From 702c0ea60d2081d1a2f77559e02be819b8bac757 Mon Sep 17 00:00:00 2001 From: Alexey Pelykh Date: Wed, 12 Feb 2020 19:12:22 -0700 Subject: [PATCH 01/25] [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 000000000..e3346cffe --- /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 000000000..4b76c7b2d --- /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 000000000..68f7097b7 --- /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 000000000..bcdddc602 --- /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 000000000..965eb883c --- /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 000000000..ee53e8b24 --- /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 000000000..9feb4c1d2 --- /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 000000000..d8e331c64 --- /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 000000000..1c6a35a1e --- /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 000000000..7800db6f8 --- /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 000000000..adc78bcf4 --- /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 000000000..e3b7b46f2 --- /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 000000000..8f1a33650 --- /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 000000000..7dc179601 --- /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 000000000..c83f347da --- /dev/null +++ b/mail_activity_reminder/views/mail_activity_type.xml @@ -0,0 +1,19 @@ + + + + + + mail.activity.type.view.form + mail.activity.type + + + + + + + + + From 7d47723e17261c1350be0de31f32c65336a06b7d Mon Sep 17 00:00:00 2001 From: oca-travis Date: Thu, 7 May 2020 17:58:38 +0000 Subject: [PATCH 02/25] [UPD] Update mail_activity_reminder.pot --- .../i18n/mail_activity_reminder.pot | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 mail_activity_reminder/i18n/mail_activity_reminder.pot 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 000000000..004806cb2 --- /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 "" + From d853a7eb5202f39b8e8b04725871f784c6b4110a Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Thu, 7 May 2020 18:11:15 +0000 Subject: [PATCH 03/25] [UPD] README.rst --- mail_activity_reminder/README.rst | 8 ++++- .../static/description/index.html | 30 ++++++++++++------- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/mail_activity_reminder/README.rst b/mail_activity_reminder/README.rst index e3346cffe..f53f5bc5e 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/static/description/index.html b/mail_activity_reminder/static/description/index.html index e3b7b46f2..d818c7b23 100644 --- a/mail_activity_reminder/static/description/index.html +++ b/mail_activity_reminder/static/description/index.html @@ -373,11 +373,12 @@ ul.auto-toc {
+
+

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 @@ If you spotted it first, help us smashing it by providing a detailed and welcome

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 f248d431e31737e340942500a84f3273f4accc59 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Thu, 7 May 2020 18:11:15 +0000 Subject: [PATCH 04/25] [ADD] icon.png --- .../static/description/icon.png | Bin 0 -> 9455 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 mail_activity_reminder/static/description/icon.png 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 From e19852dcee40bcf3c7f39331b2ff623a406a3772 Mon Sep 17 00:00:00 2001 From: Alexey Pelykh Date: Wed, 4 Nov 2020 12:49:33 +0200 Subject: [PATCH 05/25] [UPD] Brainbean Apps => CorporateHub --- mail_activity_reminder/__manifest__.py | 3 ++- mail_activity_reminder/readme/CONTRIBUTORS.rst | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/mail_activity_reminder/__manifest__.py b/mail_activity_reminder/__manifest__.py index 68f7097b7..ba05dff09 100644 --- a/mail_activity_reminder/__manifest__.py +++ b/mail_activity_reminder/__manifest__.py @@ -1,4 +1,5 @@ # 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). { @@ -7,7 +8,7 @@ '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 1c6a35a1e..724bc1d03 100644 --- a/mail_activity_reminder/readme/CONTRIBUTORS.rst +++ b/mail_activity_reminder/readme/CONTRIBUTORS.rst @@ -1 +1,3 @@ -* Alexey Pelykh +* `CorporateHub `__ + + * Alexey Pelykh From 9b5ad4d2ee97c1d4661cac1887389f859a42ada9 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Tue, 10 Nov 2020 08:35:28 +0000 Subject: [PATCH 06/25] [UPD] README.rst --- mail_activity_reminder/README.rst | 6 ++++-- mail_activity_reminder/static/description/index.html | 7 +++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/mail_activity_reminder/README.rst b/mail_activity_reminder/README.rst index f53f5bc5e..d914e1fa7 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/static/description/index.html b/mail_activity_reminder/static/description/index.html index d818c7b23..df9167b2e 100644 --- a/mail_activity_reminder/static/description/index.html +++ b/mail_activity_reminder/static/description/index.html @@ -416,13 +416,16 @@ If you spotted it first, help us smashing it by providing a detailed and welcome

Authors

    -
  • Brainbean Apps
  • +
  • CorporateHub
From d22858a4930b8a7786a2c6ec5b09bed6bdef48b9 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Tue, 10 Nov 2020 08:35:28 +0000 Subject: [PATCH 07/25] mail_activity_reminder 12.0.1.0.1 --- mail_activity_reminder/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mail_activity_reminder/__manifest__.py b/mail_activity_reminder/__manifest__.py index ba05dff09..0f542e0b2 100644 --- a/mail_activity_reminder/__manifest__.py +++ b/mail_activity_reminder/__manifest__.py @@ -4,7 +4,7 @@ { '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': From f6a58cadd057ea432c29874396ec003892b03be7 Mon Sep 17 00:00:00 2001 From: Pedro Castro Silva Date: Tue, 11 May 2021 13:43:00 +0000 Subject: [PATCH 08/25] 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 000000000..0ca2f582e --- /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 9a4a568f1e7ebdec0675c2825194abe25292be77 Mon Sep 17 00:00:00 2001 From: Pedro Castro Silva Date: Tue, 11 May 2021 13:45:15 +0000 Subject: [PATCH 09/25] 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 0ca2f582e..1506563de 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 f320be071472dbc78dbb6225f04842face98790c Mon Sep 17 00:00:00 2001 From: Yann Papouin Date: Thu, 20 Oct 2022 07:04:10 +0000 Subject: [PATCH 10/25] 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 000000000..7204090cb --- /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 651f1fc36a66eca96ece17cc03956353e222c0da Mon Sep 17 00:00:00 2001 From: Yann Papouin Date: Thu, 20 Oct 2022 07:15:01 +0000 Subject: [PATCH 11/25] 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 7204090cb..cfa2b6be4 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 f2284c8b011e64ef8b3d45fad29638f35738f360 Mon Sep 17 00:00:00 2001 From: Denis Roussel Date: Fri, 21 Apr 2023 18:23:02 +0200 Subject: [PATCH 12/25] [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 0f542e0b2..ae72e91eb 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 bcdddc602..e4b9f5ce9 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 @@ in one message.

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 @@ If you spotted it first, help us smashing it by providing a detailed and welcome
  • Alexey Pelykh <alexey.pelykh@corphub.eu>
  • +
  • Denis Roussel <denis.roussel@acsone.eu>
  • @@ -435,7 +436,7 @@ If you spotted it first, help us smashing it by providing a detailed and welcome

    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 ef5724ca1..7d3ebf263 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 @@ class TestMailActivityReminder(common.SavepointCase): ) 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 @@ class TestMailActivityReminder(common.SavepointCase): 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 @@ class TestMailActivityReminder(common.SavepointCase): 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 @@ class TestMailActivityReminder(common.SavepointCase): 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 @@ class TestMailActivityReminder(common.SavepointCase): 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 60f170a168a1b820f50d245f4cabcfab0b36a2b2 Mon Sep 17 00:00:00 2001 From: Denis Roussel Date: Sat, 22 Apr 2023 10:11:20 +0200 Subject: [PATCH 14/25] [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 abddfcd26..21dde1cc1 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 882ef3f07..f686193b3 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 000000000..21e3c6ac2 --- /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 e1898ef8f..6d5825612 100644 --- a/mail_activity_reminder/models/mail_activity.py +++ b/mail_activity_reminder/models/mail_activity.py @@ -98,30 +98,31 @@ class MailActivity(models.Model): 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 adc78bcf4..000000000 --- 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 1d9d9ccf9..23102a8ed 100644 --- a/mail_activity_reminder/static/description/index.html +++ b/mail_activity_reminder/static/description/index.html @@ -373,12 +373,11 @@ ul.auto-toc {
    -
    -

    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 @@ If you spotted it first, help us smashing it by providing a detailed and welcome

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

    -

    Credits

    +

    Credits

    -

    Authors

    +

    Authors

    • CorporateHub
    -

    Contributors

    +

    Contributors

    -

    Maintainers

    +

    Maintainers

    This module is maintained by the OCA.

    Odoo Community Association

    OCA, or the Odoo Community Association, is a nonprofit organization whose From 0f29b9ab320e4d0cf4c8ab3cb54321236a0a8ec4 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 15/25] [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 6d5825612..329b46e5b 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 @@ class MailActivity(models.Model): 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 @@ class MailActivity(models.Model): ) ) 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 @@ class MailActivity(models.Model): 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 7d3ebf263..3c2235afd 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 @@ class TestMailActivityReminder(common.SavepointCase): 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 66577ad16b75b5e41a93b5b251d6adfdfad6ff8c 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 16/25] [MIG] mail_activity_reminder: Migration to 16.0 --- mail_activity_reminder/__manifest__.py | 2 +- mail_activity_reminder/models/mail_activity.py | 11 ++++------- mail_activity_reminder/models/mail_activity_type.py | 1 - .../tests/test_mail_activity_reminder.py | 4 ++-- 4 files changed, 7 insertions(+), 11 deletions(-) diff --git a/mail_activity_reminder/__manifest__.py b/mail_activity_reminder/__manifest__.py index f686193b3..486db9908 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/models/mail_activity.py b/mail_activity_reminder/models/mail_activity.py index 329b46e5b..243f91b0f 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 @@ class MailActivity(models.Model): ) 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 @@ class MailActivity(models.Model): 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 2199351b2..e9e806d98 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/tests/test_mail_activity_reminder.py b/mail_activity_reminder/tests/test_mail_activity_reminder.py index 3c2235afd..2954de185 100644 --- a/mail_activity_reminder/tests/test_mail_activity_reminder.py +++ b/mail_activity_reminder/tests/test_mail_activity_reminder.py @@ -9,7 +9,7 @@ from freezegun import freeze_time from odoo.tests import common -class TestMailActivityReminder(common.SavepointCase): +class TestMailActivityReminder(common.TransactionCase): @classmethod def setUpClass(cls): super().setUpClass() @@ -114,7 +114,7 @@ class TestMailActivityReminder(common.SavepointCase): self.assertEqual(activities, activity) activities.action_remind() - activity.active = False + activity.unlink() with freeze_time(self.now + relativedelta(days=5)): activities = self.MailActivity._get_activities_to_remind() self.assertFalse(activities) From 72abc33ce1b5bc8bb25eb6e2b15ca19b7c26559f Mon Sep 17 00:00:00 2001 From: oca-ci Date: Fri, 13 Oct 2023 08:13:03 +0000 Subject: [PATCH 17/25] [UPD] Update mail_activity_reminder.pot --- .../i18n/mail_activity_reminder.pot | 48 +++++++++++++++---- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/mail_activity_reminder/i18n/mail_activity_reminder.pot b/mail_activity_reminder/i18n/mail_activity_reminder.pot index 004806cb2..cee8f294b 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 "" From 18d426c4a141c05950e0da52226f213664737868 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Fri, 13 Oct 2023 08:16:14 +0000 Subject: [PATCH 18/25] [BOT] post-merge updates --- mail_activity_reminder/README.rst | 23 +++++----- .../static/description/index.html | 42 ++++++++++--------- 2 files changed, 35 insertions(+), 30 deletions(-) diff --git a/mail_activity_reminder/README.rst b/mail_activity_reminder/README.rst index 21dde1cc1..312c9dea5 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/static/description/index.html b/mail_activity_reminder/static/description/index.html index 23102a8ed..a04848689 100644 --- a/mail_activity_reminder/static/description/index.html +++ b/mail_activity_reminder/static/description/index.html @@ -1,20 +1,20 @@ - + - + Mail Activity Reminder