# -*- coding: utf-8 -*- 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 json class opendons_duplicate_partner(models.Model): _name = 'opendons.duplicate_partner' _description = 'duplicate partner' partner_id = fields.Many2one( 'res.partner', string='partner', required=True, index=True, readonly=True, track_visibility='onchange', ondelete='restrict' ) def find_duplicate_partner(self): self.env['opendons.duplicate_partner'].search([]).unlink() rules=self.env['opendons.duplicate_rule'].search([('is_active','=','true')]) dbl_partner_ids=[] i=1 for rule in rules: if rule.field_ids: groupby_fields='' selected_fields='' list_field=[] for f in rule.field_ids: try: if i==1:groupby_fields+="'"+f.field+"'" else:groupby_fields+=",'"+f.field+"'" list_field.append(f.field) i=i+1 except: raise warning(f.field) selected_fields='' j=1 i=i-1 for f in list_field: try: if j==1:selected_fields+=""+f+"" if j>1 and j1: domain='' if len(list_field)>0: i=1 for f in list_field: if pp[f]!='' and pp[f]: try: if i==1:domain+="('"+f+"','=','"+pp[f]+"')" if i>1:domain+=",('"+f+"','=','"+pp[f]+"')" except: raise Warning(f+' '+pp[f]) i=i+1 if len(list_field)>1 : domain="['&',"+domain+"]" else:domain="["+domain+"]" else:domain="[]" if domain!='[]' and domain!="['&',]" : try: partner_dbl=self.env['res.partner'].search(eval(domain)) for partner in partner_dbl: vals={} vals['partner_id']=partner.id self.env['opendons.duplicate_partner'].create(vals) dbl_partner_ids.append(partner.id) except: raise Warning(domain) if dbl_partner_ids: action = self.env.ref("contacts.action_contacts").sudo().read([])[0] action.update( { "domain": [("id", "in", dbl_partner_ids)], "limit": 5000, } ) return action class opendons_duplicate_rule(models.Model): _name = 'opendons.duplicate_rule' _description = 'duplicate partner rule' field_ids=fields.One2many( 'opendons.duplicate_rule_line', 'rule_id', string='fields', ) is_active=fields.Boolean('active' ,default=True) fields_selected=fields.Char('fields', compute='_fields_selected') def _fields_selected(self): for rec in self: result='' field_list=rec.field_ids if field_list: i=1 for f in field_list: if i==1: result+=f.field else:result+=','+f.field i=i+1 rec.fields_selected=result class opendons_duplicate_rule_line(models.Model): _name = 'opendons.duplicate_rule_line' _description = 'duplicate partner rule line' field=fields.Selection('field_selection', string='fields') rule_id=fields.Many2one( 'opendons.duplicate_rule', string='rule', required=True, index=True, readonly=True, track_visibility='onchange', ondelete='restrict' ) @api.model def 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 def field_selection2(self): field_list=self.env['res.partner'].fields_get() result=[] for key in field_list: result.append((key,key)) raise Warning(result) return result