Browse Source

2022-01-28

master
root 3 years ago
parent
commit
349a28ed24
9 changed files with 261 additions and 85 deletions
  1. +1
    -0
      __manifest__.py
  2. +1
    -0
      models/__init__.py
  3. +19
    -0
      models/donation.py
  4. +150
    -72
      models/operation.py
  5. +16
    -0
      models/partner.py
  6. +1
    -1
      security/ir.model.access.csv
  7. +21
    -0
      views/donation.xml
  8. +13
    -10
      views/operation.xml
  9. +39
    -2
      views/partner.xml

+ 1
- 0
__manifest__.py View File

@ -30,6 +30,7 @@
'views/email.xml', 'views/email.xml',
'views/phone.xml', 'views/phone.xml',
'views/partner.xml', 'views/partner.xml',
'views/donation.xml',
'views/relationship.xml', 'views/relationship.xml',
'views/operation.xml', 'views/operation.xml',
'views/templates.xml', 'views/templates.xml',


+ 1
- 0
models/__init__.py View File

@ -2,6 +2,7 @@
from . import qualifier from . import qualifier
from . import partner from . import partner
from . import donation
from . import address from . import address
from . import email from . import email
from . import phone from . import phone


+ 19
- 0
models/donation.py View File

@ -0,0 +1,19 @@
from odoo import models, fields, api
from odoo.exceptions import UserError, ValidationError
from psycopg2 import sql, DatabaseError
from werkzeug import utils
class DonationDonation(models.Model):
_inherit = 'donation.donation'
operation_id = fields.Many2one(
'opendons.operation',
string='Donation Operation',
track_visibility='onchange',
ondelete='restrict'
)

+ 150
- 72
models/operation.py View File

