From 3ee14756bda3dda7a5e71a4c959714485f93b18b Mon Sep 17 00:00:00 2001 From: Alexey Pelykh Date: Wed, 12 Feb 2020 19:12:22 -0700 Subject: [PATCH 01/23] [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 c4c1d3845fdbfae412733f0c12415d3fc487dfd5 Mon Sep 17 00:00:00 2001 From: oca-travis Date: Thu, 7 May 2020 17:58:38 +0000 Subject: [PATCH 02/23] [UPD] Update mail_activity_reminder.pot --- mail_activity_reminder/README.rst | 8 ++- .../i18n/mail_activity_reminder.pot | 63 ++++++++++++++++++ .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 30 ++++++--- 4 files changed, 90 insertions(+), 11 deletions(-) create mode 100644 mail_activity_reminder/i18n/mail_activity_reminder.pot create mode 100644 mail_activity_reminder/static/description/icon.png diff --git a/mail_activity_reminder/README.rst b/mail_activity_reminder/README.rst index 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/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 "" + diff --git a/mail_activity_reminder/static/description/icon.png b/mail_activity_reminder/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/mail_activity_reminder/static/description/index.html b/mail_activity_reminder/static/description/index.html index e3b7b46f2..d818c7b23 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 8e86071ce7a5530565430401fd6b301e9d17a043 Mon Sep 17 00:00:00 2001 From: Alexey Pelykh Date: Wed, 4 Nov 2020 12:49:33 +0200 Subject: [PATCH 03/23] [UPD] Brainbean Apps => CorporateHub --- mail_activity_reminder/README.rst | 6 ++++-- mail_activity_reminder/__manifest__.py | 5 +++-- mail_activity_reminder/readme/CONTRIBUTORS.rst | 4 +++- mail_activity_reminder/static/description/index.html | 7 +++++-- 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/mail_activity_reminder/README.rst b/mail_activity_reminder/README.rst index 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/__manifest__.py b/mail_activity_reminder/__manifest__.py index 68f7097b7..0f542e0b2 100644 --- a/mail_activity_reminder/__manifest__.py +++ b/mail_activity_reminder/__manifest__.py @@ -1,13 +1,14 @@ # Copyright 2020 Brainbean Apps (https://brainbeanapps.com) +# Copyright 2020 CorporateHub (https://corporatehub.eu) # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). { 'name': 'Mail Activity Reminder', - 'version': '12.0.1.0.0', + 'version': '12.0.1.0.1', 'category': 'Discuss', 'website': 'https://github.com/OCA/social', 'author': - 'Brainbean Apps, ' + 'CorporateHub, ' 'Odoo Community Association (OCA)', 'license': 'AGPL-3', 'installable': True, diff --git a/mail_activity_reminder/readme/CONTRIBUTORS.rst b/mail_activity_reminder/readme/CONTRIBUTORS.rst index 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 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 @@

Credits

Authors

    -
  • Brainbean Apps
  • +
  • CorporateHub
From e2479461244d8cf43e7f61eeed05ef1007df95ad Mon Sep 17 00:00:00 2001 From: Pedro Castro Silva Date: Tue, 11 May 2021 13:43:00 +0000 Subject: [PATCH 04/23] 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 195405b2c0105c76aca9760768e97da3c21edb9a Mon Sep 17 00:00:00 2001 From: Pedro Castro Silva Date: Tue, 11 May 2021 13:45:15 +0000 Subject: [PATCH 05/23] 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 7a1c263b72d56f196a9ff61550b22705793c1068 Mon Sep 17 00:00:00 2001 From: Yann Papouin Date: Thu, 20 Oct 2022 07:04:10 +0000 Subject: [PATCH 06/23] 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 dd3b643b678bc4e4b40914edeab6084fd276660a Mon Sep 17 00:00:00 2001 From: Yann Papouin Date: Thu, 20 Oct 2022 07:15:01 +0000 Subject: [PATCH 07/23] 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 cfe7da2bd55bb9bb031768453b89e6ed2f602d10 Mon Sep 17 00:00:00 2001 From: Denis Roussel Date: Fri, 21 Apr 2023 18:23:02 +0200 Subject: [PATCH 08/23] [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 @@

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 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 @@ 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 0096d343cf58cc5aab0a2c9cb27b39cfb354efeb Mon Sep 17 00:00:00 2001 From: Denis Roussel Date: Sat, 22 Apr 2023 10:11:20 +0200 Subject: [PATCH 10/23] [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 @@ 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 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 @@

    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 ebcf3c8610fa8cd29a2e3011153c666bb2a789f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Alix?= Date: Mon, 9 Oct 2023 17:50:01 +0200 Subject: [PATCH 11/23] [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 @@ 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 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 @@ 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 4c3c907717f349405a609fe612c0fd26280ac43b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Alix?= Date: Mon, 9 Oct 2023 17:52:50 +0200 Subject: [PATCH 12/23] [MIG] mail_activity_reminder: Migration to 16.0 --- mail_activity_reminder/README.rst | 23 +++++---- mail_activity_reminder/__manifest__.py | 2 +- mail_activity_reminder/i18n/fr.po | 51 ++++++++++++++++--- .../i18n/mail_activity_reminder.pot | 48 ++++++++++++++--- mail_activity_reminder/i18n/pt.po | 51 ++++++++++++++++--- .../models/mail_activity.py | 11 ++-- .../models/mail_activity_type.py | 1 - .../static/description/index.html | 42 +++++++-------- .../tests/test_mail_activity_reminder.py | 4 +- 9 files changed, 170 insertions(+), 63 deletions(-) diff --git a/mail_activity_reminder/README.rst b/mail_activity_reminder/README.rst index 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/__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/i18n/fr.po b/mail_activity_reminder/i18n/fr.po index cfa2b6be4..e46dbc6bf 100644 --- a/mail_activity_reminder/i18n/fr.po +++ b/mail_activity_reminder/i18n/fr.po @@ -1,6 +1,6 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * mail_activity_reminder +# * mail_activity_reminder # msgid "" msgstr "" @@ -17,14 +17,21 @@ msgstr "" "X-Generator: Weblate 4.14.1\n" #. module: mail_activity_reminder -#: code:addons/mail_activity_reminder/models/mail_activity.py:123 -#, python-format -msgid "%s: %s assigned to you, %d day(s) remaining" -msgstr "%s : %s assigné à vous, %d jour(s) restant(s)" +#: model_terms:ir.ui.view,arch_db:mail_activity_reminder.message_activity_assigned +msgid ".
    " +msgstr "" + +#. module: mail_activity_reminder +#: model_terms:ir.ui.view,arch_db:mail_activity_reminder.message_activity_assigned +msgid "You have some activities assigned that expire soon:" +msgstr "" #. module: mail_activity_reminder #: model:ir.model.fields,help:mail_activity_reminder.field_mail_activity_type__reminders -msgid "A non-digit-separated list of offsets (in days) when reminders should be fired: e.g. 0 means \"on the deadline day\" while 5 means \"5 calendar days before the deadline\"." +msgid "" +"A non-digit-separated list of offsets (in days) when reminders should be " +"fired: e.g. 0 means \"on the deadline day\" while 5 means \"5 calendar days " +"before the deadline\"." msgstr "" "Une liste de nombres de jours (séparés par tout caractère autre que des " "chiffres) qui indique quand les rappels doivent être déclenchés : par ex. 0 " @@ -54,7 +61,6 @@ msgstr "Dernier rappel (local)" #. module: mail_activity_reminder #: model:ir.actions.server,name:mail_activity_reminder.mail_activity_reminder_ir_actions_server #: model:ir.cron,cron_name:mail_activity_reminder.mail_activity_reminder -#: model:ir.cron,name:mail_activity_reminder.mail_activity_reminder msgid "Mail Activity: Reminders" msgstr "Activité : Rappels" @@ -67,3 +73,34 @@ msgstr "Rappel suivant" #: model:ir.model.fields,field_description:mail_activity_reminder.field_mail_activity_type__reminders msgid "Reminders" msgstr "Rappels" + +#. module: mail_activity_reminder +#. odoo-python +#: code:addons/mail_activity_reminder/models/mail_activity.py:0 +#, python-format +msgid "Some activities you are assigned too expire soon." +msgstr "" + +#. module: mail_activity_reminder +#: model_terms:ir.ui.view,arch_db:mail_activity_reminder.message_activity_assigned +msgid "View" +msgstr "" + +#. module: mail_activity_reminder +#: model_terms:ir.ui.view,arch_db:mail_activity_reminder.message_activity_assigned +msgid "assigned you an activity" +msgstr "" + +#. module: mail_activity_reminder +#: model_terms:ir.ui.view,arch_db:mail_activity_reminder.message_activity_assigned +msgid "on" +msgstr "" + +#. module: mail_activity_reminder +#: model_terms:ir.ui.view,arch_db:mail_activity_reminder.message_activity_assigned +msgid "to close for" +msgstr "" + +#, python-format +#~ msgid "%s: %s assigned to you, %d day(s) remaining" +#~ msgstr "%s : %s assigné à vous, %d jour(s) restant(s)" diff --git a/mail_activity_reminder/i18n/mail_activity_reminder.pot b/mail_activity_reminder/i18n/mail_activity_reminder.pot index 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 "" diff --git a/mail_activity_reminder/i18n/pt.po b/mail_activity_reminder/i18n/pt.po index 1506563de..4d64a8454 100644 --- a/mail_activity_reminder/i18n/pt.po +++ b/mail_activity_reminder/i18n/pt.po @@ -1,6 +1,6 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * mail_activity_reminder +# * mail_activity_reminder # msgid "" msgstr "" @@ -17,14 +17,21 @@ msgstr "" "X-Generator: Weblate 4.3.2\n" #. module: mail_activity_reminder -#: code:addons/mail_activity_reminder/models/mail_activity.py:123 -#, python-format -msgid "%s: %s assigned to you, %d day(s) remaining" -msgstr "%s: %s atribuído a você, %d dia(s) restante(s)" +#: model_terms:ir.ui.view,arch_db:mail_activity_reminder.message_activity_assigned +msgid ".
    " +msgstr "" + +#. module: mail_activity_reminder +#: model_terms:ir.ui.view,arch_db:mail_activity_reminder.message_activity_assigned +msgid "You have some activities assigned that expire soon:" +msgstr "" #. module: mail_activity_reminder #: model:ir.model.fields,help:mail_activity_reminder.field_mail_activity_type__reminders -msgid "A non-digit-separated list of offsets (in days) when reminders should be fired: e.g. 0 means \"on the deadline day\" while 5 means \"5 calendar days before the deadline\"." +msgid "" +"A non-digit-separated list of offsets (in days) when reminders should be " +"fired: e.g. 0 means \"on the deadline day\" while 5 means \"5 calendar days " +"before the deadline\"." msgstr "" "Uma lista não separada por dígitos de offsets (em dias) para quando os " "lembretes devem ser disparados: por exemplo, 0 significa \"no dia do prazo\" " @@ -53,7 +60,6 @@ msgstr "Último lembrete (local)" #. module: mail_activity_reminder #: model:ir.actions.server,name:mail_activity_reminder.mail_activity_reminder_ir_actions_server #: model:ir.cron,cron_name:mail_activity_reminder.mail_activity_reminder -#: model:ir.cron,name:mail_activity_reminder.mail_activity_reminder msgid "Mail Activity: Reminders" msgstr "Atividade de Correio: Lembretes" @@ -66,3 +72,34 @@ msgstr "Próximo lembrete" #: model:ir.model.fields,field_description:mail_activity_reminder.field_mail_activity_type__reminders msgid "Reminders" msgstr "Lembretes" + +#. module: mail_activity_reminder +#. odoo-python +#: code:addons/mail_activity_reminder/models/mail_activity.py:0 +#, python-format +msgid "Some activities you are assigned too expire soon." +msgstr "" + +#. module: mail_activity_reminder +#: model_terms:ir.ui.view,arch_db:mail_activity_reminder.message_activity_assigned +msgid "View" +msgstr "" + +#. module: mail_activity_reminder +#: model_terms:ir.ui.view,arch_db:mail_activity_reminder.message_activity_assigned +msgid "assigned you an activity" +msgstr "" + +#. module: mail_activity_reminder +#: model_terms:ir.ui.view,arch_db:mail_activity_reminder.message_activity_assigned +msgid "on" +msgstr "" + +#. module: mail_activity_reminder +#: model_terms:ir.ui.view,arch_db:mail_activity_reminder.message_activity_assigned +msgid "to close for" +msgstr "" + +#, python-format +#~ msgid "%s: %s assigned to you, %d day(s) remaining" +#~ msgstr "%s: %s atribuído a você, %d dia(s) restante(s)" diff --git a/mail_activity_reminder/models/mail_activity.py b/mail_activity_reminder/models/mail_activity.py index 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 @@ 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 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/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 -

    -

    Mail Activity Reminder

    +
    + + +Odoo Community Association + +
    +

    Mail Activity Reminder

    -

    Beta License: AGPL-3 OCA/mail Translate me on Weblate Try me on Runboat

    +

    Beta License: AGPL-3 OCA/mail Translate me on Weblate Try me on Runboat

    This module allows setting reminders for various Activity Types.

    Table of contents

    @@ -384,7 +390,7 @@

    Mail Activity Reminder

    -

    Configuration

    +

    Configuration

    To configure reminders for specific Activity Type:

    1. Go to Settings > Technical > Activity Types
    2. @@ -395,23 +401,23 @@

      Configuration

    -

    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 to smash it by providing a detailed and welcomed -feedback.

    +feedback.

    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 + +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/mail project on GitHub.

    +

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

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

    +
    From a547a36213cd05a6c9375d45f98959a895500041 Mon Sep 17 00:00:00 2001 From: Karl Southern Date: Fri, 7 Nov 2025 10:34:38 +0000 Subject: [PATCH 23/23] [MIG] mail_activity_reminder: Migration to 19.0 --- mail_activity_reminder/__manifest__.py | 2 +- mail_activity_reminder/tests/test_mail_activity_reminder.py | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/mail_activity_reminder/__manifest__.py b/mail_activity_reminder/__manifest__.py index b3d5ac4e1..98c7a0168 100644 --- a/mail_activity_reminder/__manifest__.py +++ b/mail_activity_reminder/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Mail Activity Reminder", - "version": "18.0.1.0.0", + "version": "19.0.1.0.0", "category": "Discuss", "website": "https://github.com/OCA/mail", "author": "CorporateHub, Odoo Community Association (OCA)", diff --git a/mail_activity_reminder/tests/test_mail_activity_reminder.py b/mail_activity_reminder/tests/test_mail_activity_reminder.py index d2dfe4a84..31f5e4b75 100644 --- a/mail_activity_reminder/tests/test_mail_activity_reminder.py +++ b/mail_activity_reminder/tests/test_mail_activity_reminder.py @@ -87,6 +87,7 @@ def test_reminder_behaviour(self): "res_model_id": self.model_res_partner.id, "res_id": self.partner.id, "date_deadline": self.today + relativedelta(days=5), + "user_id": self.env.user.id, } ) @@ -130,6 +131,7 @@ def test_reminder_flow(self): "res_model_id": self.model_res_partner.id, "res_id": self.partner.id, "date_deadline": self.today + relativedelta(days=5), + "user_id": self.env.user.id, } ) @@ -166,6 +168,7 @@ def test_repeated_reminder(self): "res_model_id": self.model_res_partner.id, "res_id": self.partner.id, "date_deadline": self.today + relativedelta(days=1), + "user_id": self.env.user.id, } ) @@ -189,6 +192,7 @@ def test_overdue_reminder(self): "res_model_id": self.model_res_partner.id, "res_id": self.partner.id, "date_deadline": self.today + relativedelta(days=1), + "user_id": self.env.user.id, } )