diff --git a/addons/digest/models/digest.py b/addons/digest/models/digest.py
index 658e00e4eac..f03c1d2dac0 100644
--- a/addons/digest/models/digest.py
+++ b/addons/digest/models/digest.py
@@ -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('
%s
%s
') % (
_('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 '')
diff --git a/addons/digest/tests/test_digest.py b/addons/digest/tests/test_digest.py
index 1c403433da4..196550b1bd1 100644
--- a/addons/digest/tests/test_digest.py
+++ b/addons/digest/tests/test_digest.py
@@ -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')