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


+ 5
- 1
models/__init__.py View File

@ -3,4 +3,8 @@
from . import qualifier from . import qualifier
from . import partner from . import partner
from . import address 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): def write(self,vals):
date_active=False
date_inactive=False
for val in vals: for val in vals:
if val=='active' and not vals['active']: if val=='active' and not vals['active']:
date_inactive=fields.Date.context_today(self) date_inactive=fields.Date.context_today(self)
if val=='active' and vals['active']: 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 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) 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 psycopg2 import sql, DatabaseError
from werkzeug import utils 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): class opendons_operation(models.Model):
_name = 'opendons.operation' _name = 'opendons.operation'
@ -11,8 +30,10 @@ class opendons_operation(models.Model):
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,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([ chanel=fields.Selection([
('mail', 'Mailing'), ('mail', 'Mailing'),
('email', 'E-mailing'), ('email', 'E-mailing'),
@ -52,19 +73,115 @@ class opendons_operation(models.Model):
'opendons.segment', 'opendons.segment',
'operation_id', 'operation_id',
string='Segments', 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): class opendons_segment(models.Model):
_name = 'opendons.segment' _name = 'opendons.segment'
_description = 'operation marketing segment : a segment is a part of contacts selected for an operation ' _description = 'operation marketing segment : a segment is a part of contacts selected for an operation '
_inherit = ['mail.thread'] _inherit = ['mail.thread']
sequence = fields.Integer(string="sequence", default=10)
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,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( cost = fields.Monetary(
string='Cost', string='Cost',
currency_field='currency_id') currency_field='currency_id')
partner_count = fields.Integer(string="count",readonly=True)
@api.model @api.model
def _default_currency(self): def _default_currency(self):
@ -82,8 +199,318 @@ class opendons_segment(models.Model):
) )
operation_id = fields.Many2one( 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) partner.address_count = len(partner.address_ids)
except Exception: except Exception:
partner.address_count = 0 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( qualifier_ids = fields.One2many(
'opendons_qualifier.partnerqualifier', 'opendons_qualifier.partnerqualifier',
@ -48,9 +72,51 @@ class partner(models.Model):
string='Address', string='Address',
readonly=True 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( address_count = fields.Integer(
compute='_compute_address_count', compute='_compute_address_count',
string="# of Addresses", string="# of Addresses",
readonly=True 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' _description = 'qualificatifs de contacts'
name = fields.Char() 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() default_value = fields.Char()
description = fields.Text() description = fields.Text()
category_id = fields.Many2one( category_id = fields.Many2one(
'opendons_qualifier.category', string='Category', tracking=True, 'opendons_qualifier.category', string='Category', tracking=True,
required=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): class opendons_partnerqualifier(models.Model):
_name = 'opendons_qualifier.partnerqualifier' _name = 'opendons_qualifier.partnerqualifier'
_description = 'qualificatifs pour stocker les valeurs au niveau du contact' _description = 'qualificatifs pour stocker les valeurs au niveau du contact'
actif=fields.Boolean(string='actif',default=False)
value=fields.Char() value=fields.Char()
qualifier_id=fields.Many2one('opendons_qualifier.qualifier',string='qualifier') qualifier_id=fields.Many2one('opendons_qualifier.qualifier',string='qualifier')
category = fields.Char(related='qualifier_id.category_id.name') 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_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_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_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 --> <!-- 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="name">opendons_partneraddress list</field>
<field name="model">opendons.partneraddress</field> <field name="model">opendons.partneraddress</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
@ -20,7 +20,7 @@
</tree> </tree>
</field> </field>
</record> </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="name">opendons_partneraddress.search</field>
<field name="model">opendons.partneraddress</field> <field name="model">opendons.partneraddress</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
@ -30,7 +30,7 @@
</field> </field>
</record> </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="name">opendons_partneraddress Form</field>
<field name="model">opendons.partneraddress</field> <field name="model">opendons.partneraddress</field>
<field name="arch" type="xml"> <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> <odoo>
<data> <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" <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> </data>
</odoo> </odoo>

+ 47
- 3
views/partner.xml View File

@ -1,6 +1,5 @@
<?xml version="1.0"?> <?xml version="1.0"?>
<odoo> <odoo>
<record id="act_partner_qualifier" model="ir.actions.act_window"> <record id="act_partner_qualifier" model="ir.actions.act_window">
@ -17,6 +16,28 @@
<field name="context">{'search_default_partner_id': active_id}</field> <field name="context">{'search_default_partner_id': active_id}</field>
</record> </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"> <record id="view_partner_form" model="ir.ui.view">
<field name="name">qualifier.button.res.partner.form</field> <field name="name">qualifier.button.res.partner.form</field>
<field name="model">res.partner</field> <field name="model">res.partner</field>
@ -27,15 +48,33 @@
<button class="oe_stat_button" type="action" <button class="oe_stat_button" type="action"
name="%(act_partner_qualifier)d" name="%(act_partner_qualifier)d"
icon="fa-check-square">
icon="fa-info">
<field string="Qualifiers" name="qualifier_count" widget="statinfo"/> <field string="Qualifiers" name="qualifier_count" widget="statinfo"/>
</button> </button>
<button class="oe_stat_button" type="action" <button class="oe_stat_button" type="action"
name="%(act_partner_address)d" name="%(act_partner_address)d"
icon="fa-check-square">
icon="fa-home">
<field string="Address" name="address_count" widget="statinfo"/> <field string="Address" name="address_count" widget="statinfo"/>
</button> </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> </xpath>
</field> </field>
</record> </record>
@ -48,5 +87,10 @@
<menuitem id="opendons_qualifier_category_menu" action="category_action" <menuitem id="opendons_qualifier_category_menu" action="category_action"
parent="opendons_qualifier_title_menu" sequence="2"/> parent="opendons_qualifier_title_menu" sequence="2"/>
<menuitem id="opendons_relationship_title_menu" name ="Relationships"
parent="contacts.menu_contacts" sequence="22"/>
</odoo> </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> <data>
<!-- explicit list view definition --> <!-- 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="name">opendons_qualifier_category list</field>
<field name="model">opendons_qualifier.category</field> <field name="model">opendons_qualifier.category</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
@ -14,14 +14,13 @@
</field> </field>
</record> </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="name">opendons_qualifier list</field>
<field name="model">opendons_qualifier.qualifier</field> <field name="model">opendons_qualifier.qualifier</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<tree> <tree>
<field name="name"/> <field name="name"/>
<field name="category_id"/> <field name="category_id"/>
<field name="type"/>
<field name="default_value"/> <field name="default_value"/>
<field name="description"/> <field name="description"/>
@ -29,18 +28,19 @@
</field> </field>
</record> </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="name">opendons_partnerqualifier list</field>
<field name="model">opendons_qualifier.partnerqualifier</field> <field name="model">opendons_qualifier.partnerqualifier</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<tree>
<tree string="Qualifiers" editable="top">
<field name="category" string="category"/> <field name="category" string="category"/>
<field name="qualifier_id"/> <field name="qualifier_id"/>
<field name="actif"/>
<field name="value"/> <field name="value"/>
</tree> </tree>
</field> </field>
</record> </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="name">opendons_partnerqualifier.search</field>
<field name="model">opendons_qualifier.partnerqualifier</field> <field name="model">opendons_qualifier.partnerqualifier</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
@ -50,22 +50,19 @@
</field> </field>
</record> </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="name">opendons_partnerqualifier Form</field>
<field name="model">opendons_qualifier.partnerqualifier</field> <field name="model">opendons_qualifier.partnerqualifier</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<form string="partnerqualifier_form"> <form string="partnerqualifier_form">
<sheet> <sheet>
<label for="partner_id" string="Partner"/>
<group name="qualifier">
<field name="partner_id"/> <field name="partner_id"/>
<br/>
<label for="qualifier_id" string="Qualifier"/>
<field name="qualifier_id"/> <field name="qualifier_id"/>
<br/>
<label for="value" string="value"/>
<field name="actif"/>
<field name="value"/> <field name="value"/>
</group>
</sheet> </sheet>
</form> </form>
</field> </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