from odoo import models, fields, api
|
|
from odoo.exceptions import UserError, ValidationError, Warning
|
|
from psycopg2 import sql, DatabaseError
|
|
from odoo.tools.safe_eval import safe_eval, datetime
|
|
|
|
from werkzeug import utils
|
|
import csv
|
|
import base64
|
|
import io
|
|
import json
|
|
|
|
|
|
|
|
class opendons_partnerdraftfile(models.Model):
|
|
_name = 'opendons.partnerdraftfile'
|
|
_description = 'draft partner file'
|
|
|
|
#file= fields.Binary("Téléverser le fichier des contacts")
|
|
file = fields.Binary("Attachment")
|
|
file_name = fields.Char("Nom du fichier")
|
|
active = fields.Boolean("actif")
|
|
source_name=fields.Char("Source")
|
|
|
|
def import_csv_files(self):
|
|
self.env["opendons.partnerdraft"].search([]).unlink()
|
|
files= self.env["opendons.partnerdraftfile"].search([('active','=',True)])
|
|
#raise Warning('fff')
|
|
for f in files:
|
|
decrypted = base64.b64decode(f.file).decode('utf-8-sig')
|
|
source_name=f.source_name
|
|
with io.StringIO(decrypted) as fp:
|
|
reader = csv.DictReader(fp, delimiter=";", quotechar='"')
|
|
for row in reader:
|
|
vals={}
|
|
vals['source_name']=source_name
|
|
for key, value in row.items():
|
|
|
|
field_map=self.env['opendons.partnerdraftfile_mapping'].search([('external_field','=',key)])
|
|
if field_map:
|
|
odoo_field=field_map.odoo_field
|
|
vals[odoo_field]=str(value)
|
|
|
|
else: raise Warning('champ '+str(key)+' non trouvé')
|
|
self.env['opendons.partnerdraft'].create(vals)
|
|
|
|
#raise Warning(json.dumps(row))
|
|
action = self.env.ref("opendons.opendons_partnerdraft_action").sudo().read([])[0]
|
|
|
|
return action
|
|
|
|
def transfert_draftpartner(self):
|
|
#transfert des contacts importés, dans la base des contact odoo
|
|
partners=self.env['opendons.partnerdraft'].search([])
|
|
fields=self.env['opendons.partnerdraftfile_mapping'].search([])
|
|
if partners:
|
|
for p in partners:
|
|
|
|
vals={}
|
|
for f in fields:
|
|
if f.partner_field=='country_id':
|
|
if p[f.odoo_field]!='':
|
|
country=self.env['res.country'].search([('name','=',p[f.odoo_field])])
|
|
if country:vals[f.partner_field]=country.id
|
|
else:vals[f.partner_field]=False
|
|
|
|
elif f.partner_field=='title':
|
|
if p[f.odoo_field]!='':
|
|
title=self.env['res.partner.title'].search([('name','=',p[f.odoo_field])])
|
|
if title:vals[f.partner_field]=title.id
|
|
else:vals[f.partner_field]=False
|
|
else:
|
|
vals[f.partner_field]=False
|
|
|
|
elif f.partner_field in ('origine','statut_contact'):
|
|
if p[f.odoo_field]!=False:
|
|
vals[f.partner_field]=p[f.odoo_field].lower()
|
|
|
|
else:
|
|
|
|
vals[f.partner_field]=p[f.odoo_field]
|
|
|
|
vals['company_type']='person'
|
|
|
|
self.env['res.partner'].create(vals)
|
|
|
|
partners=self.env['opendons.partnerdraft'].search([]).unlink()
|
|
|
|
|
|
|
|
|
|
|
|
class opendons_partnerdraftfile_mapping(models.Model):
|
|
_name = 'opendons.partnerdraftfile_mapping'
|
|
_description = 'file mapping'
|
|
|
|
|
|
external_field=fields.Char('external field')
|
|
odoo_field=fields.Selection('odoo_field_selection', string='odoo field')
|
|
partner_field=fields.Selection('partner_field_selection', string='partner field')
|
|
|
|
@api.model
|
|
def odoo_field_selection(self):
|
|
field_list=self.env['opendons.partnerdraft'].fields_get()
|
|
|
|
result=[]
|
|
for key in field_list:
|
|
result.append((key,key))
|
|
result.sort()
|
|
return result
|
|
|
|
api.model
|
|
def partner_field_selection(self):
|
|
field_list=self.env['res.partner'].fields_get()
|
|
|
|
result=[]
|
|
for key in field_list:
|
|
result.append((key,key))
|
|
result.sort()
|
|
return result
|
|
|
|
class opendons_partnerdraft(models.Model):
|
|
_name = 'opendons.partnerdraft'
|
|
_description = 'import draft partner'
|
|
_order = "id asc"
|
|
|
|
external_id=fields.Char(string='external id')
|
|
name=fields.Char(string='nom')
|
|
firstname=fields.Char(string='prenom')
|
|
title=fields.Char(string='civilité')
|
|
street = fields.Char(string='adresse')
|
|
street2 = fields.Char(string='adresse2')
|
|
city = fields.Char(string='ville')
|
|
country = fields.Char(string='pays')
|
|
zip = fields.Char(string='code postal')
|
|
phone = fields.Char(string='tel')
|
|
email = fields.Char(string='Email')
|
|
statut_contact=fields.Char('Statut')
|
|
date_creation_contact=fields.Char(string='Date contact')
|
|
origine=fields.Char(string='Origine')
|
|
date_member=fields.Char(string='Date adhesion')
|
|
doublon=fields.Boolean(string='Doublon')
|
|
source_name=fields.Char(string='Source')
|
|
|
|
class partner(models.Model):
|
|
_inherit = 'res.partner'
|
|
external_id=fields.Char('id')
|
|
statut_contact=fields.Selection([('adhérent', 'Adhérent'), ('bienfaiteur', 'Bienfaiteur'),('contact', 'Contact'), ('soutien','Soutien') ],'Statut', index=True)
|
|
date_creation_contact=fields.Char(string='Date de création du contact', readonly=True)
|
|
origine=fields.Selection([
|
|
('boutique','Boutique'),
|
|
('visiteur','Visiteur'),
|
|
('vincennes','Vincennes'),
|
|
('bercy','Bercy'),
|
|
('salon zen','Salon Zen'),
|
|
('autre','Autre'),
|
|
('internet boutique','Internet Boutique'),
|
|
('conf m ricard','Conf M Ricard'),
|
|
('visite lzr 09','Visite lzr 09'),
|
|
('retraite','Retraite'),
|
|
('amis','Amis'),
|
|
('centre fpmt','Centre FPMT'),
|
|
('site réservations','Site réservations'),
|
|
('réservations','Réservations'),
|
|
('voyage inde','Voyage inde'),
|
|
('internet','Internet'),
|
|
('librairie','Librairie'),
|
|
('site internet boutique','Site internet boutique'),
|
|
('portes ouvertes st cosme','Portes ouvertes st cosme'),
|
|
('t','T'),
|
|
('maitreya','maitreya'),
|
|
('zen','Zen'),
|
|
('lille','Lille'),
|
|
('alan wallace','Alan wallace'),
|
|
('salon rouen','Salon Rouen'),
|
|
('stage','Stage'),
|
|
('b.actualit','B.Actualit'),
|
|
('b. actualit','B. Actualit'),
|
|
('r','R'),
|
|
('institut vy','Institut vy'),
|
|
('initiation kalachakr','Initiation kalachakr'),
|
|
('yoga','Yoga'),
|
|
('samsara','Samsara'),
|
|
('missun@gmail.com','missun@gmail.com'),
|
|
('reliques','Reliques'),
|
|
('journal m','Journal m'),
|
|
('nantes','Nantes'),
|
|
('retraite vipassana','retraite vipassana'),
|
|
('presse bouddhiste','Presse bouddhiste'),
|
|
('réservtions','Réservtions'),
|
|
('réservation','Réservation'),
|
|
('site','Site'),
|
|
('question mail','Question mail'),
|
|
('interreligieux','interreligieux'),
|
|
('refuge','Refuge'),
|
|
('zoom','zoom'),
|
|
('contact','contact'),
|
|
],'Origine', index=True)
|
|
|
|
date_adhesion=fields.Char(string='Date adhesion', readonly=True)
|