from odoo import models, fields, api,_
|
|
from odoo.exceptions import UserError, ValidationError,Warning
|
|
from psycopg2 import sql, DatabaseError
|
|
|
|
from werkzeug import utils
|
|
import json
|
|
import logging
|
|
import xlwt
|
|
from io import BytesIO
|
|
import base64
|
|
import csv
|
|
import os,secrets
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
class opendons_request(models.Model):
|
|
_name = 'opendons.request'
|
|
_description = 'operation marketing request : a request is a part of contacts selected for an ensemble '
|
|
_inherit = ['mail.thread']
|
|
sequence = fields.Integer(string="sequence", default=10)
|
|
name=fields.Char(string='Name',required=True, translate=True,track_visibility='always')
|
|
partner_count = fields.Integer(string="partners count", compute='_count_partner_request', readonly=True)
|
|
|
|
partner_ids = fields.Many2many('res.partner', 'partner_request_rel', 'partner_id', 'request_id', string='partners')
|
|
|
|
ensemble_id = fields.Many2one(
|
|
'opendons.ensemble','Ensemble',
|
|
index=True,
|
|
readonly=True,
|
|
track_visibility='onchange',
|
|
ondelete='cascade')
|
|
|
|
|
|
mailing_domain = fields.Char(
|
|
string='Domain',
|
|
readonly=False, store=True)
|
|
|
|
@api.depends('mailing_domain')
|
|
def _count_partner_request(self):
|
|
for rec in self:
|
|
if rec.mailing_domain :
|
|
rec.partner_count=self.env['res.partner'].search_count(eval(rec.mailing_domain))
|
|
else:
|
|
rec.partner_count=0
|
|
|
|
def count_partners_ensemble(self,ensemble):
|
|
#on boucle sur toutes les requêtes de l'ensemble pour compter les contacts
|
|
result=0
|
|
|
|
for req in ensemble.request_ids:
|
|
result+=req.partner_count
|
|
|
|
return result
|
|
|
|
def update_ensemble_domain(self,ensemble):
|
|
#on boucle sur toutes les requêtes de l'ensemble
|
|
logical_operator=ensemble.logical_operator
|
|
if logical_operator=='union': str_operator='"|",'
|
|
if logical_operator=='inter': str_operator='"&",'
|
|
|
|
mailing_domain=''
|
|
|
|
if len(ensemble.request_ids)>1:
|
|
i=1
|
|
for req in ensemble.request_ids:
|
|
|
|
if i==1: mailing_domain=req.mailing_domain[1:-1]
|
|
|
|
if i>1 : mailing_domain=str_operator +mailing_domain+","+req.mailing_domain[1:-1]
|
|
i+=1
|
|
|
|
mailing_domain="["+mailing_domain+"]"
|
|
|
|
#si une seule requête pour l'ensemble
|
|
if len(ensemble.request_ids)==1:
|
|
for req in ensemble.request_ids:
|
|
mailing_domain=req.mailing_domain
|
|
|
|
return mailing_domain
|
|
|
|
def count_partners_segment(self,segment):
|
|
#on boucle sur toutes les requêtes de l'ensemble pour compter les contacts
|
|
result=0
|
|
|
|
for ensemble in segment.ensemble_ids:
|
|
result+=ensemble.partner_count
|
|
|
|
return result
|
|
|
|
def count_partners_operation(self,operation):
|
|
#on boucle sur toutes les requêtes de l'ensemble pour compter les contacts
|
|
result=0
|
|
|
|
for segment in operation.segment_ids:
|
|
result+=segment.partner_count
|
|
|
|
return result
|
|
|
|
|
|
def refresh_partners_count(self):
|
|
|
|
for r in self:
|
|
r.partner_count=self.env['res.partner'].search_count(eval(r.mailing_domain))
|
|
|
|
return True
|
|
|
|
@api.model
|
|
def create(self,vals):
|
|
|
|
#partners=self.count_partner_request(vals)
|
|
|
|
if vals['mailing_domain']=="[]" :
|
|
vals['mailing_domain']="[[\"id\",\"!=\",False]]"
|
|
|
|
res=super(opendons_request, self).create(vals)
|
|
|
|
#mise à jour du nombre de requête pour l'ensemble,le segment et l'opération liée
|
|
ensemble=self.env['opendons.ensemble'].search([('id','=',int(res.ensemble_id))])
|
|
|
|
#partner_count=self.count_partners_ensemble(ensemble)
|
|
#mise à jour du domaine pour l'ensemble
|
|
ensemble_domain=self.update_ensemble_domain(ensemble)
|
|
|
|
ensemble.write(
|
|
{'request_count':len(ensemble.request_ids),
|
|
'mailing_domain':ensemble_domain
|
|
})
|
|
|
|
segment=self.env['opendons.segment'].search([('id','=',int(ensemble.segment_id))])
|
|
segment_domain=ensemble.update_segment_domain(segment)
|
|
segment.write({
|
|
'mailing_domain':segment_domain
|
|
})
|
|
|
|
operation=self.env['opendons.operation'].search([('id','=',int(segment.operation_id))])
|
|
__last_update=fields.Date.context_today(self)
|
|
operation.write({'__last_update':__last_update})
|
|
|
|
|
|
return res
|
|
|
|
def write(self,vals):
|
|
|
|
mailing_domain_update=False
|
|
for val in vals:
|
|
if val=='mailing_domain':
|
|
mailing_domain_update=True
|
|
|
|
|
|
if mailing_domain_update==True :
|
|
|
|
if vals['mailing_domain']=="[]" :
|
|
vals['mailing_domain']="[[\"id\",\"!=\",False]]"
|
|
|
|
|
|
res=super(opendons_request, self).write(vals)
|
|
ensemble=self.env['opendons.ensemble'].search([('id','=',int(self.ensemble_id))])
|
|
segment=self.env['opendons.segment'].search([('id','=',int(ensemble.segment_id))])
|
|
if mailing_domain_update==True:
|
|
|
|
ensemble_domain=self.update_ensemble_domain(ensemble)
|
|
# partner_count=self.count_partners_ensemble(ensemble)
|
|
ensemble.write({
|
|
'request_count':len(ensemble.request_ids),
|
|
'mailing_domain':ensemble_domain
|
|
})
|
|
|
|
|
|
segment_domain=ensemble.update_segment_domain(segment)
|
|
|
|
segment.write({
|
|
'mailing_domain':segment_domain
|
|
})
|
|
|
|
operation=self.env['opendons.operation'].search([('id','=',int(segment.operation_id))])
|
|
__last_update=fields.Date.context_today(self)
|
|
operation.write({'__last_update':__last_update})
|
|
|
|
|
|
return res
|
|
|
|
def copy(self,default_values=None):
|
|
|
|
vals={}
|
|
vals['name']='copy of ' + self.name
|
|
vals['ensemble_id']=int(self.ensemble_id)
|
|
vals['mailing_domain']=self.mailing_domain
|
|
dup_request=super(opendons_request, self).create(vals)
|
|
|
|
|
|
return dup_request
|