Browse Source

operation

master
raynald 3 years ago
parent
commit
01d52f403a
29 changed files with 1401 additions and 39 deletions
  1. +7
    -3
      __manifest__.py
  2. +5
    -1
      models/__init__.py
  3. BIN
      models/__pycache__/__init__.cpython-37.pyc
  4. BIN
      models/__pycache__/address.cpython-37.pyc
  5. BIN
      models/__pycache__/email.cpython-37.pyc
  6. BIN
      models/__pycache__/mail_mail.cpython-37.pyc
  7. BIN
      models/__pycache__/mailing_mailing.cpython-37.pyc
  8. BIN
      models/__pycache__/operation.cpython-37.pyc
  9. BIN
      models/__pycache__/partner.cpython-37.pyc
  10. BIN
      models/__pycache__/phone.cpython-37.pyc
  11. BIN
      models/__pycache__/qualifier.cpython-37.pyc
  12. BIN
      models/__pycache__/relationship.cpython-37.pyc
  13. +6
    -4
      models/address.py
  14. +56
    -0
      models/email.py
  15. +16
    -0
      models/mailing_mailing.py
  16. +434
    -7
      models/operation.py
  17. +66
    -0
      models/partner.py
  18. +56
    -0
      models/phone.py
  19. +20
    -2
      models/qualifier.py
  20. +145
    -0
      models/relationship.py
  21. +10
    -1
      security/ir.model.access.csv
  22. +3
    -3
      views/address.xml
  23. +64
    -0
      views/email.xml
  24. +15
    -0
      views/mail_mail.xml
  25. +263
    -1
      views/operation.xml
  26. +47
    -3
      views/partner.xml
  27. +64
    -0
      views/phone.xml
  28. +11
    -14
      views/qualifier.xml
  29. +113
    -0
      views/relationship.xml

+ 7
- 3
__manifest__.py View File

