[IMP] crm: remove duplicated field activity_deadline_my

Next to the addition of a generic field adding a compute to find
my next activity deadline there is no need to keep a custom field
on crm.lead model.

Task ID-2438822
COM PR odoo/odoo#72219

Related: odoo/upgrade#2566
Related: odoo/enterprise#19044
Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com>
This commit is contained in:
Thibault Delavallée
2021-06-21 08:53:35 +00:00
parent 800f9c499a
commit 6a1cda64f8
3 changed files with 15 additions and 39 deletions
+7 -31
View File
@@ -139,10 +139,6 @@ class Lead(models.Model):
('red', 'Next activity late'),
('green', 'Next activity is planned')], string='Kanban State',
compute='_compute_kanban_state')
activity_date_deadline_my = fields.Date(
'My Activities Deadline', compute='_compute_activity_date_deadline_my',
search='_search_activity_date_deadline_my', compute_sudo=False,
readonly=True, store=False, groups="base.group_user")
tag_ids = fields.Many2many(
'crm.tag', 'crm_tag_rel', 'lead_id', 'tag_id', string='Tags',
help="Classify and analyze your lead/opportunity categories like: Training, Service")
@@ -248,26 +244,6 @@ class Lead(models.Model):
kanban_state = 'red'
lead.kanban_state = kanban_state
@api.depends('activity_ids.date_deadline')
@api.depends_context('uid')
def _compute_activity_date_deadline_my(self):
todo_activities = []
if self.ids:
todo_activities = self.env['mail.activity'].search([
('user_id', '=', self._uid),
('res_model', '=', self._name),
('res_id', 'in', self.ids)
], order='date_deadline ASC')
for record in self:
record.activity_date_deadline_my = next(
(activity.date_deadline for activity in todo_activities if activity.res_id == record.id),
False
)
def _search_activity_date_deadline_my(self, operator, operand):
return ['&', ('activity_ids.user_id', '=', self._uid), ('activity_ids.date_deadline', operator, operand)]
@api.depends('company_id')
def _compute_user_company_ids(self):
all_companies = self.env['res.company'].search([])
@@ -704,11 +680,11 @@ class Lead(models.Model):
@api.model
def search(self, args, offset=0, limit=None, order=None, count=False):
""" Override to support ordering on activity_date_deadline_my.
""" Override to support ordering on my_activity_date_deadline.
Ordering through web client calls search_read with an order parameter set.
Search_read then calls search. In this override we therefore override search
to intercept a search without count with an order on activity_date_deadline_my.
to intercept a search without count with an order on my_activity_date_deadline.
In that case we do the search in two steps.
First step: fill with deadline-based results
@@ -733,14 +709,14 @@ class Lead(models.Model):
All other search and search_read are left untouched by this override to avoid
side effects. Search_count is not affected by this override.
"""
if count or not order or 'activity_date_deadline_my' not in order:
if count or not order or 'my_activity_date_deadline' not in order:
return super(Lead, self).search(args, offset=offset, limit=limit, order=order, count=count)
order_items = [order_item.strip().lower() for order_item in (order or self._order).split(',')]
# Perform a read_group on my activities to get a mapping lead_id / deadline
# Remember date_deadline is required, we always have a value for it. Only
# the earliest deadline per lead is kept.
activity_asc = any('activity_date_deadline_my asc' in item for item in order_items)
activity_asc = any('my_activity_date_deadline asc' in item for item in order_items)
my_lead_activities = self.env['mail.activity'].read_group(
[('res_model', '=', self._name), ('user_id', '=', self.env.uid)],
['res_id', 'date_deadline:min'],
@@ -750,7 +726,7 @@ class Lead(models.Model):
my_lead_mapping = dict((item['res_id'], item['date_deadline']) for item in my_lead_activities)
my_lead_ids = list(my_lead_mapping.keys())
my_lead_domain = expression.AND([[('id', 'in', my_lead_ids)], args])
my_lead_order = ', '.join(item for item in order_items if 'activity_date_deadline_my' not in item)
my_lead_order = ', '.join(item for item in order_items if 'my_activity_date_deadline' not in item)
# Search leads linked to those activities and order them. See docstring
# of this method for more details.
@@ -768,13 +744,13 @@ class Lead(models.Model):
# Fill with remaining leads. If a limit is given, simply remove count of
# already fetched. Otherwise keep none. If an offset is set we have to
# reduce it by already fetch results hereabove. Order is updated to exclude
# activity_date_deadline_my when calling super() .
# my_activity_date_deadline when calling super() .
lead_limit = (limit - len(my_lead_ids_keep)) if limit else None
if offset:
lead_offset = max((offset - len(search_res), 0))
else:
lead_offset = 0
lead_order = ', '.join(item for item in order_items if 'activity_date_deadline_my' not in item)
lead_order = ', '.join(item for item in order_items if 'my_activity_date_deadline' not in item)
other_lead_res = super(Lead, self).search(
expression.AND([[('id', 'not in', my_lead_ids_skip)], args]),
+4 -4
View File
@@ -46,7 +46,7 @@ class TestCrmMailActivity(TestCrmCommon):
# assert initial data, ensure we did not break base behavior
for lead in test_leads:
self.assertFalse(lead.activity_date_deadline_my)
self.assertFalse(lead.my_activity_date_deadline)
search_res = self.env['crm.lead'].search([('id', 'in', test_leads.ids)], limit=5, offset=0, order='id ASC')
self.assertEqual(search_res.ids, test_leads[:5].ids)
search_res = self.env['crm.lead'].search([('id', 'in', test_leads.ids)], limit=5, offset=5, order='id ASC')
@@ -82,11 +82,11 @@ class TestCrmMailActivity(TestCrmCommon):
expected_leads_desc = self.env['crm.lead'].browse([test_leads[lid].id for lid in expected_ids_desc])
for idx, lead in enumerate(test_leads):
self.assertEqual(lead.activity_date_deadline_my, deadlines_my[idx])
self.assertEqual(lead.my_activity_date_deadline, deadlines_my[idx])
self.assertEqual(lead.activity_date_deadline, deadlines_gl[idx], 'Fail at %s' % idx)
# Let's go for a first batch of search
_order = 'activity_date_deadline_my ASC, %s' % default_order
_order = 'my_activity_date_deadline ASC, %s' % default_order
_domain = [('id', 'in', test_leads.ids)]
search_res = self.env['crm.lead'].search(_domain, limit=None, offset=0, order=_order)
@@ -98,7 +98,7 @@ class TestCrmMailActivity(TestCrmCommon):
search_res = self.env['crm.lead'].search(_domain, limit=None, offset=3, order=_order)
self.assertEqual(expected_leads_asc[3:].ids, search_res.ids)
_order = 'activity_date_deadline_my DESC, %s' % default_order
_order = 'my_activity_date_deadline DESC, %s' % default_order
search_res = self.env['crm.lead'].search(_domain, limit=None, offset=0, order=_order)
self.assertEqual(expected_leads_desc.ids, search_res.ids)
search_res = self.env['crm.lead'].search(_domain, limit=4, offset=0, order=_order)
+4 -4
View File
@@ -711,7 +711,7 @@
<field name="priority" optional="hide" widget="priority"/>
<field name="activity_ids" widget="list_activity"/>
<field name="activity_user_id" optional="hide" string="Activity by" widget="many2one_avatar_user"/>
<field name="activity_date_deadline_my" string="My Deadline" widget="remaining_days" options="{'allow_order': '1'}"/>
<field name="my_activity_date_deadline" string="My Deadline" widget="remaining_days" options="{'allow_order': '1'}"/>
<field name="activity_calendar_event_id" invisible="1"/>
<field name="campaign_id" optional="hide"/>
<field name="medium_id" optional="hide"/>
@@ -729,10 +729,10 @@
<field name="message_needaction" invisible="1"/>
<button name="%(crm.action_lead_mail_compose)d" type="action" string="Email" icon="fa-envelope"/>
<button name="action_reschedule_meeting" class="text-warning" type="object" string="Reschedule"
icon="fa-calendar" attrs="{'invisible': ['|', ('activity_date_deadline_my', '=', False),
icon="fa-calendar" attrs="{'invisible': ['|', ('my_activity_date_deadline', '=', False),
('activity_calendar_event_id', '=', False)]}"/>
<button name="action_snooze" class="text-warning" type="object" string="Snooze 7d"
icon="fa-bell-slash" attrs="{'invisible': ['|', ('activity_date_deadline_my', '=', False),
icon="fa-bell-slash" attrs="{'invisible': ['|', ('my_activity_date_deadline', '=', False),
('activity_calendar_event_id', '!=', False)]}"/>
</tree>
</field>
@@ -746,7 +746,7 @@
<field name="inherit_id" ref="crm.crm_case_tree_view_oppor"/>
<field name="arch" type="xml">
<xpath expr="//tree" position="attributes">
<attribute name="default_order">activity_date_deadline_my</attribute>
<attribute name="default_order">my_activity_date_deadline</attribute>
</xpath>
<field name="user_id" position="attributes">
<attribute name="optional">hide</attribute>