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.
 
 

171 lines
6.1 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_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