From 349a28ed246d81e229c67a766a46f2752373044c Mon Sep 17 00:00:00 2001 From: root Date: Fri, 28 Jan 2022 19:59:39 +0000 Subject: [PATCH] 2022-01-28 --- __manifest__.py | 1 + models/__init__.py | 1 + models/donation.py | 19 +++ models/operation.py | 222 +++++++++++++++++++++++------------ models/partner.py | 16 +++ security/ir.model.access.csv | 2 +- views/donation.xml | 21 ++++ views/operation.xml | 23 ++-- views/partner.xml | 41 ++++++- 9 files changed, 261 insertions(+), 85 deletions(-) create mode 100644 models/donation.py create mode 100644 views/donation.xml diff --git a/__manifest__.py b/__manifest__.py index e650093..80306d2 100644 --- a/__manifest__.py +++ b/__manifest__.py @@ -30,6 +30,7 @@ 'views/email.xml', 'views/phone.xml', 'views/partner.xml', + 'views/donation.xml', 'views/relationship.xml', 'views/operation.xml', 'views/templates.xml', diff --git a/models/__init__.py b/models/__init__.py index b3d10fa..4e6c361 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -2,6 +2,7 @@ from . import qualifier from . import partner +from . import donation from . import address from . import email from . import phone diff --git a/models/donation.py b/models/donation.py new file mode 100644 index 0000000..fd11f6b --- /dev/null +++ b/models/donation.py @@ -0,0 +1,19 @@ +from odoo import models, fields, api +from odoo.exceptions import UserError, ValidationError +from psycopg2 import sql, DatabaseError + +from werkzeug import utils + + + + +class DonationDonation(models.Model): + _inherit = 'donation.donation' + + operation_id = fields.Many2one( + 'opendons.operation', + string='Donation Operation', + track_visibility='onchange', + ondelete='restrict' + + ) \ No newline at end of file diff --git a/models/operation.py b/models/operation.py index 5fec2e2..212f534 100644 --- a/models/operation.py +++ b/models/operation.py @@ -82,8 +82,8 @@ class opendons_operation(models.Model): ) state = fields.Selection([ ('draft', 'Draft'), - ('done', 'Done'), - ('cancel', 'Cancelled')], + ('validated', 'Validated'), + ('exported', 'Exported')], string='State', readonly=True, copy=False, @@ -107,31 +107,38 @@ class opendons_operation(models.Model): def validate(self): for operation in self: - vals = {'state': 'done'} + vals = {'state': 'validated'} operation.write(vals) return - def done2cancel(self): + def validated2draft(self): '''from Done state to Cancel state''' for operation in self: - operation.state = 'cancel' - - def cancel2draft(self): - '''from Cancel state to Draft state''' - for operation in self: - operation.state = 'draft' + def validated2exported(self): + '''from Done state to Cancel state''' + for operation in self: + + operation.state = 'exported' + + def exported2validated(self): + '''from Done state to Cancel state''' + for operation in self: + + operation.state = 'validated' + + def csv_export_operation(self): with open('export.csv', mode='w') as file: writer = csv.writer(file, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL) - # create a row contains heading of each column + # ggcreate a row containds heading of each column writer.writerow(['name', 'email']) # fetch products and write respective data. - partners = self.env['res.partner'].sudo().search([]) + partners = self.select_partner_operation() for p in partners: name=p.name @@ -147,7 +154,15 @@ class opendons_operation(models.Model): self.document_fname='operation'+str(self.id)+'.csv' return - + #def select_partner_operation(self): + + #le principe est de selectionner les contacts associés aux segments avec les règles suivantes : + #RG1: si un contact est présent dans un segment d'exclusion, alos on le retire de la sélection + #RG2: la priorité des segments est l'ordre de présentation dans la liste des segmments + #RG3: au final, un contact sélectionné est rattaché à l'opération avec le segment d'appartenance + + + def export_partners(self): partners = self.env['res.partner'].sudo().search([]) @@ -181,7 +196,8 @@ class opendons_segment(models.Model): cost = fields.Monetary( string='Cost', currency_field='currency_id') - partner_count = fields.Integer(string="count",readonly=True) + partner_count = fields.Integer(string="partners count", compute='_count_partner_segment',readonly=True) + mailing_domain = fields.Char(string='partners selection', readonly=True) @api.model def _default_currency(self): @@ -204,7 +220,7 @@ class opendons_segment(models.Model): index=True, readonly=True, track_visibility='onchange', - ondelete='restrict' + ondelete='cascade' ) ensemble_ids = fields.One2many( @@ -219,6 +235,14 @@ class opendons_segment(models.Model): string="# of ensemble", readonly=True ) + + @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 @@ -240,7 +264,21 @@ class opendons_segment(models.Model): operation.write({'segment_count':len(operation.segment_ids)}) 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) class opendons_ensemble(models.Model): @@ -250,17 +288,15 @@ class opendons_ensemble(models.Model): name=fields.Char(string='Name',required=True, translate=True,track_visibility='always') logical_operator = fields.Selection([('union','union'),('inter','intersection')],'Type',default='union') - mailing_domain = fields.Char( - string='partners selection', - readonly=True, store=True) - partner_count = fields.Integer(string="count",readonly=True) + mailing_domain = fields.Char(string='partners selection', readonly=True) + partner_count = fields.Integer(string="partners count",compute='_count_partner_ensemble',readonly=True) sequence = fields.Integer(string="sequence", default=10) segment_id = fields.Many2one( 'opendons.segment','Segment', index=True, readonly=True, track_visibility='onchange', - ondelete='restrict') + ondelete='cascade') request_ids = fields.One2many( 'opendons.request', @@ -277,6 +313,15 @@ class opendons_ensemble(models.Model): csv_export = fields.Binary('csv export', filters='.csv', readonly=True) document_fname=fields.Char() + @api.depends('mailing_domain') + def _count_partner_ensemble(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 csv_export_ensemble(self): with open('export.csv', mode='w') as file: @@ -312,6 +357,34 @@ class opendons_ensemble(models.Model): + + def update_segment_domain(self,segment): + + logical_operator=segment.logical_operator + if logical_operator=='union': str_operator='"|",' + if logical_operator=='inter': str_operator='"&",' + + mailing_domain='' + + if len(segment.ensemble_ids)>1: + i=1 + for ens in segment.ensemble_ids: + if i==1: mailing_domain=ens.mailing_domain[1:-1] + if i>1 : + if ens.mailing_domain!=False: + mailing_domain=str_operator +mailing_domain+","+ens.mailing_domain[1:-1] + i+=1 + mailing_domain="["+mailing_domain+"]" + if len(segment.ensemble_ids)==1: + for ens in segment.ensemble_ids: + mailing_domain=ens.mailing_domain + + + + + return mailing_domain + + @api.model def create(self,vals): @@ -320,8 +393,13 @@ class opendons_ensemble(models.Model): segment=self.env['opendons.segment'].search([('id','=',int(res.segment_id))]) #_logger.error('segment.id='+str(res.operation_id)) + segment_domain=self.update_segment_domain(segment) - segment.write({'ensemble_count':len(segment.ensemble_ids)}) + segment.write( + { + 'ensemble_count':len(segment.ensemble_ids), + 'mailing_domain':segment_domain, + }) return res def write(self,vals): @@ -331,9 +409,18 @@ class opendons_ensemble(models.Model): for val in vals: if val=='logical_operator': - mailing_domain=self.env['opendons.request'].update_ensemble_domaine(self) + mailing_domain=self.env['opendons.request'].update_ensemble_domain(self) + + if mailing_domain: + vals['mailing_domain']=mailing_domain + + segment=self.env['opendons.segment'].search([('id','=',int(self.segment_id))]) + segment_domain=self.update_segment_domain(segment) + segment.write({ + 'ensemble_count':len(segment.ensemble_ids), + 'mailing_domain':segment_domain + }) - if mailing_domain: vals['mailing_domain']=mailing_domain res=super(opendons_ensemble, self).write(vals) @@ -343,8 +430,7 @@ class opendons_request(models.Model): _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="count",readonly=True) - + 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') @@ -353,13 +439,20 @@ class opendons_request(models.Model): index=True, readonly=True, track_visibility='onchange', - ondelete='restrict') + 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 @@ -370,7 +463,7 @@ class opendons_request(models.Model): return result - def update_ensemble_domaine(self,ensemble): + 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='"|",' @@ -381,16 +474,19 @@ class opendons_request(models.Model): 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+"]" - if len(ensemble.request_ids)==1: - mailing_domain=req.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): @@ -410,19 +506,7 @@ class opendons_request(models.Model): result+=segment.partner_count return result - - def count_partner_request(self,vals): - - - - if vals['mailing_domain']: - partners=self.env['res.partner'].search(eval(vals['mailing_domain'])) - else: - partners=self.env['res.partner'] - - result=len(partners) - - return result + def refresh_partners_count(self): @@ -431,14 +515,13 @@ class opendons_request(models.Model): 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) @@ -447,26 +530,20 @@ class opendons_request(models.Model): #partner_count=self.count_partners_ensemble(ensemble) #mise à jour du domaine pour l'ensemble - ensemble_domaine=self.update_ensemble_domaine(ensemble) + ensemble_domain=self.update_ensemble_domain(ensemble) ensemble.write( {'request_count':len(ensemble.request_ids), - 'mailing_domain':ensemble_domaine + 'mailing_domain':ensemble_domain }) - # segment=self.env['opendons.segment'].search([('id','=',int(ensemble.segment_id))]) - # partner_count=self.count_partners_segment(segment) - # segment.write({ - # 'partner_count':partner_count - # }) + 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))]) - # partner_count=self.count_partners_operation(operation) - # operation.write({ - # 'partner_count':partner_count - # }) - - + return res def write(self,vals): @@ -475,12 +552,12 @@ class opendons_request(models.Model): for val in vals: if val=='mailing_domain': mailing_domain_update=True - partners_count=self.count_partner_request(vals) - #partner_count=len(partners) - #partner_ids=[(6, 0,partners.ids)] + if mailing_domain_update==True : - vals['partner_count']=partners_count + + if vals['mailing_domain']=="[]" : + vals['mailing_domain']="[[\"id\",\"!=\",False]]" res=super(opendons_request, self).write(vals) @@ -489,19 +566,20 @@ class opendons_request(models.Model): # #mise à jour du nombre de requête pour l'ensemble lié ensemble=self.env['opendons.ensemble'].search([('id','=',int(self.ensemble_id))]) - ensemble_domaine=self.update_ensemble_domaine(ensemble) + + 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_domaine + 'mailing_domain':ensemble_domain }) - # segment=self.env['opendons.segment'].search([('id','=',int(ensemble.segment_id))]) + segment=self.env['opendons.segment'].search([('id','=',int(ensemble.segment_id))]) + segment_domain=ensemble.update_segment_domain(segment) - # partner_count=self.count_partners_segment(segment) - # segment.write({ - # 'partner_count':partner_count - # }) + segment.write({ + 'mailing_domain':segment_domain + }) # operation=self.env['opendons.operation'].search([('id','=',int(segment.operation_id))]) # partner_count=self.count_partners_operation(operation) diff --git a/models/partner.py b/models/partner.py index 25ad49c..6bcd342 100644 --- a/models/partner.py +++ b/models/partner.py @@ -119,4 +119,20 @@ class partner(models.Model): string="# of phone", readonly=True ) + key=fields.Integer( + compute='_compute_key', + string="Key", + store=True + + ) + firstname=fields.Char( + + string="First name", + + + ) + + def _compute_key(self): + for rec in self: + rec.key=int(rec.id)*40456 diff --git a/security/ir.model.access.csv b/security/ir.model.access.csv index 05db5c6..b15ded2 100644 --- a/security/ir.model.access.csv +++ b/security/ir.model.access.csv @@ -12,4 +12,4 @@ access_opendons_relationship_partner,opendons_relationship.partner,model_opendon access_opendons_relationship_nature,opendons_relationship.nature,model_opendons_relationship_nature,donation_main.group_donation_manager,1,1,1,1 access_opendons_relationship_type,opendons_relationship.type,model_opendons_relationship_type,donation_main.group_donation_manager,1,1,1,1 access_opendons_partneremail,opendons_partneremail,model_opendons_partneremail,donation_main.group_donation_manager,1,1,1,1 -ccess_opendons_partnerphone,opendons_partnerphone,model_opendons_partnerphone,donation_main.group_donation_manager,1,1,1,1a \ No newline at end of file +access_opendons_partnerphone,opendons_partnerphone,model_opendons_partnerphone,donation_main.group_donation_manager,1,1,1,1 diff --git a/views/donation.xml b/views/donation.xml new file mode 100644 index 0000000..2f29629 --- /dev/null +++ b/views/donation.xml @@ -0,0 +1,21 @@ + + + + + opendons.donation.form + donation.donation + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/views/operation.xml b/views/operation.xml index 68740bb..932cf39 100644 --- a/views/operation.xml +++ b/views/operation.xml @@ -5,21 +5,21 @@ Segments opendons.segment tree,form,graph - {'search_default_operation_id': active_id} + {'search_default_operation_id': active_id,'default_operation_id': active_id} Ensembles opendons.ensemble tree,form,graph - {'search_default_segment_id': active_id} + {'search_default_segment_id': active_id,'default_segment_id': active_id} Requests opendons.request tree,form,graph - {'search_default_ensemble_id': active_id} + {'search_default_ensemble_id': active_id,'default_ensemble_id': active_id} @@ -127,15 +127,17 @@
@@ -178,6 +180,7 @@ + @@ -210,7 +213,7 @@ - + diff --git a/views/partner.xml b/views/partner.xml index 07e1b62..16eb112 100644 --- a/views/partner.xml +++ b/views/partner.xml @@ -39,11 +39,48 @@ - qualifier.button.res.partner.form + opendons.res.partner.form res.partner - + + + + + + + + + + +