[IMP] mail: improve usability of activities
Purpose of the task is to improve the usability of activity types and activity scheduling. Another purpose is alto to protect some master data activity types by flagging them and preventing their deletion. Containing * make the activity type as master data so deletion will be prevented; * improve the usability of the activity type; * prevent the deletion of activity type which are used for automated activity; * change the usability of activity scheduling modal; This commit is linked to task ID 1907970 and PR #29257.
This commit is contained in:
committed by
Thibault Delavallée
parent
7214173f52
commit
0db0e66e96
@@ -13,7 +13,7 @@
|
||||
<attribute name="attrs">{'invisible': [('activity_category', '=', 'meeting')]}</attribute>
|
||||
</xpath>
|
||||
<xpath expr="//button[@name='action_close_dialog']" position="attributes">
|
||||
<attribute name="attrs">{'invisible': [('activity_category', '=', 'meeting')]}</attribute>
|
||||
<attribute name="attrs">{'invisible': ['|', ('activity_category', '=', 'meeting'), ('id', '!=', False)]}</attribute>
|
||||
</xpath>
|
||||
<xpath expr="//button[@name='action_done']" position="attributes">
|
||||
<attribute name="attrs">{'invisible': ['|', ('activity_category', '=', 'meeting'), ('force_next', '=', True)]}</attribute>
|
||||
|
||||
@@ -11,17 +11,20 @@
|
||||
<field name="icon">fa-phone</field>
|
||||
<field name="delay_count">2</field>
|
||||
<field name="sequence">6</field>
|
||||
<field name="is_master_data">True</field>
|
||||
</record>
|
||||
<record id="mail_activity_data_meeting" model="mail.activity.type">
|
||||
<field name="name">Meeting</field>
|
||||
<field name="icon">fa-users</field>
|
||||
<field name="sequence">9</field>
|
||||
<field name="is_master_data">True</field>
|
||||
</record>
|
||||
<record id="mail_activity_data_todo" model="mail.activity.type">
|
||||
<field name="name">To Do</field>
|
||||
<field name="icon">fa-tasks</field>
|
||||
<field name="delay_count">5</field>
|
||||
<field name="sequence">12</field>
|
||||
<field name="is_master_data">True</field>
|
||||
</record>
|
||||
<record id="mail_activity_data_upload_document" model="mail.activity.type">
|
||||
<field name="name">Upload Document</field>
|
||||
@@ -36,6 +39,7 @@
|
||||
<field name="delay_count">0</field>
|
||||
<field name="sequence">99</field>
|
||||
<field name="decoration_type">warning</field>
|
||||
<field name="is_master_data">True</field>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
|
||||
@@ -33,12 +33,12 @@ class MailActivityType(models.Model):
|
||||
return super(MailActivityType, self).default_get(fields)
|
||||
|
||||
name = fields.Char('Name', required=True, translate=True)
|
||||
summary = fields.Char('Summary', translate=True)
|
||||
summary = fields.Char('Default Summary', translate=True)
|
||||
sequence = fields.Integer('Sequence', default=10)
|
||||
active = fields.Boolean(default=True)
|
||||
create_uid = fields.Many2one('res.users', index=True)
|
||||
delay_count = fields.Integer(
|
||||
'After', default=0, oldname='days',
|
||||
'Scheduled Date', default=0, oldname='days',
|
||||
help='Number of days/week/month before executing the action. It allows to plan the action deadline.')
|
||||
delay_unit = fields.Selection([
|
||||
('days', 'days'),
|
||||
@@ -59,7 +59,7 @@ class MailActivityType(models.Model):
|
||||
' and not available when managing activities for other models.')
|
||||
default_next_type_id = fields.Many2one('mail.activity.type', 'Default Next Activity',
|
||||
domain="['|', ('res_model_id', '=', False), ('res_model_id', '=', res_model_id)]")
|
||||
force_next = fields.Boolean("Auto Schedule Next Activity", default=False)
|
||||
force_next = fields.Boolean("Trigger Next Activity", default=False)
|
||||
next_type_ids = fields.Many2many(
|
||||
'mail.activity.type', 'mail_activity_rel', 'activity_id', 'recommended_id',
|
||||
domain="['|', ('res_model_id', '=', False), ('res_model_id', '=', res_model_id)]",
|
||||
@@ -69,7 +69,7 @@ class MailActivityType(models.Model):
|
||||
domain="['|', ('res_model_id', '=', False), ('res_model_id', '=', res_model_id)]",
|
||||
string='Preceding Activities')
|
||||
category = fields.Selection([
|
||||
('default', 'Other'), ('upload_file', 'Upload Document')
|
||||
('default', 'Standard'), ('upload_file', 'Upload Document')
|
||||
], default='default', string='Category',
|
||||
help='Categories may trigger specific behavior like opening calendar view or automatically mark as done when a document is uploaded')
|
||||
mail_template_ids = fields.Many2many('mail.template', string='Mails templates')
|
||||
@@ -78,6 +78,7 @@ class MailActivityType(models.Model):
|
||||
initial_res_model_id = fields.Many2one('ir.model', 'Initial model', compute="_compute_initial_res_model_id", store=False,
|
||||
help='Technical field to keep trace of the model at the beginning of the edition for UX related behaviour')
|
||||
res_model_change = fields.Boolean(string="Model has change", help="Technical field for UX related behaviour", default=False, store=False)
|
||||
is_master_data = fields.Boolean(string="Master data", help="This field is used to prevent master data from the deletion.")
|
||||
|
||||
@api.onchange('res_model_id')
|
||||
def _onchange_res_model_id(self):
|
||||
@@ -88,6 +89,13 @@ class MailActivityType(models.Model):
|
||||
for activity_type in self:
|
||||
activity_type.initial_res_model_id = activity_type.res_model_id
|
||||
|
||||
@api.multi
|
||||
def unlink(self):
|
||||
for activity_type in self:
|
||||
if activity_type.is_master_data:
|
||||
raise exceptions.ValidationError("You can not delete activity type that are used as master data.")
|
||||
return super(MailActivityType, self).unlink()
|
||||
|
||||
|
||||
class MailActivity(models.Model):
|
||||
""" An actual activity to perform. Activities are linked to
|
||||
@@ -120,7 +128,7 @@ class MailActivity(models.Model):
|
||||
help="Display name of the related document.", readonly=True)
|
||||
# activity
|
||||
activity_type_id = fields.Many2one(
|
||||
'mail.activity.type', 'Activity',
|
||||
'mail.activity.type', string='Activity Type',
|
||||
domain="['|', ('res_model_id', '=', False), ('res_model_id', '=', res_model_id)]", ondelete='restrict')
|
||||
activity_category = fields.Selection(related='activity_type_id.category', readonly=False)
|
||||
activity_decoration = fields.Selection(related='activity_type_id.decoration_type', readonly=False)
|
||||
|
||||
@@ -214,6 +214,7 @@ var BasicActivity = AbstractField.extend({
|
||||
_openActivityForm: function (id, callback) {
|
||||
var action = {
|
||||
type: 'ir.actions.act_window',
|
||||
name: _t("Schedule Activity"),
|
||||
res_model: 'mail.activity',
|
||||
view_mode: 'form',
|
||||
view_type: 'form',
|
||||
|
||||
@@ -1832,6 +1832,7 @@ QUnit.test('form activity widget: edit next activity', function (assert) {
|
||||
default_res_id: 2,
|
||||
default_res_model: "partner"
|
||||
},
|
||||
name: "Schedule Activity",
|
||||
res_id: 1,
|
||||
res_model: "mail.activity",
|
||||
target: "new",
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
</div>
|
||||
<field name="delay_from"/>
|
||||
</div>
|
||||
<field name="is_master_data" groups="base.group_no_one"/>
|
||||
</group>
|
||||
<group name="activity_planning">
|
||||
<field name="force_next"/>
|
||||
@@ -127,8 +128,11 @@
|
||||
</group>
|
||||
<field name="note" placeholder="Log a note..."/>
|
||||
<footer>
|
||||
<button string="Schedule" name="action_close_dialog"
|
||||
type="object" class="btn-primary"/>
|
||||
<field name="id" invisible="1"/>
|
||||
<button string="Schedule" name="action_close_dialog" type="object" class="btn-primary"
|
||||
attrs="{'invisible': [('id', '!=', False)]}"/>
|
||||
<button string="Save" name="action_close_dialog" type="object" class="btn-primary"
|
||||
attrs="{'invisible': [('id', '=', False)]}"/>
|
||||
<button attrs="{'invisible': [('force_next', '=', True)]}" string="Mark as Done" name="action_done"
|
||||
type="object" class="btn-secondary"
|
||||
context="{'mail_activity_quick_update': True}"/>
|
||||
|
||||
Reference in New Issue
Block a user