@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
{
'name': "opendons_module1",
'name': "opendons",
'summary': """
Short (1 phrase/line) summary of the module's purpose, used as
@ -20,16 +20,20 @@
'version': '0.1',
# any module necessary for this one to work correctly
'depends': ['base','mail'],
'depends': ['base','mail','mass_mailing'],
# always loaded
'data': [
'security/ir.model.access.csv',
'views/qualifier.xml',
'views/address.xml',
'views/email.xml',
'views/phone.xml',
'views/partner.xml',
'views/relationship.xml',
'views/operation.xml',
'views/templates.xml'
'views/templates.xml',
'views/mail_mail.xml'
],
# only loaded in demonstration mode


+ 5
- 1
models/__init__.py View File

@ -3,4 +3,8 @@
from . import qualifier
from . import partner
from . import address
from . import operation
from . import email
from . import phone
from . import operation
from . import mailing_mailing
from . import relationship

BIN
models/__pycache__/__init__.cpython-37.pyc View File


BIN
models/__pycache__/address.cpython-37.pyc View File


BIN
models/__pycache__/email.cpython-37.pyc View File


BIN
models/__pycache__/mail_mail.cpython-37.pyc View File


BIN
models/__pycache__/mailing_mailing.cpython-37.pyc View File


BIN
models/__pycache__/operation.cpython-37.pyc View File


BIN
models/__pycache__/partner.cpython-37.pyc View File


BIN
models/__pycache__/phone.cpython-37.pyc View File


BIN
models/__pycache__/qualifier.cpython-37.pyc View File


BIN
models/__pycache__/relationship.cpython-37.pyc View File


+ 6
- 4
models/address.py View File

@ -46,16 +46,18 @@ class opendons_partneraddress(models.Model):
)
def write(self,vals):
date_active=False
date_inactive=False
for val in vals:
if val=='active' and not vals['active']:
date_inactive=fields.Date.context_today(self)
if val=='active' and vals['active']:
date_inactive=False
date_inactive=False
date_active=fields.Date.context_today(self)
vals['npai']=0
vals['date_inactive']=date_inactive
#self.message_post(body=_('remise à zero du compteur NPAI'))
vals['date_active']=date_active
res = super(opendons_partneraddress, self).write(vals)


+ 56
- 0
models/email.py View File

@ -0,0 +1,56 @@
# -*- coding: utf-8 -*-
from odoo import models, fields, api
from odoo.exceptions import UserError, ValidationError
from psycopg2 import sql, DatabaseError
from odoo.tools.safe_eval import safe_eval, datetime
from werkzeug import utils
class opendons_partneremail(models.Model):
_name = 'opendons.partneremail'
_description = 'emails du contact'
_inherit = ['mail.thread']
email = fields.Char()
active=fields.Boolean(string='active',default=True,track_visibility='always')
date_active=fields.Date(readonly=True,string='Date active',track_visibility='always')
date_inactive=fields.Date(readonly=True,string='Date inactive',track_visibility='always')
partner_id = fields.Many2one(
'res.partner',
string='partner',
required=True,
index=True,
readonly=True,
track_visibility='onchange',
ondelete='restrict'
)
def write(self,vals):
date_active=False
date_inactive=False
for val in vals:
if val=='active' and not vals['active']:
date_inactive=fields.Date.context_today(self)
if val=='active' and vals['active']:
date_inactive=False
date_active=fields.Date.context_today(self)
vals['date_inactive']=date_inactive
vals['date_active']=date_active
res = super(opendons_partneremail, self).write(vals)
#Your code goes here
return res

+ 16
- 0
models/mailing_mailing.py View File

@ -0,0 +1,16 @@
import re
import werkzeug.urls
from odoo import api, fields, models, tools
class Mailing(models.Model):
_inherit = 'mailing.mailing'
operation_id=fields.Many2one('opendons.operation','Operation')
segment_id=fields.Many2one('opendons.segment','Segment')
@api.onchange('operation_id')
def _onchange_operation_id(self):
res = {}
res['domain']={'segment_id':[('operation_id', '=', self.operation_id.id)]}
return res

+ 434
- 7
models/operation.py View File

@ -3,6 +3,25 @@ from odoo.exceptions import UserError, ValidationError
from psycopg2 import sql, DatabaseError
from werkzeug import utils
import json
import logging
import xlwt
from io import BytesIO
import base64
import csv
_logger = logging.getLogger(__name__)
MASS_MAILING_BUSINESS_MODELS = [
'crm.lead',
'event.registration',
'hr.applicant',
'res.partner',
'event.track',
'sale.order',
'mailing.list',
'mailing.contact'
]
class opendons_operation(models.Model):
_name = 'opendons.operation'
@ -11,8 +30,10 @@ class opendons_operation(models.Model):
code=fields.Char(string='Code',required=True, translate=True,track_visibility='always')
name=fields.Char(string='Name',required=True, translate=True,track_visibility='always')
begin_date=fields.Date(string='Date begin',required=True, translate=True,track_visibility='always')
end_date=fields.Date(string='Date end',required=True, translate=True,track_visibility='always')
partner_count = fields.Integer(string="count",readonly=True)
#begin_date=fields.Date(string='Date begin',required=True, translate=True,track_visibility='always')
#end_date=fields.Date(string='Date end',required=True, translate=True,track_visibility='always')
chanel=fields.Selection([
('mail', 'Mailing'),
('email', 'E-mailing'),
@ -52,19 +73,115 @@ class opendons_operation(models.Model):
'opendons.segment',
'operation_id',
string='Segments',
required=True,
track_visibility='onchange')
readonly=True
)
segment_count = fields.Integer(
string="# of segment",
readonly=True
)
state = fields.Selection([
('draft', 'Draft'),
('done', 'Done'),
('cancel', 'Cancelled')],
string='State',
readonly=True,
copy=False,
default='draft',
index=True,
track_visibility='onchange'
)
csv_export = fields.Binary('csv export', filters='.csv', readonly=True)
document_fname=fields.Char()
# def _compute_segment_count(self):
# # The current user may not have access rights for donations
# for operation in self:
# try:
# operation.segment_count = len(operation.segment_ids)
# except Exception:
# operation.segment_count = 0
def validate(self):
for operation in self:
vals = {'state': 'done'}
operation.write(vals)
return
def done2cancel(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 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
writer.writerow(['name', 'email'])
# fetch products and write respective data.
partners = self.env['res.partner'].sudo().search([])
for p in partners:
name=p.name
email=p.email
writer.writerow([name,email])
with open('export.csv', 'r', encoding="utf-8") as f2:
# file encode and store in a variable ‘data’
data = str.encode(f2.read(), 'utf-8')
self.csv_export=base64.encodestring(data)
self.document_fname='operation'+str(self.id)+'.csv'
return
def export_partners(self):
partners = self.env['res.partner'].sudo().search([])
stream = BytesIO()
book = xlwt.Workbook(encoding='utf-8')
sheet = book.add_sheet(u'{}'.format(u'My Sheet'))
row = 1
cell = 0
for p in partners:
sheet.write(row, cell, p.name)
row += 1
book.save(stream)
self.excel_report = base64.encodestring(stream.getvalue())
self.document_fname='operation'+seld.id+'.csv'
return
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)
logical_operator = fields.Selection([('union','union'),('inter','intersection')],'Type',default='union')
cost = fields.Monetary(
string='Cost',
currency_field='currency_id')
partner_count = fields.Integer(string="count",readonly=True)
@api.model
def _default_currency(self):
@ -82,8 +199,318 @@ class opendons_segment(models.Model):
)
operation_id = fields.Many2one(
'opendons.operation','Operation',
ondelete='cascade',
track_visibility='always')
'opendons.operation',
String='Operation',
index=True,
readonly=True,
track_visibility='onchange',
ondelete='restrict'
)
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
)
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))
operation.write({'segment_count':len(operation.segment_ids)})
return res
class opendons_ensemble(models.Model):
_name = 'opendons.ensemble'
_description = 'operation marketing ensemble : an ensemble is a part of contacts selected for an segment '
_inherit = ['mail.thread']
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)
sequence = fields.Integer(string="sequence", default=10)
segment_id = fields.Many2one(
'opendons.segment','Segment',
index=True,
readonly=True,
track_visibility='onchange',
ondelete='restrict')
request_ids = fields.One2many(
'opendons.request',
'ensemble_id',
string='Request',
required=True,
track_visibility='onchange')
request_count = fields.Integer(
compute='_compute_request_count',
string="# of request",
readonly=True
)
csv_export = fields.Binary('csv export', filters='.csv', readonly=True)
document_fname=fields.Char()
def csv_export_ensemble(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
writer.writerow(['name', 'email'])
# fetch products and write respective data.
partners = self.env['res.partner'].sudo().search([])
for p in partners:
name=p.name
email=p.email
writer.writerow([name,email])
with open('export.csv', 'r', encoding="utf-8") as f2:
# file encode and store in a variable ‘data’
data = str.encode(f2.read(), 'utf-8')
self.csv_export=base64.encodestring(data)
self.document_fname='contacts.csv'
return
def _compute_request_count(self):
# The current user may not have access rights for donations
for ensemble in self:
try:
ensemble.request_count = len(ensemble.request_ids)
except Exception:
ensemble.request_count = 0
@api.model
def create(self,vals):
res=super(opendons_ensemble, self).create(vals)
segment=self.env['opendons.segment'].search([('id','=',int(res.segment_id))])
#_logger.error('segment.id='+str(res.operation_id))
segment.write({'ensemble_count':len(segment.ensemble_ids)})
return res
def write(self,vals):
res=super(opendons_ensemble, self).write(vals)
mailing_domain=False
for val in vals:
if val=='logical_operator':
mailing_domain=self.env['opendons.request'].update_ensemble_domaine(self)
if mailing_domain: vals['mailing_domain']=mailing_domain
res=super(opendons_ensemble, self).write(vals)
class opendons_request(models.Model):
_name = 'opendons.request'
_description = 'operation marketing request : a request is a part of contacts selected for an ensemble '
_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_ids = fields.Many2many('res.partner', 'partner_request_rel', 'partner_id', 'request_id', string='partners')
ensemble_id = fields.Many2one(
'opendons.ensemble','Ensemble',
index=True,
readonly=True,
track_visibility='onchange',
ondelete='restrict')
mailing_domain = fields.Char(
string='Domain',
readonly=False, store=True)
def count_partners_ensemble(self,ensemble):
#on boucle sur toutes les requêtes de l'ensemble pour compter les contacts
result=0
for req in ensemble.request_ids:
result+=req.partner_count
return result
def update_ensemble_domaine(self,ensemble):
#on boucle sur toutes les requêtes de l'ensemble
logical_operator=ensemble.logical_operator
if logical_operator=='union': str_operator='"|",'
if logical_operator=='inter': str_operator='"&",'
mailing_domain=''
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
return mailing_domain
def count_partners_segment(self,segment):
#on boucle sur toutes les requêtes de l'ensemble pour compter les contacts
result=0
for ensemble in segment.ensemble_ids:
result+=ensemble.partner_count
return result
def count_partners_operation(self,operation):
#on boucle sur toutes les requêtes de l'ensemble pour compter les contacts
result=0
for segment in operation.segment_ids:
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):
for r in self:
r.partner_count=self.env['res.partner'].search_count(eval(r.mailing_domain))
return True
@api.model
def create(self,vals):
partners=self.count_partner_request(vals)
res=super(opendons_request, self).create(vals)
#mise à jour du nombre de requête pour l'ensemble,le segment et l'opération liée
ensemble=self.env['opendons.ensemble'].search([('id','=',int(res.ensemble_id))])
#partner_count=self.count_partners_ensemble(ensemble)
#mise à jour du domaine pour l'ensemble
ensemble_domaine=self.update_ensemble_domaine(ensemble)
ensemble.write(
{'request_count':len(ensemble.request_ids),
'mailing_domain':ensemble_domaine
})
# segment=self.env['opendons.segment'].search([('id','=',int(ensemble.segment_id))])
# partner_count=self.count_partners_segment(segment)
# segment.write({
# 'partner_count':partner_count
# })
# 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):
mailing_domain_update=False
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
res=super(opendons_request, self).write(vals)
if mailing_domain_update==True:
# #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)
# partner_count=self.count_partners_ensemble(ensemble)
ensemble.write({
'request_count':len(ensemble.request_ids),
'mailing_domain':ensemble_domaine
})
# segment=self.env['opendons.segment'].search([('id','=',int(ensemble.segment_id))])
# partner_count=self.count_partners_segment(segment)
# segment.write({
# 'partner_count':partner_count
# })
# 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

+ 66
- 0
models/partner.py View File

@ -29,6 +29,30 @@ class partner(models.Model):
partner.address_count = len(partner.address_ids)
except Exception:
partner.address_count = 0
def _compute_email_count(self):
# The current user may not have access rights for donations
for partner in self:
try:
partner.email_count = len(partner.email_ids)
except Exception:
partner.email_count = 0
def _compute_phone_count(self):
# The current user may not have access rights for donations
for partner in self:
try:
partner.phone_count = len(partner.phone_ids)
except Exception:
partner.phone_count = 0
def _compute_relationshipPartner_count(self):
# The current user may not have access rights for donations
for partner in self:
try:
partner.relationshipPartner_count = len(partner.relationshipPartner_ids)
except Exception:
partner.relationshipPartner_count = 0
qualifier_ids = fields.One2many(
'opendons_qualifier.partnerqualifier',
@ -48,9 +72,51 @@ class partner(models.Model):
string='Address',
readonly=True
)
# request_ids = fields.One2many(
# 'opendons.request',
# 'partner_ids',
# string='Request',
# readonly=True
# )
request_ids = fields.Many2many('opendons.request', 'request_partner_rel', 'partner_id', 'request_id', string='requests')
address_count = fields.Integer(
compute='_compute_address_count',
string="# of Addresses",
readonly=True
)
relationshipPartner_ids = fields.One2many(
'opendons_relationship.partner',
'partner_id',
string='Relationship',
readonly=True
)
relationshipPartner_count = fields.Integer(
compute='_compute_relationshipPartner_count',
string="# of Relationship",
readonly=True
)
email_ids = fields.One2many(
'opendons.partneremail',
'partner_id',
string='Email',
readonly=True
)
email_count = fields.Integer(
compute='_compute_email_count',
string="# of email",
readonly=True
)
phone_ids = fields.One2many(
'opendons.partnerphone',
'partner_id',
string='Phone',
readonly=True
)
phone_count = fields.Integer(
compute='_compute_phone_count',
string="# of phone",
readonly=True
)

+ 56
- 0
models/phone.py View File

@ -0,0 +1,56 @@
# -*- coding: utf-8 -*-
from odoo import models, fields, api
from odoo.exceptions import UserError, ValidationError
from psycopg2 import sql, DatabaseError
from odoo.tools.safe_eval import safe_eval, datetime
from werkzeug import utils
class opendons_partnerphone(models.Model):
_name = 'opendons.partnerphone'
_description = 'telephones du contact'
_inherit = ['mail.thread']
phone = fields.Char()
active=fields.Boolean(string='active',default=True,track_visibility='always')
date_active=fields.Date(readonly=True,string='Date active',track_visibility='always')
date_inactive=fields.Date(readonly=True,string='Date inactive',track_visibility='always')
partner_id = fields.Many2one(
'res.partner',
string='partner',
required=True,
index=True,
readonly=True,
track_visibility='onchange',
ondelete='restrict'
)
def write(self,vals):
date_active=False
date_inactive=False
for val in vals:
if val=='active' and not vals['active']:
date_inactive=fields.Date.context_today(self)
if val=='active' and vals['active']:
date_inactive=False
date_active=fields.Date.context_today(self)
vals['date_inactive']=date_inactive
vals['date_active']=date_active
res = super(opendons_partnerphone, self).write(vals)
#Your code goes here
return res

+ 20
- 2
models/qualifier.py View File

@ -33,19 +33,37 @@ class opendons_qualifier(models.Model):
_description = 'qualificatifs de contacts'
name = fields.Char()
type=fields.Selection([('checkbox','checkbox'),('text','text'),('numerical','numerical')], default='checkbox')
#type=fields.Selection([('checkbox','checkbox'),('text','text'),('numerical','numerical')], default='checkbox')
default_value = fields.Char()
description = fields.Text()
category_id = fields.Many2one(
'opendons_qualifier.category', string='Category', tracking=True,
required=True)
@api.model
def create(self,vals):
res = super(opendons_qualifier, self).create(vals)
#ajout du qualificatif nouvellement créé pour chaque contact
for partner in self.env['res.partner'].sudo().search([]):
create_partner_qualifier=self.env['opendons_qualifier.partnerqualifier'].sudo().create(
{'partner_id': int(partner.id),
'qualifier_id':int(res.id)})
return res
class opendons_partnerqualifier(models.Model):
_name = 'opendons_qualifier.partnerqualifier'
_description = 'qualificatifs pour stocker les valeurs au niveau du contact'
actif=fields.Boolean(string='actif',default=False)
value=fields.Char()
qualifier_id=fields.Many2one('opendons_qualifier.qualifier',string='qualifier')
category = fields.Char(related='qualifier_id.category_id.name')


+ 145
- 0
models/relationship.py View File

@ -0,0 +1,145 @@
# -*- coding: utf-8 -*-
from odoo import models, fields, api
from odoo.exceptions import UserError, ValidationError
from psycopg2 import sql, DatabaseError
from werkzeug import utils
class opendons_relationshipType(models.Model):
_name = 'opendons_relationship.type'
_description = 'type de la relation'
name = fields.Char('Name', required=True)
description = fields.Text()
nature_ids = fields.One2many(
'opendons_relationship.nature',
'type_id',
string='Nature',
required=True,
track_visibility='onchange')
@api.constrains('name')
def _check_name(self):
count=self.search_count([('name','=',self.name),('id', '!=', self.id)])
if count>0:
raise UserError('This name already exist')
class opendons_relationshipNature(models.Model):
_name = 'opendons_relationship.nature'
_description = 'nature de la relation'
name = fields.Char('Name', required=True)
description = fields.Text()
type_id = fields.Many2one(
'opendons_relationship.type', string='Type', tracking=True,
required=True)
@api.constrains('name')
def _check_name(self):
count=self.search_count([('name','=',self.name),('id', '!=', self.id)])
if count>0:
raise UserError('This name already exist')
class opendons_relationshipPartner(models.Model):
_name = 'opendons_relationship.partner'
_description = 'relations pour un contact'
type_id=fields.Many2one('opendons_relationship.type',string='type')
nature_id=fields.Many2one('opendons_relationship.nature',string='nature')
#nature = fields.Char(related='type_id.nature_id.name')
partner_id = fields.Many2one(
'res.partner',
string='partner',
required=True,
index=True,
readonly=True,
track_visibility='onchange',
ondelete='restrict'
)
partnerRelationship_id = fields.Many2one(
'res.partner',
string='partner relationship',
required=True,
index=True,
track_visibility='onchange',
ondelete='restrict'
)
active=fields.Boolean(string='active',default=True,track_visibility='always')
#date_active=fields.Date(readonly=True,default=lambda self: fields.Date.today(),string='Date active',track_visibility='always')
date_active=fields.Date(readonly=True,string='Date active',track_visibility='always')
date_inactive=fields.Date(readonly=True,string='Date inactive',track_visibility='always')
@api.onchange('type_id')
def _onchange_type_id(self):
res = {}
res['domain']={'nature_id':[('type_id', '=', self.type_id.id)]}
return res
# def create(self,vals):
# # vals['active']=fields.Date.context_today(self)
# res = super(opendons_relationshipPartner, self).create(vals)
# return res
def write(self,vals):
date_active=False
date_inactive=False
for val in vals:
if val=='active' and not vals['active']:
date_inactive=fields.Date.context_today(self)
if val=='active' and vals['active']:
date_inactive=False
date_active=fields.Date.context_today(self)
vals['date_inactive']=date_inactive
vals['date_active']=date_active
res = super(opendons_relationshipPartner, self).write(vals)
return res
@api.model
def create(self,vals):
vals['date_active']=fields.Date.context_today(self)
res = super(opendons_relationshipPartner, self).create(vals)
#Attention la relation est reciproque entre les 2 contacts,donc on doit créer la relation pour l'autre contact
vals2={}
vals2['type_id']=int(res.type_id)
vals2['nature_id']=int(res.nature_id)
vals2['partner_id']=int(res.partnerRelationship_id)
vals2['partnerRelationship_id']=int(res.partner_id)
vals2['active']=True
vals2['date_active']=fields.Date.context_today(self)
res2=super(opendons_relationshipPartner, self).create(vals2)
return res
# sql_constraints = [
# ('qualifier_uniq', 'unique (qualifier_id,partner_id)', 'A qualifier could be defined only one time on same partner.')
# ]
# @api.constrains('qualifier_id')
# def _check_qualifier_id(self):
# for q in self:
# result=self.search_count([('qualifier_id','=',int(self.qualifier_id)),('id', '!=', self.id),('partner_id','=',int(self.partner_id))])
# if result>0:
# raise UserError('A qualifier could be defined only one time on same partner.')

+ 10
- 1
security/ir.model.access.csv View File

@ -3,4 +3,13 @@ access_opendons_qualifier_qualifier,opendons_qualifier.qualifier,model_opendons_
access_opendons_qualifier_category,opendons_qualifier.category,model_opendons_qualifier_category,donation_main.group_donation_manager,1,1,1,1
access_opendons_qualifier_partnerqualifier,opendons_qualifier.partnerqualifier,model_opendons_qualifier_partnerqualifier,donation_main.group_donation_manager,1,1,1,1
access_opendons_partneraddress,opendons.partneraddress,model_opendons_partneraddress,donation_main.group_donation_manager,1,1,1,1
access_opendons_operations,opendons.operations,model_opendons_operation,donation_main.group_donation_manager,1,1,1,1
access_opendons_operations,opendons.operations,model_opendons_operation,donation_main.group_donation_manager,1,1,1,1
access_opendons_segments,opendons.segments,model_opendons_segment,donation_main.group_donation_manager,1,1,1,1
access_opendons_ensembles,opendons.ensembles,model_opendons_ensemble,donation_main.group_donation_manager,1,1,1,1
access_opendons_requests,opendons.requests,model_opendons_request,donation_main.group_donation_manager,1,1,1,1
access_opendons_relationship_partner,opendons_relationship.partner,model_opendons_relationship_partner,donation_main.group_donation_manager,1,1,1,1
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

+ 3
- 3
views/address.xml View File

@ -3,7 +3,7 @@
<!-- explicit list view definition -->
<record model="ir.ui.view" id="opendons_module1.partneraddress_list">
<record model="ir.ui.view" id="opendons.partneraddress_list">
<field name="name">opendons_partneraddress list</field>
<field name="model">opendons.partneraddress</field>
<field name="arch" type="xml">
@ -20,7 +20,7 @@
</tree>
</field>
</record>
<record id="opendons_module1.partneraddress_search" model="ir.ui.view">
<record id="opendons.partneraddress_search" model="ir.ui.view">
<field name="name">opendons_partneraddress.search</field>
<field name="model">opendons.partneraddress</field>
<field name="arch" type="xml">
@ -30,7 +30,7 @@
</field>
</record>
<record model="ir.ui.view" id="opendons_module1.partneraddress_form" >
<record model="ir.ui.view" id="opendons.partneraddress_form" >
<field name="name">opendons_partneraddress Form</field>
<field name="model">opendons.partneraddress</field>
<field name="arch" type="xml">


+ 64
- 0
views/email.xml View File

@ -0,0 +1,64 @@
<odoo>
<data>
<!-- explicit list view definition -->
<record model="ir.ui.view" id="opendons.partneremail_list">
<field name="name">opendons_partneremail list</field>
<field name="model">opendons.partneremail</field>
<field name="arch" type="xml">
<tree>
<field name="active"/>
<field name="partner_id"/>
<field name="email"/>
</tree>
</field>
</record>
<record id="opendons.partneremail_search" model="ir.ui.view">
<field name="name">opendons_partneremail.search</field>
<field name="model">opendons.partneremail</field>
<field name="arch" type="xml">
<search string="Search Email">
<field name="partner_id"/>
</search>
</field>
</record>
<record model="ir.ui.view" id="opendons.partneremail_form" >
<field name="name">opendons_partneremail Form</field>
<field name="model">opendons.partneremail</field>
<field name="arch" type="xml">
<form string="partneremail_form">
<sheet>
<group name="main">
<field name="partner_id"/>
<field name="email"/>
</group>
<group name="dataquality">
<field name="active"/>
<field name="date_active"/>
<field name="date_inactive"/>
</group>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers"/>
<field name="message_ids" widget="mail_thread"/>
</div>
</form>
</field>
</record>
<!-- actions opening views on models -->
<record model="ir.actions.act_window" id="partneremail_action">
<field name="name">partneremails</field>
<field name="res_model">opendons.partneremail</field>
<field name="view_mode">tree,form</field>
</record>
</data>
</odoo>

+ 15
- 0
views/mail_mail.xml View File

@ -0,0 +1,15 @@
<odoo>
<data>
<record id="view_email_marketing_form" model="ir.ui.view">
<field name="name">operation.emailmarketing.opendons.form</field>
<field name="model">mailing.mailing</field>
<field name="inherit_id" ref="mass_mailing.view_mail_mass_mailing_form" />
<field name="arch" type="xml">
<xpath expr="//field[@name='preview']" position="after">
<field name="operation_id"></field>
<field name="segment_id"></field>
</xpath>
</field>
</record>
</data>
</odoo>

+ 263
- 1
views/operation.xml View File

@ -1,10 +1,272 @@
<odoo>
<data>
<record id="act_operation_segment" model="ir.actions.act_window">
<field name="name">Segments</field>
<field name="res_model">opendons.segment</field>
<field name="view_mode">tree,form,graph</field>
<field name="context">{'search_default_operation_id': active_id}</field>
</record>
<record id="act_operation_ensemble" model="ir.actions.act_window">
<field name="name">Ensembles</field>
<field name="res_model">opendons.ensemble</field>
<field name="view_mode">tree,form,graph</field>
<field name="context">{'search_default_segment_id': active_id}</field>
</record>
<record id="act_operation_request" model="ir.actions.act_window">
<field name="name">Requests</field>
<field name="res_model">opendons.request</field>
<field name="view_mode">tree,form,graph</field>
<field name="context">{'search_default_ensemble_id': active_id}</field>
</record>
<record model="ir.ui.view" id="opendons.operation_list">
<field name="name">opendons_operations list</field>
<field name="model">opendons.operation</field>
<field name="arch" type="xml">
<tree>
<field name="code"/>
<field name="name"/>
<field name="chanel"/>
<field name="partner_count"/>
<!-- <field name="begin_date"/>
<field name="end_date"/> -->
<field name="user_id"/>
<field name="cost"/>
<field name="state" invisible="context.get('recurring_view')"/>
</tree>
</field>
</record>
<record model="ir.ui.view" id="opendons.segment_list">
<field name="name">opendons_segment list</field>
<field name="model">opendons.segment</field>
<field name="arch" type="xml">
<tree decoration-danger="exclusion == True">
<field name="sequence" widget="handle"/>
<field name="code"/>
<field name="name"/>
<field name="logical_operator"/>
<field name="operation_id"/>
<field name="partner_count"/>
<field name="exclusion"/>
</tree>
</field>
</record>
<record id="opendons.segment_search" model="ir.ui.view">
<field name="name">opendons_segment.search</field>
<field name="model">opendons.segment</field>
<field name="arch" type="xml">
<search string="Search segment">
<field name="operation_id"/>
</search>
</field>
</record>
<record model="ir.ui.view" id="opendons.ensemble_list">
<field name="name">opendons_ensemble list</field>
<field name="model">opendons.ensemble</field>
<field name="arch" type="xml">
<tree>
<field name="name"/>
<field name="logical_operator"/>
<field name="partner_count"/>
<field name="segment_id"/>
</tree>
</field>
</record>
<record id="opendons.ensemble_search" model="ir.ui.view">
<field name="name">opendons_ensemble.search</field>
<field name="model">opendons.ensemble</field>
<field name="arch" type="xml">
<search string="Search ensemble">
<field name="segment_id"/>
</search>
</field>
</record>
<record model="ir.ui.view" id="opendons.request_list">
<field name="name">opendons_request list</field>
<field name="model">opendons.request</field>
<field name="arch" type="xml">
<!-- <header>
<button type="object" name="refresh_partners_count" string="Refresh"/>
</header> -->
<tree>
<field name="name"/>
<field name="mailing_domain"/>
<field name="partner_count"/>
<field name="ensemble_id"/>
</tree>
</field>
</record>
<record id="opendons.request_search" model="ir.ui.view">
<field name="name">opendons_request.search</field>
<field name="model">opendons.request</field>
<field name="arch" type="xml">
<search string="Search request">
<field name="ensemble_id"/>
</search>
</field>
</record>
<record model="ir.ui.view" id="opendons.operation_form" >
<field name="name">opendons_operation Form</field>
<field name="model">opendons.operation</field>
<field name="arch" type="xml">
<form string="operation_form">
<header>
<button type="object" name="validate" string="Validate"
class="oe_highlight" states="draft"/>
<button type="object" name="cancel2draft"
string="Back to Draft" states="cancel"/>
<button type="object" name="done2cancel" string="Cancel"
states="done" />
<button type="object" name="csv_export_operation" string="Generate csv export"
states="done" />
<field name="state" widget="statusbar"
invisible="context.get('recurring_view')"
statusbar_visible="draft,done"/>
</header>
<sheet>
<group name="operation">
<field name="code"/>
<field name="name"/>
<field name="chanel"/>
<field name="cost"/>
<field name="csv_export" filename="document_fname" widget="binary"/>
<field name="document_fname" invisible="1"/>
</group>
<group name="segment">
<div name="button_box" class="oe_button_box">
<button class="oe_stat_button" type="action"
name="%(act_operation_segment)d"
icon="fa-info">
<field string="Segments" name="segment_count" widget="statinfo"/>
</button>
</div>
</group>
</sheet>
</form>
</field>
</record>
<record model="ir.ui.view" id="opendons.segment_form" >
<field name="name">opendons_segment Form</field>
<field name="model">opendons.segment</field>
<field name="arch" type="xml">
<form string="segment_form">
<sheet>
<group name="segment">
<field name="operation_id"/>
<field name="code"/>
<field name="name"/>
<field name="logical_operator"/>
<field name="exclusion"/>
<field name="partner_count"/>
<field name="cost"/>
</group>
<group name="ensemble">
<div name="button_box" class="oe_button_box">
<button class="oe_stat_button" type="action"
name="%(act_operation_ensemble)d"
icon="fa-info">
<field string="Ensembles" name="ensemble_count" widget="statinfo"/>
</button>
</div>
</group>
</sheet>
</form>
</field>
</record>
<record model="ir.ui.view" id="opendons.ensemble_form" >
<field name="name">opendons_ensemble Form</field>
<field name="model">opendons.ensemble</field>
<field name="arch" type="xml">
<form string="ensemble_form">
<header> <button type="object" name="csv_export_ensemble" string="Generate csv export"/>
</header>
<sheet>
<group name="ensemble">
<field name="segment_id"/>
<field name="name"/>
<field name="logical_operator"/>
<field name="mailing_domain"/>
<field name="partner_count"/>
<field name="csv_export" filename="document_fname" widget="binary"/>
<field name="document_fname" invisible="1"/>
</group>
<group name="request">
<div name="button_box" class="oe_button_box">
<button class="oe_stat_button" type="action"
name="%(act_operation_request)d"
icon="fa-info">
<field string="Request" name="request_count" widget="statinfo"/>
</button>
</div>
</group>
</sheet>
</form>
</field>
</record>
<record model="ir.ui.view" id="opendons.request_form" >
<field name="name">opendons_request Form</field>
<field name="model">opendons.request</field>
<field name="arch" type="xml">
<form string="request_form">
<sheet>
<group name="request">
<field name="ensemble_id"/>
<field name="name"/>
<field name="mailing_domain" widget="domain" options="{'model': 'res.partner', 'in_dialog': true}"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="operation_action" model="ir.actions.act_window">
<field name="name">Opérations</field>
<field name="res_model">opendons.operation</field>
<field name="view_mode">tree,form,pivot,graph</field>
</record>
<menuitem id="operation_top_menu" sequence="15"
name="operations"/>
name="Operations"/>
<menuitem id="operation_title_menu" parent="operation_top_menu"
sequence="15" name="Opérations"/>
<menuitem id="operation_menu" action="operation_action"
parent="operation_title_menu" sequence="10"/>
</data>
</odoo>

+ 47
- 3
views/partner.xml View File

@ -1,6 +1,5 @@
<?xml version="1.0"?>
<odoo>
<record id="act_partner_qualifier" model="ir.actions.act_window">
@ -17,6 +16,28 @@
<field name="context">{'search_default_partner_id': active_id}</field>
</record>
<record id="act_partner_email" model="ir.actions.act_window">
<field name="name">Emails</field>
<field name="res_model">opendons.partneremail</field>
<field name="view_mode">tree,form,graph</field>
<field name="context">{'search_default_partner_id': active_id}</field>
</record>
<record id="act_partner_phone" model="ir.actions.act_window">
<field name="name">phones</field>
<field name="res_model">opendons.partnerphone</field>
<field name="view_mode">tree,form,graph</field>
<field name="context">{'search_default_partner_id': active_id}</field>
</record>
<record id="act_partner_relationship" model="ir.actions.act_window">
<field name="name">Relationships</field>
<field name="res_model">opendons_relationship.partner</field>
<field name="view_mode">tree,form,graph</field>
<field name="context">{'search_default_partner_id': active_id}</field>
</record>
<record id="view_partner_form" model="ir.ui.view">
<field name="name">qualifier.button.res.partner.form</field>
<field name="model">res.partner</field>
@ -27,15 +48,33 @@
<button class="oe_stat_button" type="action"
name="%(act_partner_qualifier)d"
icon="fa-check-square">
icon="fa-info">
<field string="Qualifiers" name="qualifier_count" widget="statinfo"/>
</button>
<button class="oe_stat_button" type="action"
name="%(act_partner_address)d"
icon="fa-check-square">
icon="fa-home">
<field string="Address" name="address_count" widget="statinfo"/>
</button>
<button class="oe_stat_button" type="action"
name="%(act_partner_email)d"
icon="fa-envelope">
<field string="Email" name="email_count" widget="statinfo"/>
</button>
<button class="oe_stat_button" type="action"
name="%(act_partner_phone)d"
icon="fa-phone">
<field string="Phone" name="phone_count" widget="statinfo"/>
</button>
<button class="oe_stat_button" type="action"
name="%(act_partner_relationship)d"
icon="fa-handshake-o">
<field string="Relationship" name="relationshipPartner_count" widget="statinfo"/>
</button>
</xpath>
</field>
</record>
@ -48,5 +87,10 @@
<menuitem id="opendons_qualifier_category_menu" action="category_action"
parent="opendons_qualifier_title_menu" sequence="2"/>
<menuitem id="opendons_relationship_title_menu" name ="Relationships"
parent="contacts.menu_contacts" sequence="22"/>
</odoo>

+ 64
- 0
views/phone.xml View File

@ -0,0 +1,64 @@
<odoo>
<data>
<!-- explicit list view definition -->
<record model="ir.ui.view" id="opendons.partnerphone_list">
<field name="name">opendons_partnerphone list</field>
<field name="model">opendons.partnerphone</field>
<field name="arch" type="xml">
<tree>
<field name="active"/>
<field name="partner_id"/>
<field name="phone"/>
</tree>
</field>
</record>
<record id="opendons.partnerphone_search" model="ir.ui.view">
<field name="name">opendons_partnerphone.search</field>
<field name="model">opendons.partnerphone</field>
<field name="arch" type="xml">
<search string="Search phone">
<field name="partner_id"/>
</search>
</field>
</record>
<record model="ir.ui.view" id="opendons.partnerphone_form" >
<field name="name">opendons_partnerphone Form</field>
<field name="model">opendons.partnerphone</field>
<field name="arch" type="xml">
<form string="partnerphone_form">
<sheet>
<group name="main">
<field name="partner_id"/>
<field name="phone"/>
</group>
<group name="dataquality">
<field name="active"/>
<field name="date_active"/>
<field name="date_inactive"/>
</group>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers"/>
<field name="message_ids" widget="mail_thread"/>
</div>
</form>
</field>
</record>
<!-- actions opening views on models -->
<record model="ir.actions.act_window" id="partnerphone_action">
<field name="name">partnerphones</field>
<field name="res_model">opendons.partnerphone</field>
<field name="view_mode">tree,form</field>
</record>
</data>
</odoo>

+ 11
- 14
views/qualifier.xml View File

@ -2,7 +2,7 @@
<data>
<!-- explicit list view definition -->
<record model="ir.ui.view" id="opendons_module1.category_list">
<record model="ir.ui.view" id="opendons.category_list">
<field name="name">opendons_qualifier_category list</field>
<field name="model">opendons_qualifier.category</field>
<field name="arch" type="xml">
@ -14,14 +14,13 @@
</field>
</record>
<record model="ir.ui.view" id="opendons_module1.qualifier_list">
<record model="ir.ui.view" id="opendons.qualifier_list">
<field name="name">opendons_qualifier list</field>
<field name="model">opendons_qualifier.qualifier</field>
<field name="arch" type="xml">
<tree>
<field name="name"/>
<field name="category_id"/>
<field name="type"/>
<field name="default_value"/>
<field name="description"/>
@ -29,18 +28,19 @@
</field>
</record>
<record model="ir.ui.view" id="opendons_module1.partnerqualifier_list">
<record model="ir.ui.view" id="opendons.partnerqualifier_list">
<field name="name">opendons_partnerqualifier list</field>
<field name="model">opendons_qualifier.partnerqualifier</field>
<field name="arch" type="xml">
<tree>
<tree string="Qualifiers" editable="top">
<field name="category" string="category"/>
<field name="qualifier_id"/>
<field name="actif"/>
<field name="value"/>
</tree>
</field>
</record>
<record id="opendons_module1.partnerqualifier_search" model="ir.ui.view">
<record id="opendons.partnerqualifier_search" model="ir.ui.view">
<field name="name">opendons_partnerqualifier.search</field>
<field name="model">opendons_qualifier.partnerqualifier</field>
<field name="arch" type="xml">
@ -50,22 +50,19 @@
</field>
</record>
<record model="ir.ui.view" id="opendons_module1.partnerqualifier_form" >
<record model="ir.ui.view" id="opendons.partnerqualifier_form" >
<field name="name">opendons_partnerqualifier Form</field>
<field name="model">opendons_qualifier.partnerqualifier</field>
<field name="arch" type="xml">
<form string="partnerqualifier_form">
<sheet>
<label for="partner_id" string="Partner"/>
<group name="qualifier">
<field name="partner_id"/>
<br/>
<label for="qualifier_id" string="Qualifier"/>
<field name="qualifier_id"/>
<br/>
<label for="value" string="value"/>
<field name="actif"/>
<field name="value"/>
</group>
</sheet>
</form>
</field>


+ 113
- 0
views/relationship.xml View File

@ -0,0 +1,113 @@
<odoo>
<data>
<!-- explicit list view definition -->
<record model="ir.ui.view" id="opendons.relationship_type_list">
<field name="name">opendons_relationship_type list</field>
<field name="model">opendons_relationship.type</field>
<field name="arch" type="xml">
<tree>
<field name="name" />
<field name="description" />
</tree>
</field>
</record>
<record model="ir.ui.view" id="opendons.relationship_nature_list">
<field name="name">opendons_relationship_nature list</field>
<field name="model">opendons_relationship.nature</field>
<field name="arch" type="xml">
<tree>
<field name="name" />
<field name="type_id" />
<field name="description" />
</tree>
</field>
</record>
<record model="ir.ui.view" id="opendons.relationship_partner_list">
<field name="name">opendons_relationship_partner list</field>
<field name="model">opendons_relationship.partner</field>
<field name="arch" type="xml">
<tree>
<field name="partnerRelationship_id"/>
<field name="type_id" />
<field name="nature_id" />
</tree>
</field>
</record>
<record id="opendons.relationship_partner_search" model="ir.ui.view">
<field name="name">opendons_relationship_partner.search</field>
<field name="model">opendons_relationship.partner</field>
<field name="arch" type="xml">
<search string="Search Relationship">
<field name="partner_id" />
</search>
</field>
</record>
<record model="ir.ui.view" id="opendons.relationship_partner_form">
<field name="name">opendons_relationshipPartner Form</field>
<field name="model">opendons_relationship.partner</field>
<field name="arch" type="xml">
<form string="relationship_partner_form">
<sheet>
<group name="main">
<field name="partner_id" />
<field name="partnerRelationship_id" />
<field name="type_id" />
<field name="nature_id" />
</group>
<group name="dataquality">
<!-- <field name="active" widget="date" options="{'format': 'dd/MM/yyyy HH/mm'}"/> -->
<field name="active"/>
<field name="date_active"/>
<!-- <field name="date_active" position="attributes"> -->
<!-- <attribute name="t-options">{"format": "dd / MM / yyyy HH / mm"}</attribute> -->
<field name="date_inactive"/>
</group>
</sheet>
</form>
</field>
</record>
<!-- actions opening views on models -->
<record model="ir.actions.act_window" id="relationship_type_action">
<field name="name">relationshipTypes</field>
<field name="res_model">opendons_relationship.type</field>
<field name="view_mode">tree,form</field>
</record>
<record model="ir.actions.act_window" id="relationship_nature_action">
<field name="name">relationshipNature</field>
<field name="res_model">opendons_relationship.nature</field>
<field name="view_mode">tree,form</field>
</record>
<record model="ir.actions.act_window" id="relationship_partner_action">
<field name="name">relationshipPartner</field>
<field name="res_model">opendons_relationship.partner</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem id="opendons_relationship_type_menu" action="relationship_type_action"
parent="opendons_relationship_title_menu" sequence="1"/>
<menuitem id="opendons_relationship_nature_menu" action="relationship_nature_action"
parent="opendons_relationship_title_menu" sequence="2"/>
</data>
</odoo>

Loading…
Cancel
Save