[IMP] website_*: improve various website.visitor views
PURPOSE Make various changes to the website.visitor views to improve readability and ease marketing analysis. SPECS The changes include notably: - Add/rename/move fields/filters elements - Remove some unnecessary information or put it in optional="hide" in tree view - Add website_id information (with the multi-website group) - Slightly rework layouts (new widgets / spacing / images / buttons / ...) - Move some technical information into the "debug mode" LINKS Task 2092302 ENT PR odoo/enterprise#14611 UPG PR odoo/upgrade#1902 closes odoo/odoo#61417 Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com>
This commit is contained in:
@@ -34,7 +34,7 @@ class WebsiteVisitor(models.Model):
|
||||
access_token = fields.Char(required=True, default=lambda x: uuid.uuid4().hex, index=False, copy=False, groups='base.group_website_publisher')
|
||||
active = fields.Boolean('Active', default=True)
|
||||
website_id = fields.Many2one('website', "Website", readonly=True)
|
||||
partner_id = fields.Many2one('res.partner', string="Linked Partner", help="Partner of the last logged in user.")
|
||||
partner_id = fields.Many2one('res.partner', string="Contact", help="Partner of the last logged in user.")
|
||||
partner_image = fields.Binary(related='partner_id.image_1920')
|
||||
|
||||
# localisation and info
|
||||
@@ -43,10 +43,10 @@ class WebsiteVisitor(models.Model):
|
||||
lang_id = fields.Many2one('res.lang', string='Language', help="Language from the website when visitor has been created")
|
||||
timezone = fields.Selection(_tz_get, string='Timezone')
|
||||
email = fields.Char(string='Email', compute='_compute_email_phone')
|
||||
mobile = fields.Char(string='Mobile Phone', compute='_compute_email_phone')
|
||||
mobile = fields.Char(string='Mobile', compute='_compute_email_phone')
|
||||
|
||||
# Visit fields
|
||||
visit_count = fields.Integer('Number of visits', default=1, readonly=True, help="A new visit is considered if last connection was more than 8 hours ago.")
|
||||
visit_count = fields.Integer('# Visits', default=1, readonly=True, help="A new visit is considered if last connection was more than 8 hours ago.")
|
||||
website_track_ids = fields.One2many('website.track', 'visitor_id', string='Visited Pages History', readonly=True)
|
||||
visitor_page_count = fields.Integer('Page Views', compute="_compute_page_statistics", help="Total number of visits on tracked pages")
|
||||
page_ids = fields.Many2many('website.page', string="Visited Pages", compute="_compute_page_statistics")
|
||||
@@ -54,7 +54,7 @@ class WebsiteVisitor(models.Model):
|
||||
last_visited_page_id = fields.Many2one('website.page', string="Last Visited Page", compute="_compute_last_visited_page_id")
|
||||
|
||||
# Time fields
|
||||
create_date = fields.Datetime('First connection date', readonly=True)
|
||||
create_date = fields.Datetime('First Connection', readonly=True)
|
||||
last_connection_datetime = fields.Datetime('Last Connection', default=fields.Datetime.now, help="Last page view date", readonly=True)
|
||||
time_since_last_action = fields.Char('Last action', compute="_compute_time_statistics", help='Time since last page view. E.g.: 2 minutes ago')
|
||||
is_connected = fields.Boolean('Is connected ?', compute='_compute_time_statistics', help='A visitor is considered as connected if his last page view was within the last 5 minutes.')
|
||||
|
||||
@@ -103,7 +103,7 @@
|
||||
t-attf-src="/base/static/img/avatar_grey.png"
|
||||
width="54px" height="54px" alt="Visitor"/>
|
||||
</div>
|
||||
<div class="col o_wvisitor_name">
|
||||
<div class="col o_wvisitor_name mr-2">
|
||||
<div>
|
||||
<b><field name="display_name"/></b>
|
||||
<div class="float-right">
|
||||
@@ -117,19 +117,19 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col">
|
||||
<div class="col mx-2">
|
||||
<b><field name="time_since_last_action"/></b>
|
||||
<div>Last Action</div>
|
||||
</div>
|
||||
<div class="col">
|
||||
<div class="col mx-2">
|
||||
<b><field name="visit_count"/></b>
|
||||
<div>Visits</div>
|
||||
</div>
|
||||
<div class="col">
|
||||
<div class="col mx-2">
|
||||
<b><field name="last_visited_page_id"/></b>
|
||||
<div>Last Page</div>
|
||||
</div>
|
||||
<div id="wvisitor_visited_page" class="col">
|
||||
<div id="wvisitor_visited_page" class="col mx-2">
|
||||
<b><field name="page_count"/></b>
|
||||
<div>Visited Pages</div>
|
||||
</div>
|
||||
@@ -195,7 +195,7 @@
|
||||
<button name="%(website.website_visitor_page_action)d" type="action"
|
||||
class="oe_stat_button"
|
||||
icon="fa-tags">
|
||||
<field name="visitor_page_count" widget="statinfo" string="Page views"/>
|
||||
<field name="visitor_page_count" widget="statinfo" string="Page Views"/>
|
||||
</button>
|
||||
</div>
|
||||
<div class="float-right" attrs="{'invisible': [('country_id', '=', False)]}">
|
||||
@@ -205,7 +205,7 @@
|
||||
<h1><field name="display_name"/></h1>
|
||||
</div>
|
||||
<group id="general_info">
|
||||
<group string="Visitor Information">
|
||||
<group string="Details">
|
||||
<field name="active" invisible="1"/>
|
||||
<field name="is_connected" invisible="1"/>
|
||||
<field name="partner_id"/>
|
||||
@@ -215,9 +215,10 @@
|
||||
<field name="lang_id"/>
|
||||
</group>
|
||||
<group id="visits" string="Visits">
|
||||
<field name="website_id" groups="website.group_multi_website"/>
|
||||
<field name="create_date"/>
|
||||
<field name="last_connection_datetime"/>
|
||||
<field name="page_ids" widget="many2many_tags"/>
|
||||
<field name="page_ids" string="Pages" widget="many2many_tags"/>
|
||||
</group>
|
||||
</group>
|
||||
</sheet>
|
||||
@@ -229,19 +230,21 @@
|
||||
<field name="name">website.visitor.view.tree</field>
|
||||
<field name="model">website.visitor</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Web Visitors" decoration-success="is_connected" decoration-danger="not is_connected" sample="1">
|
||||
<tree string="Web Visitors" decoration-success="is_connected" sample="1">
|
||||
<!--TODO DBE : Handle no_label in treeview-->
|
||||
<field name="country_flag" widget="image_url" options='{"size": [20, 20]}' string=" "/>
|
||||
<field name="display_name"/>
|
||||
<field name="create_date"/>
|
||||
<field name="display_name" string="Name"/>
|
||||
<field name="create_date" optional="hide"/>
|
||||
<field name="last_connection_datetime"/>
|
||||
<field name="lang_id"/>
|
||||
<field name="country_id" optional="hide"/>
|
||||
<field name="visit_count"/>
|
||||
<field name="page_ids" widget="many2many_tags"/>
|
||||
<field name="page_ids" widget="many2many_tags" string="Pages"/>
|
||||
<field name="last_visited_page_id" string="Last Page" optional="hide"/>
|
||||
<field name="is_connected" invisible="1"/>
|
||||
<field name="email" invisible="1"/>
|
||||
<button string="Send Email" name="action_send_mail" type="object"
|
||||
icon="fa-comment" attrs="{'invisible': [('email', '=', False)]}"/>
|
||||
<button string="Email" name="action_send_mail" type="object"
|
||||
icon="fa-envelope" attrs="{'invisible': [('email', '=', False)]}"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
@@ -256,16 +259,23 @@
|
||||
<field name="country_id"/>
|
||||
<field name="visit_count"/>
|
||||
<field name="page_ids"/>
|
||||
<filter string="Visitors" name="type_visitor" domain="[('partner_id', '=', False)]"/>
|
||||
<filter string="Customers" name="type_customer" domain="[('partner_id', '!=', False)]"/>
|
||||
<filter string="Last 7 Days" name="filter_last_7_days" domain="[('last_connection_datetime', '>', datetime.datetime.now() - datetime.timedelta(days=7))]"/>
|
||||
<separator/>
|
||||
<filter string="Archived" name="is_archived" domain="[('active', '=', False)]"/>
|
||||
<filter string="Unregistered" name="filter_type_visitor" domain="[('partner_id', '=', False)]"/>
|
||||
<filter string="Contacts" name="filter_type_customer" domain="[('partner_id', '!=', False)]"/>
|
||||
<separator/>
|
||||
<filter string="Connected" name="filter_is_connected" domain="[('last_connection_datetime', '>', datetime.datetime.now() - datetime.timedelta(minutes=5))]"/>
|
||||
<separator/>
|
||||
<filter string="Archived" name="filter_is_archived" domain="[('active', '=', False)]"/>
|
||||
<separator/>
|
||||
<filter string="Is Connected" name="is_connected" domain="[('last_connection_datetime', '>', datetime.datetime.now() - datetime.timedelta(minutes=5))]"/>
|
||||
<filter name="filter_create_date" date="create_date"/>
|
||||
<group string="Group By">
|
||||
<filter string="Country" name="group_by_country" context="{'group_by': 'country_id'}"/>
|
||||
<filter string="Timezone" name="group_by_timezone" context="{'group_by': 'timezone'}"/>
|
||||
<filter string="Language" name="group_by_lang" context="{'group_by': 'lang_id'}"/>
|
||||
<filter string="# Visits" name="group_by_visit_count" context="{'group_by': 'visit_count'}"/>
|
||||
<filter string="Website" name="group_by_website_id" context="{'group_by': 'website_id'}" groups="website.group_multi_website"/>
|
||||
<filter string="First Connection" name="group_by_create_date" context="{'group_by': 'create_date'}"/>
|
||||
<filter string="Last Connection" name="group_by_last_connection_datetime" context="{'group_by': 'last_connection_datetime'}"/>
|
||||
</group>
|
||||
</search>
|
||||
</field>
|
||||
@@ -275,9 +285,8 @@
|
||||
<field name="name">website.visitor.view.graph</field>
|
||||
<field name="model">website.visitor</field>
|
||||
<field name="arch" type="xml">
|
||||
<graph string="Visitors" sample="1">
|
||||
<field name="create_date" type="row"/>
|
||||
<field name="visit_count"/>
|
||||
<graph string="Visitors" type="line" sample="1">
|
||||
<field name="last_connection_datetime" interval="day" type="row"/>
|
||||
</graph>
|
||||
</field>
|
||||
</record>
|
||||
@@ -287,6 +296,7 @@
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="res_model">website.visitor</field>
|
||||
<field name="view_mode">kanban,tree,form,graph</field>
|
||||
<field name="context">{'search_default_filter_last_7_days':1}</field>
|
||||
<field name="help" type="html">
|
||||
<p class="o_view_nocontent_smiling_face">
|
||||
Wait for visitors to come to your website to see their history.
|
||||
|
||||
@@ -44,9 +44,11 @@
|
||||
<field name="model">website.visitor</field>
|
||||
<field name="inherit_id" ref="website.website_visitor_view_search"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//filter[@name='type_visitor']" position="replace">
|
||||
<filter string="Visitors" name="type_visitor" domain="[('partner_id', '=', False), ('lead_ids', '=', False)]"/>
|
||||
<filter string="Leads" name="type_lead" domain="[('partner_id', '=', False), ('lead_ids', '!=', False)]"/>
|
||||
<xpath expr="//filter[@name='filter_type_visitor']" position="attributes">
|
||||
<attribute name="domain">[('partner_id', '=', False), ('lead_ids', '=', False)]</attribute>
|
||||
</xpath>
|
||||
<xpath expr="//filter[@name='filter_type_visitor']" position="after">
|
||||
<filter string="Leads" name="filter_type_lead" domain="[('partner_id', '=', False), ('lead_ids', '!=', False)]"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
@@ -62,8 +64,8 @@
|
||||
<xpath expr="//div[@id='o_page_count']" position="after">
|
||||
<div>Leads/Opportunities<span class="float-right font-weight-bold"><field name="lead_count"/></span></div>
|
||||
</xpath>
|
||||
<xpath expr="//div[hasclass('w_visitor_kanban_actions_ungrouped')]" position="before">
|
||||
<div class="col">
|
||||
<xpath expr="//div[@id='wvisitor_visited_page']" position="after">
|
||||
<div class="col mx-2">
|
||||
<b><field name="lead_count"/></b>
|
||||
<div>Leads/Opportunities</div>
|
||||
</div>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
{
|
||||
'name': 'Events',
|
||||
'version': '1.1',
|
||||
'version': '1.2',
|
||||
'category': 'Marketing/Events',
|
||||
'sequence': 140,
|
||||
'summary': 'Publish events, sell tickets',
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
<field name="inherit_id" ref="website.website_visitor_view_search"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//filter[@name='group_by_lang']" position="after">
|
||||
<filter string="Main Contact" name="group_by_parent_id" context="{'group_by': 'parent_id'}"/>
|
||||
<filter string="Main Contact" name="group_by_parent_id" groups="base.group_no_one" context="{'group_by': 'parent_id'}"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
@@ -18,7 +18,7 @@
|
||||
<field name="inherit_id" ref="website.website_visitor_view_tree"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='page_ids']" position="after">
|
||||
<field name="event_registration_count"/>
|
||||
<field name="event_registration_count" optional="hide"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
@@ -37,29 +37,8 @@
|
||||
</button>
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='page_ids']" position="after">
|
||||
<field name="parent_id"/>
|
||||
<field name="parent_id" groups="base.group_no_one"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="website_visitor_view_kanban" model="ir.ui.view">
|
||||
<field name="name">website.visitor.view.kanban.inherit.event</field>
|
||||
<field name="model">website.visitor</field>
|
||||
<field name="inherit_id" ref="website.website_visitor_view_kanban"/>
|
||||
<field name="arch" type="xml">
|
||||
<field name="page_ids" position="after">
|
||||
<field name="event_registration_count"/>
|
||||
</field>
|
||||
<xpath expr="//div[@id='o_page_count']" position="after">
|
||||
<div>Registrations<span class="float-right font-weight-bold"><field name="event_registration_count"/></span></div>
|
||||
</xpath>
|
||||
<xpath expr="//div[hasclass('w_visitor_kanban_actions_ungrouped')]" position="before">
|
||||
<div class="col">
|
||||
<b><field name="event_registration_count"/></b>
|
||||
<div>Registrations</div>
|
||||
</div>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</data></odoo>
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
'name': 'Advanced Events',
|
||||
'category': 'Marketing',
|
||||
'summary': 'Sponsors, Tracks, Agenda, Event News',
|
||||
'version': '1.1',
|
||||
'version': '1.2',
|
||||
'description': "",
|
||||
'depends': ['website_event'],
|
||||
'data': [
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
<field name="inherit_id" ref="website_event.website_visitor_view_tree"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='event_registration_count']" position="after">
|
||||
<field name="event_track_wishlisted_count"/>
|
||||
<field name="event_track_wishlisted_count" optional="hide"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
@@ -27,25 +27,4 @@
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="website_visitor_view_kanban" model="ir.ui.view">
|
||||
<field name="name">website.visitor.view.kanban.inherit.event.track</field>
|
||||
<field name="model">website.visitor</field>
|
||||
<field name="inherit_id" ref="website_event.website_visitor_view_kanban"/>
|
||||
<field name="arch" type="xml">
|
||||
<field name="page_ids" position="after">
|
||||
<field name="event_track_wishlisted_count"/>
|
||||
</field>
|
||||
<xpath expr="//div[@id='o_page_count']" position="after">
|
||||
<div>Wishlisted Tracks<span class="float-right font-weight-bold"><field name="event_track_wishlisted_count"/></span></div>
|
||||
</xpath>
|
||||
<xpath expr="//div[hasclass('w_visitor_kanban_actions_ungrouped')]" position="before">
|
||||
<div class="col">
|
||||
<b><field name="event_track_wishlisted_count"/></b>
|
||||
<div>Wishlisted Tracks</div>
|
||||
</div>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</data></odoo>
|
||||
|
||||
@@ -36,20 +36,35 @@
|
||||
<field name="livechat_operator_id"/>
|
||||
</field>
|
||||
<xpath expr="//div[hasclass('w_visitor_kanban_actions')]" position="before">
|
||||
<div>Chats<span class="float-right font-weight-bold"><field name="session_count"/></span></div>
|
||||
<div t-if="record.livechat_operator_id.raw_value">
|
||||
<span class="fa fa-comments mr-2"/>Speaking With <span class="font-weight-bold"><field name="livechat_operator_name"/></span>
|
||||
Speaking With
|
||||
<div name="livechat_operator_id"
|
||||
class="o_field_many2one_avatar o_field_widget font-weight-bold float-right d-inline-block">
|
||||
<img t-attf-src="/web/image/res.partner/#{record.livechat_operator_id.raw_value}/image_128"
|
||||
alt="Operator Avatar" class="o_m2o_avatar"/>
|
||||
<field name="livechat_operator_name"/>
|
||||
</div>
|
||||
</div>
|
||||
<t t-else="">
|
||||
<br attrs="{'invisible': ['|', ('livechat_operator_id', '!=', False), ('is_connected', '=', False)]}"/>
|
||||
</t>
|
||||
</xpath>
|
||||
<xpath expr="//div[hasclass('w_visitor_kanban_actions_ungrouped')]" position="before">
|
||||
<div class="col" >
|
||||
<div class="col mx-2">
|
||||
<b>
|
||||
<field name="livechat_operator_name" t-if="record.livechat_operator_id.raw_value"/>
|
||||
<span t-else="">-</span>
|
||||
<field name="session_count"/>
|
||||
</b>
|
||||
<div>Speaking With</div>
|
||||
<div>Chats</div>
|
||||
</div>
|
||||
<div class="col mx-2">
|
||||
<div t-if="record.livechat_operator_id.raw_value"
|
||||
class="o_field_many2one_avatar o_field_widget font-weight-bold" name="livechat_operator_id">
|
||||
<img t-attf-src="/web/image/res.partner/#{record.livechat_operator_id.raw_value}/image_128"
|
||||
alt="Operator Avatar" class="o_m2o_avatar"/>
|
||||
<field name="livechat_operator_name"/>
|
||||
</div>
|
||||
<div t-if="record.livechat_operator_id.raw_value">Speaking With</div>
|
||||
</div>
|
||||
</xpath>
|
||||
<xpath expr="//div[hasclass('w_visitor_kanban_actions')]" position="inside">
|
||||
@@ -79,14 +94,14 @@
|
||||
attrs="{'invisible': ['|', ('livechat_operator_id', '!=', False), ('is_connected', '=', False)]}"/>
|
||||
</xpath>
|
||||
<xpath expr="//group[@id='general_info']" position="before">
|
||||
<group id="livechat_info">
|
||||
<field name="livechat_operator_id"/>
|
||||
<group id="livechat_info" attrs="{'invisible': [('livechat_operator_id', '=', False)]}">
|
||||
<field name="livechat_operator_id" widget="many2one_avatar"/>
|
||||
</group>
|
||||
</xpath>
|
||||
<xpath expr="//div[hasclass('oe_button_box')]" position="inside">
|
||||
<button name="%(website_visitor_livechat_session_action)d" type="action" class="oe_stat_button" icon="fa-comment"
|
||||
attrs="{'invisible': [('session_count', '=', 0)]}">
|
||||
<field name="session_count" widget="statinfo" string="Sessions"/>
|
||||
<field name="session_count" widget="statinfo" string="Chats"/>
|
||||
</button>
|
||||
</xpath>
|
||||
</field>
|
||||
@@ -97,9 +112,9 @@
|
||||
<field name="model">website.visitor</field>
|
||||
<field name="inherit_id" ref="website.website_visitor_view_tree"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='is_connected']" position="after">
|
||||
<field name="livechat_operator_id"/>
|
||||
<button name="action_send_chat_request" string="Send chat request" type="object" icon="fa-comments"
|
||||
<xpath expr="//field[@name='email']" position="after">
|
||||
<field name="livechat_operator_id" optional="hide"/>
|
||||
<button name="action_send_chat_request" string="Chat" type="object" icon="fa-comments"
|
||||
attrs="{'invisible': ['|', ('livechat_operator_id', '!=', False), ('is_connected', '=', False)]}"/>
|
||||
</xpath>
|
||||
</field>
|
||||
@@ -110,9 +125,10 @@
|
||||
<field name="model">website.visitor</field>
|
||||
<field name="inherit_id" ref="website.website_visitor_view_search"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//search" position="inside">
|
||||
<filter string="Busy" name="in_conversation" domain="[('livechat_operator_id', '!=', False)]"/>
|
||||
<filter string="Available" name="not_in_conversation" domain="[('livechat_operator_id', '=', False)]"/>
|
||||
<xpath expr="//filter[@name='filter_is_connected']" position="after">
|
||||
<separator/>
|
||||
<filter string="Available" name="filter_not_in_conversation" domain="[('livechat_operator_id', '=', False)]"/>
|
||||
<filter string="In Conversation" name="filter_in_conversation" domain="[('livechat_operator_id', '!=', False)]"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
@@ -66,11 +66,11 @@
|
||||
<button name="%(website_sale.website_sale_visitor_product_action)d" type="action"
|
||||
class="oe_stat_button"
|
||||
icon="fa-tags">
|
||||
<field name="visitor_product_count" widget="statinfo" string="Product views"/>
|
||||
<field name="visitor_product_count" widget="statinfo" string="Product Views"/>
|
||||
</button>
|
||||
</xpath>
|
||||
<xpath expr="//group[@id='visits']/field[@name='page_ids']" position="after">
|
||||
<field name="product_ids" widget="many2many_tags"/>
|
||||
<field name="product_ids" string="Products" widget="many2many_tags"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
@@ -81,7 +81,7 @@
|
||||
<field name="inherit_id" ref="website.website_visitor_view_tree"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='page_ids']" position="after">
|
||||
<field name="product_ids" widget="many2many_tags"/>
|
||||
<field name="product_ids" widget="many2many_tags" string="Products"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
@@ -38,10 +38,12 @@
|
||||
<field name="model">website.visitor</field>
|
||||
<field name="inherit_id" ref="website.website_visitor_view_tree"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//button[@name='action_send_mail']" position="after">
|
||||
<xpath expr="//field[@name='is_connected']" position="before">
|
||||
<field name="mobile" invisible="1"/>
|
||||
</xpath>
|
||||
<xpath expr="//button[@name='action_send_mail']" position="after">
|
||||
<button name="action_send_sms" type="object" icon="fa-mobile"
|
||||
attrs="{'invisible': [('mobile', '=', False)]}" string="Send SMS"/>
|
||||
attrs="{'invisible': [('mobile', '=', False)]}" string="SMS"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
Reference in New Issue
Block a user