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 odoo import fields, http, SUPERUSER_ID, tools, _ from werkzeug import utils import csv import base64 import io import json import re 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: regex = re.compile(r'([A-Za-z0-9]+[.-_])*[A-Za-z0-9]+@[A-Za-z0-9-]+(\.[A-Z|a-z]{2,})+') if re.fullmatch(regex, p.email) and p.name!='': 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'): continue 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)