root 3 years ago
parent
commit
de57d9ca91
6 changed files with 1798 additions and 2055 deletions
  1. +1685
    -2031
      i18n/fr.po
  2. +27
    -10
      models/operation.py
  3. +57
    -1
      models/operation_batch_export.py
  4. +2
    -2
      models/operation_segment.py
  5. +6
    -8
      views/operation.xml
  6. +21
    -3
      views/operation_batch_export.xml

+ 1685
- 2031
i18n/fr.po
File diff suppressed because it is too large
View File


+ 27
- 10
models/operation.py View File

@ -10,7 +10,7 @@ from io import BytesIO
import base64 import base64
import csv import csv
import os,secrets import os,secrets
from datetime import datetime,timedelta,date
_logger = logging.getLogger(__name__) _logger = logging.getLogger(__name__)
@ -19,7 +19,7 @@ class opendons_operation(models.Model):
_description = 'opération marketing : mailing, emailing evenements' _description = 'opération marketing : mailing, emailing evenements'
_inherit = ['mail.thread'] _inherit = ['mail.thread']
_check_company_auto = True _check_company_auto = True
#_order = "__last_update desc"
#_order = "__last_update asc"
code=fields.Char(string='Code',required=True, translate=True,track_visibility='always') code=fields.Char(string='Code',required=True, translate=True,track_visibility='always')
name=fields.Char(string='Name',required=True, translate=True,copy=False,default='campagne',track_visibility='always') name=fields.Char(string='Name',required=True, translate=True,copy=False,default='campagne',track_visibility='always')
partner_count = fields.Integer(string="count",readonly=True) partner_count = fields.Integer(string="count",readonly=True)
@ -143,10 +143,13 @@ class opendons_operation(models.Model):
if self.chanel=='mail': if self.chanel=='mail':
writer.writerow(['id','key','name','firstname','title','street','street2','city','cp','country_name','operation','segment']) writer.writerow(['id','key','name','firstname','title','street','street2','city','cp','country_name','operation','segment'])
#sélections des contacts #sélections des contacts
res=self.select_partner_operation()
segments=self.env['opendons.segment'].search(['&',('operation_id','=',self.id),('exclusion','=',False)]) segments=self.env['opendons.segment'].search(['&',('operation_id','=',self.id),('exclusion','=',False)])
#extraction des contacts sélectionnés sur chaque segment #extraction des contacts sélectionnés sur chaque segment
q=0
for seg in segments: for seg in segments:
if seg.partner_ids: if seg.partner_ids:
for p in seg.partner_ids: for p in seg.partner_ids:
@ -155,6 +158,7 @@ class opendons_operation(models.Model):
id=p.id id=p.id
key=p.key key=p.key
name=p.name name=p.name
email=p.email
firstname=p.firstname if p.firstname else '' firstname=p.firstname if p.firstname else ''
street=p.street if p.street else '' street=p.street if p.street else ''
street2=p.street2 if p.street2 else '' street2=p.street2 if p.street2 else ''
@ -168,15 +172,23 @@ class opendons_operation(models.Model):
writer.writerow([id,key,name,firstname,email,operation,segment]) writer.writerow([id,key,name,firstname,email,operation,segment])
if self.chanel=='mail': if self.chanel=='mail':
writer.writerow([id,key,name,firstname,title,street,street2,city,cp,country_name,operation,segment]) writer.writerow([id,key,name,firstname,title,street,street2,city,cp,country_name,operation,segment])
q=q+1
with open(csv_filename, 'r', encoding="utf-8") as f2: with open(csv_filename, 'r', encoding="utf-8") as f2:
data = str.encode(f2.read(), 'utf-8') data = str.encode(f2.read(), 'utf-8')
self.quantity=q
self.csv_export=base64.encodestring(data) self.csv_export=base64.encodestring(data)
self.document_fname='operation'+str(self.id)+'.csv'
self.document_fname=str(self.id)+'_'+self.name+'.csv'
self.exported_date=fields.Date.context_today(self) self.exported_date=fields.Date.context_today(self)
#generation des exports par lot
for batch_export_id in self.batch_export_ids:
batch_export_id.csv_export_batch()
os.unlink(csv_filename) os.unlink(csv_filename)
@ -200,8 +212,10 @@ class opendons_operation(models.Model):
for sg in segments: for sg in segments:
if i==1: if i==1:
mailing_domain='["&","!",'+segexcl.mailing_domain[1:-1]+','+ sg.mailing_domain[1:-1]+']'
if segexcl.mailing_domain:
mailing_domain='["&","!",'+segexcl.mailing_domain[1:-1]+','+ sg.mailing_domain[1:-1]+']'
else:
mailing_domain='['+sg.mailing_domain[1:-1]+']'
partners=self.env['res.partner'].search(eval(mailing_domain)) partners=self.env['res.partner'].search(eval(mailing_domain))
@ -229,8 +243,11 @@ class opendons_operation(models.Model):
else: else:
str_domain='' str_domain=''
mailing_domain='["&","!",'+str_domain+ segexcl.mailing_domain[1:-1]+',' +sg.mailing_domain[1:-1]+']'
if segexcl.mailing_domain:
mailing_domain='["&","!",'+str_domain+ segexcl.mailing_domain[1:-1]+',' +sg.mailing_domain[1:-1]+']'
else:
mailing_domain='["&",'+sg.mailing_domain[1:-1]+']'
partners=self.env['res.partner'].search(eval(mailing_domain)) partners=self.env['res.partner'].search(eval(mailing_domain))
#ajouts des contact à l'opération #ajouts des contact à l'opération
@ -241,7 +258,7 @@ class opendons_operation(models.Model):
i=i+1 i=i+1
self.exported_date=fields.Date.context_today(self, readonly=True)
self.exported_date=datetime.now()


