You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

142 lines
4.5 KiB

# -*- 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([('active','=','true')])
dbl_partner_ids=[]
i=1
for rule in rules:
groupby_fields=''
selected_fields=''
list_field=[]
for f in rule.field_ids:
if i==1:groupby_fields+="'"+f.field+"'"
else:groupby_fields+=",'"+f.field+"'"
list_field.append(f.field)
i=i+1
selected_fields=''
j=1
i=i-1
for f in list_field:
if j==1:selected_fields+=""+f+""
if j>1 and j<i:selected_fields+="'"+f+""
if j==i and j!=1:selected_fields+=","+f+""
j=j+1
j=j-1
last_field=list_field[j-1]
sql="select count(id) as __count, "+ selected_fields +" from res_partner group by "+ selected_fields
self.env.cr.execute(sql)
p=self.env.cr.dictfetchall()
#raise Warning(json.dumps(p))
for pp in p:
if int(pp['__count'])>1:
domain=''
if len(list_field)>1:domain="['&',"
else:domain="["
i=1
for f in list_field:
if pp[f]:
if i==1:domain+="('"+f+"','=','"+pp[f]+"')"
if i>1:domain+=",('"+f+"','=','"+pp[f]+"')"
i=i+1
domain+=']'
if domain!='[]':
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)
action = self.env.ref("contacts.action_contacts").sudo().read([])[0]
action.update(
{
"domain": [("id", "in", dbl_partner_ids)],
"limit": 5000,
"context":{'view_mode':'tree'}
}
)
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',
)
active=fields.Boolean('active' ,default=True)
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()
#raise Warning(json.dumps(field_list))
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()
#raise Warning(json.dumps(field_list))
result=[]
for key in field_list:
result.append((key,key))
raise Warning(result)
return result