@ -82,8 +82,8 @@ class opendons_operation(models.Model):
) )
state = fields.Selection([ state = fields.Selection([
('draft', 'Draft'), ('draft', 'Draft'),
('done', 'Done'),
('cancel', 'Cancelled')],
('validated', 'Validated'),
('exported', 'Exported')],
string='State', string='State',
readonly=True, readonly=True,
copy=False, copy=False,
@ -107,31 +107,38 @@ class opendons_operation(models.Model):
def validate(self): def validate(self):
for operation in self: for operation in self:
vals = {'state': 'done'}
vals = {'state': 'validated'}
operation.write(vals) operation.write(vals)
return return
def done2cancel(self):
def validated2draft(self):
'''from Done state to Cancel state''' '''from Done state to Cancel state'''
for operation in self: for operation in self:
operation.state = 'cancel'
def cancel2draft(self):
'''from Cancel state to Draft state'''
for operation in self:
operation.state = 'draft' operation.state = 'draft'
def validated2exported(self):
'''from Done state to Cancel state'''
for operation in self:
operation.state = 'exported'
def exported2validated(self):
'''from Done state to Cancel state'''
for operation in self:
operation.state = 'validated'
def csv_export_operation(self): def csv_export_operation(self):
with open('export.csv', mode='w') as file: with open('export.csv', mode='w') as file:
writer = csv.writer(file, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL) writer = csv.writer(file, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
# create a row contains heading of each column
# ggcreate a row containds heading of each column
writer.writerow(['name', 'email']) writer.writerow(['name', 'email'])
# fetch products and write respective data. # fetch products and write respective data.
partners = self.env['res.partner'].sudo().search([])
partners = self.select_partner_operation()
for p in partners: for p in partners:
name=p.name name=p.name
@ -147,7 +154,15 @@ class opendons_operation(models.Model):
self.document_fname='operation'+str(self.id)+'.csv' self.document_fname='operation'+str(self.id)+'.csv'
return return
#def select_partner_operation(self):
#le principe est de selectionner les contacts associés aux segments avec les règles suivantes :
#RG1: si un contact est présent dans un segment d'exclusion, alos on le retire de la sélection
#RG2: la priorité des segments est l'ordre de présentation dans la liste des segmments
#RG3: au final, un contact sélectionné est rattaché à l'opération avec le segment d'appartenance
def export_partners(self): def export_partners(self):
partners = self.env['res.partner'].sudo().search([]) partners = self.env['res.partner'].sudo().search([])
@ -181,7 +196,8 @@ class opendons_segment(models.Model):
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)
partner_count = fields.Integer(string="partners count", compute='_count_partner_segment',readonly=True)
mailing_domain = fields.Char(string='partners selection', readonly=True)
@api.model @api.model
def _default_currency(self): def _default_currency(self):
@ -204,7 +220,7 @@ class opendons_segment(models.Model):
index=True, index=True,
readonly=True, readonly=True,
track_visibility='onchange', track_visibility='onchange',
ondelete='restrict'
ondelete='cascade'
) )
ensemble_ids = fields.One2many( ensemble_ids = fields.One2many(
@ -219,6 +235,14 @@ class opendons_segment(models.Model):
string="# of ensemble", string="# of ensemble",
readonly=True readonly=True
) )
@api.depends('mailing_domain')
def _count_partner_segment(self):
for rec in self:
if rec.mailing_domain :
rec.partner_count=self.env['res.partner'].search_count(eval(rec.mailing_domain))
else:
rec.partner_count=0
def _compute_ensemble_count(self): def _compute_ensemble_count(self):
# The current user may not have access rights for donations # The current user may not have access rights for donations
@ -240,7 +264,21 @@ class opendons_segment(models.Model):
operation.write({'segment_count':len(operation.segment_ids)}) operation.write({'segment_count':len(operation.segment_ids)})
return res return res
def write(self,vals):
res=super(opendons_segment, self).write(vals)
mailing_domain=False
for val in vals:
if val=='logical_operator':
mailing_domain=self.env['opendons.ensemble'].update_segment_domain(self)
if mailing_domain:
vals['mailing_domain']=mailing_domain
res=super(opendons_segment, self).write(vals)
class opendons_ensemble(models.Model): class opendons_ensemble(models.Model):
@ -250,17 +288,15 @@ class opendons_ensemble(models.Model):
name=fields.Char(string='Name',required=True, translate=True,track_visibility='always') name=fields.Char(string='Name',required=True, translate=True,track_visibility='always')
logical_operator = fields.Selection([('union','union'),('inter','intersection')],'Type',default='union') logical_operator = fields.Selection([('union','union'),('inter','intersection')],'Type',default='union')
mailing_domain = fields.Char(
string='partners selection',
readonly=True, store=True)
partner_count = fields.Integer(string="count",readonly=True)
mailing_domain = fields.Char(string='partners selection', readonly=True)
partner_count = fields.Integer(string="partners count",compute='_count_partner_ensemble',readonly=True)
sequence = fields.Integer(string="sequence", default=10) sequence = fields.Integer(string="sequence", default=10)
segment_id = fields.Many2one( segment_id = fields.Many2one(
'opendons.segment','Segment', 'opendons.segment','Segment',
index=True, index=True,
readonly=True, readonly=True,
track_visibility='onchange', track_visibility='onchange',
ondelete='restrict')
ondelete='cascade')
request_ids = fields.One2many( request_ids = fields.One2many(
'opendons.request', 'opendons.request',
@ -277,6 +313,15 @@ class opendons_ensemble(models.Model):
csv_export = fields.Binary('csv export', filters='.csv', readonly=True) csv_export = fields.Binary('csv export', filters='.csv', readonly=True)
document_fname=fields.Char() document_fname=fields.Char()
@api.depends('mailing_domain')
def _count_partner_ensemble(self):
for rec in self:
if rec.mailing_domain :
rec.partner_count=self.env['res.partner'].search_count(eval(rec.mailing_domain))
else:
rec.partner_count=0
def csv_export_ensemble(self): def csv_export_ensemble(self):
with open('export.csv', mode='w') as file: with open('export.csv', mode='w') as file:
@ -312,6 +357,34 @@ class opendons_ensemble(models.Model):
def update_segment_domain(self,segment):
logical_operator=segment.logical_operator
if logical_operator=='union': str_operator='"|",'
if logical_operator=='inter': str_operator='"&",'
mailing_domain=''
if len(segment.ensemble_ids)>1:
i=1
for ens in segment.ensemble_ids:
if i==1: mailing_domain=ens.mailing_domain[1:-1]
if i>1 :
if ens.mailing_domain!=False:
mailing_domain=str_operator +mailing_domain+","+ens.mailing_domain[1:-1]
i+=1
mailing_domain="["+mailing_domain+"]"
if len(segment.ensemble_ids)==1:
for ens in segment.ensemble_ids:
mailing_domain=ens.mailing_domain
return mailing_domain
@api.model @api.model
def create(self,vals): def create(self,vals):
@ -320,8 +393,13 @@ class opendons_ensemble(models.Model):
segment=self.env['opendons.segment'].search([('id','=',int(res.segment_id))]) segment=self.env['opendons.segment'].search([('id','=',int(res.segment_id))])
#_logger.error('segment.id='+str(res.operation_id)) #_logger.error('segment.id='+str(res.operation_id))
segment_domain=self.update_segment_domain(segment)
segment.write({'ensemble_count':len(segment.ensemble_ids)})
segment.write(
{
'ensemble_count':len(segment.ensemble_ids),
'mailing_domain':segment_domain,
})
return res return res
def write(self,vals): def write(self,vals):
@ -331,9 +409,18 @@ class opendons_ensemble(models.Model):
for val in vals: for val in vals:
if val=='logical_operator': if val=='logical_operator':
mailing_domain=self.env['opendons.request'].update_ensemble_domaine(self)
mailing_domain=self.env['opendons.request'].update_ensemble_domain(self)
if mailing_domain:
vals['mailing_domain']=mailing_domain
segment=self.env['opendons.segment'].search([('id','=',int(self.segment_id))])
segment_domain=self.update_segment_domain(segment)
segment.write({
'ensemble_count':len(segment.ensemble_ids),
'mailing_domain':segment_domain
})
if mailing_domain: vals['mailing_domain']=mailing_domain
res=super(opendons_ensemble, self).write(vals) res=super(opendons_ensemble, self).write(vals)
@ -343,8 +430,7 @@ class opendons_request(models.Model):
_inherit = ['mail.thread'] _inherit = ['mail.thread']
sequence = fields.Integer(string="sequence", default=10) sequence = fields.Integer(string="sequence", default=10)
name=fields.Char(string='Name',required=True, translate=True,track_visibility='always') name=fields.Char(string='Name',required=True, translate=True,track_visibility='always')
partner_count = fields.Integer(string="count",readonly=True)
partner_count = fields.Integer(string="partners count", compute='_count_partner_request', readonly=True)
partner_ids = fields.Many2many('res.partner', 'partner_request_rel', 'partner_id', 'request_id', string='partners') partner_ids = fields.Many2many('res.partner', 'partner_request_rel', 'partner_id', 'request_id', string='partners')
@ -353,13 +439,20 @@ class opendons_request(models.Model):
index=True, index=True,
readonly=True, readonly=True,
track_visibility='onchange', track_visibility='onchange',
ondelete='restrict')
ondelete='cascade')
mailing_domain = fields.Char( mailing_domain = fields.Char(
string='Domain', string='Domain',
readonly=False, store=True) readonly=False, store=True)
@api.depends('mailing_domain')
def _count_partner_request(self):
for rec in self:
if rec.mailing_domain :
rec.partner_count=self.env['res.partner'].search_count(eval(rec.mailing_domain))
else:
rec.partner_count=0
def count_partners_ensemble(self,ensemble): def count_partners_ensemble(self,ensemble):
#on boucle sur toutes les requêtes de l'ensemble pour compter les contacts #on boucle sur toutes les requêtes de l'ensemble pour compter les contacts
@ -370,7 +463,7 @@ class opendons_request(models.Model):
return result return result
def update_ensemble_domaine(self,ensemble):
def update_ensemble_domain(self,ensemble):
#on boucle sur toutes les requêtes de l'ensemble #on boucle sur toutes les requêtes de l'ensemble
logical_operator=ensemble.logical_operator logical_operator=ensemble.logical_operator
if logical_operator=='union': str_operator='"|",' if logical_operator=='union': str_operator='"|",'
@ -381,16 +474,19 @@ class opendons_request(models.Model):
if len(ensemble.request_ids)>1: if len(ensemble.request_ids)>1:
i=1 i=1
for req in ensemble.request_ids: for req in ensemble.request_ids:
if i==1: mailing_domain=req.mailing_domain[1:-1] if i==1: mailing_domain=req.mailing_domain[1:-1]
if i>1 : mailing_domain=str_operator +mailing_domain+","+req.mailing_domain[1:-1] if i>1 : mailing_domain=str_operator +mailing_domain+","+req.mailing_domain[1:-1]
i+=1 i+=1
mailing_domain="["+mailing_domain+"]" mailing_domain="["+mailing_domain+"]"
if len(ensemble.request_ids)==1:
mailing_domain=req.mailing_domain
#si une seule requête pour l'ensemble
if len(ensemble.request_ids)==1:
for req in ensemble.request_ids:
mailing_domain=req.mailing_domain
return mailing_domain return mailing_domain
def count_partners_segment(self,segment): def count_partners_segment(self,segment):
@ -410,19 +506,7 @@ class opendons_request(models.Model):
result+=segment.partner_count result+=segment.partner_count
return result 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): def refresh_partners_count(self):
@ -431,14 +515,13 @@ class opendons_request(models.Model):
return True return True
@api.model @api.model
def create(self,vals): def create(self,vals):
partners=self.count_partner_request(vals) partners=self.count_partner_request(vals)
if vals['mailing_domain']=="[]" :
vals['mailing_domain']="[[\"id\",\"!=\",False]]"
res=super(opendons_request, self).create(vals) res=super(opendons_request, self).create(vals)
@ -447,26 +530,20 @@ class opendons_request(models.Model):
#partner_count=self.count_partners_ensemble(ensemble) #partner_count=self.count_partners_ensemble(ensemble)
#mise à jour du domaine pour l'ensemble #mise à jour du domaine pour l'ensemble
ensemble_domaine=self.update_ensemble_domaine(ensemble)
ensemble_domain=self.update_ensemble_domain(ensemble)
ensemble.write( ensemble.write(
{'request_count':len(ensemble.request_ids), {'request_count':len(ensemble.request_ids),
'mailing_domain':ensemble_domaine
'mailing_domain':ensemble_domain
}) })
# segment=self.env['opendons.segment'].search([('id','=',int(ensemble.segment_id))])
# partner_count=self.count_partners_segment(segment)
# segment.write({
# 'partner_count':partner_count
# })
segment=self.env['opendons.segment'].search([('id','=',int(ensemble.segment_id))])
segment_domain=ensemble.update_segment_domain(segment)
segment.write({
'mailing_domain':segment_domain
})
# operation=self.env['opendons.operation'].search([('id','=',int(segment.operation_id))])
# partner_count=self.count_partners_operation(operation)
# operation.write({
# 'partner_count':partner_count
# })
return res return res
def write(self,vals): def write(self,vals):
@ -475,12 +552,12 @@ class opendons_request(models.Model):
for val in vals: for val in vals:
if val=='mailing_domain': if val=='mailing_domain':
mailing_domain_update=True 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 : if mailing_domain_update==True :
vals['partner_count']=partners_count
if vals['mailing_domain']=="[]" :
vals['mailing_domain']="[[\"id\",\"!=\",False]]"
res=super(opendons_request, self).write(vals) res=super(opendons_request, self).write(vals)
@ -489,19 +566,20 @@ class opendons_request(models.Model):
# #mise à jour du nombre de requête pour l'ensemble lié # #mise à jour du nombre de requête pour l'ensemble lié
ensemble=self.env['opendons.ensemble'].search([('id','=',int(self.ensemble_id))]) ensemble=self.env['opendons.ensemble'].search([('id','=',int(self.ensemble_id))])
ensemble_domaine=self.update_ensemble_domaine(ensemble)
ensemble_domain=self.update_ensemble_domain(ensemble)
# partner_count=self.count_partners_ensemble(ensemble) # partner_count=self.count_partners_ensemble(ensemble)
ensemble.write({ ensemble.write({
'request_count':len(ensemble.request_ids), 'request_count':len(ensemble.request_ids),
'mailing_domain':ensemble_domaine
'mailing_domain':ensemble_domain
}) })
# segment=self.env['opendons.segment'].search([('id','=',int(ensemble.segment_id))])
segment=self.env['opendons.segment'].search([('id','=',int(ensemble.segment_id))])
segment_domain=ensemble.update_segment_domain(segment)
# partner_count=self.count_partners_segment(segment)
# segment.write({
# 'partner_count':partner_count
# })
segment.write({
'mailing_domain':segment_domain
})
# operation=self.env['opendons.operation'].search([('id','=',int(segment.operation_id))]) # operation=self.env['opendons.operation'].search([('id','=',int(segment.operation_id))])
# partner_count=self.count_partners_operation(operation) # partner_count=self.count_partners_operation(operation)


+ 16
- 0
models/partner.py View File

@ -119,4 +119,20 @@ class partner(models.Model):
string="# of phone", string="# of phone",
readonly=True readonly=True
) )
key=fields.Integer(
compute='_compute_key',
string="Key",
store=True
)
firstname=fields.Char(
string="First name",
)
def _compute_key(self):
for rec in self:
rec.key=int(rec.id)*40456

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

@ -12,4 +12,4 @@ access_opendons_relationship_partner,opendons_relationship.partner,model_opendon
access_opendons_relationship_nature,opendons_relationship.nature,model_opendons_relationship_nature,donation_main.group_donation_manager,1,1,1,1 access_opendons_relationship_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_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 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
access_opendons_partnerphone,opendons_partnerphone,model_opendons_partnerphone,donation_main.group_donation_manager,1,1,1,1

+ 21
- 0
views/donation.xml View File

@ -0,0 +1,21 @@
<odoo>
<data>
<record id="view_opendons_donation_form" model="ir.ui.view">
<field name="name">opendons.donation.form</field>
<field name="model">donation.donation</field>
<field name="inherit_id" ref="donation_main.donation_form" />
<field name="arch" type="xml">
<xpath expr="//field[@name='campaign_id']" position="replace">
<field name="operation_id"/>
</xpath>
</field>
</record>
</data>
</odoo>

