Skip to content
Snippets Groups Projects
Commit f916354b authored by Thibault Delavallée's avatar Thibault Delavallée
Browse files

[FIX] digest: improve tone down

Currently digest sending is toned down when being sent if subscribed users
did not connect since more than 3 days. It allows to avoid spamming people
not being active or present anymore.

This is currently limited to daily digests that are set to weekly. However
it may continues to send digests each week until the digest is de-activated.

In this commit we tone down the digest from daily to quarterly depending
on users activity. It is still based on overall activity and not individual
users to avoid complex computation on heavy digests. This will be done in
further cleaning of digests.

Task-2688856 (Digest tone down improvement)

Part-of: odoo/odoo#79653
parent a4b98a82
Branches
Tags
No related merge requests found
......@@ -121,7 +121,7 @@ class Digest(models.Model):
lang=user.lang
)._action_send_to_user(user, tips_count=1)
if digest in to_slowdown:
digest.write({'periodicity': 'weekly'})
digest.write({'periodicity': self._get_next_periodicity()[0]})
digest.next_run_date = digest._get_next_run_date()
def _action_send_to_user(self, user, tips_count=1, consum_tips=True):
......@@ -276,7 +276,11 @@ class Digest(models.Model):
"""
preferences = []
if self._context.get('digest_slowdown'):
preferences.append(_("We have noticed you did not connect these last few days so we've automatically switched your preference to weekly Digests."))
_dummy, new_perioridicy_str = self._get_next_periodicity()
preferences.append(
_("We have noticed you did not connect these last few days. We have automatically switched your preference to %(new_perioridicy_str)s Digests.",
new_perioridicy_str=new_perioridicy_str)
)
elif self.periodicity == 'daily' and user.has_group('base.group_erp_manager'):
preferences.append(Markup('<p>%s<br /><a href="%s" target="_blank" style="color:#875A7B; font-weight: bold;">%s</a></p>') % (
_('Prefer a broader overview ?'),
......@@ -338,17 +342,34 @@ class Digest(models.Model):
return margin
def _check_daily_logs(self):
three_days_ago = datetime.now().replace(hour=0, minute=0, second=0, microsecond=0) - relativedelta(days=3)
""" Badly named method that checks user logs and slowdown the sending
of digest emails based on recipients being away. """
today = datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
to_slowdown = self.env['digest.digest']
for digest in self.filtered(lambda digest: digest.periodicity == 'daily'):
for digest in self:
if digest.periodicity == 'daily': # 3 days ago
limit_dt = today - relativedelta(days=3)
elif digest.periodicity == 'weekly': # 2 weeks ago
limit_dt = today - relativedelta(days=14)
elif digest.periodicity == 'monthly': # 1 month ago
limit_dt = today - relativedelta(months=1)
elif digest.periodicity == 'quarterly': # 3 month ago
limit_dt = today - relativedelta(months=3)
users_logs = self.env['res.users.log'].sudo().search_count([
('create_uid', 'in', digest.user_ids.ids),
('create_date', '>=', three_days_ago)
('create_date', '>=', limit_dt)
])
if not users_logs:
to_slowdown += digest
return to_slowdown
def _get_next_periodicity(self):
if self.periodicity == 'weekly':
return 'monthly', _('monthly')
if self.periodicity == 'monthly':
return 'quarterly', _('quarterly')
return 'weekly', _('weekly')
def _format_currency_amount(self, amount, currency_id):
pre = currency_id.position == 'before'
symbol = u'{symbol}'.format(symbol=currency_id.symbol or '')
......
......@@ -128,6 +128,20 @@ class TestDigest(mail_test.MailCommon):
self.assertEqual(digest.periodicity, 'weekly')
# no logs for employee -> should tone down periodicity
digest.flush()
with self.mock_mail_gateway():
digest.action_send()
self.assertEqual(digest.periodicity, 'monthly')
# no logs for employee -> should tone down periodicity
digest.flush()
with self.mock_mail_gateway():
digest.action_send()
self.assertEqual(digest.periodicity, 'quarterly')
@users('admin')
def test_digest_tone_down_wlogs(self):
digest = self.env['digest.digest'].browse(self.test_digest.ids)
......@@ -137,12 +151,34 @@ class TestDigest(mail_test.MailCommon):
self.assertEqual(digest.periodicity, 'daily')
# logs for employee -> should not tone down
self.env['res.users.log'].with_user(SUPERUSER_ID).create({'create_uid': self.user_employee.id})
logs = self.env['res.users.log'].with_user(SUPERUSER_ID).create({'create_uid': self.user_employee.id})
digest.flush()
with self.mock_mail_gateway():
digest.action_send()
self.assertEqual(digest.periodicity, 'daily')
logs.unlink()
logs = self.env['res.users.log'].with_user(SUPERUSER_ID).create({
'create_uid': self.user_employee.id,
'create_date': fields.Datetime.now() - relativedelta(days=20),
})
# logs for employee are more than 3 days old -> should tone down
digest.flush()
with self.mock_mail_gateway():
digest.action_send()
self.assertEqual(digest.periodicity, 'weekly')
# logs for employee are more than 2 weeks old -> should tone down
digest.flush()
with self.mock_mail_gateway():
digest.action_send()
self.assertEqual(digest.periodicity, 'monthly')
# logs for employee are less than 1 month old -> should not tone down
digest.flush()
with self.mock_mail_gateway():
digest.action_send()
self.assertEqual(digest.periodicity, 'monthly')
@tagged('-at_install', 'post_install')
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment