From ab47ff975cbae2960793f41f6013f39c60342eed Mon Sep 17 00:00:00 2001 From: Alexey Pelykh Date: Wed, 12 Feb 2020 19:12:22 -0700 Subject: [PATCH 01/22] [ADD] mail_activity_reminder --- mail_activity_reminder/README.rst | 84 ++++ mail_activity_reminder/__init__.py | 3 + mail_activity_reminder/__manifest__.py | 23 + .../data/mail_activity_reminder_cron.xml | 20 + mail_activity_reminder/models/__init__.py | 4 + .../models/mail_activity.py | 141 ++++++ .../models/mail_activity_type.py | 27 ++ mail_activity_reminder/readme/CONFIGURE.rst | 7 + .../readme/CONTRIBUTORS.rst | 1 + mail_activity_reminder/readme/DESCRIPTION.rst | 1 + mail_activity_reminder/readme/ROADMAP.rst | 2 + .../static/description/index.html | 431 ++++++++++++++++++ mail_activity_reminder/tests/__init__.py | 3 + .../tests/test_mail_activity_reminder.py | 196 ++++++++ .../views/mail_activity_type.xml | 19 + 15 files changed, 962 insertions(+) create mode 100644 mail_activity_reminder/README.rst create mode 100644 mail_activity_reminder/__init__.py create mode 100644 mail_activity_reminder/__manifest__.py create mode 100644 mail_activity_reminder/data/mail_activity_reminder_cron.xml create mode 100644 mail_activity_reminder/models/__init__.py create mode 100644 mail_activity_reminder/models/mail_activity.py create mode 100644 mail_activity_reminder/models/mail_activity_type.py create mode 100644 mail_activity_reminder/readme/CONFIGURE.rst create mode 100644 mail_activity_reminder/readme/CONTRIBUTORS.rst create mode 100644 mail_activity_reminder/readme/DESCRIPTION.rst create mode 100644 mail_activity_reminder/readme/ROADMAP.rst create mode 100644 mail_activity_reminder/static/description/index.html create mode 100644 mail_activity_reminder/tests/__init__.py create mode 100644 mail_activity_reminder/tests/test_mail_activity_reminder.py create mode 100644 mail_activity_reminder/views/mail_activity_type.xml diff --git a/mail_activity_reminder/README.rst b/mail_activity_reminder/README.rst new file mode 100644 index 0000000000..e3346cffed --- /dev/null +++ b/mail_activity_reminder/README.rst @@ -0,0 +1,84 @@ +====================== +Mail Activity Reminder +====================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fsocial-lightgray.png?logo=github + :target: https://github.com/OCA/social/tree/12.0/mail_activity_reminder + :alt: OCA/social +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/social-12-0/social-12-0-mail_activity_reminder + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/205/12.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module allows setting reminders for various Activity Types. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +To configure reminders for specific Activity Type: + +#. Go to *Settings > Technical > Activity Types* +#. Open a specific activity type +#. Fill *Reminders* field with a non-digit-separated list of offsets (in days) + when reminders should be fired: e.g. 0 means "on the deadline day" while + 5 means "5 calendar days before the deadline". + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Brainbean Apps + +Contributors +~~~~~~~~~~~~ + +* Alexey Pelykh + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/social `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/mail_activity_reminder/__init__.py b/mail_activity_reminder/__init__.py new file mode 100644 index 0000000000..4b76c7b2d5 --- /dev/null +++ b/mail_activity_reminder/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from . import models diff --git a/mail_activity_reminder/__manifest__.py b/mail_activity_reminder/__manifest__.py new file mode 100644 index 0000000000..68f7097b77 --- /dev/null +++ b/mail_activity_reminder/__manifest__.py @@ -0,0 +1,23 @@ +# Copyright 2020 Brainbean Apps (https://brainbeanapps.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +{ + 'name': 'Mail Activity Reminder', + 'version': '12.0.1.0.0', + 'category': 'Discuss', + 'website': 'https://github.com/OCA/social', + 'author': + 'Brainbean Apps, ' + 'Odoo Community Association (OCA)', + 'license': 'AGPL-3', + 'installable': True, + 'application': False, + 'summary': 'Reminder notifications about planned activities', + 'depends': [ + 'mail', + ], + 'data': [ + 'data/mail_activity_reminder_cron.xml', + 'views/mail_activity_type.xml', + ], +} diff --git a/mail_activity_reminder/data/mail_activity_reminder_cron.xml b/mail_activity_reminder/data/mail_activity_reminder_cron.xml new file mode 100644 index 0000000000..bcdddc6022 --- /dev/null +++ b/mail_activity_reminder/data/mail_activity_reminder_cron.xml @@ -0,0 +1,20 @@ + + + + + + Mail Activity: Reminders + + code + model._process_reminders() + 1 + hours + 2020-01-01 00:01:00 + -1 + + + + diff --git a/mail_activity_reminder/models/__init__.py b/mail_activity_reminder/models/__init__.py new file mode 100644 index 0000000000..965eb883cb --- /dev/null +++ b/mail_activity_reminder/models/__init__.py @@ -0,0 +1,4 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from . import mail_activity_type +from . import mail_activity diff --git a/mail_activity_reminder/models/mail_activity.py b/mail_activity_reminder/models/mail_activity.py new file mode 100644 index 0000000000..ee53e8b243 --- /dev/null +++ b/mail_activity_reminder/models/mail_activity.py @@ -0,0 +1,141 @@ +# Copyright 2020 Brainbean Apps (https://brainbeanapps.com) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from datetime import datetime, time +from dateutil.relativedelta import relativedelta +from pytz import timezone, UTC + +from odoo import _, api, fields, models + + +class MailActivity(models.Model): + _inherit = 'mail.activity' + + next_reminder = fields.Datetime( + string='Next reminder', + compute='_compute_next_reminder', + compute_sudo=True, + store=True, + ) + last_reminder_local = fields.Datetime( + string='Last reminder (local)', + ) + deadline = fields.Datetime( + string='Deadline', + compute='_compute_deadline', + compute_sudo=True, + store=True, + ) + + @api.model + def _get_activities_to_remind_domain(self): + """Hook for extensions""" + return [ + ('next_reminder', '<=', fields.Datetime.now()), + ('deadline', '>=', fields.Datetime.now()), + ] + + @api.model + def _get_activities_to_remind(self): + return self \ + .search(self._get_activities_to_remind_domain()) + + @api.model + def _process_reminders(self): + activities = self._get_activities_to_remind() + activities.action_remind() + return activities + + @api.multi + @api.depends( + 'user_id.tz', + 'activity_type_id.reminders', + 'deadline', + 'last_reminder_local', + ) + def _compute_next_reminder(self): + now = fields.Datetime.now() + for activity in self: + if activity.deadline < now: + activity.next_reminder = None + continue + reminders = activity.activity_type_id._get_reminder_offsets() + if not reminders: + activity.next_reminder = None + continue + reminders.sort(reverse=True) + tz = timezone(activity.user_id.sudo().tz or 'UTC') + last_reminder_local = tz.localize( + activity.last_reminder_local + ) if activity.last_reminder_local else None + local_deadline = tz.localize(datetime.combine( + activity.date_deadline, + time.min # Schedule reminder based of beginning of day + )) + for reminder in reminders: + next_reminder_local = local_deadline - relativedelta( + days=reminder, + ) + if not last_reminder_local \ + or next_reminder_local > last_reminder_local: + break + if last_reminder_local \ + and next_reminder_local <= last_reminder_local: + activity.next_reminder = None + continue + activity.next_reminder = next_reminder_local \ + .astimezone(UTC) \ + .replace(tzinfo=None) + + @api.multi + @api.depends('user_id.tz', 'date_deadline') + def _compute_deadline(self): + for activity in self: + tz = timezone(activity.user_id.sudo().tz or 'UTC') + activity.deadline = tz.localize( + datetime.combine(activity.date_deadline, time.max) + ).astimezone(UTC).replace(tzinfo=None) + + @api.multi + def action_notify(self): + super().action_notify() + utc_now = fields.Datetime.now().replace(tzinfo=UTC) + for activity in self: + if activity.last_reminder_local: + continue + tz = timezone(activity.user_id.sudo().tz or 'UTC') + activity.last_reminder_local = utc_now \ + .astimezone(tz) \ + .replace(tzinfo=None) + + @api.multi + def action_remind(self): + IrModel = self.env['ir.model'] + MailThread = self.env['mail.thread'] + message_activity_assigned = self.env.ref( + 'mail.message_activity_assigned' + ) + utc_now = fields.Datetime.now().replace(tzinfo=UTC) + for activity in self: + tz = timezone(activity.user_id.sudo().tz or 'UTC') + local_now = utc_now.astimezone(tz) + model_description = IrModel._get(activity.res_model).display_name + subject = _('%s: %s assigned to you, %d day(s) remaining') % ( + activity.res_name, + activity.summary or activity.activity_type_id.name, + (activity.date_deadline - local_now.date()).days + ) + body = message_activity_assigned.render( + dict(activity=activity, model_description=model_description), + engine='ir.qweb', + minimal_qcontext=True, + ) + MailThread.message_notify( + partner_ids=activity.user_id.partner_id.ids, + body=body, + subject=subject, + record_name=activity.res_name, + model_description=model_description, + notif_layout='mail.mail_notification_light', + ) + activity.last_reminder_local = local_now.replace(tzinfo=None) diff --git a/mail_activity_reminder/models/mail_activity_type.py b/mail_activity_reminder/models/mail_activity_type.py new file mode 100644 index 0000000000..9feb4c1d2b --- /dev/null +++ b/mail_activity_reminder/models/mail_activity_type.py @@ -0,0 +1,27 @@ +# Copyright 2020 Brainbean Apps (https://brainbeanapps.com) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from re import split + +from odoo import api, fields, models + + +class MailActivityType(models.Model): + _inherit = 'mail.activity.type' + + reminders = fields.Char( + string='Reminders', + help=( + 'A non-digit-separated list of offsets (in days) when reminders' + ' should be fired: e.g. 0 means "on the deadline day" while' + ' 5 means "5 calendar days before the deadline".' + ), + ) + + @api.multi + def _get_reminder_offsets(self): + """Hook for extensions""" + self.ensure_one() + if not self.reminders: + return [] + return [int(x) for x in split(r'\D+', self.reminders) if x] diff --git a/mail_activity_reminder/readme/CONFIGURE.rst b/mail_activity_reminder/readme/CONFIGURE.rst new file mode 100644 index 0000000000..d8e331c645 --- /dev/null +++ b/mail_activity_reminder/readme/CONFIGURE.rst @@ -0,0 +1,7 @@ +To configure reminders for specific Activity Type: + +#. Go to *Settings > Technical > Activity Types* +#. Open a specific activity type +#. Fill *Reminders* field with a non-digit-separated list of offsets (in days) + when reminders should be fired: e.g. 0 means "on the deadline day" while + 5 means "5 calendar days before the deadline". diff --git a/mail_activity_reminder/readme/CONTRIBUTORS.rst b/mail_activity_reminder/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000000..1c6a35a1e3 --- /dev/null +++ b/mail_activity_reminder/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Alexey Pelykh diff --git a/mail_activity_reminder/readme/DESCRIPTION.rst b/mail_activity_reminder/readme/DESCRIPTION.rst new file mode 100644 index 0000000000..7800db6f8b --- /dev/null +++ b/mail_activity_reminder/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +This module allows setting reminders for various Activity Types. diff --git a/mail_activity_reminder/readme/ROADMAP.rst b/mail_activity_reminder/readme/ROADMAP.rst new file mode 100644 index 0000000000..adc78bcf48 --- /dev/null +++ b/mail_activity_reminder/readme/ROADMAP.rst @@ -0,0 +1,2 @@ + * Maybe, group reminders by receiver and send multiple scheduled remiders + in one message. diff --git a/mail_activity_reminder/static/description/index.html b/mail_activity_reminder/static/description/index.html new file mode 100644 index 0000000000..e3b7b46f21 --- /dev/null +++ b/mail_activity_reminder/static/description/index.html @@ -0,0 +1,431 @@ + + + + + + +Mail Activity Reminder + + + +
+

