diff --git a/mail_activity_done/README.rst b/mail_activity_done/README.rst new file mode 100644 index 0000000..49e4854 --- /dev/null +++ b/mail_activity_done/README.rst @@ -0,0 +1,79 @@ +================== +Mail Activity Done +================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! 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-LGPL--3-blue.png + :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html + :alt: License: LGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fsocial-lightgray.png?logo=github + :target: https://github.com/OCA/social/tree/14.0/mail_activity_done + :alt: OCA/social +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/social-14-0/social-14-0-mail_activity_done + :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/14.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module implements the capability to keep activities that have been +completed, for future reporting, by setting them with the boolean 'Done'. + +The activities that have been completed will not appear in the chatter. + +**Table of contents** + +.. contents:: + :local: + +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 +~~~~~~~ + +* ForgeFlow + +Contributors +~~~~~~~~~~~~ + +* Jordi Ballester (www.forgeflow.com) +* Eduardo Magdalena (C2i Change 2 improve http://www.c2i.es) +* Radovan Skolnik (https://www.kema.sk) +* Manuel Regidor (https://www.sygel.es) + +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_done/__init__.py b/mail_activity_done/__init__.py new file mode 100644 index 0000000..320b63a --- /dev/null +++ b/mail_activity_done/__init__.py @@ -0,0 +1,2 @@ +from . import models +from .hooks import post_load_hook, pre_init_hook, uninstall_hook diff --git a/mail_activity_done/__manifest__.py b/mail_activity_done/__manifest__.py new file mode 100644 index 0000000..b6545bc --- /dev/null +++ b/mail_activity_done/__manifest__.py @@ -0,0 +1,20 @@ +# Copyright 2018-22 ForgeFlow +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). +{ + "name": "Mail Activity Done", + "version": "15.0.1.0.0", + "author": "ForgeFlow, Odoo Community Association (OCA)", + "license": "LGPL-3", + "category": "Discuss", + "website": "https://github.com/OCA/social", + "depends": ["mail"], + "data": ["views/mail_activity_views.xml"], + "assets": { + "web.assets_backend": [ + "mail_activity_done/static/src/js/mail_activity.esm.js", + ], + }, + "pre_init_hook": "pre_init_hook", + "post_load": "post_load_hook", + "uninstall_hook": "uninstall_hook", +} diff --git a/mail_activity_done/hooks.py b/mail_activity_done/hooks.py new file mode 100644 index 0000000..5320fc9 --- /dev/null +++ b/mail_activity_done/hooks.py @@ -0,0 +1,94 @@ +# Copyright 2018-22 ForgeFlow +# Copyright 2018 Odoo, S.A. +# License AGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). +from odoo import Command, fields + +from odoo.addons.mail.models.mail_activity import MailActivity + + +def pre_init_hook(cr): + """The objective of this hook is to default to false all values of field + 'done' of mail.activity + """ + cr.execute( + """SELECT column_name + FROM information_schema.columns + WHERE table_name='mail_activity' AND + column_name='done'""" + ) + if not cr.fetchone(): + cr.execute( + """ + ALTER TABLE mail_activity ADD COLUMN done boolean; + """ + ) + + cr.execute( + """ + UPDATE mail_activity + SET done = False + """ + ) + + +def post_load_hook(): + def _new_action_done(self, feedback=False, attachment_ids=None): + """Overwritten method""" + if "done" not in self._fields: + return self._action_done_original( + feedback=feedback, attachment_ids=attachment_ids + ) + # marking as 'done' + messages = self.env["mail.message"] + next_activities_values = [] + for activity in self: + # extract value to generate next activities + if activity.chaining_type == "trigger": + vals = activity.with_context( + activity_previous_deadline=activity.date_deadline + )._prepare_next_activity_values() + next_activities_values.append(vals) + + # post message on activity, before deleting it + record = self.env[activity.res_model].browse(activity.res_id) + activity.done = True + activity.active = False + activity.date_done = fields.Date.today() + record.message_post_with_view( + "mail.message_activity_done", + values={ + "activity": activity, + "feedback": feedback, + "display_assignee": activity.user_id != self.env.user, + }, + subtype_id=self.env["ir.model.data"]._xmlid_to_res_id( + "mail.mt_activities" + ), + mail_activity_type_id=activity.activity_type_id.id, + attachment_ids=[ + Command.link(attachment_id) for attachment_id in attachment_ids + ] + if attachment_ids + else [], + ) + messages |= record.message_ids[0] + + next_activities = self.env["mail.activity"].create(next_activities_values) + + return messages, next_activities + + if not hasattr(MailActivity, "_action_done_original"): + MailActivity._action_done_original = MailActivity._action_done + MailActivity._action_done = _new_action_done + + +def uninstall_hook(cr, registry): + """The objective of this hook is to remove all activities that are done + upon module uninstall + """ + cr.execute( + """ + DELETE FROM mail_activity + WHERE done=True + """ + ) diff --git a/mail_activity_done/i18n/hu.po b/mail_activity_done/i18n/hu.po new file mode 100644 index 0000000..9c28b0d --- /dev/null +++ b/mail_activity_done/i18n/hu.po @@ -0,0 +1,109 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mail_activity_done +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2021-04-16 14:36+0000\n" +"Last-Translator: Tamás Dombos \n" +"Language-Team: none\n" +"Language: hu\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_done +#. openerp-web +#: code:addons/mail_activity_done/static/src/js/mail_activity.js:0 +#, python-format +msgid "%d days overdue" +msgstr "%d nap késésben" + +#. module: mail_activity_done +#: model:ir.model.fields,field_description:mail_activity_done.field_mail_activity__active +msgid "Active" +msgstr "Aktív" + +#. module: mail_activity_done +#: model:ir.model.fields,field_description:mail_activity_done.field_event_event__activity_ids +#: model:ir.model.fields,field_description:mail_activity_done.field_event_registration__activity_ids +#: model:ir.model.fields,field_description:mail_activity_done.field_mail_activity_mixin__activity_ids +#: model:ir.model.fields,field_description:mail_activity_done.field_mailing_mailing__activity_ids +#: model:ir.model.fields,field_description:mail_activity_done.field_res_partner__activity_ids +#: model:ir.model.fields,field_description:mail_activity_done.field_res_users__activity_ids +msgid "Activities" +msgstr "Tevékenységek" + +#. module: mail_activity_done +#: model:ir.model,name:mail_activity_done.model_mail_activity +msgid "Activity" +msgstr "Tevékenység" + +#. module: mail_activity_done +#: model:ir.model,name:mail_activity_done.model_mail_activity_mixin +msgid "Activity Mixin" +msgstr "Tevékenység mixin" + +#. module: mail_activity_done +#: model_terms:ir.ui.view,arch_db:mail_activity_done.mail_activity_view_search +#: model_terms:ir.ui.view,arch_db:mail_activity_done.res_partner_view_search_inherit_mail +msgid "Completed Activities" +msgstr "Elkészült tevékenységek" + +#. module: mail_activity_done +#: model:ir.model.fields,field_description:mail_activity_done.field_mail_activity__date_done +msgid "Completed Date" +msgstr "Elkészülés dátuma" + +#. module: mail_activity_done +#: model:ir.model.fields,field_description:mail_activity_done.field_mail_activity__done +#: model:ir.model.fields.selection,name:mail_activity_done.selection__mail_activity__state__done +msgid "Done" +msgstr "Kész" + +#. module: mail_activity_done +#. openerp-web +#: code:addons/mail_activity_done/static/src/js/mail_activity.js:0 +#, python-format +msgid "Due in %d days" +msgstr "%d napon belül esedékes" + +#. module: mail_activity_done +#: model_terms:ir.ui.view,arch_db:mail_activity_done.res_partner_view_search_inherit_mail +msgid "Open Activities" +msgstr "Nyitott tevékenységek" + +#. module: mail_activity_done +#: model:ir.model.fields,field_description:mail_activity_done.field_mail_activity__state +msgid "State" +msgstr "Állapot" + +#. module: mail_activity_done +#. openerp-web +#: code:addons/mail_activity_done/static/src/js/mail_activity.js:0 +#, python-format +msgid "Today" +msgstr "Ma" + +#. module: mail_activity_done +#. openerp-web +#: code:addons/mail_activity_done/static/src/js/mail_activity.js:0 +#, python-format +msgid "Tomorrow" +msgstr "Holnap" + +#. module: mail_activity_done +#: model:ir.model,name:mail_activity_done.model_res_users +msgid "Users" +msgstr "Felhasználók" + +#. module: mail_activity_done +#. openerp-web +#: code:addons/mail_activity_done/static/src/js/mail_activity.js:0 +#, python-format +msgid "Yesterday" +msgstr "Tegnap" diff --git a/mail_activity_done/i18n/mail_activity_done.pot b/mail_activity_done/i18n/mail_activity_done.pot new file mode 100644 index 0000000..3135f55 --- /dev/null +++ b/mail_activity_done/i18n/mail_activity_done.pot @@ -0,0 +1,133 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mail_activity_done +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.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_done +#. openerp-web +#: code:addons/mail_activity_done/static/src/js/mail_activity.js:0 +#, python-format +msgid "%d days overdue" +msgstr "" + +#. module: mail_activity_done +#: model:ir.model.fields,field_description:mail_activity_done.field_mail_activity__active +msgid "Active" +msgstr "" + +#. module: mail_activity_done +#: model:ir.model.fields,field_description:mail_activity_done.field_account_bank_statement_line__activity_ids +#: model:ir.model.fields,field_description:mail_activity_done.field_account_journal__activity_ids +#: model:ir.model.fields,field_description:mail_activity_done.field_account_move__activity_ids +#: model:ir.model.fields,field_description:mail_activity_done.field_account_payment__activity_ids +#: model:ir.model.fields,field_description:mail_activity_done.field_event_event__activity_ids +#: model:ir.model.fields,field_description:mail_activity_done.field_event_registration__activity_ids +#: model:ir.model.fields,field_description:mail_activity_done.field_mail_activity_mixin__activity_ids +#: model:ir.model.fields,field_description:mail_activity_done.field_mailing_mailing__activity_ids +#: model:ir.model.fields,field_description:mail_activity_done.field_product_product__activity_ids +#: model:ir.model.fields,field_description:mail_activity_done.field_product_template__activity_ids +#: model:ir.model.fields,field_description:mail_activity_done.field_res_partner__activity_ids +#: model:ir.model.fields,field_description:mail_activity_done.field_res_users__activity_ids +msgid "Activities" +msgstr "" + +#. module: mail_activity_done +#: model:ir.model,name:mail_activity_done.model_mail_activity +msgid "Activity" +msgstr "" + +#. module: mail_activity_done +#: model:ir.model,name:mail_activity_done.model_mail_activity_mixin +msgid "Activity Mixin" +msgstr "" + +#. module: mail_activity_done +#: model_terms:ir.ui.view,arch_db:mail_activity_done.mail_activity_view_search +#: model_terms:ir.ui.view,arch_db:mail_activity_done.res_partner_view_search_inherit_mail +msgid "Completed Activities" +msgstr "" + +#. module: mail_activity_done +#: model:ir.model.fields,field_description:mail_activity_done.field_mail_activity__date_done +msgid "Completed Date" +msgstr "" + +#. module: mail_activity_done +#: model:ir.model.fields,field_description:mail_activity_done.field_mail_activity__display_name +#: model:ir.model.fields,field_description:mail_activity_done.field_mail_activity_mixin__display_name +#: model:ir.model.fields,field_description:mail_activity_done.field_res_users__display_name +msgid "Display Name" +msgstr "" + +#. module: mail_activity_done +#: model:ir.model.fields,field_description:mail_activity_done.field_mail_activity__done +#: model:ir.model.fields.selection,name:mail_activity_done.selection__mail_activity__state__done +msgid "Done" +msgstr "" + +#. module: mail_activity_done +#. openerp-web +#: code:addons/mail_activity_done/static/src/js/mail_activity.js:0 +#, python-format +msgid "Due in %d days" +msgstr "" + +#. module: mail_activity_done +#: model:ir.model.fields,field_description:mail_activity_done.field_mail_activity__id +#: model:ir.model.fields,field_description:mail_activity_done.field_mail_activity_mixin__id +#: model:ir.model.fields,field_description:mail_activity_done.field_res_users__id +msgid "ID" +msgstr "" + +#. module: mail_activity_done +#: model:ir.model.fields,field_description:mail_activity_done.field_mail_activity____last_update +#: model:ir.model.fields,field_description:mail_activity_done.field_mail_activity_mixin____last_update +#: model:ir.model.fields,field_description:mail_activity_done.field_res_users____last_update +msgid "Last Modified on" +msgstr "" + +#. module: mail_activity_done +#: model_terms:ir.ui.view,arch_db:mail_activity_done.res_partner_view_search_inherit_mail +msgid "Open Activities" +msgstr "" + +#. module: mail_activity_done +#: model:ir.model.fields,field_description:mail_activity_done.field_mail_activity__state +msgid "State" +msgstr "" + +#. module: mail_activity_done +#. openerp-web +#: code:addons/mail_activity_done/static/src/js/mail_activity.js:0 +#, python-format +msgid "Today" +msgstr "" + +#. module: mail_activity_done +#. openerp-web +#: code:addons/mail_activity_done/static/src/js/mail_activity.js:0 +#, python-format +msgid "Tomorrow" +msgstr "" + +#. module: mail_activity_done +#: model:ir.model,name:mail_activity_done.model_res_users +msgid "Users" +msgstr "" + +#. module: mail_activity_done +#. openerp-web +#: code:addons/mail_activity_done/static/src/js/mail_activity.js:0 +#, python-format +msgid "Yesterday" +msgstr "" diff --git a/mail_activity_done/models/__init__.py b/mail_activity_done/models/__init__.py new file mode 100644 index 0000000..a28b246 --- /dev/null +++ b/mail_activity_done/models/__init__.py @@ -0,0 +1,2 @@ +from . import mail_activity +from . import res_users diff --git a/mail_activity_done/models/mail_activity.py b/mail_activity_done/models/mail_activity.py new file mode 100644 index 0000000..51df641 --- /dev/null +++ b/mail_activity_done/models/mail_activity.py @@ -0,0 +1,70 @@ +# Copyright 2018-22 ForgeFlow +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). +from odoo import api, fields, models + + +class MailActivity(models.Model): + + _inherit = "mail.activity" + + active = fields.Boolean(default=True) + done = fields.Boolean(default=False) + state = fields.Selection( + selection_add=[("done", "Done")], + compute="_compute_state", + search="_search_state", + ) + date_done = fields.Date("Completed Date", index=True, readonly=True) + + @api.depends("date_deadline", "done") + def _compute_state(self): + res = super()._compute_state() + for record in self.filtered(lambda activity: activity.done): + record.state = "done" + return res + + def _search_state(self, operator, operand): + if not operand: + # checking for is (not) set + if operator == "=": + # is not set - never happens actually so we create impossible domain + return [("id", "=", False)] + else: + # is set - always - return empty domain + return [] + else: + # checking for value + if operand == "done": + if operator == "=": + return ["&", ("done", operator, True), ("active", "=", False)] + else: + return ["&", ("done", operator, False), ("active", "=", True)] + else: + if operator == "=": + return [ + "&", + ( + "date_deadline", + {"today": "=", "overdue": "<", "planned": ">"}[operand], + fields.Date.today(), + ), + ("done", "=", False), + ] + else: + return [ + "|", + ( + "date_deadline", + {"today": "!=", "overdue": ">=", "planned": "<="}[operand], + fields.Date.today(), + ), + ("done", "=", True), + ] + + +class MailActivityMixin(models.AbstractModel): + + _inherit = "mail.activity.mixin" + activity_ids = fields.One2many( + domain=lambda self: [("res_model", "=", self._name), ("active", "=", True)] + ) diff --git a/mail_activity_done/models/res_users.py b/mail_activity_done/models/res_users.py new file mode 100644 index 0000000..9696f53 --- /dev/null +++ b/mail_activity_done/models/res_users.py @@ -0,0 +1,58 @@ +# Copyright 2018-22 ForgeFlow +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). +from odoo import api, fields, models, modules + + +class ResUsers(models.Model): + _inherit = "res.users" + + @api.model + def systray_get_activities(self): + # Here we totally override the method. Not very nice, but + # we should perhaps ask Odoo to add a hook here. + query = """SELECT m.id, count(*), act.res_model as model, + CASE + WHEN %(today)s::date - + act.date_deadline::date = 0 Then 'today' + WHEN %(today)s::date - + act.date_deadline::date > 0 Then 'overdue' + WHEN %(today)s::date - + act.date_deadline::date < 0 Then 'planned' + END AS states + FROM mail_activity AS act + JOIN ir_model AS m ON act.res_model_id = m.id + WHERE user_id = %(user_id)s + AND act.done = False + GROUP BY m.id, states, act.res_model; + """ + self.env.cr.execute( + query, {"today": fields.Date.context_today(self), "user_id": self.env.uid} + ) + activity_data = self.env.cr.dictfetchall() + model_ids = [a["id"] for a in activity_data] + model_names = { + n[0]: n[1] for n in self.env["ir.model"].sudo().browse(model_ids).name_get() + } + + user_activities = {} + for activity in activity_data: + if not user_activities.get(activity["model"]): + user_activities[activity["model"]] = { + "name": model_names[activity["id"]], + "model": activity["model"], + "icon": modules.module.get_module_icon( + self.env[activity["model"]]._original_module + ), + "total_count": 0, + "today_count": 0, + "overdue_count": 0, + "planned_count": 0, + "type": "activity", + } + user_activities[activity["model"]][ + "%s_count" % activity["states"] + ] += activity["count"] + if activity["states"] in ("today", "overdue"): + user_activities[activity["model"]]["total_count"] += activity["count"] + + return list(user_activities.values()) diff --git a/mail_activity_done/readme/CONTRIBUTORS.rst b/mail_activity_done/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000..ea39428 --- /dev/null +++ b/mail_activity_done/readme/CONTRIBUTORS.rst @@ -0,0 +1,5 @@ +* Jordi Ballester (www.forgeflow.com) +* Eduardo Magdalena (C2i Change 2 improve http://www.c2i.es) +* Radovan Skolnik (https://www.kema.sk) +* Manuel Regidor (https://www.sygel.es) +* Bernat Puig (www.forgeflow.com) diff --git a/mail_activity_done/readme/DESCRIPTION.rst b/mail_activity_done/readme/DESCRIPTION.rst new file mode 100644 index 0000000..423def7 --- /dev/null +++ b/mail_activity_done/readme/DESCRIPTION.rst @@ -0,0 +1,2 @@ +This module implements the capability to keep activities that have been +completed, for future reporting, by setting them with the boolean 'Done'. diff --git a/mail_activity_done/readme/USAGE.rst b/mail_activity_done/readme/USAGE.rst new file mode 100644 index 0000000..420dd59 --- /dev/null +++ b/mail_activity_done/readme/USAGE.rst @@ -0,0 +1,9 @@ +To use this module, you need to: + +#. Access to an activity from the systray activities menu. +#. Once finished, open the activity and mark it as Done. + +To check activities: + +#. Go to Settings -> Technical -> Activities +#. To see finished activities filter by Completed Activities diff --git a/mail_activity_done/static/description/icon.png b/mail_activity_done/static/description/icon.png new file mode 100644 index 0000000..3a0328b Binary files /dev/null and b/mail_activity_done/static/description/icon.png differ diff --git a/mail_activity_done/static/description/index.html b/mail_activity_done/static/description/index.html new file mode 100644 index 0000000..32b461f --- /dev/null +++ b/mail_activity_done/static/description/index.html @@ -0,0 +1,424 @@ + + + + + + +Mail Activity Done + + + +
+