+ 13
- 10
views/operation.xml View File

@ -5,21 +5,21 @@
<field name="name">Segments</field> <field name="name">Segments</field>
<field name="res_model">opendons.segment</field> <field name="res_model">opendons.segment</field>
<field name="view_mode">tree,form,graph</field> <field name="view_mode">tree,form,graph</field>
<field name="context">{'search_default_operation_id': active_id}</field>
<field name="context">{'search_default_operation_id': active_id,'default_operation_id': active_id}</field>
</record> </record>
<record id="act_operation_ensemble" model="ir.actions.act_window"> <record id="act_operation_ensemble" model="ir.actions.act_window">
<field name="name">Ensembles</field> <field name="name">Ensembles</field>
<field name="res_model">opendons.ensemble</field> <field name="res_model">opendons.ensemble</field>
<field name="view_mode">tree,form,graph</field> <field name="view_mode">tree,form,graph</field>
<field name="context">{'search_default_segment_id': active_id}</field>
<field name="context">{'search_default_segment_id': active_id,'default_segment_id': active_id}</field>
</record> </record>
<record id="act_operation_request" model="ir.actions.act_window"> <record id="act_operation_request" model="ir.actions.act_window">
<field name="name">Requests</field> <field name="name">Requests</field>
<field name="res_model">opendons.request</field> <field name="res_model">opendons.request</field>
<field name="view_mode">tree,form,graph</field> <field name="view_mode">tree,form,graph</field>
<field name="context">{'search_default_ensemble_id': active_id}</field>
<field name="context">{'search_default_ensemble_id': active_id,'default_ensemble_id': active_id}</field>
</record> </record>
@ -127,15 +127,17 @@
<header> <header>
<button type="object" name="validate" string="Validate" <button type="object" name="validate" string="Validate"
class="oe_highlight" states="draft"/> 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="validated2draft"
string="Back to Draft" states="validated"/>
<button type="object" name="validated2exported"
string="to Exported" states="validated"/>
<button type="object" name="exported2validated"
string="Back to Validated" states="exported"/>
<button type="object" name="csv_export_operation" string="Generate csv export" <button type="object" name="csv_export_operation" string="Generate csv export"
states="done" />
states="draft" />
<field name="state" widget="statusbar" <field name="state" widget="statusbar"
invisible="context.get('recurring_view')" invisible="context.get('recurring_view')"
statusbar_visible="draft,done"/>
statusbar_visible="draft,validated,exported"/>
</header> </header>
<sheet> <sheet>
@ -178,6 +180,7 @@
<field name="name"/> <field name="name"/>
<field name="logical_operator"/> <field name="logical_operator"/>
<field name="exclusion"/> <field name="exclusion"/>
<field name="mailing_domain" widget="domain" options="{'model': 'res.partner', 'in_dialog': true}"/>
<field name="partner_count"/> <field name="partner_count"/>
<field name="cost"/> <field name="cost"/>
</group> </group>
@ -210,7 +213,7 @@
<field name="segment_id"/> <field name="segment_id"/>
<field name="name"/> <field name="name"/>
<field name="logical_operator"/> <field name="logical_operator"/>
<field name="mailing_domain"/>
<field name="mailing_domain" widget="domain" options="{'model': 'res.partner', 'in_dialog': true}"/>
<field name="partner_count"/> <field name="partner_count"/>
<field name="csv_export" filename="document_fname" widget="binary"/> <field name="csv_export" filename="document_fname" widget="binary"/>
<field name="document_fname" invisible="1"/> <field name="document_fname" invisible="1"/>


+ 39
- 2
views/partner.xml View File

@ -39,11 +39,48 @@
</record> </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">opendons.res.partner.form</field>
<field name="model">res.partner</field> <field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form" /> <field name="inherit_id" ref="base.view_partner_form" />
<field name="arch" type="xml"> <field name="arch" type="xml">
<xpath expr="/form/sheet/div/h1" position="replace">
<group>
<field id="company" class="o_text_overflow" name="name" default_focus="1" placeholder="e.g. Lumber Inc" attrs="{'required' : [('type', '=', 'contact'),('is_company', '=', True)], 'invisible': [('is_company','=', False)]}"/>
<field id="individual" class="o_text_overflow" name="name" default_focus="1" placeholder="e.g. Brandom Freeman" attrs="{'required' : [('type', '=', 'contact'), ('is_company', '=', False)], 'invisible': [('is_company','=', True)]}"/>
<field name="firstname"/>
<field name="key"/>
<field name="parent_id" string="Company Name"
widget="res_partner_many2one"
placeholder="Company Name..."
domain="[('is_company', '=', True)]" context="{'default_is_company': True, 'show_vat': True}"
attrs="{'invisible': ['|', '&amp;', ('is_company','=', True),('parent_id', '=', False),('company_name', '!=', False),('company_name', '!=', '')]}"/>
<field name="company_name" attrs="{'invisible': ['|', '|', ('company_name', '=', False), ('company_name', '=', ''), ('is_company', '=', True)]}"/>
<button name="create_company" icon="fa-plus-square" string="Create company"
type="object" class="oe_edit_only btn-link"
attrs="{'invisible': ['|', '|', ('is_company','=', True), ('company_name', '=', ''), ('company_name', '=', False)]}"/>
</group>
</xpath>
<xpath expr="/form/sheet/div/div" position="replace">
</xpath>
<xpath expr="//label[@for='phone']" position="replace"></xpath>
<xpath expr="//field[@name='phone']" position="attributes">
<attribute name="invisible">1</attribute>
</xpath>
<xpath expr="//label[@for='mobile']" position="replace"></xpath>
<xpath expr="//field[@name='mobile']" position="attributes">
<attribute name="invisible">1</attribute>
</xpath>
<xpath expr="//label[@for='email']" position="replace"></xpath>
<xpath expr="//field[@name='email']" position="attributes">
<attribute name="invisible">1</attribute>
</xpath>
<xpath expr="//div[@name='button_box']" position="inside"> <xpath expr="//div[@name='button_box']" position="inside">
<button class="oe_stat_button" type="action" <button class="oe_stat_button" type="action"
name="%(act_partner_qualifier)d" name="%(act_partner_qualifier)d"


Loading…
Cancel
Save