Mail Activity Reminder

+ + +

Beta License: AGPL-3 OCA/social Translate me on Weblate Try me on Runbot

+

This module allows setting reminders for various Activity Types.

+

Table of contents

+ +
+

Configuration

+

To configure reminders for specific Activity Type:

+
    +
  1. Go to Settings > Technical > Activity Types
  2. +
  3. Open a specific activity type
  4. +
  5. Fill Reminders field with a non-digit-separated list of offsets (in days) +when reminders should be fired: e.g. 0 means “on the deadline day” while +5 means “5 calendar days before the deadline”.
  6. +
+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Brainbean Apps
  • +
+
+ +
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/social project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/mail_activity_reminder/tests/__init__.py b/mail_activity_reminder/tests/__init__.py new file mode 100644 index 0000000000..8f1a336502 --- /dev/null +++ b/mail_activity_reminder/tests/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from . import test_mail_activity_reminder diff --git a/mail_activity_reminder/tests/test_mail_activity_reminder.py b/mail_activity_reminder/tests/test_mail_activity_reminder.py new file mode 100644 index 0000000000..7dc1796014 --- /dev/null +++ b/mail_activity_reminder/tests/test_mail_activity_reminder.py @@ -0,0 +1,196 @@ +# Copyright 2020 Brainbean Apps (https://brainbeanapps.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from datetime import datetime +from dateutil.relativedelta import relativedelta +from freezegun import freeze_time + +from odoo.tests import common + + +class TestMailActivityReminder(common.SavepointCase): + + @classmethod + def setUpClass(cls): + super().setUpClass() + + cls.env = cls.env(context=dict( + cls.env.context, + tracking_disable=True, + no_reset_password=True, + )) + cls.ResUsers = cls.env['res.users'] + cls.Company = cls.env['res.company'] + cls.MailActivityType = cls.env['mail.activity.type'] + cls.MailActivity = cls.env['mail.activity'] + cls.company_id = cls.Company._company_default_get() + cls.now = datetime(2020, 4, 19, 15, 00) + cls.today = cls.now.date() + cls.model_res_partner = cls.env['ir.model'].search( + [('model', '=', 'res.partner')], limit=1 + ) + cls.partner_DecoAddict = cls.env['res.partner'].search( + [('name', 'ilike', 'Deco Addict')], limit=1 + ) + + def test_none_reminders(self): + activity_type = self.MailActivityType.create({ + 'name': 'Activity Type', + }) + self.assertEqual(activity_type._get_reminder_offsets(), []) + + def test_empty_reminders(self): + activity_type = self.MailActivityType.create({ + 'name': 'Activity Type', + 'reminders': ' -./', + }) + self.assertEqual(activity_type._get_reminder_offsets(), []) + + def test_delimiters(self): + activity_type = self.MailActivityType.create({ + 'name': 'Activity Type', + 'reminders': '0 1_2/3.4t5', + }) + self.assertEqual(activity_type._get_reminder_offsets(), [ + 0, 1, 2, 3, 4, 5 + ]) + + def test_first_notice_is_reminder(self): + activity_type = self.MailActivityType.create({ + 'name': 'Activity Type', + 'reminders': '0', + }) + user = self.ResUsers.sudo().create({ + 'name': 'User', + 'login': 'user', + 'email': 'user@example.com', + 'company_id': self.company_id.id, + }) + activity = self.MailActivity.create({ + 'summary': 'Activity', + 'activity_type_id': activity_type.id, + 'res_model_id': self.model_res_partner.id, + 'res_id': self.partner_DecoAddict.id, + 'date_deadline': self.today, + 'user_id': user.id, + }) + + self.assertTrue(activity.last_reminder_local) + + def test_reminder_behaviour(self): + activity_type = self.MailActivityType.create({ + 'name': 'Activity Type', + 'reminders': '0/2', + }) + + with freeze_time(self.now): + activity = self.MailActivity.create({ + 'summary': 'Activity', + 'activity_type_id': activity_type.id, + 'res_model_id': self.model_res_partner.id, + 'res_id': self.partner_DecoAddict.id, + 'date_deadline': self.today + relativedelta(days=5), + }) + + with freeze_time(self.now): + activities = self.MailActivity._get_activities_to_remind() + self.assertFalse(activities) + + with freeze_time(self.now + relativedelta(days=2)): + activities = self.MailActivity._get_activities_to_remind() + self.assertFalse(activities) + + with freeze_time(self.now + relativedelta(days=3)): + activities = self.MailActivity._get_activities_to_remind() + self.assertEqual(activities, activity) + activities.action_remind() + + with freeze_time(self.now + relativedelta(days=4)): + activities = self.MailActivity._get_activities_to_remind() + self.assertFalse(activities) + + with freeze_time(self.now + relativedelta(days=5)): + activities = self.MailActivity._get_activities_to_remind() + self.assertEqual(activities, activity) + activities.action_remind() + + activity.active = False + with freeze_time(self.now + relativedelta(days=5)): + activities = self.MailActivity._get_activities_to_remind() + self.assertFalse(activities) + + def test_reminder_flow(self): + activity_type = self.MailActivityType.create({ + 'name': 'Activity Type', + 'reminders': '0/2', + }) + + with freeze_time(self.now): + activity = self.MailActivity.create({ + 'summary': 'Activity', + 'activity_type_id': activity_type.id, + 'res_model_id': self.model_res_partner.id, + 'res_id': self.partner_DecoAddict.id, + 'date_deadline': self.today + relativedelta(days=5), + }) + + with freeze_time(self.now): + activities = self.MailActivity._process_reminders() + self.assertFalse(activities) + + with freeze_time(self.now + relativedelta(days=2)): + activities = self.MailActivity._process_reminders() + self.assertFalse(activities) + + with freeze_time(self.now + relativedelta(days=3)): + activities = self.MailActivity._process_reminders() + self.assertEqual(activities, activity) + + with freeze_time(self.now + relativedelta(days=4)): + activities = self.MailActivity._process_reminders() + self.assertFalse(activities) + + with freeze_time(self.now + relativedelta(days=5)): + activities = self.MailActivity._process_reminders() + self.assertEqual(activities, activity) + + def test_repeated_reminder(self): + activity_type = self.MailActivityType.create({ + 'name': 'Activity Type', + 'reminders': '0', + }) + + with freeze_time(self.now): + activity = self.MailActivity.create({ + 'summary': 'Activity', + 'activity_type_id': activity_type.id, + 'res_model_id': self.model_res_partner.id, + 'res_id': self.partner_DecoAddict.id, + 'date_deadline': self.today + relativedelta(days=1), + }) + + with freeze_time(self.now + relativedelta(days=1)): + activities = self.MailActivity._process_reminders() + self.assertEqual(activities, activity) + + activities = self.MailActivity._process_reminders() + self.assertFalse(activities) + + def test_overdue_reminder(self): + activity_type = self.MailActivityType.create({ + 'name': 'Activity Type', + 'reminders': '0', + }) + + with freeze_time(self.now): + self.MailActivity.create({ + 'summary': 'Activity', + 'activity_type_id': activity_type.id, + 'res_model_id': self.model_res_partner.id, + 'res_id': self.partner_DecoAddict.id, + 'date_deadline': self.today + relativedelta(days=1), + }) + + with freeze_time(self.now + relativedelta(days=2)): + activities = self.MailActivity._get_activities_to_remind() + self.assertFalse(activities) diff --git a/mail_activity_reminder/views/mail_activity_type.xml b/mail_activity_reminder/views/mail_activity_type.xml new file mode 100644 index 0000000000..c83f347da1 --- /dev/null +++ b/mail_activity_reminder/views/mail_activity_type.xml @@ -0,0 +1,19 @@ + + + + + + mail.activity.type.view.form + mail.activity.type + + + + + + + + + From 9b9dcdc834204791e50a4a2cccdbb470ab833af1 Mon Sep 17 00:00:00 2001 From: oca-travis Date: Thu, 7 May 2020 17:58:38 +0000 Subject: [PATCH 02/22] [UPD] Update mail_activity_reminder.pot --- mail_activity_reminder/README.rst | 8 ++- .../i18n/mail_activity_reminder.pot | 63 ++++++++++++++++++ .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 30 ++++++--- 4 files changed, 90 insertions(+), 11 deletions(-) create mode 100644 mail_activity_reminder/i18n/mail_activity_reminder.pot create mode 100644 mail_activity_reminder/static/description/icon.png diff --git a/mail_activity_reminder/README.rst b/mail_activity_reminder/README.rst index e3346cffed..f53f5bc5e2 100644 --- a/mail_activity_reminder/README.rst +++ b/mail_activity_reminder/README.rst @@ -23,7 +23,7 @@ Mail Activity Reminder :target: https://runbot.odoo-community.org/runbot/205/12.0 :alt: Try me on Runbot -|badge1| |badge2| |badge3| |badge4| |badge5| +|badge1| |badge2| |badge3| |badge4| |badge5| This module allows setting reminders for various Activity Types. @@ -43,6 +43,12 @@ To configure reminders for specific Activity Type: when reminders should be fired: e.g. 0 means "on the deadline day" while 5 means "5 calendar days before the deadline". +Known issues / Roadmap +====================== + + * Maybe, group reminders by receiver and send multiple scheduled remiders + in one message. + Bug Tracker =========== diff --git a/mail_activity_reminder/i18n/mail_activity_reminder.pot b/mail_activity_reminder/i18n/mail_activity_reminder.pot new file mode 100644 index 0000000000..004806cb2c --- /dev/null +++ b/mail_activity_reminder/i18n/mail_activity_reminder.pot @@ -0,0 +1,63 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mail_activity_reminder +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: mail_activity_reminder +#: code:addons/mail_activity_reminder/models/mail_activity.py:123 +#, python-format +msgid "%s: %s assigned to you, %d day(s) remaining" +msgstr "" + +#. module: mail_activity_reminder +#: model:ir.model.fields,help:mail_activity_reminder.field_mail_activity_type__reminders +msgid "A non-digit-separated list of offsets (in days) when reminders should be fired: e.g. 0 means \"on the deadline day\" while 5 means \"5 calendar days before the deadline\"." +msgstr "" + +#. module: mail_activity_reminder +#: model:ir.model,name:mail_activity_reminder.model_mail_activity +msgid "Activity" +msgstr "" + +#. module: mail_activity_reminder +#: model:ir.model,name:mail_activity_reminder.model_mail_activity_type +msgid "Activity Type" +msgstr "" + +#. module: mail_activity_reminder +#: model:ir.model.fields,field_description:mail_activity_reminder.field_mail_activity__deadline +msgid "Deadline" +msgstr "" + +#. module: mail_activity_reminder +#: model:ir.model.fields,field_description:mail_activity_reminder.field_mail_activity__last_reminder_local +msgid "Last reminder (local)" +msgstr "" + +#. module: mail_activity_reminder +#: model:ir.actions.server,name:mail_activity_reminder.mail_activity_reminder_ir_actions_server +#: model:ir.cron,cron_name:mail_activity_reminder.mail_activity_reminder +#: model:ir.cron,name:mail_activity_reminder.mail_activity_reminder +msgid "Mail Activity: Reminders" +msgstr "" + +#. module: mail_activity_reminder +#: model:ir.model.fields,field_description:mail_activity_reminder.field_mail_activity__next_reminder +msgid "Next reminder" +msgstr "" + +#. module: mail_activity_reminder +#: model:ir.model.fields,field_description:mail_activity_reminder.field_mail_activity_type__reminders +msgid "Reminders" +msgstr "" + diff --git a/mail_activity_reminder/static/description/icon.png b/mail_activity_reminder/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/mail_activity_reminder/static/description/index.html b/mail_activity_reminder/static/description/index.html index e3b7b46f21..d818c7b23f 100644 --- a/mail_activity_reminder/static/description/index.html +++ b/mail_activity_reminder/static/description/index.html @@ -373,11 +373,12 @@