+ 57
- 1
models/operation_batch_export.py View File

@ -27,14 +27,70 @@ class opendons_operation_batch_export(models.Model):
track_visibility='onchange', track_visibility='onchange',
ondelete='cascade' ondelete='cascade'
) )
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')
partner_ids = fields.Many2many('res.partner', 'partner_batch_export_rel', 'partner_id', 'batch_export__id', string='partners') partner_ids = fields.Many2many('res.partner', 'partner_batch_export_rel', 'partner_id', 'batch_export__id', string='partners')
csv_export = fields.Binary('csv export', filters='.csv', readonly=True) csv_export = fields.Binary('csv export', filters='.csv', readonly=True)
document_fname=fields.Char() document_fname=fields.Char()
exported_date=fields.Date(string='Exported Date',track_visibility='always', readonly=True) exported_date=fields.Date(string='Exported Date',track_visibility='always', readonly=True)
def csv_export_batch(self): def csv_export_batch(self):
if self.operation_id.quantity==0: raise Warning('You must generate export at the operation level first')
segments=self.env['opendons.segment'].search([('operation_id','=',int(self.operation_id)),('batch_export_id','=',int(self.id))]) segments=self.env['opendons.segment'].search([('operation_id','=',int(self.operation_id)),('batch_export_id','=',int(self.id))])
#récupération des contacts sélectionnées et lié au segments du batch #récupération des contacts sélectionnées et lié au segments du batch
for seg in segments:
for p in seg.partner_ids:
self.write({'partner_ids':[(4,p.id)]})
tmstp=secrets.token_hex(16)
csv_filename='/tmp/export_'+tmstp+'.csv'
with open(csv_filename, mode='w') as file:
writer = csv.writer(file, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
if self.chanel=='email':
writer.writerow(['id','key','name','firstname','email','operation','segment'])
if self.chanel=='mail':
writer.writerow(['id','key','name','firstname','title','street','street2','city','cp','country_name','operation','segment'])
for p in self.partner_ids:
#raise UserError(p)
id=p.id
key=p.key
name=p.name
firstname=p.firstname if p.firstname else ''
street=p.street if p.street else ''
street2=p.street2 if p.street2 else ''
city=p.city if p.city else ''
cp=p.zip if p.zip else ''
country_name=p.country_id.name if p.country_id else ''
title=p.title.name if p.title else ''
operation=int(self.id)
segment=int(seg.id)
if self.chanel=='email':
writer.writerow([id,key,name,firstname,email,operation,segment])
if self.chanel=='mail':
writer.writerow([id,key,name,firstname,title,street,street2,city,cp,country_name,operation,segment])
with open(csv_filename, 'r', encoding="utf-8") as f2:
data = str.encode(f2.read(), 'utf-8')
self.csv_export=base64.encodestring(data)
self.document_fname=str(self.id)+'_'+self.name+'.csv'
self.exported_date=fields.Date.context_today(self)
os.unlink(csv_filename)
return True return True

+ 2
- 2
models/operation_segment.py View File

@ -31,8 +31,8 @@ class opendons_segment(models.Model):
mailing_domain = fields.Char(string='partners selection') mailing_domain = fields.Char(string='partners selection')
batch_export_id=fields.Many2one( batch_export_id=fields.Many2one(
'opendons.operation.batch_export', 'opendons.operation.batch_export',
String='batch export',
Domain="[('operation_id','=',operation_id)]",
string='batch export',
domain="[('operation_id','=',operation_id)]",
track_visibility='onchange', track_visibility='onchange',
) )


+ 6
- 8
views/operation.xml View File

@ -27,19 +27,15 @@
<field name="name">opendons_operations list</field> <field name="name">opendons_operations list</field>
<field name="model">opendons.operation</field> <field name="model">opendons.operation</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<tree duplicate="1">
<tree duplicate="1" default_order="create_date desc" >
<field name="id"/> <field name="id"/>
<!-- <field name="company_id"/> -->
<field name="__last_update"/>
<field name="create_date"/>
<field name="name"/> <field name="name"/>
<field name="chanel"/> <field name="chanel"/>
<field name="partner_count"/>
<!-- <field name="begin_date"/>
<field name="end_date"/> -->
<field name="quantity"/>
<field name="user_id"/> <field name="user_id"/>
<field name="cost"/> <field name="cost"/>
<field name="state" invisible="context.get('recurring_view')"/> <field name="state" invisible="context.get('recurring_view')"/>
</tree> </tree>
</field> </field>
@ -152,10 +148,12 @@
<field name="code"/> <field name="code"/>
<field name="chanel"/> <field name="chanel"/>
<field name="cost"/> <field name="cost"/>
<field name="quantity"/>
<field name="quantity" attrs="{'invisible':[('csv_export','=',False)]}"/>
<field name="batch_export_ids"> <field name="batch_export_ids">
<tree editable="bottom"> <tree editable="bottom">
<field name="name"/> <field name="name"/>
<field name="chanel"/>
<field name="csv_export" filename="document_fname" widget="binary"/>
</tree> </tree>
</field> </field>


+ 21
- 3
views/operation_batch_export.xml View File

@ -6,15 +6,16 @@
<form string="operation_batch_export_form"> <form string="operation_batch_export_form">
<header>
<!-- <header>
<button type="object" name="csv_export_batch" string="csv export" class="oe_highlight"/> <button type="object" name="csv_export_batch" string="csv export" class="oe_highlight"/>
</header>
</header> -->
<group> <group>
<field name="create_date"/> <field name="create_date"/>
<field name="name"/> <field name="name"/>
<field name="chanel"/>
<field name="csv_export" filename="document_fname" widget="binary"/> <field name="csv_export" filename="document_fname" widget="binary"/>
<field name="document_fname" invisible="1"/> <field name="document_fname" invisible="1"/>
<field name="exported_date">%b-%d-%Y</field>
<field name="exported_date"></field>
</group> </group>
</form> </form>
@ -22,4 +23,21 @@
</field> </field>
</record> </record>
<record model="ir.ui.view" id="opendons.operation_batch_export_tree">
<field name="name">opendons_batch_export Tree</field>
<field name="model">opendons.operation.batch_export</field>
<field name="arch" type="xml">
<tree>
<field name="name"/>
<field name="chanel"/>
<field name="csv_export" filename="document_fname" widget="binary"/>
</tree>
</field>
</record>
</odoo> </odoo>

Loading…
Cancel
Save