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.
 
 

191 lines
6.2 KiB

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