Mail Activity Reminder

+
+

Known issues / Roadmap

+
+
    +
  • Maybe, group reminders by receiver and send multiple scheduled remiders +in one message.
  • +
+
+
-

Bug Tracker

+

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed @@ -402,21 +412,21 @@

Bug Tracker

Do not contact contributors directly about support or help with technical issues.

-

Credits

+

Credits

-

Authors

+

Authors

  • Brainbean Apps
-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association

OCA, or the Odoo Community Association, is a nonprofit organization whose From 6be7611e8d13fb21510fc76934ca1ecb3b1ab095 Mon Sep 17 00:00:00 2001 From: Alexey Pelykh Date: Wed, 4 Nov 2020 12:49:33 +0200 Subject: [PATCH 03/22] [UPD] Brainbean Apps => CorporateHub --- mail_activity_reminder/README.rst | 6 ++++-- mail_activity_reminder/__manifest__.py | 5 +++-- mail_activity_reminder/readme/CONTRIBUTORS.rst | 4 +++- mail_activity_reminder/static/description/index.html | 7 +++++-- 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/mail_activity_reminder/README.rst b/mail_activity_reminder/README.rst index f53f5bc5e2..d914e1fa75 100644 --- a/mail_activity_reminder/README.rst +++ b/mail_activity_reminder/README.rst @@ -65,12 +65,14 @@ Credits Authors ~~~~~~~ -* Brainbean Apps +* CorporateHub Contributors ~~~~~~~~~~~~ -* Alexey Pelykh +* `CorporateHub `__ + + * Alexey Pelykh Maintainers ~~~~~~~~~~~ diff --git a/mail_activity_reminder/__manifest__.py b/mail_activity_reminder/__manifest__.py index 68f7097b77..0f542e0b24 100644 --- a/mail_activity_reminder/__manifest__.py +++ b/mail_activity_reminder/__manifest__.py @@ -1,13 +1,14 @@ # Copyright 2020 Brainbean Apps (https://brainbeanapps.com) +# Copyright 2020 CorporateHub (https://corporatehub.eu) # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). { 'name': 'Mail Activity Reminder', - 'version': '12.0.1.0.0', + 'version': '12.0.1.0.1', 'category': 'Discuss', 'website': 'https://github.com/OCA/social', 'author': - 'Brainbean Apps, ' + 'CorporateHub, ' 'Odoo Community Association (OCA)', 'license': 'AGPL-3', 'installable': True, diff --git a/mail_activity_reminder/readme/CONTRIBUTORS.rst b/mail_activity_reminder/readme/CONTRIBUTORS.rst index 1c6a35a1e3..724bc1d03a 100644 --- a/mail_activity_reminder/readme/CONTRIBUTORS.rst +++ b/mail_activity_reminder/readme/CONTRIBUTORS.rst @@ -1 +1,3 @@ -* Alexey Pelykh +* `CorporateHub `__ + + * Alexey Pelykh diff --git a/mail_activity_reminder/static/description/index.html b/mail_activity_reminder/static/description/index.html index d818c7b23f..df9167b2e1 100644 --- a/mail_activity_reminder/static/description/index.html +++ b/mail_activity_reminder/static/description/index.html @@ -416,13 +416,16 @@

Credits

Authors

    -
  • Brainbean Apps
  • +
  • CorporateHub
From 289a103acdbfec91ed655f7502063d3cd9560215 Mon Sep 17 00:00:00 2001 From: Pedro Castro Silva Date: Tue, 11 May 2021 13:43:00 +0000 Subject: [PATCH 04/22] Added translation using Weblate (Portuguese) --- mail_activity_reminder/i18n/pt.po | 63 +++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 mail_activity_reminder/i18n/pt.po diff --git a/mail_activity_reminder/i18n/pt.po b/mail_activity_reminder/i18n/pt.po new file mode 100644 index 0000000000..0ca2f582e9 --- /dev/null +++ b/mail_activity_reminder/i18n/pt.po @@ -0,0 +1,63 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mail_activity_reminder +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: pt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" + +#. module: mail_activity_reminder +#: code:addons/mail_activity_reminder/models/mail_activity.py:123 +#, python-format +msgid "%s: %s assigned to you, %d day(s) remaining" +msgstr "" + +#. module: mail_activity_reminder +#: model:ir.model.fields,help:mail_activity_reminder.field_mail_activity_type__reminders +msgid "A non-digit-separated list of offsets (in days) when reminders should be fired: e.g. 0 means \"on the deadline day\" while 5 means \"5 calendar days before the deadline\"." +msgstr "" + +#. module: mail_activity_reminder +#: model:ir.model,name:mail_activity_reminder.model_mail_activity +msgid "Activity" +msgstr "" + +#. module: mail_activity_reminder +#: model:ir.model,name:mail_activity_reminder.model_mail_activity_type +msgid "Activity Type" +msgstr "" + +#. module: mail_activity_reminder +#: model:ir.model.fields,field_description:mail_activity_reminder.field_mail_activity__deadline +msgid "Deadline" +msgstr "" + +#. module: mail_activity_reminder +#: model:ir.model.fields,field_description:mail_activity_reminder.field_mail_activity__last_reminder_local +msgid "Last reminder (local)" +msgstr "" + +#. module: mail_activity_reminder +#: model:ir.actions.server,name:mail_activity_reminder.mail_activity_reminder_ir_actions_server +#: model:ir.cron,cron_name:mail_activity_reminder.mail_activity_reminder +#: model:ir.cron,name:mail_activity_reminder.mail_activity_reminder +msgid "Mail Activity: Reminders" +msgstr "" + +#. module: mail_activity_reminder +#: model:ir.model.fields,field_description:mail_activity_reminder.field_mail_activity__next_reminder +msgid "Next reminder" +msgstr "" + +#. module: mail_activity_reminder +#: model:ir.model.fields,field_description:mail_activity_reminder.field_mail_activity_type__reminders +msgid "Reminders" +msgstr "" From 7f01ff2b76160dc7aac3d360d0c410df9c05f392 Mon Sep 17 00:00:00 2001 From: Pedro Castro Silva Date: Tue, 11 May 2021 13:45:15 +0000 Subject: [PATCH 05/22] Translated using Weblate (Portuguese) Currently translated at 100.0% (9 of 9 strings) Translation: social-12.0/social-12.0-mail_activity_reminder Translate-URL: https://translation.odoo-community.org/projects/social-12-0/social-12-0-mail_activity_reminder/pt/ --- mail_activity_reminder/i18n/pt.po | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/mail_activity_reminder/i18n/pt.po b/mail_activity_reminder/i18n/pt.po index 0ca2f582e9..1506563def 100644 --- a/mail_activity_reminder/i18n/pt.po +++ b/mail_activity_reminder/i18n/pt.po @@ -6,58 +6,63 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 12.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: Automatically generated\n" +"PO-Revision-Date: 2021-05-11 13:47+0000\n" +"Last-Translator: Pedro Castro Silva \n" "Language-Team: none\n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 4.3.2\n" #. module: mail_activity_reminder #: code:addons/mail_activity_reminder/models/mail_activity.py:123 #, python-format msgid "%s: %s assigned to you, %d day(s) remaining" -msgstr "" +msgstr "%s: %s atribuído a você, %d dia(s) restante(s)" #. module: mail_activity_reminder #: model:ir.model.fields,help:mail_activity_reminder.field_mail_activity_type__reminders msgid "A non-digit-separated list of offsets (in days) when reminders should be fired: e.g. 0 means \"on the deadline day\" while 5 means \"5 calendar days before the deadline\"." msgstr "" +"Uma lista não separada por dígitos de offsets (em dias) para quando os " +"lembretes devem ser disparados: por exemplo, 0 significa \"no dia do prazo\" " +"e 5 significa \"5 dias de calendário antes do prazo\"." #. module: mail_activity_reminder #: model:ir.model,name:mail_activity_reminder.model_mail_activity msgid "Activity" -msgstr "" +msgstr "Atividade" #. module: mail_activity_reminder #: model:ir.model,name:mail_activity_reminder.model_mail_activity_type msgid "Activity Type" -msgstr "" +msgstr "Tipo de Atividade" #. module: mail_activity_reminder #: model:ir.model.fields,field_description:mail_activity_reminder.field_mail_activity__deadline msgid "Deadline" -msgstr "" +msgstr "Prazo Limite" #. module: mail_activity_reminder #: model:ir.model.fields,field_description:mail_activity_reminder.field_mail_activity__last_reminder_local msgid "Last reminder (local)" -msgstr "" +msgstr "Último lembrete (local)" #. module: mail_activity_reminder #: model:ir.actions.server,name:mail_activity_reminder.mail_activity_reminder_ir_actions_server #: model:ir.cron,cron_name:mail_activity_reminder.mail_activity_reminder #: model:ir.cron,name:mail_activity_reminder.mail_activity_reminder msgid "Mail Activity: Reminders" -msgstr "" +msgstr "Atividade de Correio: Lembretes" #. module: mail_activity_reminder #: model:ir.model.fields,field_description:mail_activity_reminder.field_mail_activity__next_reminder msgid "Next reminder" -msgstr "" +msgstr "Próximo lembrete" #. module: mail_activity_reminder #: model:ir.model.fields,field_description:mail_activity_reminder.field_mail_activity_type__reminders msgid "Reminders" -msgstr "" +msgstr "Lembretes" From 956649ee1b0b11c816a8d7ff75461b70eddf356c Mon Sep 17 00:00:00 2001 From: Yann Papouin Date: Thu, 20 Oct 2022 07:04:10 +0000 Subject: [PATCH 06/22] Added translation using Weblate (French) --- mail_activity_reminder/i18n/fr.po | 63 +++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 mail_activity_reminder/i18n/fr.po diff --git a/mail_activity_reminder/i18n/fr.po b/mail_activity_reminder/i18n/fr.po new file mode 100644 index 0000000000..7204090cba --- /dev/null +++ b/mail_activity_reminder/i18n/fr.po @@ -0,0 +1,63 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mail_activity_reminder +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" + +#. module: mail_activity_reminder +#: code:addons/mail_activity_reminder/models/mail_activity.py:123 +#, python-format +msgid "%s: %s assigned to you, %d day(s) remaining" +msgstr "" + +#. module: mail_activity_reminder +#: model:ir.model.fields,help:mail_activity_reminder.field_mail_activity_type__reminders +msgid "A non-digit-separated list of offsets (in days) when reminders should be fired: e.g. 0 means \"on the deadline day\" while 5 means \"5 calendar days before the deadline\"." +msgstr "" + +#. module: mail_activity_reminder +#: model:ir.model,name:mail_activity_reminder.model_mail_activity +msgid "Activity" +msgstr "" + +#. module: mail_activity_reminder +#: model:ir.model,name:mail_activity_reminder.model_mail_activity_type +msgid "Activity Type" +msgstr "" + +#. module: mail_activity_reminder +#: model:ir.model.fields,field_description:mail_activity_reminder.field_mail_activity__deadline +msgid "Deadline" +msgstr "" + +#. module: mail_activity_reminder +#: model:ir.model.fields,field_description:mail_activity_reminder.field_mail_activity__last_reminder_local +msgid "Last reminder (local)" +msgstr "" + +#. module: mail_activity_reminder +#: model:ir.actions.server,name:mail_activity_reminder.mail_activity_reminder_ir_actions_server +#: model:ir.cron,cron_name:mail_activity_reminder.mail_activity_reminder +#: model:ir.cron,name:mail_activity_reminder.mail_activity_reminder +msgid "Mail Activity: Reminders" +msgstr "" + +#. module: mail_activity_reminder +#: model:ir.model.fields,field_description:mail_activity_reminder.field_mail_activity__next_reminder +msgid "Next reminder" +msgstr "" + +#. module: mail_activity_reminder +#: model:ir.model.fields,field_description:mail_activity_reminder.field_mail_activity_type__reminders +msgid "Reminders" +msgstr "" From 22d4a844a764ff19c78318a8ec50c11d6b1b46d3 Mon Sep 17 00:00:00 2001 From: Yann Papouin Date: Thu, 20 Oct 2022 07:15:01 +0000 Subject: [PATCH 07/22] Translated using Weblate (French) Currently translated at 100.0% (9 of 9 strings) Translation: social-12.0/social-12.0-mail_activity_reminder Translate-URL: https://translation.odoo-community.org/projects/social-12-0/social-12-0-mail_activity_reminder/fr/ --- mail_activity_reminder/i18n/fr.po | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/mail_activity_reminder/i18n/fr.po b/mail_activity_reminder/i18n/fr.po index 7204090cba..cfa2b6be49 100644 --- a/mail_activity_reminder/i18n/fr.po +++ b/mail_activity_reminder/i18n/fr.po @@ -6,58 +6,64 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 12.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: Automatically generated\n" +"PO-Revision-Date: 2022-10-20 09:44+0000\n" +"Last-Translator: Yann Papouin \n" "Language-Team: none\n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 4.14.1\n" #. module: mail_activity_reminder #: code:addons/mail_activity_reminder/models/mail_activity.py:123 #, python-format msgid "%s: %s assigned to you, %d day(s) remaining" -msgstr "" +msgstr "%s : %s assigné à vous, %d jour(s) restant(s)" #. module: mail_activity_reminder #: model:ir.model.fields,help:mail_activity_reminder.field_mail_activity_type__reminders msgid "A non-digit-separated list of offsets (in days) when reminders should be fired: e.g. 0 means \"on the deadline day\" while 5 means \"5 calendar days before the deadline\"." msgstr "" +"Une liste de nombres de jours (séparés par tout caractère autre que des " +"chiffres) qui indique quand les rappels doivent être déclenchés : par ex. 0 " +"signifie \"le jour de l'échéance\" tandis que 5 signifie \"5 jours " +"calendaires avant l'échéance\"." #. module: mail_activity_reminder #: model:ir.model,name:mail_activity_reminder.model_mail_activity msgid "Activity" -msgstr "" +msgstr "Activité" #. module: mail_activity_reminder #: model:ir.model,name:mail_activity_reminder.model_mail_activity_type msgid "Activity Type" -msgstr "" +msgstr "Type d'activité" #. module: mail_activity_reminder #: model:ir.model.fields,field_description:mail_activity_reminder.field_mail_activity__deadline msgid "Deadline" -msgstr "" +msgstr "Echéance" #. module: mail_activity_reminder #: model:ir.model.fields,field_description:mail_activity_reminder.field_mail_activity__last_reminder_local msgid "Last reminder (local)" -msgstr "" +msgstr "Dernier rappel (local)" #. module: mail_activity_reminder #: model:ir.actions.server,name:mail_activity_reminder.mail_activity_reminder_ir_actions_server #: model:ir.cron,cron_name:mail_activity_reminder.mail_activity_reminder #: model:ir.cron,name:mail_activity_reminder.mail_activity_reminder msgid "Mail Activity: Reminders" -msgstr "" +msgstr "Activité : Rappels" #. module: mail_activity_reminder #: model:ir.model.fields,field_description:mail_activity_reminder.field_mail_activity__next_reminder msgid "Next reminder" -msgstr "" +msgstr "Rappel suivant" #. module: mail_activity_reminder #: model:ir.model.fields,field_description:mail_activity_reminder.field_mail_activity_type__reminders msgid "Reminders" -msgstr "" +msgstr "Rappels" From 4ef968f9cbd8bdc3e41cfd75748bd18070f3455d Mon Sep 17 00:00:00 2001 From: Denis Roussel Date: Fri, 21 Apr 2023 18:23:02 +0200 Subject: [PATCH 08/22] [IMP] mail_activity_reminder: black, isort, prettier --- mail_activity_reminder/__manifest__.py | 29 ++- .../data/mail_activity_reminder_cron.xml | 6 +- .../models/mail_activity.py | 102 +++++----- .../models/mail_activity_type.py | 8 +- .../tests/test_mail_activity_reminder.py | 181 +++++++++--------- .../views/mail_activity_type.xml | 6 +- 6 files changed, 158 insertions(+), 174 deletions(-) diff --git a/mail_activity_reminder/__manifest__.py b/mail_activity_reminder/__manifest__.py index 0f542e0b24..ae72e91eb9 100644 --- a/mail_activity_reminder/__manifest__.py +++ b/mail_activity_reminder/__manifest__.py @@ -3,22 +3,15 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). { - 'name': 'Mail Activity Reminder', - 'version': '12.0.1.0.1', - 'category': 'Discuss', - 'website': 'https://github.com/OCA/social', - 'author': - 'CorporateHub, ' - 'Odoo Community Association (OCA)', - 'license': 'AGPL-3', - 'installable': True, - 'application': False, - 'summary': 'Reminder notifications about planned activities', - 'depends': [ - 'mail', - ], - 'data': [ - 'data/mail_activity_reminder_cron.xml', - 'views/mail_activity_type.xml', - ], + "name": "Mail Activity Reminder", + "version": "12.0.1.0.1", + "category": "Discuss", + "website": "https://github.com/OCA/social", + "author": "CorporateHub, " "Odoo Community Association (OCA)", + "license": "AGPL-3", + "installable": True, + "application": False, + "summary": "Reminder notifications about planned activities", + "depends": ["mail",], + "data": ["data/mail_activity_reminder_cron.xml", "views/mail_activity_type.xml",], } diff --git a/mail_activity_reminder/data/mail_activity_reminder_cron.xml b/mail_activity_reminder/data/mail_activity_reminder_cron.xml index bcdddc6022..e4b9f5ce94 100644 --- a/mail_activity_reminder/data/mail_activity_reminder_cron.xml +++ b/mail_activity_reminder/data/mail_activity_reminder_cron.xml @@ -1,4 +1,4 @@ - + -

Beta License: AGPL-3 OCA/social Translate me on Weblate Try me on Runbot

+

Beta License: AGPL-3 OCA/social Translate me on Weblate Try me on Runbot

This module allows setting reminders for various Activity Types.

Table of contents

@@ -408,7 +408,7 @@

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -feedback.

+feedback.

Do not contact contributors directly about support or help with technical issues.

@@ -426,6 +426,7 @@

Contributors

  • Alexey Pelykh <alexey.pelykh@corphub.eu>
  • +
  • Denis Roussel <denis.roussel@acsone.eu>
  • @@ -435,7 +436,7 @@

    Maintainers

    OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

    -

    This module is part of the OCA/social project on GitHub.

    +

    This module is part of the OCA/social project on GitHub.

    You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

    diff --git a/mail_activity_reminder/tests/test_mail_activity_reminder.py b/mail_activity_reminder/tests/test_mail_activity_reminder.py index ef5724ca1e..7d3ebf2638 100644 --- a/mail_activity_reminder/tests/test_mail_activity_reminder.py +++ b/mail_activity_reminder/tests/test_mail_activity_reminder.py @@ -34,24 +34,24 @@ def setUpClass(cls): ) def test_none_reminders(self): - activity_type = self.MailActivityType.create({"name": "Activity Type",}) + activity_type = self.MailActivityType.create({"name": "Activity Type"}) self.assertEqual(activity_type._get_reminder_offsets(), []) def test_empty_reminders(self): activity_type = self.MailActivityType.create( - {"name": "Activity Type", "reminders": " -./",} + {"name": "Activity Type", "reminders": " -./"} ) self.assertEqual(activity_type._get_reminder_offsets(), []) def test_delimiters(self): activity_type = self.MailActivityType.create( - {"name": "Activity Type", "reminders": "0 1_2/3.4t5",} + {"name": "Activity Type", "reminders": "0 1_2/3.4t5"} ) self.assertEqual(activity_type._get_reminder_offsets(), [0, 1, 2, 3, 4, 5]) def test_first_notice_is_reminder(self): activity_type = self.MailActivityType.create( - {"name": "Activity Type", "reminders": "0",} + {"name": "Activity Type", "reminders": "0"} ) user = self.ResUsers.sudo().create( { @@ -76,7 +76,7 @@ def test_first_notice_is_reminder(self): def test_reminder_behaviour(self): activity_type = self.MailActivityType.create( - {"name": "Activity Type", "reminders": "0/2",} + {"name": "Activity Type", "reminders": "0/2"} ) with freeze_time(self.now): @@ -119,7 +119,7 @@ def test_reminder_behaviour(self): def test_reminder_flow(self): activity_type = self.MailActivityType.create( - {"name": "Activity Type", "reminders": "0/2",} + {"name": "Activity Type", "reminders": "0/2"} ) with freeze_time(self.now): @@ -155,7 +155,7 @@ def test_reminder_flow(self): def test_repeated_reminder(self): activity_type = self.MailActivityType.create( - {"name": "Activity Type", "reminders": "0",} + {"name": "Activity Type", "reminders": "0"} ) with freeze_time(self.now): @@ -178,7 +178,7 @@ def test_repeated_reminder(self): def test_overdue_reminder(self): activity_type = self.MailActivityType.create( - {"name": "Activity Type", "reminders": "0",} + {"name": "Activity Type", "reminders": "0"} ) with freeze_time(self.now): From b3e2d0042d453b10214bbc30c6b1e7d4ff08b313 Mon Sep 17 00:00:00 2001 From: Denis Roussel Date: Sat, 22 Apr 2023 10:11:20 +0200 Subject: [PATCH 10/22] [IMP] mail_activity_reminder: Group sendings per user and activity type --- mail_activity_reminder/README.rst | 6 --- mail_activity_reminder/__manifest__.py | 6 ++- .../data/mail_activity_template.xml | 43 +++++++++++++++++++ .../models/mail_activity.py | 31 ++++++------- mail_activity_reminder/readme/ROADMAP.rst | 2 - .../static/description/index.html | 30 +++++-------- 6 files changed, 74 insertions(+), 44 deletions(-) create mode 100644 mail_activity_reminder/data/mail_activity_template.xml delete mode 100644 mail_activity_reminder/readme/ROADMAP.rst diff --git a/mail_activity_reminder/README.rst b/mail_activity_reminder/README.rst index abddfcd268..21dde1cc16 100644 --- a/mail_activity_reminder/README.rst +++ b/mail_activity_reminder/README.rst @@ -43,12 +43,6 @@ To configure reminders for specific Activity Type: when reminders should be fired: e.g. 0 means "on the deadline day" while 5 means "5 calendar days before the deadline". -Known issues / Roadmap -====================== - - * Maybe, group reminders by receiver and send multiple scheduled remiders - in one message. - Bug Tracker =========== diff --git a/mail_activity_reminder/__manifest__.py b/mail_activity_reminder/__manifest__.py index 882ef3f07c..f686193b3e 100644 --- a/mail_activity_reminder/__manifest__.py +++ b/mail_activity_reminder/__manifest__.py @@ -11,5 +11,9 @@ "license": "AGPL-3", "summary": "Reminder notifications about planned activities", "depends": ["mail"], - "data": ["data/mail_activity_reminder_cron.xml", "views/mail_activity_type.xml"], + "data": [ + "data/mail_activity_reminder_cron.xml", + "views/mail_activity_type.xml", + "data/mail_activity_template.xml", + ], } diff --git a/mail_activity_reminder/data/mail_activity_template.xml b/mail_activity_reminder/data/mail_activity_template.xml new file mode 100644 index 0000000000..21e3c6ac2b --- /dev/null +++ b/mail_activity_reminder/data/mail_activity_template.xml @@ -0,0 +1,43 @@ + + + + + + + diff --git a/mail_activity_reminder/models/mail_activity.py b/mail_activity_reminder/models/mail_activity.py index e1898ef8fe..6d58256128 100644 --- a/mail_activity_reminder/models/mail_activity.py +++ b/mail_activity_reminder/models/mail_activity.py @@ -98,30 +98,31 @@ def action_notify(self): activity.last_reminder_local = utc_now.astimezone(tz).replace(tzinfo=None) def action_remind(self): - IrModel = self.env["ir.model"] + """ + Group reminders by user and type and send them together + """ MailThread = self.env["mail.thread"] - message_activity_assigned = self.env.ref("mail.message_activity_assigned") + message_activity_assigned = self.env.ref( + "mail_activity_reminder.message_activity_assigned" + ) utc_now = fields.Datetime.now().replace(tzinfo=UTC) - for activity in self: - tz = timezone(activity.user_id.sudo().tz or "UTC") + for user in self.mapped("user_id"): + activities = self.filtered(lambda activity: activity.user_id == user) + tz = timezone(user.sudo().tz or "UTC") local_now = utc_now.astimezone(tz) - model_description = IrModel._get(activity.res_model).display_name - subject = _("%s: %s assigned to you, %d day(s) remaining") % ( - activity.res_name, - activity.summary or activity.activity_type_id.name, - (activity.date_deadline - local_now.date()).days, - ) + + subject = _("Some activities you are assigned too expire soon.") + body = message_activity_assigned.render( - dict(activity=activity, model_description=model_description), + dict(activities=activities, model_description="Activities"), engine="ir.qweb", minimal_qcontext=True, ) MailThread.message_notify( - partner_ids=activity.user_id.partner_id.ids, + partner_ids=user.partner_id.ids, body=body, subject=subject, - record_name=activity.res_name, - model_description=model_description, + model_description="Activity", notif_layout="mail.mail_notification_light", ) - activity.last_reminder_local = local_now.replace(tzinfo=None) + activities.update({"last_reminder_local": local_now.replace(tzinfo=None)}) diff --git a/mail_activity_reminder/readme/ROADMAP.rst b/mail_activity_reminder/readme/ROADMAP.rst deleted file mode 100644 index adc78bcf48..0000000000 --- a/mail_activity_reminder/readme/ROADMAP.rst +++ /dev/null @@ -1,2 +0,0 @@ - * Maybe, group reminders by receiver and send multiple scheduled remiders - in one message. diff --git a/mail_activity_reminder/static/description/index.html b/mail_activity_reminder/static/description/index.html index 1d9d9ccf95..23102a8ed8 100644 --- a/mail_activity_reminder/static/description/index.html +++ b/mail_activity_reminder/static/description/index.html @@ -373,12 +373,11 @@

    Mail Activity Reminder

    -
    -

    Known issues / Roadmap

    -
    -
      -
    • Maybe, group reminders by receiver and send multiple scheduled remiders -in one message.
    • -
    -
    -
    -

    Bug Tracker

    +

    Bug Tracker

    Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed @@ -412,15 +402,15 @@

    Bug Tracker

    Do not contact contributors directly about support or help with technical issues.

    -

    Credits

    +

    Credits

    -

    Authors

    +

    Authors

    • CorporateHub
    -

    Maintainers

    +

    Maintainers

    This module is maintained by the OCA.

    Odoo Community Association

    OCA, or the Odoo Community Association, is a nonprofit organization whose From 1a3cab4da37cb0033d9d7822407bfb419816ba4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Alix?= Date: Mon, 9 Oct 2023 17:50:01 +0200 Subject: [PATCH 11/22] [IMP] mail_activity_reminder: pre-commit stuff --- .../models/mail_activity.py | 20 ++++++++++++++----- .../tests/test_mail_activity_reminder.py | 4 +++- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/mail_activity_reminder/models/mail_activity.py b/mail_activity_reminder/models/mail_activity.py index 6d58256128..329b46e5b7 100644 --- a/mail_activity_reminder/models/mail_activity.py +++ b/mail_activity_reminder/models/mail_activity.py @@ -18,9 +18,14 @@ class MailActivity(models.Model): compute_sudo=True, store=True, ) - last_reminder_local = fields.Datetime(string="Last reminder (local)",) + last_reminder_local = fields.Datetime( + string="Last reminder (local)", + ) deadline = fields.Datetime( - string="Deadline", compute="_compute_deadline", compute_sudo=True, store=True, + string="Deadline", + compute="_compute_deadline", + compute_sudo=True, + store=True, ) @api.model @@ -42,7 +47,10 @@ def _process_reminders(self): return activities @api.depends( - "user_id.tz", "activity_type_id.reminders", "deadline", "last_reminder_local", + "user_id.tz", + "activity_type_id.reminders", + "deadline", + "last_reminder_local", ) def _compute_next_reminder(self): now = fields.Datetime.now() @@ -68,7 +76,9 @@ def _compute_next_reminder(self): ) ) for reminder in reminders: - next_reminder_local = local_deadline - relativedelta(days=reminder,) + next_reminder_local = local_deadline - relativedelta( + days=reminder, + ) if not last_reminder_local or next_reminder_local > last_reminder_local: break if last_reminder_local and next_reminder_local <= last_reminder_local: @@ -99,7 +109,7 @@ def action_notify(self): def action_remind(self): """ - Group reminders by user and type and send them together + Group reminders by user and type and send them together """ MailThread = self.env["mail.thread"] message_activity_assigned = self.env.ref( diff --git a/mail_activity_reminder/tests/test_mail_activity_reminder.py b/mail_activity_reminder/tests/test_mail_activity_reminder.py index 7d3ebf2638..3c2235afd9 100644 --- a/mail_activity_reminder/tests/test_mail_activity_reminder.py +++ b/mail_activity_reminder/tests/test_mail_activity_reminder.py @@ -16,7 +16,9 @@ def setUpClass(cls): cls.env = cls.env( context=dict( - cls.env.context, tracking_disable=True, no_reset_password=True, + cls.env.context, + tracking_disable=True, + no_reset_password=True, ) ) cls.ResUsers = cls.env["res.users"] From 6963d8920a95daa0707d806296e193ca60713d9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Alix?= Date: Mon, 9 Oct 2023 17:52:50 +0200 Subject: [PATCH 12/22] [MIG] mail_activity_reminder: Migration to 16.0 --- mail_activity_reminder/README.rst | 23 +++++---- mail_activity_reminder/__manifest__.py | 2 +- mail_activity_reminder/i18n/fr.po | 51 ++++++++++++++++--- .../i18n/mail_activity_reminder.pot | 48 ++++++++++++++--- mail_activity_reminder/i18n/pt.po | 51 ++++++++++++++++--- .../models/mail_activity.py | 11 ++-- .../models/mail_activity_type.py | 1 - .../static/description/index.html | 42 +++++++-------- .../tests/test_mail_activity_reminder.py | 4 +- 9 files changed, 170 insertions(+), 63 deletions(-) diff --git a/mail_activity_reminder/README.rst b/mail_activity_reminder/README.rst index 21dde1cc16..312c9dea57 100644 --- a/mail_activity_reminder/README.rst +++ b/mail_activity_reminder/README.rst @@ -2,10 +2,13 @@ Mail Activity Reminder ====================== -.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:d6d84b98e72a7142b96255d66b7ace192dfa9c32b5c0857fd5817361358860bc + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status @@ -14,16 +17,16 @@ Mail Activity Reminder :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fsocial-lightgray.png?logo=github - :target: https://github.com/OCA/social/tree/13.0/mail_activity_reminder + :target: https://github.com/OCA/social/tree/16.0/mail_activity_reminder :alt: OCA/social .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/social-13-0/social-13-0-mail_activity_reminder + :target: https://translation.odoo-community.org/projects/social-16-0/social-16-0-mail_activity_reminder :alt: Translate me on Weblate -.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/205/13.0 - :alt: Try me on Runbot +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/social&target_branch=16.0 + :alt: Try me on Runboat -|badge1| |badge2| |badge3| |badge4| |badge5| +|badge1| |badge2| |badge3| |badge4| |badge5| This module allows setting reminders for various Activity Types. @@ -48,8 +51,8 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. -If you spotted it first, help us smashing it by providing a detailed and welcomed -`feedback `_. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -83,6 +86,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -This module is part of the `OCA/social `_ project on GitHub. +This module is part of the `OCA/social `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/mail_activity_reminder/__manifest__.py b/mail_activity_reminder/__manifest__.py index f686193b3e..486db99084 100644 --- a/mail_activity_reminder/__manifest__.py +++ b/mail_activity_reminder/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Mail Activity Reminder", - "version": "13.0.1.0.0", + "version": "16.0.1.0.0", "category": "Discuss", "website": "https://github.com/OCA/social", "author": "CorporateHub, Odoo Community Association (OCA)", diff --git a/mail_activity_reminder/i18n/fr.po b/mail_activity_reminder/i18n/fr.po index cfa2b6be49..e46dbc6bf3 100644 --- a/mail_activity_reminder/i18n/fr.po +++ b/mail_activity_reminder/i18n/fr.po @@ -1,6 +1,6 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * mail_activity_reminder +# * mail_activity_reminder # msgid "" msgstr "" @@ -17,14 +17,21 @@ msgstr "" "X-Generator: Weblate 4.14.1\n" #. module: mail_activity_reminder -#: code:addons/mail_activity_reminder/models/mail_activity.py:123 -#, python-format -msgid "%s: %s assigned to you, %d day(s) remaining" -msgstr "%s : %s assigné à vous, %d jour(s) restant(s)" +#: model_terms:ir.ui.view,arch_db:mail_activity_reminder.message_activity_assigned +msgid ".
    " +msgstr "" + +#. module: mail_activity_reminder +#: model_terms:ir.ui.view,arch_db:mail_activity_reminder.message_activity_assigned +msgid "You have some activities assigned that expire soon:" +msgstr "" #. module: mail_activity_reminder #: model:ir.model.fields,help:mail_activity_reminder.field_mail_activity_type__reminders -msgid "A non-digit-separated list of offsets (in days) when reminders should be fired: e.g. 0 means \"on the deadline day\" while 5 means \"5 calendar days before the deadline\"." +msgid "" +"A non-digit-separated list of offsets (in days) when reminders should be " +"fired: e.g. 0 means \"on the deadline day\" while 5 means \"5 calendar days " +"before the deadline\"." msgstr "" "Une liste de nombres de jours (séparés par tout caractère autre que des " "chiffres) qui indique quand les rappels doivent être déclenchés : par ex. 0 " @@ -54,7 +61,6 @@ msgstr "Dernier rappel (local)" #. module: mail_activity_reminder #: model:ir.actions.server,name:mail_activity_reminder.mail_activity_reminder_ir_actions_server #: model:ir.cron,cron_name:mail_activity_reminder.mail_activity_reminder -#: model:ir.cron,name:mail_activity_reminder.mail_activity_reminder msgid "Mail Activity: Reminders" msgstr "Activité : Rappels" @@ -67,3 +73,34 @@ msgstr "Rappel suivant" #: model:ir.model.fields,field_description:mail_activity_reminder.field_mail_activity_type__reminders msgid "Reminders" msgstr "Rappels" + +#. module: mail_activity_reminder +#. odoo-python +#: code:addons/mail_activity_reminder/models/mail_activity.py:0 +#, python-format +msgid "Some activities you are assigned too expire soon." +msgstr "" + +#. module: mail_activity_reminder +#: model_terms:ir.ui.view,arch_db:mail_activity_reminder.message_activity_assigned +msgid "View" +msgstr "" + +#. module: mail_activity_reminder +#: model_terms:ir.ui.view,arch_db:mail_activity_reminder.message_activity_assigned +msgid "assigned you an activity" +msgstr "" + +#. module: mail_activity_reminder +#: model_terms:ir.ui.view,arch_db:mail_activity_reminder.message_activity_assigned +msgid "on" +msgstr "" + +#. module: mail_activity_reminder +#: model_terms:ir.ui.view,arch_db:mail_activity_reminder.message_activity_assigned +msgid "to close for" +msgstr "" + +#, python-format +#~ msgid "%s: %s assigned to you, %d day(s) remaining" +#~ msgstr "%s : %s assigné à vous, %d jour(s) restant(s)" diff --git a/mail_activity_reminder/i18n/mail_activity_reminder.pot b/mail_activity_reminder/i18n/mail_activity_reminder.pot index 004806cb2c..cee8f294b6 100644 --- a/mail_activity_reminder/i18n/mail_activity_reminder.pot +++ b/mail_activity_reminder/i18n/mail_activity_reminder.pot @@ -1,12 +1,12 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * mail_activity_reminder +# * mail_activity_reminder # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 12.0\n" +"Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: <>\n" +"Last-Translator: \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -14,14 +14,21 @@ msgstr "" "Plural-Forms: \n" #. module: mail_activity_reminder -#: code:addons/mail_activity_reminder/models/mail_activity.py:123 -#, python-format -msgid "%s: %s assigned to you, %d day(s) remaining" +#: model_terms:ir.ui.view,arch_db:mail_activity_reminder.message_activity_assigned +msgid ".
    " +msgstr "" + +#. module: mail_activity_reminder +#: model_terms:ir.ui.view,arch_db:mail_activity_reminder.message_activity_assigned +msgid "You have some activities assigned that expire soon:" msgstr "" #. module: mail_activity_reminder #: model:ir.model.fields,help:mail_activity_reminder.field_mail_activity_type__reminders -msgid "A non-digit-separated list of offsets (in days) when reminders should be fired: e.g. 0 means \"on the deadline day\" while 5 means \"5 calendar days before the deadline\"." +msgid "" +"A non-digit-separated list of offsets (in days) when reminders should be " +"fired: e.g. 0 means \"on the deadline day\" while 5 means \"5 calendar days " +"before the deadline\"." msgstr "" #. module: mail_activity_reminder @@ -47,7 +54,6 @@ msgstr "" #. module: mail_activity_reminder #: model:ir.actions.server,name:mail_activity_reminder.mail_activity_reminder_ir_actions_server #: model:ir.cron,cron_name:mail_activity_reminder.mail_activity_reminder -#: model:ir.cron,name:mail_activity_reminder.mail_activity_reminder msgid "Mail Activity: Reminders" msgstr "" @@ -61,3 +67,29 @@ msgstr "" msgid "Reminders" msgstr "" +#. module: mail_activity_reminder +#. odoo-python +#: code:addons/mail_activity_reminder/models/mail_activity.py:0 +#, python-format +msgid "Some activities you are assigned too expire soon." +msgstr "" + +#. module: mail_activity_reminder +#: model_terms:ir.ui.view,arch_db:mail_activity_reminder.message_activity_assigned +msgid "View" +msgstr "" + +#. module: mail_activity_reminder +#: model_terms:ir.ui.view,arch_db:mail_activity_reminder.message_activity_assigned +msgid "assigned you an activity" +msgstr "" + +#. module: mail_activity_reminder +#: model_terms:ir.ui.view,arch_db:mail_activity_reminder.message_activity_assigned +msgid "on" +msgstr "" + +#. module: mail_activity_reminder +#: model_terms:ir.ui.view,arch_db:mail_activity_reminder.message_activity_assigned +msgid "to close for" +msgstr "" diff --git a/mail_activity_reminder/i18n/pt.po b/mail_activity_reminder/i18n/pt.po index 1506563def..4d64a8454f 100644 --- a/mail_activity_reminder/i18n/pt.po +++ b/mail_activity_reminder/i18n/pt.po @@ -1,6 +1,6 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * mail_activity_reminder +# * mail_activity_reminder # msgid "" msgstr "" @@ -17,14 +17,21 @@ msgstr "" "X-Generator: Weblate 4.3.2\n" #. module: mail_activity_reminder -#: code:addons/mail_activity_reminder/models/mail_activity.py:123 -#, python-format -msgid "%s: %s assigned to you, %d day(s) remaining" -msgstr "%s: %s atribuído a você, %d dia(s) restante(s)" +#: model_terms:ir.ui.view,arch_db:mail_activity_reminder.message_activity_assigned +msgid ".
    " +msgstr "" + +#. module: mail_activity_reminder +#: model_terms:ir.ui.view,arch_db:mail_activity_reminder.message_activity_assigned +msgid "You have some activities assigned that expire soon:" +msgstr "" #. module: mail_activity_reminder #: model:ir.model.fields,help:mail_activity_reminder.field_mail_activity_type__reminders -msgid "A non-digit-separated list of offsets (in days) when reminders should be fired: e.g. 0 means \"on the deadline day\" while 5 means \"5 calendar days before the deadline\"." +msgid "" +"A non-digit-separated list of offsets (in days) when reminders should be " +"fired: e.g. 0 means \"on the deadline day\" while 5 means \"5 calendar days " +"before the deadline\"." msgstr "" "Uma lista não separada por dígitos de offsets (em dias) para quando os " "lembretes devem ser disparados: por exemplo, 0 significa \"no dia do prazo\" " @@ -53,7 +60,6 @@ msgstr "Último lembrete (local)" #. module: mail_activity_reminder #: model:ir.actions.server,name:mail_activity_reminder.mail_activity_reminder_ir_actions_server #: model:ir.cron,cron_name:mail_activity_reminder.mail_activity_reminder -#: model:ir.cron,name:mail_activity_reminder.mail_activity_reminder msgid "Mail Activity: Reminders" msgstr "Atividade de Correio: Lembretes" @@ -66,3 +72,34 @@ msgstr "Próximo lembrete" #: model:ir.model.fields,field_description:mail_activity_reminder.field_mail_activity_type__reminders msgid "Reminders" msgstr "Lembretes" + +#. module: mail_activity_reminder +#. odoo-python +#: code:addons/mail_activity_reminder/models/mail_activity.py:0 +#, python-format +msgid "Some activities you are assigned too expire soon." +msgstr "" + +#. module: mail_activity_reminder +#: model_terms:ir.ui.view,arch_db:mail_activity_reminder.message_activity_assigned +msgid "View" +msgstr "" + +#. module: mail_activity_reminder +#: model_terms:ir.ui.view,arch_db:mail_activity_reminder.message_activity_assigned +msgid "assigned you an activity" +msgstr "" + +#. module: mail_activity_reminder +#: model_terms:ir.ui.view,arch_db:mail_activity_reminder.message_activity_assigned +msgid "on" +msgstr "" + +#. module: mail_activity_reminder +#: model_terms:ir.ui.view,arch_db:mail_activity_reminder.message_activity_assigned +msgid "to close for" +msgstr "" + +#, python-format +#~ msgid "%s: %s assigned to you, %d day(s) remaining" +#~ msgstr "%s: %s atribuído a você, %d dia(s) restante(s)" diff --git a/mail_activity_reminder/models/mail_activity.py b/mail_activity_reminder/models/mail_activity.py index 329b46e5b7..243f91b0fe 100644 --- a/mail_activity_reminder/models/mail_activity.py +++ b/mail_activity_reminder/models/mail_activity.py @@ -22,7 +22,6 @@ class MailActivity(models.Model): string="Last reminder (local)", ) deadline = fields.Datetime( - string="Deadline", compute="_compute_deadline", compute_sudo=True, store=True, @@ -99,22 +98,20 @@ def _compute_deadline(self): ) def action_notify(self): - super().action_notify() + res = super().action_notify() utc_now = fields.Datetime.now().replace(tzinfo=UTC) for activity in self: if activity.last_reminder_local: continue tz = timezone(activity.user_id.sudo().tz or "UTC") activity.last_reminder_local = utc_now.astimezone(tz).replace(tzinfo=None) + return res def action_remind(self): """ Group reminders by user and type and send them together """ MailThread = self.env["mail.thread"] - message_activity_assigned = self.env.ref( - "mail_activity_reminder.message_activity_assigned" - ) utc_now = fields.Datetime.now().replace(tzinfo=UTC) for user in self.mapped("user_id"): activities = self.filtered(lambda activity: activity.user_id == user) @@ -123,9 +120,9 @@ def action_remind(self): subject = _("Some activities you are assigned too expire soon.") - body = message_activity_assigned.render( + body = self.env["ir.qweb"]._render( + "mail_activity_reminder.message_activity_assigned", dict(activities=activities, model_description="Activities"), - engine="ir.qweb", minimal_qcontext=True, ) MailThread.message_notify( diff --git a/mail_activity_reminder/models/mail_activity_type.py b/mail_activity_reminder/models/mail_activity_type.py index 2199351b2d..e9e806d98d 100644 --- a/mail_activity_reminder/models/mail_activity_type.py +++ b/mail_activity_reminder/models/mail_activity_type.py @@ -10,7 +10,6 @@ class MailActivityType(models.Model): _inherit = "mail.activity.type" reminders = fields.Char( - string="Reminders", help=( "A non-digit-separated list of offsets (in days) when reminders" ' should be fired: e.g. 0 means "on the deadline day" while' diff --git a/mail_activity_reminder/static/description/index.html b/mail_activity_reminder/static/description/index.html index 23102a8ed8..a048486893 100644 --- a/mail_activity_reminder/static/description/index.html +++ b/mail_activity_reminder/static/description/index.html @@ -1,20 +1,20 @@ - + - + Mail Activity Reminder