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_segment(models.Model): _name = 'opendons.segment' _description = 'operation marketing segment : a segment is a part of contacts selected for an operation ' _inherit = ['mail.thread'] sequence = fields.Integer(string="sequence", default=10) #code=fields.Char(string='Code',required=True, translate=True,track_visibility='always') name=fields.Char(string='Name',required=True, translate=True,track_visibility='always') exclusion=fields.Boolean(String='segment d\'exclusion',default=False,readonly=True) logical_operator = fields.Selection([('union','union'),('inter','intersection')],'Type',default='union') cost = fields.Monetary( string='Cost', currency_field='currency_id') partner_ids = fields.Many2many('res.partner', 'partner_segment_rel', 'partner_id', 'segment_id', string='partners') partner_count = fields.Integer(string="partners count", compute='_count_partner_segment',readonly=True) mailing_domain = fields.Char(string='partners selection') batch_export_id=fields.Many2one( 'opendons.operation.batch_export', String='batch export', Domain="[('operation_id','=',operation_id)]", track_visibility='onchange', ) @api.model def _default_currency(self): company = self.env['res.company']._company_default_get( 'opendons.segment') return company.currency_id currency_id = fields.Many2one( 'res.currency', string='Currency', required=True, track_visibility='onchange', ondelete='restrict', default=_default_currency ) operation_id = fields.Many2one( 'opendons.operation', String='Operation', index=True, readonly=True, track_visibility='onchange', ondelete='cascade' ) ensemble_ids = fields.One2many( 'opendons.ensemble', 'segment_id', string='Ensemble', required=True, track_visibility='onchange') ensemble_count = fields.Integer( compute='_compute_ensemble_count', string="# of ensemble", readonly=True ) chanel=fields.Selection([ ('mail', 'Mailing'), ('email', 'E-mailing'), ('event', 'Event'), ('face_to_face', 'Face to face')], string='Chanel',required=True, translate=True,track_visibility='always') @api.depends('mailing_domain') def _count_partner_segment(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 _compute_ensemble_count(self): # The current user may not have access rights for donations for segment in self: try: segment.ensemble_count = len(segment.ensemble_ids) except Exception: segment.ensemble_count = 0 @api.model def create(self,vals): res=super(opendons_segment, self).create(vals) #segment=self.env['opendons.segment'].search([('id','=',int(res.id))]) operation=self.env['opendons.operation'].search([('id','=',int(res.operation_id))]) #_logger.error('segment.id='+str(res.operation_id)) __last_update=fields.Date.context_today(self) operation.write( { 'segment_count':len(operation.segment_ids), '__last_update':__last_update } ) return res def write(self,vals): res=super(opendons_segment, self).write(vals) mailing_domain=False for val in vals: if val=='logical_operator': mailing_domain=self.env['opendons.ensemble'].update_segment_domain(self) if mailing_domain: vals['mailing_domain']=mailing_domain res=super(opendons_segment, self).write(vals) operation=self.env['opendons.operation'].search([('id','=',int(self.operation_id))]) __last_update=fields.Date.context_today(self) operation.write({'__last_update':__last_update}) def copy(self,default_values=None): vals={} vals['name']='copy of ' + self.name vals['operation_id']=int(self.operation_id) vals['mailing_domain']=self.mailing_domain dup_segment=super(opendons_segment, self).create(vals) #on duplique les ensembles du segment for ensemble_id in self.ensemble_ids: #raise Warning(segment_id.id) ens=self.env['opendons.ensemble'].search([('id','=',int(ensemble_id.id))]) if ens: vals3={} vals3['segment_id']=dup_segment.id vals3['name']=ens.name vals3['mailing_domain']=ens.mailing_domain #dup_segment=super(opendons_segment,self).create(vals2) dup_ensemble=self.env['opendons.ensemble'].create(vals3) dup_segment.write({'ensemble_ids':[(4,dup_ensemble.id)]}) for request_id in ens.request_ids: req=self.env['opendons.request'].search([('id','=',int(request_id.id))]) if req: vals4={} vals4['ensemble_id']=dup_ensemble.id vals4['name']=req.name vals4['mailing_domain']=req.mailing_domain #dup_segment=super(opendons_segment,self).create(vals2) dup_request=self.env['opendons.request'].create(vals4) dup_ensemble.write({'request_ids':[(4,dup_request.id)]}) #rtn=super(opendons_operation,self).copy(default=default_values) return dup_segment