mirror of
https://github.com/bringout/oca-ocb-core.git
synced 2026-04-21 02:52:04 +02:00
19.0 vanilla
This commit is contained in:
parent
0a7ae8db93
commit
991d2234ca
416 changed files with 646602 additions and 300844 deletions
|
|
@ -28,10 +28,10 @@
|
|||
</menuitem>
|
||||
|
||||
<menuitem id="menu_management" name="Apps" sequence="500" web_icon="base,static/description/modules.png" groups="base.group_system"/>
|
||||
<menuitem id="base.menu_tests" name="Tests" sequence="1000" web_icon="test_exceptions,static/description/icon.png"/>
|
||||
<menuitem id="base.menu_tests" name="Tests" sequence="1000" web_icon="base,static/description/exception.png"/>
|
||||
|
||||
<record model="ir.ui.menu" id="base.menu_administration">
|
||||
<field name="groups_id" eval="[Command.set([ref('group_system'), ref('group_erp_manager')])]"/>
|
||||
<field name="group_ids" eval="[Command.set([ref('group_system'), ref('group_erp_manager')])]"/>
|
||||
</record>
|
||||
|
||||
<record id="action_client_base_menu" model="ir.actions.client">
|
||||
|
|
|
|||
|
|
@ -96,7 +96,7 @@
|
|||
</group>
|
||||
<notebook>
|
||||
<page name="security" string="Visibility">
|
||||
<field name="groups_id"/>
|
||||
<field name="group_ids"/>
|
||||
</page>
|
||||
<page name='advanced' string="Advanced Properties">
|
||||
<group>
|
||||
|
|
@ -132,7 +132,7 @@
|
|||
filter_domain="['|', '|', '|', '|', ('name','ilike',self), ('model','ilike',self), ('type','ilike',self), ('report_name','ilike',self), ('report_type','ilike',self)]"
|
||||
string="Report"/>
|
||||
<field name="model" filter_domain="[('model','=', self)]" string="Model"/>
|
||||
<group expand="0" string="Group By" colspan="4">
|
||||
<group colspan="4">
|
||||
<filter string="Report Type" name="report_type" domain="[]" context="{'group_by':'report_type'}"/>
|
||||
<filter string="Report Model" name="report_model" domain="[]" context="{'group_by':'model'}"/>
|
||||
</group>
|
||||
|
|
@ -208,6 +208,7 @@
|
|||
<field name="usage"/>
|
||||
<field name="type" readonly="1"/>
|
||||
<field name="target"/>
|
||||
<field name="cache"/>
|
||||
</group>
|
||||
</group>
|
||||
<notebook>
|
||||
|
|
@ -247,7 +248,7 @@
|
|||
</group>
|
||||
</page>
|
||||
<page string="Visibility" name="security">
|
||||
<field name="groups_id"/>
|
||||
<field name="group_ids"/>
|
||||
</page>
|
||||
</notebook>
|
||||
</sheet>
|
||||
|
|
@ -306,12 +307,34 @@
|
|||
|
||||
<!-- ir.actions.server -->
|
||||
|
||||
<record id="server_action_history_wizard_view" model="ir.ui.view">
|
||||
<field name="name">Server Action History Wizard</field>
|
||||
<field name="model">server.action.history.wizard</field>
|
||||
<field name="arch" type="xml">
|
||||
<form>
|
||||
<group>
|
||||
<group>
|
||||
<field name="revision" required="1" widget="selection"/>
|
||||
</group>
|
||||
</group>
|
||||
<field name="code_diff" invisible="not code_diff"/>
|
||||
<div class="alert alert-warning my-2" role="alert" invisible="code_diff">
|
||||
<span>No diff available</span>
|
||||
</div>
|
||||
<footer>
|
||||
<button string="Restore Revision" name="restore_revision" type="object" class="btn-primary" invisible="not code_diff" data-hotkey="q"/>
|
||||
<button string="Cancel" class="btn-secondary" special="cancel" data-hotkey="x" />
|
||||
</footer>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_server_action_form" model="ir.ui.view">
|
||||
<field name="name">Server Action</field>
|
||||
<field name="model">ir.actions.server</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Server Action">
|
||||
<header>
|
||||
<header invisible="context.get('is_modal')">
|
||||
<button name="create_action" string="Create Contextual Action" type="object"
|
||||
class="btn-primary"
|
||||
invisible="binding_model_id"
|
||||
|
|
@ -323,124 +346,225 @@
|
|||
class="btn-primary"
|
||||
invisible="model_name != 'ir.actions.server' or state != 'code'"
|
||||
help="Run this action manually."/>
|
||||
<button name="history_wizard_action" string="Code History" type="object"
|
||||
invisible="not show_code_history"
|
||||
help="View code history and restore a previous version"/>
|
||||
</header>
|
||||
<sheet>
|
||||
<h1 class="oe_title">
|
||||
<field name="name" placeholder="e.g. Mass archive contacts"/>
|
||||
</h1>
|
||||
<div class="d-flex flex-column">
|
||||
<label for="state"/>
|
||||
<field name="state" widget="selection_badge" options="{'size': 'sm'}"/>
|
||||
<div class="oe_button_box" name="button_box">
|
||||
<button
|
||||
type="object"
|
||||
name="action_open_parent_action"
|
||||
invisible="not parent_id"
|
||||
class="oe_stat_button"
|
||||
icon="fa-database"
|
||||
>
|
||||
<div class="o_stat_info">
|
||||
<span class="o_stat_text">Parent Action</span>
|
||||
</div>
|
||||
</button>
|
||||
<button
|
||||
type="object"
|
||||
name="action_open_scheduled_action"
|
||||
invisible="not ir_cron_ids or context.key != 'server_action'"
|
||||
context="{'key': 'ir_cron'}"
|
||||
class="oe_stat_button"
|
||||
icon="fa-refresh"
|
||||
>
|
||||
<div class="o_stat_info">
|
||||
<span class="o_stat_text">Scheduled Action</span>
|
||||
</div>
|
||||
</button>
|
||||
</div>
|
||||
<group string="Technical Settings" groups="base.group_no_one">
|
||||
<h1 class="oe_title">
|
||||
<field name="automated_name" invisible="1"/> <!-- needed for name compute -->
|
||||
<field name="name" placeholder="Set an explicit name"/>
|
||||
</h1>
|
||||
<group invisible="context.get('is_modal')">
|
||||
<group>
|
||||
<field name="model_id" options="{'no_create': True, 'no_open': True}" />
|
||||
<field name="groups_id" widget="many2many_tags" />
|
||||
<field name="model_id" options="{'no_create': True, 'no_open': True}" groups="base.group_no_one" />
|
||||
<field name="model_id" options="{'no_create': True, 'no_open': True}" groups="!base.group_no_one"
|
||||
invisible="context.get('default_model_id')"
|
||||
domain="[('id', 'in', available_model_ids)]"/>
|
||||
</group>
|
||||
<group groups="base.group_no_one">
|
||||
<field name="group_ids" widget="many2many_tags" />
|
||||
</group>
|
||||
</group>
|
||||
<separator string="Action Details" groups="base.group_no_one" />
|
||||
<div class="d-flex flex-row flex-wrap gap-2" invisible="state != 'object_write'">
|
||||
<field name="evaluation_type" class="oe_inline"/>
|
||||
<field name="update_path" widget="DynamicModelFieldSelectorChar" class="oe_inline" options="{'model': 'model_name'}" required="state == 'object_write'"/>
|
||||
<field name="update_field_id" invisible="True"/> <!-- The field is store=True and readonly=False, in this view we want to save the value from compute/onchange -->
|
||||
<field name="update_related_model_id" invisible="True"/> <!-- This field is required for 'resource_ref' to compute possible m2m and m2o values -->
|
||||
<span invisible="evaluation_type != 'value' or update_field_type not in ['one2many', 'many2many']">by</span>
|
||||
<field name="update_m2m_operation" class="oe_inline" invisible="evaluation_type != 'value' or update_field_type not in ['one2many', 'many2many']" required="update_field_type in ['one2many', 'many2many']"/>
|
||||
<span invisible="evaluation_type != 'value' or update_field_type in ['one2many', 'many2many']">to</span>
|
||||
<field name="value" class="oe_inline" placeholder="Set a value..." invisible="update_field_id == False or value_field_to_show != 'value' or evaluation_type != 'value'" string="Custom Value"/>
|
||||
<field name="resource_ref" class="oe_inline" placeholder="Choose a value..." string="Custom Value" options="{'model_field': 'update_related_model_id', 'no_create': True, 'no_open': True}" invisible=" update_field_id == False or value_field_to_show != 'resource_ref' or evaluation_type == 'equation' or update_m2m_operation == 'clear'"/>
|
||||
<field name="selection_value" class="oe_inline" placeholder="Choose a value..." options="{'no_create': True, 'no_open': True}" invisible=" update_field_id == False or value_field_to_show != 'selection_value' or evaluation_type == 'equation'"/>
|
||||
<field name="update_boolean_value" class="oe_inline" invisible="evaluation_type != 'value' or value_field_to_show != 'update_boolean_value'" required="value_field_to_show == 'update_boolean_value'"/>
|
||||
<span invisible="update_field_id != False or evaluation_type == 'equation'" class="text-muted">Set a value...</span>
|
||||
<span invisible="evaluation_type != 'equation'">
|
||||
to this Python expression:
|
||||
</span>
|
||||
<div class="w-100 d-flex flex-row gap-3" invisible="evaluation_type != 'equation'">
|
||||
<field name="value" class="w-50" widget="code" options="{'mode': 'python'}" string="Expression"/>
|
||||
<div class="w-50 opacity-75">
|
||||
<span colspan="2" class="text-muted"> Available variables: </span>
|
||||
<ul colspan="2" class="text-muted">
|
||||
<li><code>env</code>: environment on which the action is triggered</li>
|
||||
<li><code>model</code>: model of the record on which the action is triggered; is a void recordset</li>
|
||||
<li><code>record</code>: record on which the action is triggered</li>
|
||||
<li><code>records</code>: recordset of all records on which the action is triggered in multi mode</li>
|
||||
<li><code>time</code>, <code>datetime</code>, <code>dateutil</code>, <code>timezone</code>: useful Python libraries</li>
|
||||
<li><code>float_compare()</code>: utility function to compare floats based on a specific precision</li>
|
||||
</ul>
|
||||
<t name="action_content" invisible="not model_id">
|
||||
<field name="allowed_states" invisible="1"/> <!-- Used to filter state using selection_badge_with_filter -->
|
||||
<div class="d-flex flex-column">
|
||||
<label for="state"/>
|
||||
<field name="state" widget="selection_badge_with_filter" options="{'size': 'sm', 'allowed_selection_field': 'allowed_states'}"/>
|
||||
</div>
|
||||
<div class="alert alert-warning" role="alert" invisible="not warning">
|
||||
<i class="fa fa-warning pe-2" title="Warning"/><field class="d-inline" name="warning" nolabel="1"/>
|
||||
</div>
|
||||
<div class="d-flex flex-row flex-wrap gap-2" invisible="state != 'object_write'">
|
||||
<field name="evaluation_type" class="oe_inline"/>
|
||||
<field name="update_path" widget="field_selector" class="oe_inline" options="{'model': 'model_name', 'allow_properties': False}" required="state == 'object_write'"/>
|
||||
<field name="update_field_id" invisible="True"/> <!-- The field is store=True and readonly=False, in this view we want to save the value from compute/onchange -->
|
||||
<field name="update_related_model_id" invisible="True"/> <!-- This field is required for 'resource_ref' to compute possible m2m and m2o values -->
|
||||
<span invisible="evaluation_type != 'value' or update_field_type not in ['one2many', 'many2many']">by</span>
|
||||
<field name="update_m2m_operation" class="oe_inline" invisible="evaluation_type != 'value' or update_field_type not in ['one2many', 'many2many']" required="update_field_type in ['one2many', 'many2many']"/>
|
||||
<span invisible="evaluation_type != 'value' or update_field_type in ['one2many', 'many2many']">to</span>
|
||||
<span invisible="evaluation_type != 'sequence'">with</span>
|
||||
<field name="value" class="oe_inline" placeholder="Set a value..." invisible="update_field_id == False or value_field_to_show != 'value' or evaluation_type != 'value'" string="Custom Value"/>
|
||||
<field name="html_value" class="w-100" placeholder="Set a value..." invisible="update_field_id == False or value_field_to_show != 'html_value' or evaluation_type != 'value'" string="Custom Value"/>
|
||||
<field name="sequence_id" class="oe_inline" placeholder="Select a sequence..." invisible="evaluation_type != 'sequence'" required="evaluation_type == 'sequence'"/>
|
||||
<field name="resource_ref" class="oe_inline" placeholder="Choose a value..." string="Custom Value" options="{'model_field': 'update_related_model_id', 'no_create': True, 'no_open': True}" invisible="update_field_id == False or value_field_to_show != 'resource_ref' or evaluation_type == 'equation' or update_m2m_operation == 'clear'"/>
|
||||
<field name="selection_value" class="oe_inline" placeholder="Choose a value..." options="{'no_create': True, 'no_open': True}" invisible="update_field_id == False or value_field_to_show != 'selection_value' or evaluation_type == 'equation'"/>
|
||||
<field name="update_boolean_value" class="oe_inline" invisible="evaluation_type != 'value' or value_field_to_show != 'update_boolean_value'" required="value_field_to_show == 'update_boolean_value'"/>
|
||||
<span invisible="update_field_id != False or evaluation_type != 'value'" class="o_actions_server_set_a_value text-muted">Set a value...</span>
|
||||
<span invisible="evaluation_type != 'equation'">
|
||||
to this Python expression:
|
||||
</span>
|
||||
<div class="w-100 d-flex flex-row gap-3" invisible="evaluation_type != 'equation'">
|
||||
<field name="value" class="w-50" widget="code" options="{'mode': 'python'}" string="Expression"/>
|
||||
<div class="w-50 opacity-75">
|
||||
<span colspan="2" class="text-muted"> Available variables: </span>
|
||||
<ul colspan="2" class="text-muted">
|
||||
<li><code>env</code>: environment on which the action is triggered</li>
|
||||
<li><code>model</code>: model of the record on which the action is triggered; is a void recordset</li>
|
||||
<li><code>record</code>: record on which the action is triggered</li>
|
||||
<li><code>records</code>: recordset of all records on which the action is triggered in multi mode</li>
|
||||
<li><code>time</code>, <code>datetime</code>, <code>dateutil</code>, <code>timezone</code>: useful Python libraries</li>
|
||||
<li><code>float_compare()</code>: utility function to compare floats based on a specific precision</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<group name="action_wrapper">
|
||||
<group name="action_content">
|
||||
<field name="model_id" options="{'no_create': True, 'no_open': True}" groups="!base.group_no_one" invisible="context.get('default_model_id')"
|
||||
domain="[('id', 'in', available_model_ids)]"/>
|
||||
|
||||
<field name="crud_model_id"
|
||||
options="{'no_create': True, 'no_open': True}"
|
||||
invisible="state != 'object_create'"
|
||||
required="state == 'object_create'"/>
|
||||
<field name="value" widget="char" string="Name" invisible="state != 'object_create'"
|
||||
help="The name of the record to create" placeholder="e.g. Follow-up"/>
|
||||
<field name="link_field_id"
|
||||
domain="[('model_id', '=', model_id), ('relation', '=', crud_model_name),
|
||||
('ttype', 'in', ['many2one', 'one2many', 'many2many'])]"
|
||||
placeholder="Select a field to link the record to"
|
||||
options="{'no_create': True, 'no_open': True}"
|
||||
invisible="state != 'object_create'"
|
||||
context="{'default_model_id': model_id, 'default_relation': crud_model_name}"/>
|
||||
<field name="webhook_url" string="URL" invisible="state != 'webhook'" placeholder="e.g. https://maker.ifttt.com/use/..."/>
|
||||
<field name="webhook_field_ids" string="Fields" invisible="state != 'webhook'" widget="many2many_tags" context="{'hide_model': 1}" domain="[('model_id', '=', model_id)]" placeholder="Select fields to include in the request..."/>
|
||||
<group invisible="state not in ['object_create', 'object_copy']">
|
||||
<group>
|
||||
<field name="crud_model_id"
|
||||
options="{'no_create': True, 'no_open': True}"
|
||||
required="state in ['object_create', 'object_copy']"/>
|
||||
<field name="value" widget="char" string="Name" invisible="state != 'object_create'"
|
||||
help="The name of the record to create" placeholder="e.g. Follow-up"/>
|
||||
<field name="resource_ref" placeholder="Choose a record..." string="Duplicate from" options="{'model_field': 'crud_model_id', 'no_create': True, 'no_open': True}" invisible="crud_model_id == False or state != 'object_copy'" required="state == 'object_copy'"/>
|
||||
<field name="link_field_id"
|
||||
domain="[('model_id', '=', model_id), ('relation', '=', crud_model_name),
|
||||
('ttype', 'in', ['many2one', 'one2many', 'many2many'])]"
|
||||
placeholder="Select a field to link the record to"
|
||||
options="{'no_create': True, 'no_open': True}"
|
||||
context="{'default_model_id': model_id, 'default_relation': crud_model_name}"/>
|
||||
</group>
|
||||
<group invisible="state != 'webhook'">
|
||||
</group>
|
||||
<group invisible="state != 'webhook'">
|
||||
<group>
|
||||
<field name="webhook_url" string="URL" placeholder="e.g. https://maker.ifttt.com/use/..."/>
|
||||
<field name="webhook_field_ids" string="Fields" widget="many2many_tags" context="{'hide_model': 1}" domain="[('model_id', '=', model_id)]" placeholder="Select fields to include in the request..."/>
|
||||
</group>
|
||||
<group>
|
||||
<label for="webhook_sample_payload" />
|
||||
<field name="webhook_sample_payload" string="Sample Payload" nolabel="1" colspan="2" readonly="1" widget="code" options="{'mode': 'javascript'}" />
|
||||
</group>
|
||||
</group>
|
||||
<field name="child_ids" domain="[('model_id', '=', model_id)]" invisible="state != 'multi'"/>
|
||||
<p class="oe_grey" invisible="state != 'multi'">
|
||||
If several child actions return an action, only the last one will be executed.
|
||||
This may happen when having server actions executing code that returns an action, or server actions returning a client action.
|
||||
</p>
|
||||
<notebook invisible="state != 'code'">
|
||||
<page string="Code">
|
||||
<field name="code" invisible="state != 'code'" widget="code" options="{'mode': 'python'}" placeholder="Enter Python code here. Help about Python expression is available in the help tab of this document."/>
|
||||
</page>
|
||||
<page string="Help">
|
||||
<p>The following variables can be used:</p>
|
||||
<ul>
|
||||
<li><code>env</code>: environment on which the action is triggered</li>
|
||||
<li><code>model</code>: model of the record on which the action is triggered; is a void recordset</li>
|
||||
<li><code>record</code>: record on which the action is triggered; may be be void</li>
|
||||
<li><code>records</code>: recordset of all records on which the action is triggered in multi mode; may be void</li>
|
||||
<li><code>time</code>, <code>datetime</code>, <code>dateutil</code>, <code>timezone</code>: useful Python libraries</li>
|
||||
<li><code>float_compare()</code>: utility function to compare floats based on a specific precision</li>
|
||||
<li><code>log(message, level='info')</code>: logging function to record debug information in <code>ir.logging</code> table</li>
|
||||
<li><code>_logger.info(message)</code>: logger to emit messages in server logs</li>
|
||||
<li><code>UserError</code>: exception class for raising user-facing warning messages</li>
|
||||
<li><code>Command</code>: x2many commands namespace</li>
|
||||
<li>To return an action, assign: <code>action = {...}</code></li>
|
||||
<li>To notify progress for CRON call and re-trigger a call if there is remaining tasks, use <code>env['ir.cron']._notify_progress(done=task_done_count, remaining=task_remaining_count)</code></li>
|
||||
</ul>
|
||||
<div >
|
||||
<p>Example of Python code:</p>
|
||||
<pre style='white-space: pre-wrap'>partner_name = record.name + '_code'
|
||||
</group>
|
||||
<group>
|
||||
<field name="usage"/>
|
||||
</group>
|
||||
<t invisible="state != 'multi'">
|
||||
<field name="child_ids" widget="many2many" mode="kanban" context="{
|
||||
'is_modal': 1,
|
||||
'default_model_id': model_id,
|
||||
}"/>
|
||||
</t>
|
||||
<notebook>
|
||||
<page string="Code" invisible="state != 'code'">
|
||||
<field name="code" invisible="state != 'code'" widget="code" options="{'mode': 'python'}" placeholder="Enter Python code here. Help about Python expression is available in the help tab of this document."/>
|
||||
</page>
|
||||
<page string="Help" invisible="state != 'code'" name="ir_actions_server_code_help">
|
||||
<p>The following variables can be used:</p>
|
||||
<ul>
|
||||
<li><code>env</code>: environment on which the action is triggered</li>
|
||||
<li><code>model</code>: model of the record on which the action is triggered; is a void recordset</li>
|
||||
<li><code>record</code>: record on which the action is triggered; may be be void</li>
|
||||
<li><code>records</code>: recordset of all records on which the action is triggered in multi mode; may be void</li>
|
||||
<li><code>time</code>, <code>datetime</code>, <code>dateutil</code>, <code>timezone</code>: useful Python libraries</li>
|
||||
<li><code>float_compare()</code>: utility function to compare floats based on a specific precision</li>
|
||||
<li><code>log(message, level='info')</code>: logging function to record debug information in <code>ir.logging</code> table</li>
|
||||
<li><code>_logger.info(message)</code>: logger to emit messages in server logs</li>
|
||||
<li><code>UserError</code>: exception class for raising user-facing warning messages</li>
|
||||
<li><code>Command</code>: x2many commands namespace</li>
|
||||
<li>To return an action, assign: <code>action = {...}</code></li>
|
||||
<li>To notify progress for CRON call and re-trigger a call if there is remaining tasks, use <code>env['ir.cron']._notify_progress(done=task_done_count, remaining=task_remaining_count)</code></li>
|
||||
</ul>
|
||||
<p>
|
||||
<widget name="documentation_link"
|
||||
path="/developer/reference/backend/orm.html"
|
||||
label="ORM API Documentation"
|
||||
icon="oi oi-fw oi-arrow-right me-1"/>
|
||||
</p>
|
||||
<div >
|
||||
<p>Example of Python code:</p>
|
||||
<pre style='white-space: pre-wrap'>partner_name = record.name + '_code'
|
||||
env['res.partner'].create({'name': partner_name})
|
||||
</pre>
|
||||
</div>
|
||||
</page>
|
||||
</notebook>
|
||||
</div>
|
||||
</page>
|
||||
<page string="Usage" name="usage" invisible="1"/>
|
||||
</notebook>
|
||||
</t>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_server_action_kanban" model="ir.ui.view">
|
||||
<field name="name">Server Actions</field>
|
||||
<field name="model">ir.actions.server</field>
|
||||
<field name="arch" type="xml">
|
||||
<kanban>
|
||||
<control>
|
||||
<create string="Add an action" />
|
||||
</control>
|
||||
<field name="state"/>
|
||||
<field name="evaluation_type"/>
|
||||
<field name="value"/>
|
||||
<field name="value_field_to_show"/>
|
||||
<field name="update_field_type"/>
|
||||
<field name="update_m2m_operation"/>
|
||||
<templates>
|
||||
<t t-name="card" class="o_draggable_norotate w-100 flex-row align-items-center gap-1">
|
||||
<field name="sequence" widget="handle" class="px-1" />
|
||||
<!-- Icon section -->
|
||||
<i
|
||||
data-name="server_action_icon"
|
||||
t-att-title="record.state.value"
|
||||
class="fa fa-fw"
|
||||
t-att-class="{
|
||||
'code': 'fa-code',
|
||||
'object_create': 'fa-plus-square',
|
||||
'object_copy': 'fa-clone',
|
||||
'object_write': 'fa-pencil',
|
||||
'multi': 'fa-list-ul',
|
||||
'mail_post': 'fa-envelope',
|
||||
'followers': 'fa-user',
|
||||
'remove_followers': 'fa-user-times',
|
||||
'next_activity': 'fa-clock-o',
|
||||
'sms': 'fa-mobile',
|
||||
'webhook': 'fa-paper-plane',
|
||||
'whatsapp': 'fa-whatsapp',
|
||||
'ai': 'fa-magic',
|
||||
}[record.state.raw_value] || 'fa-circle-thin'"
|
||||
/>
|
||||
<i class="fa fa-warning text-warning px-2 m-0" invisible="not warning" t-att-title="record.warning.raw_value"/>
|
||||
<field name="name" class="text-truncate" />
|
||||
<button type="delete" name="delete" class="btn fa fa-trash fa-xl px-3 ms-auto" title="Delete Action" />
|
||||
</t>
|
||||
</templates>
|
||||
</kanban>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_server_action_tree" model="ir.ui.view">
|
||||
<field name="name">Server Actions</field>
|
||||
<field name="model">ir.actions.server</field>
|
||||
<field name="arch" type="xml">
|
||||
<list string="Server Actions">
|
||||
<field name="name"/>
|
||||
<field name="state"/>
|
||||
<field name="name" string="Name"/>
|
||||
<field name="model_id"/>
|
||||
<field name="state"/>
|
||||
<field name="usage"/>
|
||||
</list>
|
||||
</field>
|
||||
|
|
@ -453,7 +577,8 @@ env['res.partner'].create({'name': partner_name})
|
|||
<field name="name" string="Server Action"/>
|
||||
<field name="model_id"/>
|
||||
<field name="state"/>
|
||||
<group expand="0" string="Group By" colspan="4" col="4">
|
||||
<filter string="Top-level actions" name="toplevel_actions" domain="[('parent_id', '=', False)]"/>
|
||||
<group colspan="4" col="4">
|
||||
<filter string="Action Type" name="action_type" domain="[]" context="{'group_by':'state'}"/>
|
||||
<filter string="Model" name="model" domain="[]" context="{'group_by':'model_id'}"/>
|
||||
<filter string="Usage" name="usage" domain="[]" context="{'group_by':'usage'}"/>
|
||||
|
|
@ -468,7 +593,10 @@ env['res.partner'].create({'name': partner_name})
|
|||
<field name="view_mode">list,form</field>
|
||||
<field name="view_id" ref="view_server_action_tree"/>
|
||||
<field name="search_view_id" ref="view_server_action_search"/>
|
||||
<field name="context">{'key':'server_action'}</field>
|
||||
<field name="context">{
|
||||
'key':'server_action',
|
||||
'search_default_toplevel_actions': 1,
|
||||
}</field>
|
||||
</record>
|
||||
<menuitem action="action_server_action" id="menu_server_action" parent="base.next_id_6"/>
|
||||
|
||||
|
|
|
|||
|
|
@ -75,7 +75,7 @@
|
|||
<separator/>
|
||||
<field name="create_uid" string="Created by"/>
|
||||
<field name="type"/>
|
||||
<group expand="0" string="Group By">
|
||||
<group>
|
||||
<filter name="owner" string="Owner" domain="[]" context="{'group_by':'create_uid'}"/>
|
||||
<filter string="Type" name="type" domain="[]" context="{'group_by':'type'}" groups="base.group_no_one"/>
|
||||
<filter string="Company" name="company" domain="[]" context="{'group_by':'company_id'}" groups="base.group_multi_company"/>
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@
|
|||
<record model="ir.ui.view" id="view_ir_config_list">
|
||||
<field name="model">ir.config_parameter</field>
|
||||
<field name="arch" type="xml">
|
||||
<list string="System Parameters">
|
||||
<list string="System Parameters" editable="bottom">
|
||||
<field name="key"/>
|
||||
<field name="value"/>
|
||||
</list>
|
||||
|
|
|
|||
|
|
@ -14,16 +14,21 @@
|
|||
</xpath>
|
||||
<xpath expr="//button[@name='run']" position="replace">
|
||||
</xpath>
|
||||
<xpath expr="//group[@name='action_content']" position="inside">
|
||||
<field name="user_id"/>
|
||||
<label for="interval_number" string="Execute Every"/>
|
||||
<div>
|
||||
<field name="interval_number" class="oe_inline"/>
|
||||
<field name="interval_type" class="oe_inline"/>
|
||||
</div>
|
||||
<field name="active" widget="boolean_toggle"/>
|
||||
<field name="nextcall"/>
|
||||
<field name="priority"/>
|
||||
<xpath expr="//button[@name='history_wizard_action']" position="replace"/>
|
||||
<xpath expr="//notebook" position="before">
|
||||
<group>
|
||||
<group>
|
||||
<field name="user_id"/>
|
||||
<label for="interval_number" string="Execute Every"/>
|
||||
<div>
|
||||
<field name="interval_number" class="oe_inline"/>
|
||||
<field name="interval_type" class="oe_inline"/>
|
||||
</div>
|
||||
<field name="active" widget="boolean_toggle"/>
|
||||
<field name="nextcall"/>
|
||||
<field name="priority"/>
|
||||
</group>
|
||||
</group>
|
||||
</xpath>
|
||||
<field name="state" position="attributes">
|
||||
<attribute name="invisible">1</attribute>
|
||||
|
|
@ -69,7 +74,7 @@
|
|||
<filter string="All" name="all" domain="['|', ('active', '=', False), ('active', '=', True)]" />
|
||||
<separator/>
|
||||
<filter string="Archived" name="inactive" domain="[('active', '=', False)]"/>
|
||||
<group expand="0" string="Group By">
|
||||
<group>
|
||||
<filter string="User" name="user" domain="[]" context="{'group_by': 'user_id'}"/>
|
||||
<filter string="Execution" name="execution" domain="[]" context="{'group_by': 'nextcall'}" />
|
||||
<filter string="Model" name="groupby_model_id" domain="[]" context="{'group_by': 'model_id'}"/>
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@
|
|||
<field name="field_id"/>
|
||||
<field name="user_id"/>
|
||||
<field name="company_id" groups="base.group_multi_company"/>
|
||||
<group expand="0" string="Group By">
|
||||
<group>
|
||||
<filter string="User" name="groupby_user" domain="[]" context="{'group_by':'user_id'}"/>
|
||||
<filter string="Company" name="groupby_company" domain="[]" context="{'group_by':'company_id'}"/>
|
||||
</group>
|
||||
|
|
|
|||
|
|
@ -5,31 +5,48 @@
|
|||
<field name="model">ir.filters</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Filters">
|
||||
<sheet>
|
||||
<group col="4">
|
||||
<field name="name"/>
|
||||
<field name="user_id" string="Available for User"/>
|
||||
<field name="model_id"/>
|
||||
<field name="is_default"/>
|
||||
<field name="action_id"/>
|
||||
<field name="active" widget="boolean_toggle"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="domain" widget="domain" options="{'model': 'model_id'}"/>
|
||||
<field name="context"/>
|
||||
<field name="sort"/>
|
||||
</group>
|
||||
</sheet>
|
||||
<field name="model_id" invisible="1"/> <!-- required for the domain widget model option when the user is not in debug -->
|
||||
<sheet>
|
||||
<div class="ribbon ribbon-top-right" invisible="active">
|
||||
<span class="text-bg-primary">Archived</span>
|
||||
</div>
|
||||
<group>
|
||||
<group>
|
||||
<field name="name"/>
|
||||
<field name="user_ids" string="Shared with" widget="many2many_tags_avatar" placeholder="All users"/>
|
||||
<field name="is_default" widget="boolean_toggle"/>
|
||||
<field name="model_id" groups="base.group_no_one"/>
|
||||
<field name="action_id" groups="base.group_no_one"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="domain" widget="domain" options="{'foldable': True, 'model': 'model_id', 'allow_expressions':True}"/>
|
||||
<field name="context" groups="base.group_no_one"/>
|
||||
<field name="sort" groups="base.group_no_one"/>
|
||||
</group>
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
<record id="ir_filters_view_edit_form" model="ir.ui.view">
|
||||
<field name="model">ir.filters</field>
|
||||
<field name="inherit_id" ref="base.ir_filters_view_form"/>
|
||||
<field name="mode">primary</field>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//form" position="attributes">
|
||||
<attribute name="create">0</attribute>
|
||||
</xpath>
|
||||
<field name="action_id" position="replace"/>
|
||||
<xpath expr="//group/field[@name='model_id']" position="replace"/>
|
||||
</field>
|
||||
</record>
|
||||
<record id="ir_filters_view_tree" model="ir.ui.view">
|
||||
<field name="model">ir.filters</field>
|
||||
<field name="arch" type="xml">
|
||||
<list string="Filters">
|
||||
<field name="name"/>
|
||||
<field name="model_id"/>
|
||||
<field name="user_id"/>
|
||||
<field name="user_ids" widget="many2many_tags_avatar"/>
|
||||
<field name="is_default"/>
|
||||
<field name="action_id"/>
|
||||
<field name="domain" groups="base.group_no_one"/>
|
||||
|
|
@ -43,17 +60,16 @@
|
|||
<field name="arch" type="xml">
|
||||
<search string="Filters">
|
||||
<field name="name" string="Filter Name"/>
|
||||
<filter string="User" domain="[('user_id','!=',False)]" name="user" help="Filters visible only for one user"/>
|
||||
<filter string="Shared" domain="[('user_id','=',False)]" name="shared" help="Filters shared with all users"/>
|
||||
<filter string="My filters" domain="[('user_id','=',uid)]" name="my_filters" help="Filters created by myself"/>
|
||||
<filter string="Global" domain="[('user_ids','=',False)]" name="shared" help="Filters shared with all users"/>
|
||||
<filter string="My filters" domain="[('user_ids','in',[uid])]" name="my_filters" help="Filters shared with myself"/>
|
||||
<separator/>
|
||||
<filter string="Archived" name="inactive" domain="[('active', '=', False)]"/>
|
||||
<group expand="0" string="Group By">
|
||||
<filter string="User" name="user" domain="[]" context="{'group_by':'user_id'}"/>
|
||||
<group>
|
||||
<filter string="User" name="user" domain="[]" context="{'group_by':'user_ids'}"/>
|
||||
<filter string="Model" name="model" domain="[]" context="{'group_by':'model_id'}"/>
|
||||
</group>
|
||||
<field name="model_id"/>
|
||||
<field name="user_id"/>
|
||||
<field name="user_ids"/>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
|
|
|||
|
|
@ -48,7 +48,7 @@
|
|||
<field name="name" />
|
||||
<field name="level" />
|
||||
<field name="message" />
|
||||
<group expand="0" string="Group By">
|
||||
<group>
|
||||
<filter string="Database" name="database" domain="[]" context="{'group_by': 'dbname'}" />
|
||||
<filter string="Level" name="group_by_level" domain="[]" context="{'group_by': 'level'}" />
|
||||
<filter string="Type" name="group_by_type" domain="[]" context="{'group_by': 'type'}" />
|
||||
|
|
|
|||
|
|
@ -56,7 +56,8 @@
|
|||
required="smtp_authentication != 'cli'"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="smtp_user" invisible="smtp_authentication == 'certificate'" force_save="1"/>
|
||||
<label for="smtp_user" string="Username" invisible="smtp_authentication == 'certificate'"/>
|
||||
<field name="smtp_user" invisible="smtp_authentication == 'certificate'" force_save="1" nolabel="1"/>
|
||||
<field name="smtp_pass" invisible="smtp_authentication != 'login'" password="True" force_save="1"/>
|
||||
<field name="smtp_ssl_certificate" invisible="smtp_authentication != 'certificate'" force_save="1"/>
|
||||
<field name="smtp_ssl_private_key" invisible="smtp_authentication != 'certificate'" force_save="1"/>
|
||||
|
|
@ -107,6 +108,13 @@
|
|||
<field name="view_mode">list,form</field>
|
||||
<field name="view_id" ref="ir_mail_server_list" />
|
||||
<field name="search_view_id" ref="view_ir_mail_server_search"/>
|
||||
<field name="help" type="html">
|
||||
<div>
|
||||
<b class="o_view_nocontent_smiling_face">
|
||||
No Outgoing Servers yet
|
||||
</b>
|
||||
</div>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<menuitem id="menu_mail_servers" parent="menu_email" action="action_ir_mail_server_list" sequence="5" groups="base.group_no_one"/>
|
||||
|
|
|
|||
|
|
@ -1,36 +1,10 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
|
||||
<!-- menu_create from model form -->
|
||||
<record id="view_model_menu_create" model="ir.ui.view">
|
||||
<field name="name">Create Menu</field>
|
||||
<field name="model">wizard.ir.model.menu.create</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Create Menu">
|
||||
<group>
|
||||
<field name="name"/>
|
||||
<field name="menu_id"/>
|
||||
</group>
|
||||
<footer>
|
||||
<button name="menu_create" string="Create Menu" type="object" class="btn-primary" data-hotkey="q"/>
|
||||
<button string="Cancel" class="btn-secondary" special="cancel" data-hotkey="x" />
|
||||
</footer>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
<record id="act_menu_create" model="ir.actions.act_window">
|
||||
<field name="name">Create Menu</field>
|
||||
<field name="res_model">wizard.ir.model.menu.create</field>
|
||||
<field name="view_mode">form</field>
|
||||
<field name="target">new</field>
|
||||
<field name="context">{'model_id': active_id}</field>
|
||||
</record>
|
||||
|
||||
<!-- model -->
|
||||
<record id="view_model_form" model="ir.ui.view">
|
||||
<field name="model">ir.model</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Model Description">
|
||||
<form string="Model Description" duplicate="0">
|
||||
<header><!-- used for override --></header>
|
||||
<sheet>
|
||||
<group>
|
||||
|
|
@ -38,6 +12,7 @@
|
|||
<field name="name"/>
|
||||
<field name="model" readonly="id"/>
|
||||
<field name="order"/>
|
||||
<field name="abstract" readonly="id" groups="base.group_no_one"/>
|
||||
<field name="transient" readonly="id" groups="base.group_no_one"/>
|
||||
</group>
|
||||
<group>
|
||||
|
|
@ -70,13 +45,15 @@
|
|||
</group>
|
||||
<notebook>
|
||||
<page name="base" string="Properties">
|
||||
<group string="Base Properties">
|
||||
<group>
|
||||
<group>
|
||||
<field name="required"/>
|
||||
<field name="readonly"/>
|
||||
<field name="store" groups="base.group_no_one"/>
|
||||
<field name="index" groups="base.group_no_one"/>
|
||||
<field name="copied" groups="base.group_no_one"/>
|
||||
<field name="state" groups="base.group_no_one"/>
|
||||
<field name="modules" groups="base.group_no_one"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="translate"
|
||||
|
|
@ -119,12 +96,14 @@
|
|||
</list>
|
||||
</field>
|
||||
</group>
|
||||
<group string="Advanced Properties" groups="base.group_no_one">
|
||||
</page>
|
||||
<page name="compute" string="Compute" groups="base.group_no_one">
|
||||
<group>
|
||||
<field name="related"/>
|
||||
<field name="depends" required="compute not in [False, '']"/>
|
||||
<field name="compute" widget="code" options="{'mode': 'python'}"/>
|
||||
</group>
|
||||
<div groups="base.group_no_one">
|
||||
<div>
|
||||
<h3>How to define a computed field</h3>
|
||||
<p>Computed fields are defined with the fields
|
||||
<strong>Dependencies</strong> and <strong>Compute</strong>.</p>
|
||||
|
|
@ -155,12 +134,6 @@
|
|||
<page name="groups" string="Access Rights">
|
||||
<field name="groups"/>
|
||||
</page>
|
||||
<page name="misc" string="Miscellaneous" groups="base.group_no_one">
|
||||
<group>
|
||||
<field name="state"/>
|
||||
<field name="modules"/>
|
||||
</group>
|
||||
</page>
|
||||
</notebook>
|
||||
</form>
|
||||
</field>
|
||||
|
|
@ -212,7 +185,7 @@
|
|||
<record id="view_model_tree" model="ir.ui.view">
|
||||
<field name="model">ir.model</field>
|
||||
<field name="arch" type="xml">
|
||||
<list string="Model Description">
|
||||
<list string="Model Description" duplicate="0">
|
||||
<field name="model"/>
|
||||
<field name="name"/>
|
||||
<field name="state"/>
|
||||
|
|
@ -226,6 +199,7 @@
|
|||
<search string="Model Description">
|
||||
<field name="name" filter_domain="['|', ('name','ilike',self), ('model','ilike',self)]" string="Model"/>
|
||||
<field name="model" filter_domain="[('model','ilike',self)]" string="Technical Name"/>
|
||||
<filter string="Abstract" name="abstract" domain="[('abstract', '=', True)]"/>
|
||||
<filter string="Transient" name="transient" domain="[('transient', '=', True)]"/>
|
||||
<separator/>
|
||||
<filter string="Custom" name="custom" domain="[('state', '=', 'manual')]"/>
|
||||
|
|
@ -260,13 +234,15 @@
|
|||
</group>
|
||||
<notebook>
|
||||
<page name="base" string="Properties">
|
||||
<group string="Base Properties">
|
||||
<group>
|
||||
<group>
|
||||
<field name="required"/>
|
||||
<field name="readonly"/>
|
||||
<field name="store" groups="base.group_no_one"/>
|
||||
<field name="index" groups="base.group_no_one"/>
|
||||
<field name="copied" groups="base.group_no_one"/>
|
||||
<field name="state" groups="base.group_no_one"/>
|
||||
<field name="modules" groups="base.group_no_one"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="translate"
|
||||
|
|
@ -306,7 +282,7 @@
|
|||
readonly="ttype != 'monetary'"/>
|
||||
</group>
|
||||
</group>
|
||||
<group string="HTML/Sanitization Properties">
|
||||
<group string="HTML/Sanitization Properties" invisible="ttype != 'html'">
|
||||
<group>
|
||||
<field name="sanitize"
|
||||
invisible="ttype != 'html'"
|
||||
|
|
@ -345,12 +321,14 @@
|
|||
</list>
|
||||
</field>
|
||||
</group>
|
||||
<group string="Advanced Properties" groups="base.group_no_one">
|
||||
</page>
|
||||
<page name="compute" string="Compute" groups="base.group_no_one">
|
||||
<group>
|
||||
<field name="related"/>
|
||||
<field name="depends" required="compute not in [False, '']"/>
|
||||
<field name="depends" required="bool(compute) and store"/>
|
||||
<field name="compute" widget="code" options="{'mode': 'python'}"/>
|
||||
</group>
|
||||
<div groups="base.group_no_one">
|
||||
<div>
|
||||
<h3>How to define a computed field</h3>
|
||||
<p>Computed fields are defined with the fields
|
||||
<strong>Dependencies</strong> and <strong>Compute</strong>.</p>
|
||||
|
|
@ -381,12 +359,6 @@
|
|||
<page name="groups" string="Access Rights">
|
||||
<field name="groups"/>
|
||||
</page>
|
||||
<page name="misc" string="Miscellaneous" groups="base.group_no_one">
|
||||
<group>
|
||||
<field name="state"/>
|
||||
<field name="modules"/>
|
||||
</group>
|
||||
</page>
|
||||
</notebook>
|
||||
</sheet>
|
||||
</form>
|
||||
|
|
@ -426,7 +398,7 @@
|
|||
<field name="required"/>
|
||||
<field name="readonly"/>
|
||||
<field name="relation"/>
|
||||
<group expand="0" string="Group By">
|
||||
<group>
|
||||
<filter string="Model" name="group_by_object" domain="[]" context="{'group_by':'model_id'}"/>
|
||||
<filter string="Field Type" name="group_by_ttype" domain="[]" context="{'group_by':'ttype'}"/>
|
||||
</group>
|
||||
|
|
@ -462,7 +434,7 @@
|
|||
<field name="arch" type="xml">
|
||||
<list>
|
||||
<field name="sequence" widget="handle"/>
|
||||
<field name="field_id"/>
|
||||
<field name="field_id" options="{'no_quick_create': True}"/>
|
||||
<field name="value"/>
|
||||
<field name="name"/>
|
||||
</list>
|
||||
|
|
@ -538,7 +510,7 @@
|
|||
<field name="model"/>
|
||||
<field name="res_id"/>
|
||||
<field name="noupdate"/>
|
||||
<group expand="0" string="Group By">
|
||||
<group>
|
||||
<filter string="Module" name="group_by_module" domain="[]" context="{'group_by':'module'}"/>
|
||||
<filter string="Model" name="group_by_object" domain="[]" context="{'group_by':'model'}"/>
|
||||
</group>
|
||||
|
|
@ -592,7 +564,7 @@
|
|||
<field name="model"/>
|
||||
<field name="name"/>
|
||||
<field name="message"/>
|
||||
<group expand="1" string="Group By">
|
||||
<group>
|
||||
<filter name="module" string="Module" context="{'group_by' : 'module'}"/>
|
||||
<filter name="model" string="Model" context="{'group_by': 'model'}"/>
|
||||
<filter name="type" string="Constraint type" context="{'group_by' : 'type'}"/>
|
||||
|
|
@ -718,7 +690,7 @@
|
|||
<filter string="Archived" name="inactive" domain="[('active', '=', False)]"/>
|
||||
<field name="model_id"/>
|
||||
<field name="group_id"/>
|
||||
<group expand="0" string="Group By" colspan="11" col="11" groups="base.group_no_one">
|
||||
<group colspan="11" col="11" groups="base.group_no_one">
|
||||
<filter string="Group" name="group" domain="[]" context="{'group_by': 'group_id'}"/>
|
||||
<filter string="Model" name="group_by_object" domain="[]" context="{'group_by': 'model_id'}"/>
|
||||
</group>
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@
|
|||
<filter name="installed" string="Installed" domain="[('state', 'in', ['installed', 'to upgrade', 'to remove'])]"/>
|
||||
<filter name="not_installed" string="Not Installed" domain="[('state', 'in', ['uninstalled', 'uninstallable', 'to install'])]"/>
|
||||
<field name="category_id"/>
|
||||
<group expand="0" string="Group By">
|
||||
<group>
|
||||
<filter string="Author" name="author" domain="[]" context="{'group_by':'author'}"/>
|
||||
<filter string="Category" name="category" domain="[]" context="{'group_by':'category_id'}"/>
|
||||
<filter string="Status" name="state" domain="[]" context="{'group_by':'state'}"/>
|
||||
|
|
@ -68,9 +68,9 @@
|
|||
invisible="not to_buy or state not in ('uninstalled', 'uninstallable')" role="button">Upgrade</a>
|
||||
<button name="button_immediate_upgrade" invisible="state != 'installed'" string="Upgrade" type="object" class="btn btn-primary me-1" groups="base.group_system"/>
|
||||
<button name="button_uninstall_wizard" invisible="state != 'installed'" string="Uninstall" type="object" class="btn btn-secondary me-1" groups="base.group_system"/>
|
||||
<button name="button_uninstall_cancel" invisible="state != 'to remove'" string="Cancel Uninstall" type="object" class="btn btn-secondary me-1" groups="base.group_system"/>
|
||||
<button name="button_upgrade_cancel" invisible="state != 'to upgrade'" string="Cancel Upgrade" type="object" class="btn btn-secondary me-1" groups="base.group_system"/>
|
||||
<button name="button_install_cancel" invisible="state != 'to install'" string="Cancel Install" type="object" class="btn btn-secondary me-1" groups="base.group_system"/>
|
||||
<button invisible="state != 'to remove'" class="btn btn-secondary me-1" groups="base.group_system" disabled="1">Removing</button>
|
||||
<button invisible="state != 'to upgrade'" class="btn btn-secondary me-1" groups="base.group_system" disabled="1">Upgrading</button>
|
||||
<button invisible="state != 'to install'" class="btn btn-secondary me-1" groups="base.group_system" disabled="1">Installing</button>
|
||||
</div>
|
||||
<h6 class="text-muted mt-2" invisible="not has_iap">Contains In-App Purchases</h6>
|
||||
</div>
|
||||
|
|
@ -94,7 +94,7 @@
|
|||
</group>
|
||||
<group>
|
||||
<group string="Dependencies">
|
||||
<field name="dependencies_id" nolabel="1">
|
||||
<field name="dependencies_id" nolabel="1" colspan="2">
|
||||
<list string="Dependencies">
|
||||
<field name="name"/>
|
||||
<field name="state"/>
|
||||
|
|
@ -102,7 +102,7 @@
|
|||
</field>
|
||||
</group>
|
||||
<group string="Exclusions">
|
||||
<field name="exclusion_ids" nolabel="1">
|
||||
<field name="exclusion_ids" nolabel="1" colspan="2">
|
||||
<list string="Exclusions">
|
||||
<field name="name"/>
|
||||
<field name="state"/>
|
||||
|
|
@ -163,7 +163,7 @@
|
|||
<a type="open" class="dropdown-item">Module Info</a>
|
||||
<a t-if="record.website.raw_value" role="menuitem" class="dropdown-item o-hidden-ios" t-att-href="record.website.raw_value" target="_blank">Learn More</a>
|
||||
<a t-if="installed" name="button_immediate_upgrade" type="object" role="menuitem" class="dropdown-item" groups="base.group_system">Upgrade</a>
|
||||
<a t-if="installed" name="button_uninstall_wizard" type="object" role="menuitem" class="dropdown-item" groups="base.group_system">Uninstall</a>
|
||||
<a t-if="installed" name="button_uninstall_wizard" type="object" role="menuitem" class="dropdown-item" groups="base.group_system">Uninstall…</a>
|
||||
</t>
|
||||
<t t-name="card" class="flex-row align-items-center">
|
||||
<aside>
|
||||
|
|
@ -178,12 +178,13 @@
|
|||
</p>
|
||||
<footer class="w-100 justify-content-between">
|
||||
<button type="object" class="btn btn-primary btn-sm" name="button_immediate_install" invisible="state != 'uninstalled'" t-if="! record.to_buy.raw_value" groups="base.group_system">Activate</button>
|
||||
<div t-if="installed" class="d-flex align-items-center text-muted float-start">Installed</div>
|
||||
<button t-if="installed" class="d-flex align-items-center text-muted float-start">Installed</button>
|
||||
<a t-att-href="record.website.raw_value" target="_blank" invisible="website in (False, '')" class="btn btn-sm btn-secondary float-end o-hidden-ios" role="button">Learn More</a>
|
||||
<a type="edit" class="btn btn-secondary btn-sm float-end" role="button" invisible="website != ''">Module Info</a>
|
||||
<a type="open" class="btn btn-secondary btn-sm float-end" id="module_info" role="button" invisible="website != ''">Module Info</a>
|
||||
<a href="https://odoo.com/pricing?utm_source=db&utm_medium=module#hosting=on_premise" target="_blank" class="btn btn-info btn-sm" invisible="state not in ('uninstalled', 'uninstallable')" t-if="record.to_buy.raw_value" role="button" groups="base.group_system">Upgrade</a>
|
||||
<button invisible="state != 'to remove'" type="object" class="btn btn-sm btn-primary" name="button_uninstall_cancel" groups="base.group_system">Cancel Uninstall</button>
|
||||
<button invisible="state != 'to install'" type="object" class="btn btn-sm btn-primary" name="button_install_cancel" groups="base.group_system">Cancel Install</button>
|
||||
<button invisible="state != 'to remove'" class="btn btn-sm btn-secondary" groups="base.group_system" disabled="1">Removing</button>
|
||||
<button invisible="state != 'to upgrade'" class="btn btn-sm btn-secondary" groups="base.group_system" disabled="1">Upgrading</button>
|
||||
<button invisible="state != 'to install'" class="btn btn-sm btn-secondary" groups="base.group_system" disabled="1">Installing</button>
|
||||
</footer>
|
||||
</main>
|
||||
</t>
|
||||
|
|
|
|||
|
|
@ -17,14 +17,19 @@
|
|||
<field name="name">IR Profile List</field>
|
||||
<field name="model">ir.profile</field>
|
||||
<field name="arch" type="xml">
|
||||
<list string="Profile Session" default_order="session desc, id desc">
|
||||
<list string="Profile Session" default_order="session desc, id desc" create="0">
|
||||
<header>
|
||||
<button name="action_view_speedscope" type="object" string="View in speedscope"/>
|
||||
</header>
|
||||
<field name="create_date"/>
|
||||
<field name="session"/>
|
||||
<field name="name"/>
|
||||
<field name="entry_count"/>
|
||||
<field name="sql_count" optional="hide"/>
|
||||
<field name="speedscope_url" widget="url"/>
|
||||
<field name="config_url" widget="url"/>
|
||||
<field name="duration"/>
|
||||
<field name="cpu_duration" optional="hide"/>
|
||||
</list>
|
||||
</field>
|
||||
</record>
|
||||
|
|
@ -37,10 +42,12 @@
|
|||
<group>
|
||||
<field name="name"/>
|
||||
<field name="session"/>
|
||||
<field name="cpu_duration"/>
|
||||
<field name="entry_count"/>
|
||||
<!-- Do not rely on sql field for the invisible attrs to avoid fetching whole trace from server. -->
|
||||
<field name="sql_count" invisible="sql_count == 0"/>
|
||||
<field name="speedscope_url" widget="url"/>
|
||||
<field name="config_url" widget="url"/>
|
||||
</group>
|
||||
<group invisible="not qweb">
|
||||
<field name="qweb" widget="profiling_qweb_view" nolabel="1"/>
|
||||
|
|
|
|||
|
|
@ -28,12 +28,19 @@
|
|||
<i t-if="not options.get('no_marker')" class="fa fa-map-marker fa-fw" role="img" aria-label="Address" title="Address"/>
|
||||
<span class="w-100 lh-sm text-break d-block" itemprop="streetAddress" t-esc="address"/>
|
||||
</div>
|
||||
<div t-if="city and 'city' in fields" t-attf-class="d-flex align-items-baseline gap-1">
|
||||
<t t-set="has_city" t-value="city and 'city' in fields"/>
|
||||
<t t-set="has_state" t-value="object.state_id and object.country_id.state_required"/>
|
||||
<div t-if="has_city or (country_id and 'country_id' in fields)" t-attf-class="d-flex align-items-baseline gap-1">
|
||||
<i t-if="not options.get('no_marker')" class="fa fa-map-marker fa-fw" role="img" aria-label="Address" title="Address"/>
|
||||
<span>
|
||||
<div>
|
||||
<span itemprop="addressLocality" t-esc="city"/>,
|
||||
<span itemprop="addressCountry" t-esc="country_id"/>
|
||||
<t t-if="has_city">
|
||||
<span itemprop="addressLocality" t-out="city"/><t t-if="country_id">,</t>
|
||||
</t>
|
||||
<t t-if="has_state">
|
||||
<span itemprop="addressRegion" t-out="object.state_id.code"/>,
|
||||
</t>
|
||||
<span itemprop="addressCountry" t-out="country_id"/>
|
||||
</div>
|
||||
</span>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -86,7 +86,7 @@
|
|||
<filter string="Delete" name="delete_access_right" domain="[('perm_unlink', '=', True)]"/>
|
||||
<separator/>
|
||||
<filter string="Archived" name="inactive" domain="[('active', '=', False)]"/>
|
||||
<group string="Group By">
|
||||
<group>
|
||||
<filter string="Model" name="group_by_object" domain="[]" context="{'group_by': 'model_id'}"/>
|
||||
<separator/>
|
||||
<filter string="Group" name="group_by_group" domain="[]" context="{'group_by': 'groups'}"/>
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@
|
|||
<field name="number_next_actual" string="Next Number"/>
|
||||
</list>
|
||||
</field>
|
||||
<group col="3" string="Legend (for prefix, suffix)">
|
||||
<group col="4" string="Legend (for prefix, suffix)">
|
||||
<group>
|
||||
<span colspan="2">Current Year with Century: %%(year)s</span>
|
||||
<span colspan="2">Current Year without Century: %%(y)s</span>
|
||||
|
|
@ -56,6 +56,11 @@
|
|||
<span colspan="2">Minute: %%(min)s</span>
|
||||
<span colspan="2">Second: %%(sec)s</span>
|
||||
</group>
|
||||
<group>
|
||||
<span colspan="2">ISO 8601 Week Year with Century: %%(isoyear)s</span>
|
||||
<span colspan="2">ISO 8601 Week Year without Century: %%(isoy)s</span>
|
||||
<span colspan="2">ISO 8601 Week Number: %%(isoweek)s</span>
|
||||
</group>
|
||||
</group>
|
||||
<group invisible="not use_date_range">
|
||||
<div colspan="2">
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@
|
|||
<field name="name"/>
|
||||
<field name="parent_id" groups="base.group_no_one"/>
|
||||
<field name="sequence" groups="base.group_no_one"/>
|
||||
<field name="group_ids" string="Visibility" widget="many2many_tags"/>
|
||||
</group>
|
||||
<group groups="base.group_no_one">
|
||||
<field name="complete_name"/>
|
||||
|
|
@ -19,9 +20,6 @@
|
|||
</group>
|
||||
</group>
|
||||
<notebook>
|
||||
<page string="Visibility" name="access_rights">
|
||||
<field name="groups_id"/>
|
||||
</page>
|
||||
<page string="Submenus" name="submenus" groups="base.group_no_one">
|
||||
<!-- Note: make sure you have 'ir.ui.menu.full_list'
|
||||
in the context to see all submenus! -->
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@
|
|||
<field name="arch_base" string="View Architecture" widget="code" options="{'mode': 'xml'}" required="1"/>
|
||||
</page>
|
||||
<page string="Access Rights" name="access_rights">
|
||||
<field name="groups_id"/>
|
||||
<field name="group_ids"/>
|
||||
</page>
|
||||
<page name="inherit_children" string="Inherited Views">
|
||||
<field name="inherit_children_ids" context="{'default_model':model,'default_type':type,'default_inherit_id':id,'default_mode':'extension', 'active_test': False}">
|
||||
|
|
@ -89,7 +89,7 @@
|
|||
<separator/>
|
||||
<filter string="Active" name="active" domain="[('active', '=',True)]"/>
|
||||
<filter string="Inactive" name="inactive" domain="[('active', '=',False)]"/>
|
||||
<group expand="0" string="Group By">
|
||||
<group>
|
||||
<filter string="Model" name="object" domain="[]" context="{'group_by':'model'}"/>
|
||||
<filter string="Type" name="type" domain="[]" context="{'group_by':'type'}"/>
|
||||
<filter string="Inherit" name="inherit" domain="[]" context="{'group_by':'inherit_id'}"/>
|
||||
|
|
@ -145,7 +145,7 @@
|
|||
<field name="view_mode">form</field>
|
||||
<field name="target">new</field>
|
||||
<field name="binding_model_id" ref="model_ir_ui_view"/>
|
||||
<field name="binding_view_types">form,list</field>
|
||||
<field name="binding_view_types">form,list,kanban</field>
|
||||
</record>
|
||||
|
||||
<!-- View customizations -->
|
||||
|
|
|
|||
|
|
@ -84,15 +84,21 @@
|
|||
<group>
|
||||
<group>
|
||||
<field name="acc_number"/>
|
||||
<field name="bank_id"/>
|
||||
<field name="clearing_number"/>
|
||||
<field name="partner_id"/>
|
||||
<field name="bank_id"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="allow_out_payment" widget="boolean_toggle"/>
|
||||
<field name="company_id" groups="base.group_multi_company" options="{'no_create': True}"/>
|
||||
<field name="currency_id" groups="base.group_multi_currency" options="{'no_create': True}"/>
|
||||
<field name="allow_out_payment" widget="boolean_toggle"/>
|
||||
</group>
|
||||
</group>
|
||||
<notebook>
|
||||
<page string="Note" name="internal_notes">
|
||||
<field name="note" nolabel="1" placeholder="Internal notes..."/>
|
||||
</page>
|
||||
</notebook>
|
||||
</sheet>
|
||||
<footer replace="0">
|
||||
<button name="action_archive_bank" type="object" string="Archive" class="btn btn-secondary"/>
|
||||
|
|
@ -108,9 +114,9 @@
|
|||
<list string="Bank Accounts" multi_edit="1" decoration-muted="(not active)">
|
||||
<field name="sequence" widget="handle"/>
|
||||
<field name="acc_number"/>
|
||||
<field name="partner_id" optional="hide"/>
|
||||
<field name="bank_name" string="Bank" optional="show"/>
|
||||
<field name="company_id" groups="base.group_multi_company" optional="hide"/>
|
||||
<field name="partner_id" optional="hide"/>
|
||||
<field name="allow_out_payment" widget="boolean_toggle" optional="show"/>
|
||||
<field name="active" widget="boolean_toggle" optional="hide"/>
|
||||
</list>
|
||||
|
|
|
|||
|
|
@ -15,12 +15,14 @@
|
|||
icon="fa-sitemap"
|
||||
string="Branches"/>
|
||||
</div>
|
||||
<field name="logo" widget="image" class="oe_avatar"/>
|
||||
<div class="oe_title">
|
||||
<label for="name"/>
|
||||
<h1>
|
||||
<field name="name" placeholder="e.g. My Company"/>
|
||||
</h1>
|
||||
<div class="d-flex gap-2">
|
||||
<field name="logo" widget="contact_image" class="oe_avatar text-start float-none" nolabel="1" options="{'size': [100,100], 'img_class': 'rounded-4'}"/>
|
||||
<div class="oe_title">
|
||||
<label for="name"/>
|
||||
<h1>
|
||||
<field name="name" placeholder="e.g. My Company"/>
|
||||
</h1>
|
||||
</div>
|
||||
</div>
|
||||
<notebook colspan="4">
|
||||
<page string="General Information" name="general_info">
|
||||
|
|
@ -37,12 +39,12 @@
|
|||
<field name="country_id" placeholder="Country" class="o_address_country" options='{"no_open": True, "no_create": True}'/>
|
||||
</div>
|
||||
<field name="vat"/>
|
||||
<field name="company_registry"/>
|
||||
<field name="company_registry_placeholder" invisible="1"/> <!-- Needed for the placeholder widget -->
|
||||
<field name="company_registry" options="{'placeholder_field': 'company_registry_placeholder'}"/>
|
||||
<field name="currency_id" options="{'no_create': True, 'no_open': True}" id="company_currency" context="{'active_test': False}"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="phone" class="o_force_ltr"/>
|
||||
<field name="mobile" class="o_force_ltr"/>
|
||||
<field name="email"/>
|
||||
<field name="website" string="Website" widget="url" placeholder="e.g. https://www.odoo.com"/>
|
||||
<field name="parent_id" groups="base.group_no_one"/>
|
||||
|
|
@ -65,6 +67,7 @@
|
|||
<field name="arch" type="xml">
|
||||
<list string="Companies" decoration-muted="not active">
|
||||
<field name="sequence" widget="handle"/>
|
||||
<field name="logo" invisible="not logo" widget="image" options="{'size': [24, 24], 'img_class': 'o_avatar rounded'}" width="30" nolabel="1"/>
|
||||
<field name="name"/>
|
||||
<field name="partner_id" required="0"/>
|
||||
<field name="child_ids" widget="many2many_tags" options="{'color_field': 'color'}"/>
|
||||
|
|
|
|||
|
|
@ -13,7 +13,6 @@
|
|||
<field name="name">Settings</field>
|
||||
<field name="res_model">res.config.settings</field>
|
||||
<field name="view_mode">form</field>
|
||||
<field name="target">inline</field>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
|
|
|
|||
|
|
@ -91,6 +91,7 @@
|
|||
<field name="arch" type="xml">
|
||||
<list string="Country Group">
|
||||
<field name="name"/>
|
||||
<field name="code"/>
|
||||
</list>
|
||||
</field>
|
||||
</record>
|
||||
|
|
@ -106,6 +107,7 @@
|
|||
<h1><field name="name" placeholder="e.g. Europe"/></h1>
|
||||
</div>
|
||||
<group name="country_group">
|
||||
<field name="code" />
|
||||
<field name="country_ids" widget="many2many_tags" options="{'no_open': True, 'no_create': True}"/>
|
||||
</group>
|
||||
</sheet>
|
||||
|
|
@ -161,7 +163,7 @@
|
|||
<search string="Country">
|
||||
<field name="name"/>
|
||||
<field name="country_id"/>
|
||||
<group string="Group By">
|
||||
<group>
|
||||
<filter name="groupby_country" string="Country" context="{'group_by': 'country_id'}"/>
|
||||
</group>
|
||||
</search>
|
||||
|
|
|
|||
|
|
@ -131,9 +131,6 @@
|
|||
<field name="model">res.currency</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Currency">
|
||||
<div class="alert alert-info text-center" role="alert" groups="base.group_no_one">
|
||||
You cannot reduce the number of decimal places of a currency already used on an accounting entry.
|
||||
</div>
|
||||
<div class="alert alert-info text-center" role="alert" invisible="not is_current_company_currency">
|
||||
This is your company's currency.
|
||||
</div>
|
||||
|
|
@ -148,6 +145,7 @@
|
|||
<field name="symbol"/>
|
||||
<field name="currency_unit_label"/>
|
||||
<field name="currency_subunit_label"/>
|
||||
<field name="position"/>
|
||||
</group>
|
||||
</group>
|
||||
|
||||
|
|
@ -156,17 +154,13 @@
|
|||
<field name="rounding"/>
|
||||
<field name="decimal_places"/>
|
||||
</group>
|
||||
|
||||
<group string="Display">
|
||||
<field name="position"/>
|
||||
</group>
|
||||
</group>
|
||||
<notebook class="o_currency_rate_list" invisible="is_current_company_currency">
|
||||
<page string="Rates" name="rates">
|
||||
<field name="rate_ids" widget="one2many">
|
||||
<list string="Rates" editable="top" limit="25">
|
||||
<field name="name"/>
|
||||
<field name="company_id" groups="base.group_multi_company"/>
|
||||
<field name="company_id" groups="base.group_multi_company" placeholder="Visible to all"/>
|
||||
<field name="company_rate" digits="[12,12]"/>
|
||||
<field name="inverse_company_rate" digits="[12,12]"/>
|
||||
<field name="rate" digits="[12,12]" optional="hide"/>
|
||||
|
|
@ -183,6 +177,7 @@
|
|||
<record id="action_currency_form" model="ir.actions.act_window">
|
||||
<field name="name">Currencies</field>
|
||||
<field name="res_model">res.currency</field>
|
||||
<field name="path">currencies</field>
|
||||
<field name="view_mode">list,kanban,form</field>
|
||||
<field name="search_view_id" ref="view_currency_search"/>
|
||||
<field name="context">{'active_test': False}</field>
|
||||
|
|
|
|||
|
|
@ -46,32 +46,31 @@
|
|||
<field name="name">res.device.kanban</field>
|
||||
<field name="model">res.device</field>
|
||||
<field name="arch" type="xml">
|
||||
<kanban create="false" default_order="is_current desc, last_activity desc">
|
||||
<kanban create="0" can_open="0" default_order="is_current desc, last_activity desc">
|
||||
<field name="id"/>
|
||||
<field name="device_type"/>
|
||||
<field name="last_activity"/>
|
||||
<field name="is_current"/>
|
||||
<templates>
|
||||
<t t-name="card" class="flex-row">
|
||||
<t t-if="record.device_type.raw_value === 'computer'">
|
||||
<span class="fa fa-laptop fs-1" title="Computer" role="img" aria-label="Computer"/>
|
||||
</t>
|
||||
<t t-else="">
|
||||
<span class="fa fa-mobile fs-1" title="Mobile" role="img" aria-label="Mobile"/>
|
||||
</t>
|
||||
<div class="d-flex flex-column ms-3">
|
||||
<div class="d-flex align-items-center">
|
||||
<field name="display_name" string="Name" class="fw-bolder"/>
|
||||
<t t-if="record.is_current.raw_value">
|
||||
<span class="ms-2 text-success o_status o_status_green"></span>
|
||||
</t>
|
||||
<span t-if="record.device_type.raw_value === 'computer'" class="fa fa-laptop fs-1 col-1 mx-auto" title="Computer" role="img" aria-label="Computer"/>
|
||||
<span t-else="" class="fa fa-mobile fs-1 col-1 mx-auto" title="Mobile" role="img" aria-label="Mobile"/>
|
||||
<div class="d-flex col-11">
|
||||
<div class="d-flex flex-column ms-2">
|
||||
<div class="d-flex align-items-center">
|
||||
<field name="display_name" string="Name" class="fw-bolder"/>
|
||||
<t t-if="record.is_current.raw_value">
|
||||
<span class="ms-2 text-success o_status o_status_green"></span>
|
||||
</t>
|
||||
<span t-out="luxon.DateTime.fromISO(record.last_activity.raw_value).toRelative()"
|
||||
class="ms-2 text-muted"/>
|
||||
</div>
|
||||
<field name="ip_address"/>
|
||||
<field name="country"/>
|
||||
<field name="city"/>
|
||||
</div>
|
||||
<field name="ip_address"/>
|
||||
<field name="country"/>
|
||||
<field name="city"/>
|
||||
<t t-out="luxon.DateTime.fromISO(record.last_activity.raw_value).toRelative()"/>
|
||||
<button name="revoke" type="object" string="Log out" class="btn btn-secondary ms-auto mb-auto my-auto"/>
|
||||
</div>
|
||||
<button name="revoke" type="object" string="Revoke" class="btn btn-secondary ms-auto mt-auto"/>
|
||||
</t>
|
||||
</templates>
|
||||
</kanban>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,171 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<data>
|
||||
<!-- Group's sections -->
|
||||
<record id="view_res_groups_privilege_list" model="ir.ui.view">
|
||||
<field name="name">res.groups.privilege.list</field>
|
||||
<field name="model">res.groups.privilege</field>
|
||||
<field name="arch" type="xml">
|
||||
<list default_group_by="category_id">
|
||||
<field name="name"/>
|
||||
<field name="group_ids" widget="many2many_tags" context="{'short_display_name': True}"/>
|
||||
</list>
|
||||
</field>
|
||||
</record>
|
||||
<record id="view_res_groups_privilege_form" model="ir.ui.view">
|
||||
<field name="name">res.groups.privilege.form</field>
|
||||
<field name="model">res.groups.privilege</field>
|
||||
<field name="arch" type="xml">
|
||||
<form>
|
||||
<sheet>
|
||||
<h1><field name="name" placeholder="Privilege Name"/></h1>
|
||||
<group>
|
||||
<group>
|
||||
<field name="sequence" groups="base.group_no_one"/>
|
||||
<field name="category_id" invisible="'default_category_id' in context"/>
|
||||
<field name="placeholder"/>
|
||||
</group>
|
||||
</group>
|
||||
<notebook>
|
||||
<page string="Groups" name="groups">
|
||||
<field name="group_ids" widget="many2many" domain="[('privilege_id', '=', False)]" context="{'default_privilege_id': id}">
|
||||
<list string="Groups">
|
||||
<field name="sequence" widget="handle"/>
|
||||
<field name="name"/>
|
||||
</list>
|
||||
</field>
|
||||
</page>
|
||||
<page string="Notes" name="notes">
|
||||
<field name="description"/>
|
||||
</page>
|
||||
</notebook>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
<record id="action_res_groups_privilege" model="ir.actions.act_window">
|
||||
<field name="name">Privileges</field>
|
||||
<field name="res_model">res.groups.privilege</field>
|
||||
</record>
|
||||
<menuitem id="menu_action_res_groups_privilege" action="action_res_groups_privilege" parent="base.menu_users" groups="base.group_no_one" sequence="5"/>
|
||||
|
||||
<!-- res.groups -->
|
||||
<record id="view_groups_search" model="ir.ui.view">
|
||||
<field name="name">res.groups.search</field>
|
||||
<field name="model">res.groups</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="Groups">
|
||||
<field name="full_name" string="Group"/>
|
||||
<field name="implied_by_ids" filter_domain="[('implied_by_ids.full_name','ilike',self)]" string="Added from"/>
|
||||
<field name="implied_ids" filter_domain="[('implied_ids.full_name','ilike',self)]" string="Implied"/>
|
||||
<separator orientation="vertical"/>
|
||||
<field name="share"/>
|
||||
<filter name="filter_no_share" string="Internal Groups" domain="[('share','=',False)]"/>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
<record id="view_groups_list" model="ir.ui.view">
|
||||
<field name="name">res.groups.list</field>
|
||||
<field name="model">res.groups</field>
|
||||
<field name="arch" type="xml">
|
||||
<list string="Implied groups" default_order="privilege_id,name">
|
||||
<field name="privilege_id"/>
|
||||
<field name="name"/>
|
||||
<field name="comment" optional="hide"/>
|
||||
<field name="implied_ids" widget="many2many_tags" optional="hide"/>
|
||||
<field name="implied_by_ids" widget="many2many_tags" optional="hide"/>
|
||||
</list>
|
||||
</field>
|
||||
</record>
|
||||
<record id="view_groups_form" model="ir.ui.view">
|
||||
<field name="name">res.groups.form</field>
|
||||
<field name="model">res.groups</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Groups">
|
||||
<sheet>
|
||||
<div class="oe_button_box" name="button_box">
|
||||
<button name="action_show_all_users" type="object" groups="base.group_no_one" class="oe_stat_button" icon="fa-users" help="Users having this group (implicitly or explicitly)">
|
||||
<field string="Users" name="all_users_count" widget="statinfo"/>
|
||||
</button>
|
||||
</div>
|
||||
<h1><field name="name" placeholder="Group Name" required="1"/></h1>
|
||||
<group>
|
||||
<group>
|
||||
<field name="privilege_id" invisible="'default_privilege_id' in context" readonly="context.get('is_action_res_users')"/>
|
||||
<field name="share" invisible="'default_privilege_id' in context" readonly="context.get('is_action_res_users')"/>
|
||||
<field name="api_key_duration" groups="base.group_no_one"/>
|
||||
</group>
|
||||
</group>
|
||||
<notebook>
|
||||
<page string="Users" name="user_ids">
|
||||
<field name="user_ids" context="{'search_default_filter_no_share':1}"/>
|
||||
</page>
|
||||
<page string="Inherited" name="inherit_groups">
|
||||
<group>
|
||||
<field name="implied_ids"/>
|
||||
<field name="implied_by_ids"/>
|
||||
<field name="disjoint_ids" widget="many2many_tags"/>
|
||||
</group>
|
||||
</page>
|
||||
<page string="Menus" name="menus">
|
||||
<field name="menu_access"/>
|
||||
</page>
|
||||
<page string="Views" name="views">
|
||||
<field name="view_access" groups="base.group_system"/>
|
||||
</page>
|
||||
<page string="Access Rights" name="access_rights">
|
||||
<field name="model_access">
|
||||
<list string="Access Rights" editable="top">
|
||||
<field name="name"/>
|
||||
<field name="model_id"/>
|
||||
<field name="perm_read"/>
|
||||
<field name="perm_write"/>
|
||||
<field name="perm_create"/>
|
||||
<field name="perm_unlink"/>
|
||||
</list>
|
||||
</field>
|
||||
</page>
|
||||
<page string="Record Rules" name="record_rules">
|
||||
<field name="rule_groups">
|
||||
<list string="Record Rules" editable="top">
|
||||
<field name="name"/>
|
||||
<field name="model_id"/>
|
||||
<field name="domain_force"/>
|
||||
<field name="perm_read"/>
|
||||
<field name="perm_write"/>
|
||||
<field name="perm_create"/>
|
||||
<field name="perm_unlink"/>
|
||||
</list>
|
||||
</field>
|
||||
</page><page string="Notes" name="notes">
|
||||
<field name="comment"/>
|
||||
</page>
|
||||
</notebook>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
<record id="action_res_groups" model="ir.actions.act_window">
|
||||
<field name="name">Groups</field>
|
||||
<field name="res_model">res.groups</field>
|
||||
<field name="context">{'search_default_filter_no_share': 1}</field>
|
||||
<field name="help">A group is a set of functional areas that will be assigned to the user in order to give them access and rights to specific applications and tasks in the system. You can create custom groups or edit the ones existing by default in order to customize the view of the menu that users will be able to see. Whether they can have a read, write, create and delete access right can be managed from here.</field>
|
||||
</record>
|
||||
<menuitem action="action_res_groups" id="menu_action_res_groups" parent="base.menu_users" groups="base.group_no_one" sequence="3"/>
|
||||
|
||||
<record id="view_default_groups_form" model="ir.ui.view">
|
||||
<field name="name">res.groups default groups form</field>
|
||||
<field name="model">res.groups</field>
|
||||
<field name="priority">100</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Groups">
|
||||
<sheet>
|
||||
<group>
|
||||
<field name="implied_ids" widget="res_user_group_ids" nolabel="1" colspan="2"/>
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
|
|
@ -67,49 +67,9 @@
|
|||
<field name="thousands_sep"/>
|
||||
<field name="date_format"/>
|
||||
<field name="time_format"/>
|
||||
<field name="short_time_format"/>
|
||||
<field name="week_start"/>
|
||||
</group>
|
||||
</group>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-8 row">
|
||||
<div class="col-12">
|
||||
<div class="o_horizontal_separator mb-3 mt-4 text-uppercase fw-bolder small">Legends for supported Date and Time Formats</div>
|
||||
</div>
|
||||
<div class="col-sm">
|
||||
<div>%a - Abbreviated day of the week.</div>
|
||||
<div>%A - Full day of the week.</div>
|
||||
<div>%b - Abbreviated month name.</div>
|
||||
<div>%B - Full month name."</div>
|
||||
<div>%d - Day of the month [01,31]."</div>
|
||||
<div>%j - Day of the year [001,366]."</div>
|
||||
<div>%H - Hour (24-hour clock) [00,23]."</div>
|
||||
<div>%I - Hour (12-hour clock) [01,12]."</div>
|
||||
</div>
|
||||
<div class="col-sm">
|
||||
<div>%M - Minute [00,59]."</div>
|
||||
<div>%p - Equivalent of either AM or PM."</div>
|
||||
<div>%S - Seconds [00,61]."</div>
|
||||
<div>%w - Day of the week number [0(Sunday),6]."</div>
|
||||
<div>%y - Year without century [00,99]."</div>
|
||||
<div>%Y - Year with century."</div>
|
||||
<div>%m - Month number [01,12]."</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4 text-info">
|
||||
<div class="o_horizontal_separator mb-3 mt-4 text-uppercase fw-bolder small">Examples</div>
|
||||
<div>1. %b, %B ==> Dec, December</div>
|
||||
<div>2. %a ,%A ==> Fri, Friday</div>
|
||||
<div>3. %y, %Y ==> 08, 2008</div>
|
||||
<div>4. %d, %m ==> 05, 12</div>
|
||||
<div>5. %H:%M:%S ==> 18:25:20</div>
|
||||
<div>6. %I:%M:%S %p ==> 06:25:20 PM</div>
|
||||
<div>7. %j ==> 340</div>
|
||||
<div>8. %S ==> 20</div>
|
||||
<div>9. %w ==> 5 ( Friday is the 6th day)</div>
|
||||
</div>
|
||||
</div>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
|
|
|
|||
|
|
@ -2,46 +2,6 @@
|
|||
<odoo>
|
||||
<data>
|
||||
|
||||
<!-- Partner Titles -->
|
||||
<record id="view_partner_title_tree" model="ir.ui.view">
|
||||
<field name="name">res.partner.title.list</field>
|
||||
<field name="model">res.partner.title</field>
|
||||
<field name="arch" type="xml">
|
||||
<list string="Partner Titles" editable="bottom">
|
||||
<field name="name"/>
|
||||
<field name="shortcut"/>
|
||||
</list>
|
||||
</field>
|
||||
</record>
|
||||
<record id="view_partner_title_form" model="ir.ui.view">
|
||||
<field name="name">res.partner.title.form</field>
|
||||
<field name="model">res.partner.title</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Partner Titles">
|
||||
<sheet>
|
||||
<group col="4">
|
||||
<field name="name"/>
|
||||
<field name="shortcut"/>
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="action_partner_title_contact" model="ir.actions.act_window">
|
||||
<field name="name">Contact Titles</field>
|
||||
<field name="res_model">res.partner.title</field>
|
||||
<field name="domain">[]</field>
|
||||
<field name="context">{}</field>
|
||||
<field name="help" type="html">
|
||||
<p class="o_view_nocontent_smiling_face">
|
||||
Create a Title
|
||||
</p><p>
|
||||
Manage Contact Titles as well as their abbreviations (e.g. "Mr.", "Mrs.", etc).
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- PARTNER TREE VIEW + MUTI_EDIT: VISIBLE FIELDS WITH ONCHANGE ON BASE/PARTNER
|
||||
VIEW WON'T BE EDITABLE ON "MULTI_EDIT" MODE:
|
||||
- parent_id
|
||||
|
|
@ -57,18 +17,20 @@
|
|||
<field eval="8" name="priority"/>
|
||||
<field name="arch" type="xml">
|
||||
<list string="Contacts" sample="1" multi_edit="1">
|
||||
<field name="avatar_128" widget="image" options="{'size': [24, 24], 'img_class': 'o_avatar rounded'}" width="30" nolabel="1"/>
|
||||
<field name="complete_name" string="Name"/>
|
||||
<field name="phone" class="o_force_ltr" optional="show"/>
|
||||
<field name="mobile" optional="hide"/>
|
||||
<field name="vat" optional="hide" readonly="1"/>
|
||||
<field name="email" optional="show"/>
|
||||
<field name="user_id" optional="show" widget="many2one_avatar_user" domain="[('share', '=', False)]"/>
|
||||
<field name="phone" class="o_force_ltr" optional="show"/>
|
||||
<field name="user_id" optional="hide" widget="many2one_avatar_user" domain="[('share', '=', False)]"/>
|
||||
<field name="street" optional="hide"/>
|
||||
<field name="city" optional="show"/>
|
||||
<field name="city" optional="hide"/>
|
||||
<field name="state_id" optional="hide" readonly="1"/>
|
||||
<field name="country_id" optional="show" readonly="1"/>
|
||||
<field name="vat" optional="hide" readonly="1"/>
|
||||
<field name="application_statistics" widget="contact_statistics" nolabel="1" optional="show" width="270"/>
|
||||
<field name="category_id" optional="hide" widget="many2many_tags" options="{'color_field': 'color'}"/>
|
||||
<field name="company_id" groups="base.group_multi_company" readonly="1"/>
|
||||
<field name="company_id" groups="base.group_multi_company" readonly="1" optional="hide"/>
|
||||
<field name="properties" optional="hide"/>
|
||||
</list>
|
||||
</field>
|
||||
</record>
|
||||
|
|
@ -93,9 +55,8 @@
|
|||
</div>
|
||||
<group>
|
||||
<field name="function" placeholder="e.g. Sales Director" invisible="is_company"/>
|
||||
<field name="email" widget="email" context="{'gravatar_image': True}" required="True"/>
|
||||
<field name="email" widget="email" required="True"/>
|
||||
<field name="phone" widget="phone" options="{'enable_sms': false}"/>
|
||||
<field name="mobile" widget="phone" options="{'enable_sms': false}"/>
|
||||
</group>
|
||||
</form>
|
||||
</field>
|
||||
|
|
@ -144,77 +105,99 @@
|
|||
<field name="priority" eval="1"/>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Partners">
|
||||
<div class="alert alert-warning oe_edit_only" role="alert" name="warning_tax" invisible="not same_vat_partner_id">
|
||||
A partner with the same <span><field name="vat_label" /></span> already exists (<field name="same_vat_partner_id" context="{'show_address': False, 'show_vat': False}"/>), are you sure you want to create a new one?
|
||||
</div>
|
||||
<div class="alert alert-warning oe_edit_only" role="alert" name="warning_company" invisible="not same_company_registry_partner_id">
|
||||
A partner with the same <span><field name="company_registry_label" /></span> already exists (<field name="same_company_registry_partner_id" context="{'show_address': False, 'show_vat': False}"/>), are you sure you want to create a new one?
|
||||
<div class="alert alert-warning oe_edit_only" role="alert" name="warning_tax" invisible="not same_vat_partner_id and not same_company_registry_partner_id">
|
||||
Potential duplicates:
|
||||
<span invisible="not same_vat_partner_id or same_company_registry_partner_id">
|
||||
<field name="same_vat_partner_id" context="{'show_address': False, 'show_vat': False}"/>
|
||||
(Same <field name="vat_label"/>)
|
||||
</span>
|
||||
<span invisible="same_vat_partner_id or not same_company_registry_partner_id">
|
||||
<field name="same_company_registry_partner_id" context="{'show_address': False, 'show_vat': False}"/>
|
||||
(Same <field name="company_registry_label"/>)
|
||||
</span>
|
||||
<span invisible="not (same_vat_partner_id and same_company_registry_partner_id and same_vat_partner_id == same_company_registry_partner_id)">
|
||||
<field name="same_vat_partner_id" context="{'show_address': False, 'show_vat': False}"/>
|
||||
(Same <field name="vat_label"/> and <field name="company_registry_label"/>)
|
||||
</span>
|
||||
<span invisible="not (same_vat_partner_id and same_company_registry_partner_id and same_vat_partner_id != same_company_registry_partner_id)">
|
||||
<field name="same_vat_partner_id" context="{'show_address': False, 'show_vat': False}"/>
|
||||
(Same <field name="vat_label"/>) and
|
||||
<field name="same_company_registry_partner_id" context="{'show_address': False, 'show_vat': False}"/>
|
||||
(Same <field name="company_registry_label"/>)
|
||||
</span>
|
||||
</div>
|
||||
<sheet>
|
||||
<div class="oe_button_box" name="button_box"/>
|
||||
<widget name="web_ribbon" title="Archived" bg_color="text-bg-danger" invisible="active"/>
|
||||
<field name="image_1920" widget='image' class="oe_avatar" options='{"preview_image": "avatar_128"}'/>
|
||||
<div class="oe_title mb24">
|
||||
<field name="company_type" widget="radio" options="{'horizontal': true}"/>
|
||||
<h1>
|
||||
<field id="company" options="{'line_breaks': False}" widget="text" class="text-break" name="name" default_focus="1" placeholder="e.g. Lumber Inc" invisible="not is_company" required="type == 'contact'"/>
|
||||
<field id="individual" options="{'line_breaks': False}" widget="text" class="text-break" name="name" default_focus="1" placeholder="e.g. Brandon Freeman" invisible="is_company" required="type == 'contact'"/>
|
||||
</h1>
|
||||
<div class="o_row">
|
||||
<div class="mb8">
|
||||
<div class="d-flex gap-3">
|
||||
<field name="image_1920" widget="contact_image" options="{'preview_image': 'avatar_128', 'size': [130,130], 'img_class': 'rounded border'}"/>
|
||||
<field name="avatar_128" invisible="1"/> <!-- Needed in contact_image widget -->
|
||||
<div class="d-flex flex-column flex-grow-1">
|
||||
<field name="company_type" widget="radio" options="{'horizontal': true}"/>
|
||||
<h1 class="mb-0 w-md-75">
|
||||
<field options="{'line_breaks': False}" widget="text" class="text-break d-block" name="name" default_focus="1" placeholder="e.g. Lumber Inc" invisible="not is_company" required="type == 'contact'"/>
|
||||
<field options="{'line_breaks': False}" widget="text" class="text-break d-block" name="name" default_focus="1" placeholder="e.g. Brandon Freeman" invisible="is_company" required="type == 'contact'"/>
|
||||
</h1>
|
||||
<div class="d-flex align-items-baseline w-md-50">
|
||||
<i class="fa fa-fw me-1 fa-envelope text-primary" title="Email"/>
|
||||
<field name="email" class="w-100" widget="email" required="user_ids" placeholder="Email"/>
|
||||
</div>
|
||||
<div class="d-flex align-items-baseline w-md-50">
|
||||
<i class="fa fa-fw me-1 fa-phone text-primary" title="Phone"/>
|
||||
<field name="phone" class="w-100" widget="phone" placeholder="Phone"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<group>
|
||||
<group>
|
||||
<field name="parent_id"
|
||||
widget="res_partner_many2one"
|
||||
placeholder="Company Name..."
|
||||
domain="[('is_company', '=', True)]" context="{'default_is_company': True, 'show_vat': True, 'default_user_id': user_id}"
|
||||
string="Company"
|
||||
domain="[('is_company', '=', True)]"
|
||||
context="{'default_is_company': True, 'default_user_id': user_id}"
|
||||
invisible="((is_company and not parent_id) or company_name) and company_name != ''"/>
|
||||
<field name="company_name" invisible="not company_name or company_name == '' or is_company"/>
|
||||
<button name="create_company" icon="fa-plus-square" string="Create company"
|
||||
type="object" class="oe_edit_only btn-link"
|
||||
invisible="is_company or company_name == '' or not company_name"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<group>
|
||||
<group>
|
||||
<div colspan="2" class="d-flex gap-2" invisible="not company_name or company_name == '' or is_company">
|
||||
<label for="company_name" class="fw-bold text-nowrap"/>
|
||||
<field name="company_name"/>
|
||||
<button name="create_company" icon="fa-plus-square" string="Create" type="object" class="oe_edit_only btn-link text-nowrap"/>
|
||||
</div>
|
||||
<span class="o_form_label o_td_label o_address_type" name="address_name">
|
||||
<field name="type" invisible="is_company" readonly="user_ids" required="not is_company" class="fw-bold"/>
|
||||
<field name="type_address_label" invisible="is_company" readonly="1" class="fw-bold"/>
|
||||
<span invisible="not is_company">Address</span>
|
||||
</span>
|
||||
<div class="o_address_format">
|
||||
<field name="street" placeholder="Street..." class="o_address_street"
|
||||
readonly="type == 'contact' and parent_id"/>
|
||||
<field name="street2" placeholder="Street 2..." class="o_address_street"
|
||||
readonly="type == 'contact' and parent_id"/>
|
||||
<field name="city" placeholder="City" class="o_address_city"
|
||||
readonly="type == 'contact' and parent_id"/>
|
||||
<field name="state_id" class="o_address_state" placeholder="State" options="{'no_open': True, 'no_quick_create': True}"
|
||||
readonly="type == 'contact' and parent_id" context="{'country_id': country_id, 'default_country_id': country_id, 'zip': zip}"/>
|
||||
<field name="zip" placeholder="ZIP" class="o_address_zip"
|
||||
readonly="type == 'contact' and parent_id"/>
|
||||
<field name="street" placeholder="Street..." class="o_address_street"/>
|
||||
<field name="street2" placeholder="Street 2..." class="o_address_street"/>
|
||||
<field name="city" placeholder="City" class="o_address_city"/>
|
||||
<field name="state_id" placeholder="State" class="o_address_state"
|
||||
options="{'no_open': True, 'no_quick_create': True}"
|
||||
context="{'country_id': country_id, 'default_country_id': country_id, 'zip': zip}"/>
|
||||
<field name="zip" placeholder="ZIP" class="o_address_zip"/>
|
||||
<div name="partner_address_country" class="d-flex justify-content-between">
|
||||
<field name="country_id" placeholder="Country" class="o_address_country" options='{"no_open": True, "no_create": True}'
|
||||
readonly="type == 'contact' and parent_id"/>
|
||||
<field name="country_id" placeholder="Country" class="o_address_country"
|
||||
options='{"no_open": True, "no_create": True}'/>
|
||||
</div>
|
||||
</div>
|
||||
<field name="vat" placeholder="e.g. BE0477472701" readonly="parent_id"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="function" placeholder="e.g. Sales Director"
|
||||
invisible="is_company"/>
|
||||
<field name="phone" widget="phone"/>
|
||||
<field name="mobile" widget="phone"/>
|
||||
<field name="email" widget="email" context="{'gravatar_image': True}" required="user_ids"/>
|
||||
<field name="function" placeholder="e.g. Sales Director" invisible="is_company"/>
|
||||
<field name="vat" placeholder="e.g. BE0477472701"/>
|
||||
<field name="website" string="Website" widget="url" placeholder="e.g. https://www.odoo.com"/>
|
||||
<field name="title" options='{"no_open": True}' placeholder="e.g. Mister"
|
||||
invisible="is_company"/>
|
||||
<field name="lang" invisible="active_lang_count <= 1"/>
|
||||
<field name="category_id" widget="many2many_tags" options="{'color_field': 'color'}"
|
||||
placeholder='e.g. "B2B", "VIP", "Consulting", ...'/>
|
||||
</group>
|
||||
</group>
|
||||
<div class="d-flex">
|
||||
<field name="properties" nolabel="1" columns="2"/>
|
||||
</div>
|
||||
|
||||
<notebook colspan="4">
|
||||
<page string="Contacts & Addresses" name="contact_addresses" autofocus="autofocus">
|
||||
<field name="child_ids" mode="kanban" context="{'default_parent_id': id, 'default_street': street, 'default_street2': street2, 'default_city': city, 'default_state_id': state_id, 'default_zip': zip, 'default_country_id': country_id, 'default_lang': lang, 'default_user_id': user_id, 'default_type': 'other'}">
|
||||
<page string="Contacts" name="contact_addresses" autofocus="autofocus">
|
||||
<field name="child_ids" mode="kanban" context="{'default_parent_id': id, 'default_street': street, 'default_street2': street2, 'default_city': city, 'default_state_id': state_id, 'default_zip': zip, 'default_country_id': country_id, 'default_lang': lang, 'default_user_id': user_id, 'default_type': is_company and 'contact' or 'other'}">
|
||||
<kanban color="color">
|
||||
<field name="color"/>
|
||||
<field name="type"/>
|
||||
|
|
@ -222,22 +205,30 @@
|
|||
<templates>
|
||||
<t t-name="card" class="flex-row">
|
||||
<aside class="o_kanban_aside_full">
|
||||
<field name="avatar_128" class="o_kanban_image_fill w-100" widget="image" options="{'img_class': 'object-fit-cover'}" alt="Contact image"/>
|
||||
<field name="avatar_128" class="o_kanban_image_fill w-100" widget="image" options="{'img_class': 'object-fit-cover'}" alt="Contact image" invisible="type != 'contact'"/>
|
||||
<field name="avatar_128" class="o_kanban_image_fill w-100" widget="image" options="{'img_class': 'object-fit-contain p-2'}" alt="Contact image" invisible="type == 'contact'"/>
|
||||
</aside>
|
||||
<main class="ps-2 ps-md-0">
|
||||
<field name="name" class="fw-bold"/>
|
||||
<field name="function"/>
|
||||
<field name="email" widget="email"/>
|
||||
<div t-if="record.type.raw_value != 'contact'">
|
||||
<div>
|
||||
<field class="me-1" name="zip"/>
|
||||
<field name="city"/>
|
||||
</div>
|
||||
<field class="me-1" name="state_id"/>
|
||||
<field name="name" invisible="not name" class="fw-bold"/>
|
||||
<field name="type" invisible="name" class="fw-bold"/>
|
||||
<div t-if="record.email.raw_value" class="text-truncate">
|
||||
<i class="fa fa-fw me-1 fa-envelope text-primary" title="Email"/>
|
||||
<field name="email"/>
|
||||
</div>
|
||||
<div t-if="record.phone.raw_value">
|
||||
<i class="fa fa-fw me-1 fa-phone text-primary" title="Phone"/>
|
||||
<field name="phone"/>
|
||||
</div>
|
||||
<div invisible="not function or is_company">
|
||||
<i class="fa fa-fw me-1 fa-suitcase text-primary" title="Position"/>
|
||||
<field name="function"/>
|
||||
</div>
|
||||
<div t-if="record.type.raw_value != 'contact' and (record.city.raw_value or record.country_id.raw_value)">
|
||||
<i class="fa fa-fw me-1 fa-map-marker text-primary" title="Location"/>
|
||||
<field name="city"/>
|
||||
<span t-if="record.city.raw_value and record.country_id.raw_value">, </span>
|
||||
<field name="country_id"/>
|
||||
</div>
|
||||
<div t-if="record.phone.raw_value">Phone: <field name="phone"/></div>
|
||||
<div t-if="record.mobile.raw_value">Mobile: <field name="mobile"/></div>
|
||||
</main>
|
||||
</t>
|
||||
</templates>
|
||||
|
|
@ -245,50 +236,47 @@
|
|||
<form string="Contact / Address">
|
||||
<sheet>
|
||||
<field name="type" required="1" widget="radio" options="{'horizontal': true}"/>
|
||||
<div class="text-muted oe_edit_only">
|
||||
<p class="mb-0" invisible="type != 'contact'">
|
||||
<span>Use this to organize the contact details of employees of a given company (e.g. CEO, CFO, ...).</span>
|
||||
</p>
|
||||
<p class="mb-0" invisible="type != 'invoice'">
|
||||
<span>Preferred address for all invoices. Selected by default when you invoice an order that belongs to this company.</span>
|
||||
</p>
|
||||
<p class="mb-0" invisible="type != 'delivery'">
|
||||
<span>Preferred address for all deliveries. Selected by default when you deliver an order that belongs to this company.</span>
|
||||
</p>
|
||||
<p class="mb-0" invisible="type != 'other'">
|
||||
<span>Other address for the company (e.g. subsidiary, ...)</span>
|
||||
</p>
|
||||
</div>
|
||||
<hr/>
|
||||
<group>
|
||||
<group>
|
||||
<field name="name" string="Contact Name" required="type == 'contact'"
|
||||
placeholder="e.g. New Address"/>
|
||||
<field name="title" options="{'no_open': True}" placeholder="e.g. Mr."
|
||||
invisible="type != 'contact'"/>
|
||||
<field name="function" placeholder="e.g. Sales Director"
|
||||
invisible="type != 'contact'"/>
|
||||
<label for="street" string="Address" invisible="type == 'contact'"/>
|
||||
<div invisible="type == 'contact'">
|
||||
<div class="o_address_format" name="div_address">
|
||||
<field name="street" placeholder="Street..." class="o_address_street"/>
|
||||
<field name="street2" placeholder="Street 2..." class="o_address_street"/>
|
||||
<field name="city" placeholder="City" class="o_address_city"/>
|
||||
<field name="state_id" class="o_address_state" placeholder="State" options="{'no_open': True, 'no_quick_create': True}" context="{'country_id': country_id, 'default_country_id': country_id, 'zip': zip}"/>
|
||||
<field name="zip" placeholder="ZIP" class="o_address_zip"/>
|
||||
<field name="country_id" placeholder="Country" class="o_address_country" options='{"no_open": True, "no_create": True}'/>
|
||||
<div class="d-flex align-items-center gap-3">
|
||||
<field name="image_1920" widget="contact_image" nolabel="1" options="{'preview_image': 'avatar_128', 'size': [100,100], 'img_class': 'rounded border'}"/>
|
||||
<div class="flex-grow-1">
|
||||
<h3>
|
||||
<field name="name" class="d-block" string="Name" default_focus="1" required="type == 'contact'" placeholder="e.g. Brandon Freeman"/>
|
||||
</h3>
|
||||
<div class="row flex-row">
|
||||
<div class="d-flex align-items-baseline">
|
||||
<i class="fa fa-fw me-1 fa-envelope text-primary" title="Email"/>
|
||||
<field name="email" widget="email" class="w-100" context="{'gravatar_image': True}" required="user_ids" placeholder="Email"/>
|
||||
</div>
|
||||
<div class="d-flex align-items-baseline">
|
||||
<i class="fa fa-fw me-1 fa-phone text-primary" title="Phone"/>
|
||||
<field name="phone" widget="phone" class="w-100" placeholder="Phone"/>
|
||||
</div>
|
||||
<div invisible="is_company or type != 'contact'" class="d-flex align-items-baseline">
|
||||
<i class="fa fa-fw me-1 fa-suitcase text-primary" title="Position"/>
|
||||
<field name="function" placeholder="Job title"/>
|
||||
</div>
|
||||
</div>
|
||||
</group>
|
||||
</div>
|
||||
</div>
|
||||
<group invisible="type == 'contact'" name="other_info">
|
||||
<group>
|
||||
<field name="email" widget="email"/>
|
||||
<field name="phone" widget="phone"/>
|
||||
<field name="mobile" widget="phone"/>
|
||||
<field name="company_id" invisible="1"/> <!-- Need to save value from parented record, cf onchange -->
|
||||
<span class="o_form_label o_td_label o_address_type">
|
||||
<field name="type_address_label" readonly="1" class="fw-bold"/>
|
||||
</span>
|
||||
<div class="o_address_format" name="div_address">
|
||||
<field name="street" placeholder="Street..." class="o_address_street"/>
|
||||
<field name="street2" placeholder="Street 2..." class="o_address_street"/>
|
||||
<field name="city" placeholder="City" class="o_address_city"/>
|
||||
<field name="state_id" class="o_address_state" placeholder="State" options="{'no_open': True, 'no_quick_create': True}" context="{'country_id': country_id, 'default_country_id': country_id, 'zip': zip}"/>
|
||||
<field name="zip" placeholder="ZIP" class="o_address_zip"/>
|
||||
<field name="country_id" placeholder="Country" class="o_address_country" options='{"no_open": True, "no_create": True}'/>
|
||||
</div>
|
||||
</group>
|
||||
</group>
|
||||
<group>
|
||||
<field name="comment" placeholder="Internal notes..." nolabel="1"/>
|
||||
<field name="company_id" invisible="1"/> <!-- Need to save value from parented record, cf onchange -->
|
||||
<label for="comment"/>
|
||||
<field name="comment" options="{'height': 100}" placeholder="Internal notes..." nolabel="1"/>
|
||||
</group>
|
||||
<field name="lang" invisible="True"/> <!-- Need to add lang to save default value from parented record -->
|
||||
</sheet>
|
||||
|
|
@ -303,16 +291,18 @@
|
|||
<group string="Purchase" name="purchase" priority="2">
|
||||
</group>
|
||||
<group name="misc" string="Misc">
|
||||
<field name="company_registry" invisible="parent_id"/>
|
||||
<field name="company_registry_placeholder" invisible="1"/> <!-- Needed for the placeholder widget -->
|
||||
<field name="company_registry" invisible="parent_id or not is_company" options="{'placeholder_field': 'company_registry_placeholder'}"/>
|
||||
<field name="ref" string="Reference"/>
|
||||
<field name="company_id" groups="base.group_multi_company" options="{'no_create': True}" readonly="parent_id" force_save="1"/>
|
||||
<field name="company_id" invisible="1"/> <!-- need to be able to to compute based on the company even without multi company groups -->
|
||||
<field name="company_id" groups="base.group_multi_company" options="{'no_create': True}" readonly="parent_id" force_save="1" placeholder="Visible to all"/>
|
||||
<field name="company_id" invisible="1"/> <!-- need to be able to compute based on the company even without multi company groups -->
|
||||
<field name="industry_id" invisible="not is_company" options="{'no_create': True}"/>
|
||||
</group>
|
||||
</group>
|
||||
</page>
|
||||
<page name='internal_notes' string="Internal Notes">
|
||||
<page name='internal_notes' string="Notes">
|
||||
<field name="comment" placeholder="Internal notes..."/>
|
||||
<group name="warnings"/>
|
||||
</page>
|
||||
</notebook>
|
||||
</sheet>
|
||||
|
|
@ -320,51 +310,6 @@
|
|||
</field>
|
||||
</record>
|
||||
|
||||
<!-- Special restricted view for private address, with limited "named" info that
|
||||
can be traced back to the employee -->
|
||||
<record id="res_partner_view_form_private" model="ir.ui.view">
|
||||
<field name="name">res.partner.view.form.private</field>
|
||||
<field name="model">res.partner</field>
|
||||
<field name="priority" eval="300"/>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Private Address Form">
|
||||
<sheet>
|
||||
<label for="name" class="oe_edit_only"/>
|
||||
<field name="name" required="0"/>
|
||||
<group>
|
||||
<group>
|
||||
<label for="street" string="Address"/>
|
||||
<div>
|
||||
<div class="o_address_format" name="div_address">
|
||||
<field name="street" placeholder="Street..." class="o_address_street"/>
|
||||
<field name="street2" placeholder="Street 2..." class="o_address_street"/>
|
||||
<field name="city" placeholder="City" class="o_address_city"/>
|
||||
<field name="state_id" class="o_address_state" placeholder="State" options="{'no_open': True, 'no_quick_create': True}" context="{'country_id': country_id, 'default_country_id': country_id, 'zip': zip}"/>
|
||||
<field name="zip" placeholder="ZIP" class="o_address_zip"/>
|
||||
<field name="country_id" placeholder="Country" class="o_address_country" options='{"no_open": True, "no_create": True}'/>
|
||||
</div>
|
||||
</div>
|
||||
</group>
|
||||
<group>
|
||||
<field name="phone" widget="phone" options="{'enable_sms': false}"/>
|
||||
<field name="mobile" widget="phone" options="{'enable_sms': false}"/>
|
||||
<field name="email"/>
|
||||
<field name="lang"/>
|
||||
</group>
|
||||
</group>
|
||||
<group string="Bank Accounts">
|
||||
<field name="bank_ids">
|
||||
<list editable="bottom">
|
||||
<field name="bank_id"/>
|
||||
<field name="acc_number"/>
|
||||
</list>
|
||||
</field>
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_res_partner_filter" model="ir.ui.view">
|
||||
<field name="name">res.partner.select</field>
|
||||
<field name="model">res.partner</field>
|
||||
|
|
@ -374,19 +319,21 @@
|
|||
filter_domain="['|', '|', '|', '|', ('complete_name', 'ilike', self), ('ref', 'ilike', self), ('email', 'ilike', self), ('vat', 'ilike', self), ('company_registry', 'ilike', self)]"/>
|
||||
<field name="parent_id" domain="[('is_company', '=', True)]" operator="child_of"/>
|
||||
<field name="email" filter_domain="[('email', 'ilike', self)]"/>
|
||||
<field name="phone" filter_domain="['|', ('phone', 'ilike', self), ('mobile', 'ilike', self)]"/>
|
||||
<field name="phone"/>
|
||||
<field name="category_id" string="Tag" operator="child_of"/>
|
||||
<field name="user_id"/>
|
||||
<separator/>
|
||||
<filter string="Individuals" name="type_person" domain="[('is_company', '=', False)]"/>
|
||||
<filter string="Persons" name="type_person" domain="[('is_company', '=', False)]"/>
|
||||
<filter string="Companies" name="type_company" domain="[('is_company', '=', True)]"/>
|
||||
<separator/>
|
||||
<filter string="Archived" name="inactive" domain="[('active', '=', False)]"/>
|
||||
<field name="properties"/>
|
||||
<separator/>
|
||||
<group expand="0" name="group_by" string="Group By">
|
||||
<group name="group_by">
|
||||
<filter name="salesperson" string="Salesperson" domain="[]" context="{'group_by' : 'user_id'}" />
|
||||
<filter name="group_company" string="Company" context="{'group_by': 'parent_id'}"/>
|
||||
<filter name="group_country" string="Country" context="{'group_by': 'country_id'}"/>
|
||||
<filter string="Properties" name="group_by_properties" context="{'group_by': 'properties'}"/>
|
||||
</group>
|
||||
</search>
|
||||
</field>
|
||||
|
|
@ -396,6 +343,7 @@
|
|||
<record model="ir.ui.view" id="res_partner_kanban_view">
|
||||
<field name="name">res.partner.kanban</field>
|
||||
<field name="model">res.partner</field>
|
||||
<field name="priority">1</field>
|
||||
<field name="arch" type="xml">
|
||||
<kanban sample="1">
|
||||
<field name="avatar_128"/>
|
||||
|
|
@ -406,31 +354,36 @@
|
|||
<widget name="web_ribbon" title="Archived" bg_color="text-bg-danger" invisible="active"/>
|
||||
<aside class="o_kanban_aside_full">
|
||||
<t t-if="!record.is_company.raw_value">
|
||||
<div class="o_kanban_image_fill position-relative w-100">
|
||||
<field name="avatar_128" alt="Contact image" class="h-100" widget="image" options="{'img_class': 'object-fit-cover'}"/>
|
||||
<field t-if="record.parent_id.raw_value" name="parent_id" class="position-absolute bottom-0 end-0 w-25 bg-light" widget="image" options="{'preview_image': 'image_128', 'img_class': 'object-fit-contain'}"/>
|
||||
<div class="position-relative w-100 h-auto m-0">
|
||||
<field name="avatar_128" alt="Contact image" class="h-100" widget="image" options="{'img_class': 'object-fit-contain'}"/>
|
||||
<field t-if="record.parent_id.raw_value and record.parent_id.image_128" name="parent_id" class="position-absolute bottom-0 end-0 w-25 bg-light" widget="image" options="{'preview_image': 'image_128', 'img_class': 'object-fit-contain'}"/>
|
||||
<field t-elif="record.parent_id.raw_value and !record.parent_id.image_128" name="parent_id" class="position-absolute bottom-0 end-0 w-25 bg-light" widget="image" options="{'preview_image': 'avatar_128', 'img_class': 'object-fit-contain'}"/>
|
||||
</div>
|
||||
</t>
|
||||
<t t-else="">
|
||||
<field name="avatar_128" class="w-100" widget="image" options="{'img_class': 'object-fit-contain w-100 h-100'}"/>
|
||||
<field name="avatar_128" class="w-100 h-auto m-0" widget="image" options="{'img_class': 'object-fit-contain w-100 h-100'}"/>
|
||||
</t>
|
||||
</aside>
|
||||
<main class="ps-2 ps-md-0">
|
||||
<main class="ps-2">
|
||||
<div class="mb-1">
|
||||
<field name="display_name" class="mb-0 fw-bold fs-5"/>
|
||||
<field t-if="record.parent_id.raw_value and !record.function.raw_value" class="text-muted" name="parent_id"/>
|
||||
<field t-elif="!record.parent_id.raw_value and record.function.raw_value" class="text-muted" name="function"/>
|
||||
<div t-elif="record.parent_id.raw_value and record.function.raw_value" class="text-muted">
|
||||
<field name="function"/> at <field name="parent_id"/>
|
||||
</div>
|
||||
<field name="complete_name" class="mb-0 fw-bold fs-5"/>
|
||||
</div>
|
||||
<div t-if="record.email.raw_value" class="text-truncate">
|
||||
<i class="fa fa-fw me-1 fa-envelope text-primary" title="Email"/>
|
||||
<field name="email"/>
|
||||
</div>
|
||||
<div t-if="record.phone.raw_value">
|
||||
<i class="fa fa-fw me-1 fa-phone text-primary" title="Phone"/>
|
||||
<field name="phone"/>
|
||||
</div>
|
||||
<div t-if="record.city.raw_value or record.country_id.raw_value">
|
||||
<i class="fa fa-fw me-1 fa-map-marker text-primary" title="Location"/>
|
||||
<field name="city"/>
|
||||
<span t-if="record.city.raw_value and record.country_id.raw_value">, </span>
|
||||
<field name="country_id"/>
|
||||
</div>
|
||||
<field name="email" class="text-truncate"/>
|
||||
<footer><div/></footer>
|
||||
<field name="properties" widget="properties"/>
|
||||
<footer><field name="application_statistics" widget="contact_statistics"/></footer>
|
||||
</main>
|
||||
</t>
|
||||
</templates>
|
||||
|
|
@ -441,7 +394,7 @@
|
|||
<record id="action_partner_form" model="ir.actions.act_window">
|
||||
<field name="name">Customers</field>
|
||||
<field name="res_model">res.partner</field>
|
||||
<field name="view_mode">kanban,list,form</field>
|
||||
<field name="view_mode">list,kanban,form</field>
|
||||
<field name="context">{'res_partner_search_mode': 'customer'}</field>
|
||||
<field name="search_view_id" ref="view_res_partner_filter"/>
|
||||
<field name="help" type="html">
|
||||
|
|
@ -453,7 +406,7 @@
|
|||
</field>
|
||||
</record>
|
||||
<record id="action_partner_form_view1" model="ir.actions.act_window.view">
|
||||
<field eval="0" name="sequence"/>
|
||||
<field eval="1" name="sequence"/>
|
||||
<field name="view_mode">kanban</field>
|
||||
<field name="view_id" ref="res_partner_kanban_view"/>
|
||||
<field name="act_window_id" ref="action_partner_form"/>
|
||||
|
|
@ -465,7 +418,7 @@
|
|||
<field name="act_window_id" ref="action_partner_form"/>
|
||||
</record>
|
||||
<record id="action_partner_tree_view1" model="ir.actions.act_window.view">
|
||||
<field name="sequence" eval="1"/>
|
||||
<field name="sequence" eval="0"/>
|
||||
<field name="view_mode">list</field>
|
||||
<field name="view_id" ref="view_partner_tree"/>
|
||||
<field name="act_window_id" ref="action_partner_form"/>
|
||||
|
|
@ -474,7 +427,8 @@
|
|||
<record id="action_partner_customer_form" model="ir.actions.act_window">
|
||||
<field name="name">Customers</field>
|
||||
<field name="res_model">res.partner</field>
|
||||
<field name="view_mode">kanban,list,form</field>
|
||||
<field name="path">ecommerce-customers</field>
|
||||
<field name="view_mode">list,kanban,form</field>
|
||||
<field name="domain">[]</field>
|
||||
<field name="context">{'res_partner_search_mode': 'customer', 'default_is_company': True}</field>
|
||||
<field name="filter" eval="True"/>
|
||||
|
|
@ -487,13 +441,13 @@
|
|||
</field>
|
||||
</record>
|
||||
<record id="action_partner_customer_form_view1" model="ir.actions.act_window.view">
|
||||
<field eval="1" name="sequence"/>
|
||||
<field eval="2" name="sequence"/>
|
||||
<field name="view_mode">kanban</field>
|
||||
<field name="view_id" ref="res_partner_kanban_view"/>
|
||||
<field name="act_window_id" ref="action_partner_customer_form"/>
|
||||
</record>
|
||||
<record id="action_partner_customer_form_view2" model="ir.actions.act_window.view">
|
||||
<field eval="2" name="sequence"/>
|
||||
<field eval="1" name="sequence"/>
|
||||
<field name="view_mode">list</field>
|
||||
<field name="view_id" ref="view_partner_tree"/>
|
||||
<field name="act_window_id" ref="action_partner_customer_form"/>
|
||||
|
|
@ -521,13 +475,13 @@
|
|||
</field>
|
||||
</record>
|
||||
<record id="action_partner_vendor_form_view1" model="ir.actions.act_window.view">
|
||||
<field eval="1" name="sequence"/>
|
||||
<field eval="2" name="sequence"/>
|
||||
<field name="view_mode">kanban</field>
|
||||
<field name="view_id" ref="res_partner_kanban_view"/>
|
||||
<field name="act_window_id" ref="action_partner_supplier_form"/>
|
||||
</record>
|
||||
<record id="action_partner_vendor_form_view2" model="ir.actions.act_window.view">
|
||||
<field eval="2" name="sequence"/>
|
||||
<field eval="1" name="sequence"/>
|
||||
<field name="view_mode">list</field>
|
||||
<field name="view_id" ref="view_partner_tree"/>
|
||||
<field name="act_window_id" ref="action_partner_supplier_form"/>
|
||||
|
|
@ -579,7 +533,7 @@
|
|||
<field name="display_name" string="Category" />
|
||||
<separator/>
|
||||
<filter string="Archived" name="inactive" domain="[('active', '=', False)]"/>
|
||||
<group string="Group By">
|
||||
<group>
|
||||
<filter string="Category" name="group_parent_id" context="{'group_by': 'parent_id'}"/>
|
||||
<filter string="Color" name="group_color" context="{'group_by': 'color'}"/>
|
||||
</group>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,26 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<data>
|
||||
<record model="ir.ui.view" id="res_users_apikeys_view_kanban">
|
||||
<field name="name">res.users.apikeys.kanban</field>
|
||||
<field name="model">res.users.apikeys</field>
|
||||
<field name="arch" type="xml">
|
||||
<kanban create="0" can_open="0">
|
||||
<templates>
|
||||
<t t-name="card" class="flex-row">
|
||||
<div>
|
||||
<div>
|
||||
<field name="name" class="fw-bold fs-5"/>
|
||||
<field name="create_date" class="ms-2 text-muted"/>
|
||||
</div>
|
||||
<small invisible="not scope">Scope: <field name="scope"/></small>
|
||||
<small>Expires on: <field name="expiration_date"/></small>
|
||||
</div>
|
||||
<button name="remove" type="object" string="Delete" class="btn btn-secondary ms-auto mb-auto my-auto"/>
|
||||
</t>
|
||||
</templates>
|
||||
</kanban>
|
||||
</field>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
|
|
@ -8,17 +8,19 @@
|
|||
<form string="Password Confirmation">
|
||||
<sheet>
|
||||
<div invisible="auth_method != 'password'">
|
||||
<h3><strong>Please confirm your identity by entering your password</strong></h3>
|
||||
<h3><strong>Let's first confirm it's you. Enter your current password:</strong></h3>
|
||||
<div>
|
||||
<field class="o_field_highlight col-10 col-md-6 px-0" name="password" autocomplete="current-password"
|
||||
required="auth_method == 'password'" password="True" placeholder="************"/>
|
||||
required="auth_method == 'password'" password="True" placeholder="Enter your password"/>
|
||||
</div>
|
||||
<a href="/web/reset_password/" class="btn btn-link" role="button">Forgot password?</a>
|
||||
<a href="/web/reset_password/" class="btn btn-link ps-0" role="button">Forgot password?</a>
|
||||
</div>
|
||||
</sheet>
|
||||
<footer>
|
||||
<button string="Confirm Password" id="password_confirm" type="object" name="run_check" class="btn btn-primary" data-hotkey="q" invisible="auth_method != 'password'"/>
|
||||
<button string="Cancel" special="cancel" data-hotkey="z" class="btn btn-secondary"/>
|
||||
<button string="Confirm Password" id="password_confirm" type="object" name="run_check"
|
||||
class="btn btn-primary" data-hotkey="q" invisible="auth_method != 'password'"
|
||||
context="{'password': password}"/>
|
||||
<button string="Discard" special="cancel" data-hotkey="z" class="btn btn-secondary"/>
|
||||
</footer>
|
||||
</form>
|
||||
</field>
|
||||
|
|
|
|||
|
|
@ -52,85 +52,6 @@
|
|||
<field name="binding_model_id" ref="base.model_res_users"/>
|
||||
</record>
|
||||
|
||||
<!-- res.groups -->
|
||||
<record id="view_groups_search" model="ir.ui.view">
|
||||
<field name="name">res.groups.search</field>
|
||||
<field name="model">res.groups</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="Groups">
|
||||
<field name="name" filter_domain="['|', ('full_name','ilike',self), ('category_id','ilike',self)]" string="Group"/>
|
||||
<separator orientation="vertical"/>
|
||||
<field name="share"/>
|
||||
<filter name="filter_no_share" string="Internal Groups" domain="[('share','=',False)]"/>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
<record id="view_groups_form" model="ir.ui.view">
|
||||
<field name="name">res.groups.form</field>
|
||||
<field name="model">res.groups</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Groups">
|
||||
<sheet>
|
||||
<group col="4">
|
||||
<field name="category_id"/>
|
||||
<field name="name"/>
|
||||
<field name="share"/>
|
||||
<field name="api_key_duration" groups="base.group_no_one"/>
|
||||
</group>
|
||||
<notebook>
|
||||
<page string="Users" name="users">
|
||||
<field name="users" context="{'search_default_filter_no_share':1}"/>
|
||||
</page>
|
||||
<page string="Inherited" name="inherit_groups">
|
||||
<label for="implied_ids" string="Users added to this group are automatically added in the following groups."/>
|
||||
<field name="implied_ids"/>
|
||||
</page>
|
||||
<page string="Menus" name="menus">
|
||||
<field name="menu_access"/>
|
||||
</page>
|
||||
<page string="Views" name="views">
|
||||
<field name="view_access" groups="base.group_system"/>
|
||||
</page>
|
||||
<page string="Access Rights" name="access_rights">
|
||||
<field name="model_access">
|
||||
<list string="Access Rights" editable="top">
|
||||
<field name="name"/>
|
||||
<field name="model_id"/>
|
||||
<field name="perm_read"/>
|
||||
<field name="perm_write"/>
|
||||
<field name="perm_create"/>
|
||||
<field name="perm_unlink"/>
|
||||
</list>
|
||||
</field>
|
||||
</page>
|
||||
<page string="Record Rules" name="record_rules">
|
||||
<field name="rule_groups">
|
||||
<list string="Record Rules" editable="top">
|
||||
<field name="name"/>
|
||||
<field name="model_id"/>
|
||||
<field name="domain_force"/>
|
||||
<field name="perm_read"/>
|
||||
<field name="perm_write"/>
|
||||
<field name="perm_create"/>
|
||||
<field name="perm_unlink"/>
|
||||
</list>
|
||||
</field>
|
||||
</page><page string="Notes" name="notes">
|
||||
<field name="comment"/>
|
||||
</page>
|
||||
</notebook>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
<record id="action_res_groups" model="ir.actions.act_window">
|
||||
<field name="name">Groups</field>
|
||||
<field name="res_model">res.groups</field>
|
||||
<field name="context">{'search_default_filter_no_share': 1, 'ir.ui.menu.full_list': 1}</field>
|
||||
<field name="help">A group is a set of functional areas that will be assigned to the user in order to give them access and rights to specific applications and tasks in the system. You can create custom groups or edit the ones existing by default in order to customize the view of the menu that users will be able to see. Whether they can have a read, write, create and delete access right can be managed from here.</field>
|
||||
</record>
|
||||
<menuitem action="action_res_groups" id="menu_action_res_groups" parent="base.menu_users" groups="base.group_no_one" sequence="3"/>
|
||||
|
||||
<!-- res.users -->
|
||||
<record id="view_users_simple_form" model="ir.ui.view">
|
||||
<field name="name">res.users.simplified.form</field>
|
||||
|
|
@ -139,29 +60,34 @@
|
|||
<field name="arch" type="xml">
|
||||
<form string="Users">
|
||||
<sheet>
|
||||
<div class="alert alert-info text-center mb-3" invisible="id > 0" role="alert">
|
||||
You are inviting a new user.
|
||||
</div>
|
||||
<field name="image_1920" widget='image' class="oe_avatar" options='{"zoom": true, "preview_image": "avatar_128"}'/>
|
||||
<div class="oe_title">
|
||||
<label for="name"/>
|
||||
<h1><field name="name" placeholder="e.g. John Doe" required="1"/></h1>
|
||||
<field name="email" invisible="1"/><!-- needed to update partner's email from on_change_login() -->
|
||||
<label for="login" string="Email Address"/>
|
||||
<h2>
|
||||
<field name="login"
|
||||
placeholder="e.g. email@yourcompany.com"/>
|
||||
</h2>
|
||||
</div>
|
||||
<group name="phone_numbers">
|
||||
<field name="company_id" context="{'user_preference': 0}" groups="base.group_multi_company"/>
|
||||
<label for="groups_id" string="Access Rights"
|
||||
invisible="id > 0" groups="base.group_no_one"/>
|
||||
<div invisible="id > 0" groups="base.group_no_one">
|
||||
<field name="groups_id" readonly="1" widget="many2many_tags" options="{'color_field': 'color'}" style="display: inline;"/> You will be able to define additional access rights by editing the newly created user under the Settings / Users menu.
|
||||
<div class="d-flex gap-3">
|
||||
<field name="image_1920" widget="contact_image" options="{'preview_image': 'avatar_128', 'zoom': true, 'size': [130,130], 'img_class': 'rounded-4'}"/>
|
||||
<field name="avatar_128" invisible="1"/> <!-- Needed in contact_image widget -->
|
||||
<div class="d-flex flex-column flex-grow-1 justify-content-center">
|
||||
<h1 class="mb-0 w-100">
|
||||
<field name="name" placeholder="e.g. John Doe" required="1"/>
|
||||
</h1>
|
||||
<div class="d-flex align-items-baseline w-100">
|
||||
<field name="email" invisible="1"/> <!-- needed to update partner's email from on_change_login() -->
|
||||
<i class="fa fa-fw me-1 fa-envelope text-primary" title="Email"/>
|
||||
<field name="email_domain_placeholder" invisible="1" /> <!-- needed to compute the placeholder whenever the dialog opens -->
|
||||
<field name="login" class="w-100" options="{'placeholder_field': 'email_domain_placeholder'}"/>
|
||||
</div>
|
||||
<div class="d-flex align-items-baseline w-100">
|
||||
<i class="fa fa-fw me-1 fa-phone text-primary" title="Phone"/>
|
||||
<field name="phone" class="w-100" widget="phone" placeholder="Phone"/>
|
||||
</div>
|
||||
<div class="d-flex align-items-baseline w-100" groups="base.group_multi_company">
|
||||
<i class="fa fa-fw me-1 fa-building text-primary" title="Company"/>
|
||||
<field name="company_id" class="w-100" context="{'user_preference': 0}" placeholder="Company"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<group name="access_groups" invisible="id > 0">
|
||||
<label for="group_ids" string="Access Rights" groups="base.group_no_one"/>
|
||||
<div groups="base.group_no_one">
|
||||
<field name="group_ids" readonly="1" widget="many2many_tags" style="display: inline;"/> You will be able to define additional access rights by editing the newly created user under the Settings / Users menu.
|
||||
</div>
|
||||
<field name="phone" widget="phone"/>
|
||||
<field name="mobile" widget="phone"/>
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
|
|
@ -176,16 +102,17 @@
|
|||
</header>
|
||||
<sheet>
|
||||
<div class="oe_button_box" name="button_box">
|
||||
<button name="action_show_groups" type="object" groups="base.group_no_one" class="oe_stat_button" icon="fa-users">
|
||||
<button name="action_show_groups" type="object" groups="base.group_no_one" class="oe_stat_button" icon="fa-users" help="Groups that apply to the current user">
|
||||
<field string="Groups" name="groups_count" widget="statinfo"/>
|
||||
</button>
|
||||
<button name="action_show_accesses" type="object" groups="base.group_no_one" class="oe_stat_button" icon="fa-list">
|
||||
<button name="action_show_accesses" type="object" groups="base.group_no_one" class="oe_stat_button" icon="fa-lock">
|
||||
<field string="Access Rights" name="accesses_count" widget="statinfo"/>
|
||||
</button>
|
||||
<button name="action_show_rules" type="object" groups="base.group_no_one" class="oe_stat_button" icon="fa-list-ul">
|
||||
<button name="action_show_rules" type="object" groups="base.group_no_one" class="oe_stat_button" icon="fa-lock">
|
||||
<field string="Record Rules" name="rules_count" widget="statinfo"/>
|
||||
</button>
|
||||
</div>
|
||||
<widget name="web_ribbon" title="External user" bg_color="text-bg-warning" invisible="not share"/>
|
||||
<widget name="web_ribbon" title="Archived" bg_color="text-bg-danger" invisible="active"/>
|
||||
<div class="alert alert-info text-center o_form_header"
|
||||
invisible="active and active_partner or not active and not active_partner or active and not active_partner"
|
||||
|
|
@ -198,31 +125,47 @@
|
|||
<field name="partner_id" required="0" readonly="1"/>
|
||||
</div>
|
||||
</div>
|
||||
<field name="image_1920" widget='image' class="oe_avatar" options='{"preview_image": "avatar_128"}'/>
|
||||
<div class="oe_title">
|
||||
<label for="name"/>
|
||||
<h1><field name="name" placeholder="e.g. John Doe" required="1"/></h1>
|
||||
<field name="email" invisible="1"/><!-- needed to update partner's email from on_change_login() -->
|
||||
<label for="login" string="Email Address"/>
|
||||
<h2><field name="login" placeholder="e.g. email@yourcompany.com"/></h2>
|
||||
<group>
|
||||
<field name="partner_id" groups="base.group_no_one"
|
||||
readonly="1"
|
||||
required="0"
|
||||
invisible="not id"/>
|
||||
</group>
|
||||
<div class="d-flex gap-3">
|
||||
<field name="image_1920" widget="contact_image" options="{'preview_image': 'avatar_128', 'img_class': 'rounded-4'}"/>
|
||||
<field name="avatar_128" invisible="1"/> <!-- Needed in contact_image widget -->
|
||||
<div class="oe_title d-flex flex-column flex-grow-1">
|
||||
<h1 class="mb-0 w-sm-75">
|
||||
<field name="name" placeholder="e.g. John Doe" required="1"/>
|
||||
</h1>
|
||||
<!-- Must replace the login when the user is created. -->
|
||||
<h5 name="h5_email" class="d-flex align-items-baseline mb-0" invisible="not id">
|
||||
<i class="fa fa-fw fa-envelope text-primary" title="Email"/>
|
||||
<field name="email" placeholder="Email" class="w-75"/>
|
||||
</h5>
|
||||
<h5 class="d-flex align-items-baseline mb-0" invisible="id">
|
||||
<i class="fa fa-fw fa-envelope text-primary" title="Email"/>
|
||||
<field name="login" placeholder="Email" class="w-75"/>
|
||||
</h5>
|
||||
<h5 name="h5_phone" class="d-flex align-items-baseline mb-0">
|
||||
<i class="fa fa-fw fa-phone text-primary" title="Email"/>
|
||||
<field name="phone" placeholder="Phone" class="w-75"/>
|
||||
</h5>
|
||||
</div>
|
||||
</div>
|
||||
<group>
|
||||
<field name="partner_id" groups="base.group_no_one"
|
||||
readonly="1"
|
||||
required="0"
|
||||
invisible="not id"/>
|
||||
</group>
|
||||
<notebook colspan="4">
|
||||
<page name="access_rights" string="Access Rights">
|
||||
<group string="Multi Companies" invisible="companies_count <= 1">
|
||||
<field string="Allowed Companies" name="company_ids" widget="many2many_tags" options="{'no_create': True, 'color_field': 'color'}"/>
|
||||
<field string="Default Company" name="company_id" context="{'user_preference': 0}"/>
|
||||
<group string="Roles" invisible="share and companies_count <= 1">
|
||||
<field name="role" invisible="share" widget="radio" options="{'horizontal': true}"/>
|
||||
<field string="Companies" name="company_ids" invisible="companies_count <= 1" widget="many2many_tags" options="{'no_create': True, 'color_field': 'color'}"/>
|
||||
<field string="Default Company" name="company_id" invisible="companies_count <= 1" context="{'user_preference': 0}"/>
|
||||
</group>
|
||||
<field name="groups_id"/>
|
||||
<field name="group_ids" widget="res_user_group_ids" nolabel="1" colspan="2" groups="base.group_no_one"/>
|
||||
<field name="group_ids" widget="res_user_group_ids" nolabel="1" colspan="2" groups="!base.group_no_one" invisible="share"/>
|
||||
</page>
|
||||
<page string="Preferences" name="preferences">
|
||||
<group>
|
||||
<group string="Localization" name="preferences">
|
||||
<group>
|
||||
<label for="lang" />
|
||||
<div class="o_row">
|
||||
<field name="lang" required="1"/>
|
||||
|
|
@ -230,22 +173,70 @@
|
|||
type="action"
|
||||
name="%(base.action_view_base_language_install)d"
|
||||
class="oe_edit_only btn-sm btn-link mb4 fa fa-globe"
|
||||
groups="base.group_system"
|
||||
aria-label="Add a language"
|
||||
title="Add a language"/>
|
||||
</div>
|
||||
<field name="tz" widget="timezone_mismatch" options="{'tz_offset_field': 'tz_offset'}" />
|
||||
<field name="tz_offset" invisible="1"/> <!-- needed for the timezone_mismatch widget -->
|
||||
<field name="signature" options="{'codeview': true, 'height': 112, 'resizable': true}" class="border border-secondary"/>
|
||||
</group>
|
||||
<group string="Menus Customization" groups="base.group_no_one"
|
||||
invisible="share">
|
||||
<field name="action_id"/>
|
||||
</group>
|
||||
</group>
|
||||
<group name="messaging">
|
||||
<field name="signature" options="{'codeview': true}"/>
|
||||
<!-- This group is meant to be used in overrides -->
|
||||
<group name="other_preferences"/>
|
||||
</group>
|
||||
</page>
|
||||
<page string="Account Security" name="account_security" invisible="not id"/>
|
||||
<page name="calendar" string="Calendar">
|
||||
<group>
|
||||
<group name="calendar_preferences">
|
||||
<field name="tz" widget="timezone_mismatch" options="{'tz_offset_field': 'tz_offset'}" readonly="0" invisible="share"/>
|
||||
<field name="tz_offset" invisible="1"/> <!-- needed for the timezone_mismatch widget -->
|
||||
</group>
|
||||
<!-- This group is meant to be used in overrides -->
|
||||
<group name="other_calendar_preferences"/>
|
||||
</group>
|
||||
</page>
|
||||
<page string="Security" name="page_security" invisible="not id">
|
||||
<div name="auth" class="d-flex">
|
||||
<div class="col-7 col-sm-6 col-lg-3 d-flex flex-column">
|
||||
<span class="o_form_label">
|
||||
Change Password
|
||||
</span>
|
||||
<span class="text-muted">
|
||||
Update if compromised.
|
||||
</span>
|
||||
</div>
|
||||
<button invisible="id != uid" name="preference_change_password" type="object"
|
||||
string="Change password" class="btn btn-secondary h-100 my-auto"/>
|
||||
<button invisible="id == uid" name="action_change_password_wizard" type="object"
|
||||
string="Change password" class="btn btn-secondary h-100 my-auto"/>
|
||||
</div>
|
||||
<div name="api_keys" invisible="id != uid" class="d-md-flex mt-3">
|
||||
<div class="col-md-6 col-lg-3 d-flex flex-column">
|
||||
<label for="api_key_wizard" string="API Keys" class="o_form_label"/>
|
||||
<span class="text-muted">
|
||||
Connect external services.
|
||||
</span>
|
||||
</div>
|
||||
<div class="w-md-50 w-lg-75 d-flex flex-column my-auto">
|
||||
<field name="api_key_ids" mode="kanban" invisible="not api_key_ids" class="w-sm-75 w-md-100 w-lg-75 w-xl-50 o_base_api_keys_kanban_view"/>
|
||||
<div>
|
||||
<button name="api_key_wizard" string="Add API Key" type="object" class="btn btn-secondary h-100"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div invisible="id != uid" class="d-md-flex mt-3">
|
||||
<div class="w-md-50 w-lg-25 d-flex flex-column">
|
||||
<label for="action_revoke_all_devices" string="Devices" class="o_form_label"/>
|
||||
<span class="text-muted">
|
||||
Check if they are yours.
|
||||
</span>
|
||||
</div>
|
||||
<div class="w-md-50 w-lg-75 d-flex flex-column my-auto">
|
||||
<field name="device_ids" mode="kanban" class="w-sm-75 w-md-100 w-lg-75 w-xl-50 o_base_devices_kanban_view"/>
|
||||
<div>
|
||||
<button name="action_revoke_all_devices" type="object" string="Log out from all devices" class="btn btn-secondary h-100"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</page>
|
||||
</notebook>
|
||||
</sheet>
|
||||
</form>
|
||||
|
|
@ -257,11 +248,12 @@
|
|||
<field name="model">res.users</field>
|
||||
<field name="arch" type="xml">
|
||||
<list string="Users" multi_edit="1">
|
||||
<field name="avatar_128" widget="image" options="{'size': [24, 24], 'img_class': 'o_avatar rounded'}" width="30" nolabel="1"/>
|
||||
<field name="name" readonly="1"/>
|
||||
<field name="login" readonly="1"/>
|
||||
<field name="lang"/>
|
||||
<field name="login_date" readonly="1"/>
|
||||
<field name="company_id" groups="base.group_multi_company"/>
|
||||
<field name="login" readonly="1" optional="show"/>
|
||||
<field name="lang" optional="hide"/>
|
||||
<field name="login_date" readonly="1" optional="hide"/>
|
||||
<field name="role" widget="badge"/>
|
||||
</list>
|
||||
</field>
|
||||
</record>
|
||||
|
|
@ -315,17 +307,8 @@
|
|||
</search>
|
||||
</field>
|
||||
</record>
|
||||
<record id="user_groups_view" model="ir.ui.view">
|
||||
<field name="name">res.users.groups</field>
|
||||
<field name="model">res.users</field>
|
||||
<field name="inherit_id" ref="view_users_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<!-- dummy, will be modified by groups -->
|
||||
<field name="groups_id" position="after"/>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- dummy update on group, to force the view above to be update -->
|
||||
<record model="res.groups" id="group_no_one"/>
|
||||
<record id="action_res_users" model="ir.actions.act_window">
|
||||
<field name="name">Users</field>
|
||||
<field name="res_model">res.users</field>
|
||||
|
|
@ -333,7 +316,7 @@
|
|||
<field name="view_mode">list,kanban,form</field>
|
||||
<field name="view_id" ref="view_users_tree"/>
|
||||
<field name="search_view_id" ref="view_users_search"/>
|
||||
<field name="context">{'search_default_filter_no_share': 1, 'show_user_group_warning': True}</field>
|
||||
<field name="context">{'search_default_filter_no_share': 1, 'is_action_res_users': True}</field>
|
||||
<field name="help">Create and manage users that will connect to the system. Users can be deactivated should there be a period of time during which they will/should not connect to the system. You can assign them groups in order to give them specific access to the applications they need to use in the system.</field>
|
||||
</record>
|
||||
<record id="action_res_users_view1" model="ir.actions.act_window.view">
|
||||
|
|
@ -350,7 +333,6 @@
|
|||
</record>
|
||||
<menuitem action="action_res_users" id="menu_action_res_users" parent="base.menu_users" sequence="0"/>
|
||||
|
||||
|
||||
<record id="action_res_users_keys_description" model="ir.actions.act_window">
|
||||
<field name="name">API Key: description input wizard</field>
|
||||
<field name="res_model">res.users.apikeys.description</field>
|
||||
|
|
@ -423,84 +405,107 @@
|
|||
<field eval="18" name="priority"/>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Users" edit="1">
|
||||
<widget name="notification_alert"/>
|
||||
<field name="image_1920" readonly="0" widget='image' class="oe_avatar" options='{"preview_image": "avatar_128"}'/>
|
||||
<h1>
|
||||
<field name="name" readonly="1" class="oe_inline"/>
|
||||
</h1>
|
||||
<notebook>
|
||||
<page string="Preferences" name="preferences_page">
|
||||
<group name="preferences">
|
||||
<sheet>
|
||||
<widget name="notification_alert"/>
|
||||
<div class="d-flex align-items-center">
|
||||
<div>
|
||||
<field name="image_1920" widget="contact_image" options="{'preview_image': 'avatar_128'}"/>
|
||||
<field name="avatar_128" invisible="1"/> <!-- Needed in contact_image widget -->
|
||||
</div>
|
||||
<div class="oe_title flex-fill ms-2">
|
||||
<h1 class="d-flex align-items-center">
|
||||
<field name="name"/>
|
||||
</h1>
|
||||
<h5 name="h5_email" class="d-flex align-items-baseline mb-0">
|
||||
<i class="fa fa-fw fa-envelope text-primary" title="Email"/>
|
||||
<field name="email" placeholder="Email" class="w-75"/>
|
||||
</h5>
|
||||
<h5 name="h5_phone" class="d-flex align-items-baseline mb-0">
|
||||
<i class="fa fa-fw fa-phone text-primary" title="Phone"/>
|
||||
<field name="phone" placeholder="Phone" class="w-75"/>
|
||||
</h5>
|
||||
</div>
|
||||
</div>
|
||||
<notebook>
|
||||
<page string="Preferences" name="preferences_page">
|
||||
<group>
|
||||
<field name="email" widget="email" readonly="0"/>
|
||||
<group>
|
||||
<label for="lang"/>
|
||||
<div class="o_row">
|
||||
<field name="lang" required="1" readonly="0"/>
|
||||
<button
|
||||
type="action"
|
||||
name="%(base.action_view_base_language_install)d"
|
||||
class="oe_edit_only btn-sm btn-link mb4 fa fa-globe"
|
||||
aria-label="Add a language"
|
||||
groups="base.group_system"
|
||||
title="Add a language"
|
||||
/>
|
||||
</div>
|
||||
<field name="signature" readonly="0" options="{'codeview': true, 'height': 112, 'resizable': true}" class="border border-secondary" />
|
||||
</group>
|
||||
<!-- This group is meant to be used in overrides -->
|
||||
<group name="other_preferences"/>
|
||||
</group>
|
||||
</page>
|
||||
<page name="calendar" string="Calendar">
|
||||
<group>
|
||||
<label for="lang"/>
|
||||
<div class="o_row">
|
||||
<field name="lang" required="1" readonly="0"/>
|
||||
<button
|
||||
type="action"
|
||||
name="%(base.action_view_base_language_install)d"
|
||||
class="oe_edit_only btn-sm btn-link mb4 fa fa-globe"
|
||||
aria-label="Add a language"
|
||||
groups="base.group_system"
|
||||
title="Add a language"
|
||||
/>
|
||||
<group name="calendar_preferences">
|
||||
<field name="tz" widget="timezone_mismatch" options="{'tz_offset_field': 'tz_offset'}" readonly="0"/>
|
||||
<field name="tz_offset" invisible="1"/> <!-- needed for the timezone_mismatch widget -->
|
||||
</group>
|
||||
<!-- This group is meant to be used in overrides -->
|
||||
<group name="other_calendar_preferences"/>
|
||||
</group>
|
||||
</page>
|
||||
<page string="Security" name="page_security">
|
||||
<div name="auth" class="d-flex">
|
||||
<div class="col-7 col-sm-6 col-lg-3 d-flex flex-column">
|
||||
<span class="o_form_label">
|
||||
Change Password
|
||||
</span>
|
||||
<span class="text-muted">
|
||||
Update if compromised.
|
||||
</span>
|
||||
</div>
|
||||
<field name="tz" widget="timezone_mismatch" options="{'tz_offset_field': 'tz_offset'}" readonly="0"/>
|
||||
<field name="tz_offset" invisible="1"/> <!-- needed for the timezone_mismatch widget -->
|
||||
</group>
|
||||
</group>
|
||||
<group name="signature">
|
||||
<field name="signature" readonly="0" options="{'codeview': true}"/>
|
||||
</group>
|
||||
<group name="status" string="Status" invisible="1">
|
||||
<field name="company_id" options="{'no_create': True}" readonly="0"
|
||||
groups="base.group_multi_company"/>
|
||||
</group>
|
||||
<group name="preference_contact"></group>
|
||||
</page>
|
||||
<page string="Account Security" name="page_account_security">
|
||||
<group name="auth" string="Password Management">
|
||||
<div colspan="2">
|
||||
<button name="preference_change_password" type="object" string="Change password" class="btn btn-secondary"/>
|
||||
<button name="preference_change_password" type="object" string="Change password"
|
||||
class="btn btn-secondary h-100 my-auto"/>
|
||||
</div>
|
||||
</group>
|
||||
<group name="access" string="Other Devices">
|
||||
<div colspan="2">
|
||||
<button name="action_revoke_all_devices" type="object" string="Log out from all devices" class="btn btn-secondary"/>
|
||||
<div name="api_keys" class="d-lg-flex mt-3">
|
||||
<div class="col-lg-3 d-flex flex-column">
|
||||
<label for="api_key_wizard" string="API Keys" class="o_form_label"/>
|
||||
<span class="text-muted">
|
||||
Connect external services.
|
||||
</span>
|
||||
</div>
|
||||
<div class="w-lg-75 d-flex flex-column my-auto">
|
||||
<field name="api_key_ids" mode="kanban" invisible="not api_key_ids" class="w-lg-75 o_base_api_keys_kanban_view"/>
|
||||
<div>
|
||||
<button name="api_key_wizard" string="Add API Key" type="object" class="btn btn-secondary h-100"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</group>
|
||||
<group string="API Keys">
|
||||
<div class="text-muted" colspan="2">
|
||||
API Keys are used to connect to Odoo from external tools without the need for a password or Two-factor Authentication.
|
||||
<widget name="documentation_link" path="/developer/misc/api/external_api.html#api-keys" lable="Learn more" icon="fa-fw o_button_icon fa-info-circle"/>
|
||||
<div class="d-lg-flex mt-3">
|
||||
<div class="col-lg-3 d-flex flex-column">
|
||||
<label for="action_revoke_all_devices" string="Devices" class="o_form_label"/>
|
||||
<span class="text-muted">
|
||||
Check if they are yours.
|
||||
</span>
|
||||
</div>
|
||||
<div class="w-lg-75 d-flex flex-column my-auto">
|
||||
<field name="device_ids" mode="kanban" class="w-lg-75 o_base_devices_kanban_view"/>
|
||||
<div>
|
||||
<button name="action_revoke_all_devices" type="object" string="Log out from all devices" class="btn btn-secondary h-100"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div colspan="2" invisible="not api_key_ids">
|
||||
<field name="api_key_ids" nolabel="1" colspan="4" readonly="0">
|
||||
<list editable="bottom" create="false" delete="false">
|
||||
<field name="name"/>
|
||||
<field name="scope"/>
|
||||
<field name="create_date"/>
|
||||
<field name="expiration_date"/>
|
||||
<button type="object" name="remove"
|
||||
string="Delete API key." icon="fa-trash"/>
|
||||
</list>
|
||||
</field>
|
||||
</div>
|
||||
<div colspan="2">
|
||||
<button name="api_key_wizard" string="New API Key" type="object" class="btn btn-secondary"/>
|
||||
</div>
|
||||
</group>
|
||||
</page>
|
||||
<page string="Devices" name="page_devices">
|
||||
<field name="device_ids" mode="kanban"/>
|
||||
</page>
|
||||
</notebook>
|
||||
<footer>
|
||||
<button name="preference_save" type="object" string="Save" class="btn-primary" data-hotkey="q"/>
|
||||
<button name="preference_cancel" string="Cancel" special="cancel" data-hotkey="x" class="btn-secondary"/>
|
||||
</footer>
|
||||
</page>
|
||||
</notebook>
|
||||
<footer>
|
||||
<button name="preference_save" type="object" string="Update Preferences" class="btn-primary" data-hotkey="q"/>
|
||||
<button name="preference_cancel" string="Discard" special="cancel" data-hotkey="x" class="btn-secondary"/>
|
||||
</footer>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
|
@ -520,7 +525,7 @@
|
|||
<record model="ir.ui.view" id="view_apikeys">
|
||||
<field name="name">API Keys Listing</field>
|
||||
<field name="model">res.users.apikeys</field>
|
||||
<field name="groups_id" eval="[Command.link(ref('base.group_system'))]"/>
|
||||
<field name="group_ids" eval="[Command.link(ref('base.group_system'))]"/>
|
||||
<field name="arch" type="xml">
|
||||
<list create="false" edit="false" delete="false" editable="bottom">
|
||||
<field name="user_id"/>
|
||||
|
|
@ -535,7 +540,7 @@
|
|||
<field name="name">API Keys Listing</field>
|
||||
<field name="res_model">res.users.apikeys</field>
|
||||
<field name="view_mode">list</field>
|
||||
<field name="groups_id" eval="[Command.link(ref('base.group_system'))]"/>
|
||||
<field name="group_ids" eval="[Command.link(ref('base.group_system'))]"/>
|
||||
<field name="view_id" ref="base.view_apikeys"/>
|
||||
</record>
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue