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