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 @@
-
-
+
+
+
+ states="draft" />
+ statusbar_visible="draft,validated,exported"/>
@@ -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
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+ 1
+
+
+
+ 1
+
+
+
+