From 9ff23308a5fc790e1c1f77c898482f7889331cef Mon Sep 17 00:00:00 2001 From: Alexey Pelykh Date: Wed, 12 Feb 2020 19:12:22 -0700 Subject: [PATCH 01/31] [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 00000000..e3346cff --- /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 00000000..4b76c7b2 --- /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 00000000..68f7097b --- /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 00000000..bcdddc60 --- /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 00000000..965eb883 --- /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 00000000..ee53e8b2 --- /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 00000000..9feb4c1d --- /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 00000000..d8e331c6 --- /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 00000000..1c6a35a1 --- /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 00000000..7800db6f --- /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 00000000..adc78bcf --- /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 00000000..e3b7b46f --- /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 00000000..8f1a3365 --- /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 00000000..7dc17960 --- /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 00000000..c83f347d --- /dev/null +++ b/mail_activity_reminder/views/mail_activity_type.xml @@ -0,0 +1,19 @@ + + + + + + mail.activity.type.view.form + mail.activity.type + + + + + + + + + From 6685d31a7bbf8dc44b4d9eff46194159a07d8832 Mon Sep 17 00:00:00 2001 From: oca-travis Date: Thu, 7 May 2020 17:58:38 +0000 Subject: [PATCH 02/31] [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 00000000..004806cb --- /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 6f403c961b6d6518623db6be80b2a0c175e8c00f Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Thu, 7 May 2020 18:11:15 +0000 Subject: [PATCH 03/31] [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 e3346cff..f53f5bc5 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 e3b7b46f..d818c7b2 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 0c130f0be04014e956d532d6a5973922fe455111 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Thu, 7 May 2020 18:11:15 +0000 Subject: [PATCH 04/31] [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 2f30b6e9c0e30b9faa32d0202b7dcf8273aa4798 Mon Sep 17 00:00:00 2001 From: Alexey Pelykh Date: Wed, 4 Nov 2020 12:49:33 +0200 Subject: [PATCH 05/31] [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 68f7097b..ba05dff0 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 1c6a35a1..724bc1d0 100644 --- a/mail_activity_reminder/readme/CONTRIBUTORS.rst +++ b/mail_activity_reminder/readme/CONTRIBUTORS.rst @@ -1 +1,3 @@ -* Alexey Pelykh +* `CorporateHub `__ + + * Alexey Pelykh From e55efb020aef504d694a5e44255adf56359664c0 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Tue, 10 Nov 2020 08:35:28 +0000 Subject: [PATCH 06/31] [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 f53f5bc5..d914e1fa 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 d818c7b2..df9167b2 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 55d982a4b9d1c5b103d3ef6073f4275c53273a91 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Tue, 10 Nov 2020 08:35:28 +0000 Subject: [PATCH 07/31] 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 ba05dff0..0f542e0b 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 7b6360d0ebde82bff33bfb0411ea88fa3e87584e Mon Sep 17 00:00:00 2001 From: Pedro Castro Silva Date: Tue, 11 May 2021 13:43:00 +0000 Subject: [PATCH 08/31] 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 00000000..0ca2f582 --- /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 096cfd2f8de6c769f8d7fe2fbbc369fab472e983 Mon Sep 17 00:00:00 2001 From: Pedro Castro Silva Date: Tue, 11 May 2021 13:45:15 +0000 Subject: [PATCH 09/31] 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 0ca2f582..1506563d 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 41ef36d725901ee30b1d1a6fdb77e5918cc3f889 Mon Sep 17 00:00:00 2001 From: Yann Papouin Date: Thu, 20 Oct 2022 07:04:10 +0000 Subject: [PATCH 10/31] 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 00000000..7204090c --- /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 fa4faff466f3d034e16fa56ef3382ba7f3f4e67f Mon Sep 17 00:00:00 2001 From: Yann Papouin Date: Thu, 20 Oct 2022 07:15:01 +0000 Subject: [PATCH 11/31] 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 7204090c..cfa2b6be 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 de72a6919d7f6a9d195cd5610213c3b96e3d37a8 Mon Sep 17 00:00:00 2001 From: Denis Roussel Date: Fri, 21 Apr 2023 18:23:02 +0200 Subject: [PATCH 12/31] [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 0f542e0b..ae72e91e 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 bcdddc60..e4b9f5ce 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 ef5724ca..7d3ebf26 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 930a16a0fdb1260be1425fd896fa77028db70ac7 Mon Sep 17 00:00:00 2001 From: Denis Roussel Date: Sat, 22 Apr 2023 10:11:20 +0200 Subject: [PATCH 14/31] [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 abddfcd2..21dde1cc 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 882ef3f0..f686193b 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 00000000..21e3c6ac --- /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 e1898ef8..6d582561 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 adc78bcf..00000000 --- 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 1d9d9ccf..23102a8e 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 75cb24736c5c972a0f266a4c130f49db7ee1c648 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/31] [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 6d582561..329b46e5 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 7d3ebf26..3c2235af 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 dc12becf16fb8ee0358c1d4c2ece4772823695d3 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/31] [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 f686193b..486db990 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 329b46e5..243f91b0 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 2199351b..e9e806d9 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 3c2235af..2954de18 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 odoo.tests import common -class TestMailActivityReminder(common.SavepointCase): +class TestMailActivityReminder(common.TransactionCase): @classmethod def setUpClass(cls): super().setUpClass() @@ -114,7 +114,7 @@ def test_reminder_behaviour(self): 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 dd54c16f79f396d8bd483fd0abf7b7133ed60e28 Mon Sep 17 00:00:00 2001 From: oca-ci Date: Fri, 13 Oct 2023 08:13:03 +0000 Subject: [PATCH 17/31] [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 004806cb..cee8f294 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 b08cc56fdb489d09861f09017b3a821e3cfaf660 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Fri, 13 Oct 2023 08:16:14 +0000 Subject: [PATCH 18/31] [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 21dde1cc..312c9dea 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 23102a8e..a0484868 100644 --- a/mail_activity_reminder/static/description/index.html +++ b/mail_activity_reminder/static/description/index.html @@ -1,20 +1,20 @@ - + - + Mail Activity Reminder