[IMP] various: update alias management in views

PURPOSE

Allow alias domains to be multiple, notably to be used in a multi company
environment where each company has its own alias domain.

SPECIFICATIONS

Update fields used in form views. Use 'alias_domain_id' instead of domain
that is now simply a related on 'alias_domain_id.name'. To ease UI we add
a placeholder on this field as it is now writable e.g. in multi domains
environment. Avoid unwanted configuration change by making it generally
no_open / no_create_edit.

In project, remove an unnecessary field adding complexity for few real use
case now that aliases are more open to configuration.

Task-36879 (Mail: Support Multi Domains Aliases)

Part-of: odoo/odoo#76734
This commit is contained in:
Thibault Delavallée
2023-10-24 19:24:50 +00:00
parent 11def7563e
commit c68ddce1b9
9 changed files with 60 additions and 60 deletions
@@ -12,7 +12,7 @@
<field name="kanban_dashboard"/>
<field name="activity_ids"/>
<field name="activity_state"/>
<field name="alias_domain"/>
<field name="alias_domain_id"/>
<templates>
<t t-name="kanban-box">
<div t-attf-class="d-flex flex-column flex-fill">
@@ -45,7 +45,7 @@
<span groups="base.group_multi_company" class="small">- <field name="company_id"/></span>
</t>
</div>
<div class="o_secondary" t-att-title="dashboard.title" t-if="journal_type == 'purchase' &amp;&amp; record.alias_domain.raw_value">
<div class="o_secondary" t-att-title="dashboard.title" t-if="journal_type == 'purchase' &amp;&amp; record.alias_domain_id.raw_value">
<field name="alias_id"/>
</div>
</div>
+12 -5
View File
@@ -143,18 +143,25 @@
<field name="restrict_mode_hash_table" groups="account.group_account_readonly" invisible="type in ['bank', 'cash']"/>
</group>
<!-- email alias -->
<group class="oe_read_only" name="group_alias_ro" string="Create Invoices upon Emails" invisible="type not in ('sale', 'purchase') or not alias_domain">
<group class="oe_read_only" name="group_alias_ro"
string="Create Invoices upon Emails" invisible="type not in ('sale', 'purchase')">
<field name="alias_id"/>
</group>
<group name="group_alias_no_domain" string="Create Invoices upon Emails" invisible="type not in ('sale', 'purchase') or alias_domain">
<group name="group_alias_no_domain" string="Create Invoices upon Emails"
invisible="type not in ('sale', 'purchase') or alias_domain_id">
<div class="content-group" colspan="2">
<a type='action' name='%(action_open_settings)d' class="btn btn-link" role="button"><i class="oi oi-fw o_button_icon oi-arrow-right"/> Configure Email Servers</a>
<a type='action' name='%(action_open_settings)d' class="btn btn-link" role="button">
<i class="oi oi-fw o_button_icon oi-arrow-right"/> Choose or Configure Email Servers
</a>
</div>
</group>
<group class="oe_edit_only" name="group_alias_edit" string="Create Invoices upon Emails" invisible="type not in ('sale', 'purchase') or not alias_domain">
<group class="oe_edit_only" name="group_alias_edit" string="Create Invoices upon Emails"
invisible="type not in ('sale', 'purchase') or not alias_domain_id">
<label string="Email Alias" for="alias_name"/>
<div class="oe_inline" name="edit_alias" style="display: inline;" >
<field name="alias_name" class="oe_inline"/>@<field name="alias_domain" class="oe_inline" readonly="1"/>
<field name="alias_name" class="oe_inline"/>@
<field name="alias_domain_id" class="oe_inline" placeholder="e.g. domain.com"
options="{'no_create': True, 'no_open': True}"/>
</div>
</group>
<!-- edi -->
+7 -12
View File
@@ -159,18 +159,13 @@
</xpath>
<xpath expr="//field[@name='user_id']" position="after">
<label for="alias_name" string="Email Alias"
invisible="not use_leads and not use_opportunities"/>
<div class="oe_inline" name="alias_def"
invisible="not use_leads and not use_opportunities">
<field name="alias_id" class="oe_read_only oe_inline"
string="Email Alias"
required="0"
invisible="not alias_domain"/>
<div class="oe_inline" name="edit_alias" style="display: inline;" >
<div class="oe_edit_only" invisible="not alias_domain">
<field name="alias_name" class="oe_inline"/>@<field name="alias_domain" class="oe_inline" readonly="1"/>
</div>
<button icon="oi-arrow-right" type="action" name="%(base_setup.action_general_configuration)d" string="Configure a custom domain" class="p-0 btn-link" invisible="alias_domain"/>
invisible="not use_leads and not use_opportunities"/>
<div name="alias_def" invisible="not use_leads and not use_opportunities">
<field name="alias_id" string="Email Alias" class="oe_read_only" required="0"/>
<div class="oe_edit_only" name="edit_alias">
<field name="alias_name" class="oe_inline"/>@
<field name="alias_domain_id" class="oe_inline" placeholder="e.g. domain.com"
options="{'no_create': True, 'no_open': True}"/>
</div>
</div>
<field name="alias_contact"
+15 -10
View File
@@ -14,8 +14,7 @@
<kanban class="o_kanban_dashboard o_hr_recruitment_kanban" on_create="hr_recruitment.create_job_simple" sample="1" limit="40" action="%(action_hr_job_applications)d" type="action">
<field name="active"/>
<field name="name"/>
<field name="alias_name"/>
<field name="alias_domain"/>
<field name="alias_email"/>
<field name="is_favorite"/>
<field name="department_id"/>
<field name="no_of_recruitment"/>
@@ -86,7 +85,7 @@
<div class="ps-3 o_secondary" groups="base.group_multi_company">
<small><i class="fa fa-building-o" role="img" aria-label="Company" title="Company"></i> <field name="company_id"/></small>
</div>
<div t-if="record.alias_name.value and record.alias_domain.value" class="ps-3 o_secondary o_job_alias">
<div t-if="record.alias_email.value" class="ps-3 o_secondary o_job_alias">
<small><i class="fa fa-envelope-o" role="img" aria-label="Alias" title="Alias"></i> <field name="alias_id"/></small>
</div>
</div>
@@ -146,13 +145,16 @@
<form string="Create a Job Position" class="o_hr_job_simple_form" >
<group>
<field name="name" class="o_job_name oe_inline" placeholder="e.g. Sales Manager"/>
<label for="alias_name" string="Application email" invisible="not alias_domain" help="Define a specific contact address for this job position. If you keep it empty, the default email address will be used which is in human resources settings"/>
<div name="alias_def" invisible="not alias_domain">
<label for="alias_name" string="Application email"
help="Define a specific contact address for this job position. If you keep it empty, the default email address will be used which is in human resources settings"/>
<div name="alias_def">
<field name="alias_id" class="oe_read_only" string="Email Alias" required="0"/>
<div class="oe_edit_only" name="edit_alias">
<field name="alias_name" class="oe_inline o_job_alias" placeholder="e.g. sales-manager"/>@<field name="alias_domain" class="oe_inline" readonly="1"/>
<field name="alias_name" class="oe_inline o_job_alias" placeholder="e.g. sales-manager"/>@
<field name="alias_domain_id" class="oe_inline" placeholder="e.g. domain.com"
options="{'no_create': True, 'no_open': True}"/>
</div>
<div class="text-muted" invisible="not alias_domain">Applicants can send resume to this email address,<br/>it will create an application automatically</div>
<div class="text-muted">Applicants can send resume to this email address,<br/>it will create an application automatically</div>
</div>
</group>
<footer>
@@ -187,11 +189,14 @@
<span invisible="address_id" class="oe_read_only">Remote</span>
<field name="address_id" context="{'show_address': 1}" placeholder="Remote"/>
</div>
<label for="alias_name" string="Email Alias" invisible="not alias_domain" help="Define a specific contact address for this job position. If you keep it empty, the default email address will be used which is in human resources settings"/>
<div name="alias_def" invisible="not alias_domain">
<label for="alias_name" string="Email Alias"
help="Define a specific contact address for this job position. If you keep it empty, the default email address will be used which is in human resources settings"/>
<div name="alias_def">
<field name="alias_id" class="oe_read_only" string="Email Alias" required="0"/>
<div class="oe_edit_only" name="edit_alias">
<field name="alias_name" class="oe_inline"/>@<field name="alias_domain" class="oe_inline" readonly="1"/>
<field name="alias_name" class="oe_inline"/>@
<field name="alias_domain_id" class="oe_inline" placeholder="e.g. domain.com"
options="{'no_create': True, 'no_open': True}"/>
</div>
</div>
</xpath>
+10 -9
View File
@@ -109,15 +109,16 @@
<field name="active" invisible="1"/>
<label for="alias_name" string="Email Alias"/>
<div class="oe_inline" name="alias_def">
<field name="alias_id" class="oe_read_only oe_inline"
string="Email Alias"
required="0"
invisible="not alias_domain"/>
<div class="oe_inline" name="edit_alias" style="display: inline;" >
<div class="oe_edit_only" invisible="not alias_domain">
<field name="alias_name" class="oe_inline"/>@<field name="alias_domain" class="oe_inline" readonly="1"/>
<field name="alias_id" class="oe_read_only oe_inline" string="Email Alias" required="0"/>
<div class="oe_inline" name="edit_alias" style="display: inline;">
<div class="oe_edit_only">
<field name="alias_name" class="oe_inline"/>@
<field name="alias_domain_id" class="oe_inline" placeholder="e.g. domain.com"
options="{'no_create': True, 'no_open': True}"/>
</div>
<button icon="oi-arrow-right" type="action" name="%(base_setup.action_general_configuration)d" string="Configure a custom domain" class="p-0 btn-link" invisible="alias_domain"/>
<button icon="oi-arrow-right" type="action" name="%(base_setup.action_general_configuration)d"
string="Choose or configure a custom domain" class="p-0 btn-link"
invisible="alias_domain_id"/>
</div>
</div>
<field name="description"/>
@@ -163,7 +164,7 @@
<field name="arch" type="xml">
<search string="Search Mail group">
<field name="name"/>
<field name="alias_name"/>
<field name="alias_email"/>
<separator/>
<filter string="Archived" name="archived" domain="[('active', '=', False)]"/>
<filter string="Moderated" name="moderation" domain="[('moderation', '=', True)]"/>
@@ -667,12 +667,14 @@
<field name="technician_user_id" class="oe_inline" domain="[('share', '=', False)]"/>
<field name="company_id" groups="base.group_multi_company" options="{'no_create': True}" class="oe_inline"/>
</group>
<group name="group_alias" invisible="not alias_domain" groups="base.group_no_one">
<group name="group_alias">
<label for="alias_name" string="Email Alias"/>
<div name="alias_def">
<field name="alias_id" class="oe_read_only oe_inline" string="Email Alias" required="0"/>
<div class="oe_edit_only oe_inline" name="edit_alias" style="display: inline;">
<field name="alias_name" class="oe_inline"/>@<field name="alias_domain" class="oe_inline" readonly="1"/>
<field name="alias_name" class="oe_inline"/>@
<field name="alias_domain_id" class="oe_inline" placeholder="e.g. domain.com"
options="{'no_create': True, 'no_open': True}"/>
</div>
</div>
</group>
+1 -1
View File
@@ -28,7 +28,7 @@
<field name="group_id" ref="project.group_project_user"/>
<field name="tip_description" type="html">
<div>
<t t-set="project_record" t-value="object.env['project.project'].search([('alias_name', '!=', False)], limit=1, order='sequence asc')"/>
<t t-set="project_record" t-value="object.env['project.project'].search([('alias_name', '!=', False), ('alias_domain_id', '!=', False)], limit=1, order='sequence asc')"/>
<p class="tip_title">Tip: Create tasks from incoming emails</p>
<t t-if="project_record.alias_email">
<p class="tip_content">Emails sent to <a t-attf-href="mailto:{{project_record.alias_email}}" target="_blank" style="color: #875a7b; text-decoration: none;"><t t-out="project_record.alias_email" /></a> will generate tasks in your <t t-out="project_record.name"></t> project.</p>
-10
View File
@@ -136,7 +136,6 @@ class Project(models.Model):
domain=[('state', 'not in', list(CLOSED_STATES))])
color = fields.Integer(string='Color Index')
user_id = fields.Many2one('res.users', string='Project Manager', default=lambda self: self.env.user, tracking=True)
alias_enabled = fields.Boolean(string='Use Email Alias', compute='_compute_alias_enabled', readonly=False)
alias_id = fields.Many2one(help="Internal email associated with this project. Incoming emails are automatically synchronized "
"with Tasks (or optionally Issues if the Issue Tracker module is installed).")
privacy_visibility = fields.Selection([
@@ -215,11 +214,6 @@ class Project(models.Model):
('project_date_greater', 'check(date >= date_start)', "The project's start date must be before its end date.")
]
@api.onchange('alias_enabled')
def _onchange_alias_name(self):
if not self.alias_enabled:
self.alias_name = False
@api.onchange('company_id')
def _onchange_company_id(self):
if (self.env.user.has_group('project.group_project_stages') and self.stage_id.company_id
@@ -230,10 +224,6 @@ class Project(models.Model):
limit=1,
).id
def _compute_alias_enabled(self):
for project in self:
project.alias_enabled = bool(project.alias_email)
def _compute_access_url(self):
super(Project, self)._compute_access_url()
for project in self:
@@ -108,19 +108,20 @@
</span>
</group>
<group>
<div name="alias_def" colspan="2" class="pb-2" invisible="not alias_domain">
<div name="alias_def" colspan="2" class="pb-2">
<!-- Always display the whole alias in edit mode. It depends in read only -->
<field name="alias_enabled" invisible="1"/>
<label for="alias_name" class="fw-bold o_form_label" string="Create tasks by sending an email to"/>
<field name="alias_email" class="oe_read_only d-inline" widget="email" readonly="1" invisible="not alias_name" />
<span class="oe_edit_only o_row">
<field name="alias_name" class="oe_inline"/>@<field name="alias_domain" class="oe_inline" readonly="1"/>
<field name="alias_name" class="oe_inline"/>@
<field name="alias_domain_id" class="oe_inline" placeholder="e.g. domain.com"
options="{'no_create': True, 'no_open': True}"/>
</span>
</div>
<!-- the alias contact must appear when the user start typing and it must disappear
when the string is deleted. -->
<field name="alias_contact" class="oe_inline" string="Accept Emails From"
invisible="alias_name == '' or not alias_name"/>
invisible="not alias_email"/>
</group>
<group name="extra_settings">
</group>
@@ -335,11 +336,12 @@
</div>
<field name="user_id" invisible="1"/>
<div class="row o_settings_container"/>
<div name="alias_def" class="mt-4" colspan="2" invisible="not alias_domain">
<div name="alias_def" class="mt-4" colspan="2">
<label for="alias_name" string="Create tasks by sending an email to"/>
<field name="alias_enabled" invisible="1"/>
<span>
<field name="alias_name" placeholder="e.g. office-party"/>@<field name="alias_domain"/>
<field name="alias_name" placeholder="e.g. office-party"/>@
<field name="alias_domain_id" class="oe_inline" placeholder="e.g. domain.com"
options="{'no_create': True, 'no_open': True}"/>
</span>
</div>
</form>
@@ -392,8 +394,6 @@
<field name="allow_milestones"/>
<field name="label_tasks"/>
<field name="alias_email"/>
<field name="alias_name"/>
<field name="alias_domain"/>
<field name="is_favorite"/>
<field name="rating_count" />
<field name="rating_avg"/>