Mail Activity Done

+ + +

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

+

This module implements the capability to keep activities that have been +completed, for future reporting, by setting them with the boolean ‘Done’.

+

The activities that have been completed will not appear in the chatter.

+

Table of contents

+ +
+

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

+
    +
  • ForgeFlow
  • +
+
+
+

Contributors

+ +
+
+

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_done/static/src/js/mail_activity.esm.js b/mail_activity_done/static/src/js/mail_activity.esm.js new file mode 100644 index 0000000..da7f686 --- /dev/null +++ b/mail_activity_done/static/src/js/mail_activity.esm.js @@ -0,0 +1,84 @@ +/** @odoo-module **/ + +// Copyright 2018-22 ForgeFlow +// License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). + +import {qweb as QWeb, _t} from "web.core"; +import mailUtils from "@mail/js/utils"; +import mail_activity from "mail.activity"; +import time from "web.time"; + +// We are forced here to override the method, as there is no possibility +// to inherit it. +var setDelayLabel = function (activities) { + var today = moment().startOf("day"); + _.each(activities, function (activity) { + var to_display = ""; + var deadline = moment(activity.date_deadline).startOf("day"); + // On next line, true means no rounding + var diff = deadline.diff(today, "days", true); + if (diff === 0) { + to_display = _t("Today"); + } else if (diff < 0) { + // This block is for overdue + // eslint-disable-line no-lonely-if + if (diff === -1) { + to_display = _t("Yesterday"); + } else { + to_display = _.str.sprintf(_t("%d days overdue"), Math.abs(diff)); + } + // This block is for due + } else if (diff === 1) { + // eslint-disable-line no-lonely-if + to_display = _t("Tomorrow"); + } else { + to_display = _.str.sprintf(_t("Due in %d days"), Math.abs(diff)); + } + activity.label_delay = to_display; + }); + // We do not want to show the activities that have been completed. + var open_activities = _.filter(activities, function (activity) { + return activity.done !== true; + }); + return open_activities; +}; + +mail_activity.include({ + /** + * @override + * @private + */ + _render: function () { + _.each(this._activities, function (activity) { + var note = mailUtils.parseAndTransform( + activity.note || "", + mailUtils.inline + ); + var is_blank = /^\s*$/.test(note); + if (is_blank) { + activity.note = ""; + } else { + activity.note = mailUtils.parseAndTransform( + activity.note, + mailUtils.addLink + ); + } + }); + var activities = setDelayLabel(this._activities); + if (activities.length) { + var nbActivities = _.countBy(activities, "state"); + this.$el.html( + QWeb.render("mail.activity_items", { + activities: activities, + nbPlannedActivities: nbActivities.planned, + nbTodayActivities: nbActivities.today, + nbOverdueActivities: nbActivities.overdue, + dateFormat: time.getLangDateFormat(), + datetimeFormat: time.getLangDatetimeFormat(), + }) + ); + } else { + this.$el.empty(); + } + }, +}); diff --git a/mail_activity_done/tests/__init__.py b/mail_activity_done/tests/__init__.py new file mode 100644 index 0000000..1f81564 --- /dev/null +++ b/mail_activity_done/tests/__init__.py @@ -0,0 +1 @@ +from . import test_mail_activity_done diff --git a/mail_activity_done/tests/test_mail_activity_done.py b/mail_activity_done/tests/test_mail_activity_done.py new file mode 100644 index 0000000..1b4c8c8 --- /dev/null +++ b/mail_activity_done/tests/test_mail_activity_done.py @@ -0,0 +1,41 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from datetime import date + +from odoo.tests.common import TransactionCase + + +class TestMailActivityDoneMethods(TransactionCase): + def setUp(self): + super(TestMailActivityDoneMethods, self).setUp() + + self.employee = self.env["res.users"].create( + { + "company_id": self.env.ref("base.main_company").id, + "name": "Test User", + "login": "testuser", + "groups_id": [(6, 0, [self.env.ref("base.group_user").id])], + } + ) + activity_type = self.env["mail.activity.type"].search( + [("name", "=", "Meeting")], limit=1 + ) + self.act1 = self.env["mail.activity"].create( + { + "activity_type_id": activity_type.id, + "res_id": self.env.ref("base.res_partner_1").id, + "res_model_id": self.env["ir.model"]._get("res.partner").id, + "user_id": self.employee.id, + "date_deadline": date.today(), + } + ) + + def test_mail_activity_done(self): + self.act1.done = True + self.assertEqual(self.act1.state, "done") + + def test_systray_get_activities(self): + act_count = self.employee.with_user(self.employee).systray_get_activities() + self.assertEqual( + len(act_count), 1, "Number of activities should be equal to one" + ) diff --git a/mail_activity_done/views/mail_activity_views.xml b/mail_activity_done/views/mail_activity_views.xml new file mode 100644 index 0000000..e8c50de --- /dev/null +++ b/mail_activity_done/views/mail_activity_views.xml @@ -0,0 +1,126 @@ + + + + + mail.activity.view.form.popup + mail.activity + + 20 + + + + + + + + + + + mail.activity.view.search + mail.activity + + + + + + + + + [('date_deadline', '<', context_today().strftime('%Y-%m-%d'))] + + + [('date_deadline', '=', context_today().strftime('%Y-%m-%d'))] + + + [('date_deadline', '>', context_today().strftime('%Y-%m-%d'))] + + + + + + res.partner.view.search.inherit.mail + res.partner + + + + + + + + [('activity_ids.date_deadline', '<', context_today().strftime('%Y-%m-%d'))] + + + [('activity_ids.date_deadline', '=', context_today().strftime('%Y-%m-%d'))] + + + [('activity_ids.date_deadline', '>', context_today().strftime('%Y-%m-%d'))] + + + + + + mail.activity.view.tree + mail.activity + + + + + + + + state == 'done' + date_deadline < current_date and state != 'done' + date_deadline == current_date and state != 'done' + + + + + + mail.activity.view.calendar + mail.activity + + + + + + + + + + + diff --git a/setup/mail_activity_done/odoo/addons/mail_activity_done b/setup/mail_activity_done/odoo/addons/mail_activity_done new file mode 120000 index 0000000..a076f38 --- /dev/null +++ b/setup/mail_activity_done/odoo/addons/mail_activity_done @@ -0,0 +1 @@ +../../../../mail_activity_done \ No newline at end of file diff --git a/setup/mail_activity_done/setup.py b/setup/mail_activity_done/setup.py new file mode 100644 index 0000000..28c57bb --- /dev/null +++ b/setup/mail_activity_done/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +)