diff --git a/resource_booking/README.rst b/resource_booking/README.rst index 01881ec2..693c97cd 100644 --- a/resource_booking/README.rst +++ b/resource_booking/README.rst @@ -7,7 +7,7 @@ Resource booking !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:1b5ee844dde4d92ddebc83454b46b058b45fddf1013e7ee6d17c187c15b74318 + !! source digest: sha256:51d1debd13397d74e8c6b190e42afe83c59d2be4ee084d68f3a52a33d65a414a !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png diff --git a/resource_booking/__init__.py b/resource_booking/__init__.py index f7209b17..4c9f27ed 100644 --- a/resource_booking/__init__.py +++ b/resource_booking/__init__.py @@ -1,2 +1,3 @@ from . import models from . import controllers +from .hooks import uninstall_hook diff --git a/resource_booking/__manifest__.py b/resource_booking/__manifest__.py index 830817fc..b9c1430c 100644 --- a/resource_booking/__manifest__.py +++ b/resource_booking/__manifest__.py @@ -1,12 +1,12 @@ # Copyright 2021 Tecnativa - Jairo Llopis # Copyright 2022 Tecnativa - Pedro M. Baeza -# Copyright 2023 Tecnativa - Carolina Fernandez +# Copyright 2024 Tecnativa - Carolina Fernandez # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). { "name": "Resource booking", "summary": "Manage appointments and resource booking", - "version": "15.0.1.4.2", + "version": "15.0.1.5.2", "development_status": "Production/Stable", "category": "Appointments", "website": "https://github.com/OCA/calendar", @@ -15,6 +15,7 @@ "license": "AGPL-3", "application": True, "installable": True, + "uninstall_hook": "uninstall_hook", "external_dependencies": { "python": [ # Used implicitly @@ -30,10 +31,12 @@ ], "data": [ "data/mail.xml", + "data/mail_data.xml", "security/resource_booking_security.xml", "security/ir.model.access.csv", "templates/portal.xml", "views/calendar_event_views.xml", + "views/mail_activity_views.xml", "views/resource_booking_combination_views.xml", "views/resource_booking_type_views.xml", "views/resource_booking_views.xml", diff --git a/resource_booking/data/mail_data.xml b/resource_booking/data/mail_data.xml new file mode 100644 index 00000000..4600f8d4 --- /dev/null +++ b/resource_booking/data/mail_data.xml @@ -0,0 +1,9 @@ + + + + resource_booking + Resource Booking + fa-users + 11 + + diff --git a/resource_booking/hooks.py b/resource_booking/hooks.py new file mode 100644 index 00000000..20e44831 --- /dev/null +++ b/resource_booking/hooks.py @@ -0,0 +1,15 @@ +# Copyright 2024 Tecnativa - Carolina Fernandez +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo import SUPERUSER_ID, api + + +def uninstall_hook(cr, registry): + env = api.Environment(cr, SUPERUSER_ID, {}) + # Remove new activity type resource booking and all activities associated' + activiy_resource_booking = env.ref( + "resource_booking.mail_activity_data_resource_booking", raise_if_not_found=False + ) + if activiy_resource_booking: + booking_activiy_ids = env["mail.activity"].search([("booking_id", "!=", False)]) + booking_activiy_ids.unlink() + activiy_resource_booking.unlink() diff --git a/resource_booking/i18n/ca.po b/resource_booking/i18n/ca.po index ca776fd7..45701366 100644 --- a/resource_booking/i18n/ca.po +++ b/resource_booking/i18n/ca.po @@ -499,6 +499,12 @@ msgstr "" msgid "Duration:" msgstr "" +#. module: resource_booking +#: code:addons/resource_booking/models/mail_activity.py:0 +#, python-format +msgid "Feedback: %(feedback)s" +msgstr "" + #. module: resource_booking #: model:ir.model.fields,field_description:resource_booking.field_resource_booking__message_follower_ids #: model:ir.model.fields,field_description:resource_booking.field_resource_booking_type__message_follower_ids @@ -762,6 +768,17 @@ msgstr "" msgid "Next Activity Deadline" msgstr "" +#. module: resource_booking +#: model:ir.model.fields,field_description:resource_booking.field_mail_activity_mixin__activity_booking_id +#: model:ir.model.fields,field_description:resource_booking.field_product_product__activity_booking_id +#: model:ir.model.fields,field_description:resource_booking.field_product_template__activity_booking_id +#: model:ir.model.fields,field_description:resource_booking.field_res_partner__activity_booking_id +#: model:ir.model.fields,field_description:resource_booking.field_res_users__activity_booking_id +#: model:ir.model.fields,field_description:resource_booking.field_resource_booking__activity_booking_id +#: model:ir.model.fields,field_description:resource_booking.field_resource_booking_type__activity_booking_id +msgid "Next Activity Resource Booking" +msgstr "" + #. module: resource_booking #: model:ir.model.fields,field_description:resource_booking.field_resource_booking__activity_summary #: model:ir.model.fields,field_description:resource_booking.field_resource_booking_type__activity_summary @@ -825,6 +842,11 @@ msgstr "" msgid "Only one event per resource booking can exist." msgstr "" +#. module: resource_booking +#: model_terms:ir.ui.view,arch_db:resource_booking.mail_activity_view_form_popup +msgid "Open Resource Booking" +msgstr "" + #. module: resource_booking #: model_terms:ir.ui.view,arch_db:resource_booking.resource_booking_form msgid "Open a calendar to schedule a meeting for this booking request." @@ -884,6 +906,7 @@ msgstr "" #. module: resource_booking #: model:ir.model,name:resource_booking.model_resource_booking #: model:ir.module.category,name:resource_booking.category_resource_booking +#: model:mail.activity.type,name:resource_booking.mail_activity_data_resource_booking msgid "Resource Booking" msgstr "" diff --git a/resource_booking/i18n/es.po b/resource_booking/i18n/es.po index a07281bc..d26414b7 100644 --- a/resource_booking/i18n/es.po +++ b/resource_booking/i18n/es.po @@ -181,6 +181,7 @@ msgstr "Activo" #. module: resource_booking #: model:ir.model.fields,field_description:resource_booking.field_resource_booking__activity_ids +#: model:ir.model.fields,field_description:resource_booking.field_resource_booking__booking_activity_ids #: model:ir.model.fields,field_description:resource_booking.field_resource_booking_type__activity_ids msgid "Activities" msgstr "Actividades" @@ -517,6 +518,12 @@ msgstr "La duración debe ser positiva." msgid "Duration:" msgstr "Duración:" +#. module: resource_booking +#: code:addons/resource_booking/models/mail_activity.py:0 +#, python-format +msgid "Feedback: %(feedback)s" +msgstr "Retroalimentación: %(feedback)s" + #. module: resource_booking #: model:ir.model.fields,field_description:resource_booking.field_resource_booking__message_follower_ids #: model:ir.model.fields,field_description:resource_booking.field_resource_booking_type__message_follower_ids @@ -781,6 +788,17 @@ msgstr "" msgid "Next Activity Deadline" msgstr "Fecha límite de siguiente actividad" +#. module: resource_booking +#: model:ir.model.fields,field_description:resource_booking.field_mail_activity_mixin__activity_booking_id +#: model:ir.model.fields,field_description:resource_booking.field_product_product__activity_booking_id +#: model:ir.model.fields,field_description:resource_booking.field_product_template__activity_booking_id +#: model:ir.model.fields,field_description:resource_booking.field_res_partner__activity_booking_id +#: model:ir.model.fields,field_description:resource_booking.field_res_users__activity_booking_id +#: model:ir.model.fields,field_description:resource_booking.field_resource_booking__activity_booking_id +#: model:ir.model.fields,field_description:resource_booking.field_resource_booking_type__activity_booking_id +msgid "Next Activity Resource Booking" +msgstr "Siguiente actividad de reserva de recursos" + #. module: resource_booking #: model:ir.model.fields,field_description:resource_booking.field_resource_booking__activity_summary #: model:ir.model.fields,field_description:resource_booking.field_resource_booking_type__activity_summary @@ -844,6 +862,11 @@ msgstr "Número de mensajes no leídos" msgid "Only one event per resource booking can exist." msgstr "Solo puede existir un evento por reserva de recursos." +#. module: resource_booking +#: model_terms:ir.ui.view,arch_db:resource_booking.mail_activity_view_form_popup +msgid "Open Resource Booking" +msgstr "Abrir una reserva de recursos" + #. module: resource_booking #: model_terms:ir.ui.view,arch_db:resource_booking.resource_booking_form msgid "Open a calendar to schedule a meeting for this booking request." @@ -910,6 +933,7 @@ msgstr "Aviso al solicitante" #. module: resource_booking #: model:ir.model,name:resource_booking.model_resource_booking #: model:ir.module.category,name:resource_booking.category_resource_booking +#: model:mail.activity.type,name:resource_booking.mail_activity_data_resource_booking msgid "Resource Booking" msgstr "Reserva de recursos" diff --git a/resource_booking/i18n/fr.po b/resource_booking/i18n/fr.po index 072fdab5..14848dc7 100644 --- a/resource_booking/i18n/fr.po +++ b/resource_booking/i18n/fr.po @@ -493,6 +493,12 @@ msgstr "" msgid "Duration:" msgstr "" +#. module: resource_booking +#: code:addons/resource_booking/models/mail_activity.py:0 +#, python-format +msgid "Feedback: %(feedback)s" +msgstr "" + #. module: resource_booking #: model:ir.model.fields,field_description:resource_booking.field_resource_booking__message_follower_ids #: model:ir.model.fields,field_description:resource_booking.field_resource_booking_type__message_follower_ids @@ -756,6 +762,17 @@ msgstr "" msgid "Next Activity Deadline" msgstr "" +#. module: resource_booking +#: model:ir.model.fields,field_description:resource_booking.field_mail_activity_mixin__activity_booking_id +#: model:ir.model.fields,field_description:resource_booking.field_product_product__activity_booking_id +#: model:ir.model.fields,field_description:resource_booking.field_product_template__activity_booking_id +#: model:ir.model.fields,field_description:resource_booking.field_res_partner__activity_booking_id +#: model:ir.model.fields,field_description:resource_booking.field_res_users__activity_booking_id +#: model:ir.model.fields,field_description:resource_booking.field_resource_booking__activity_booking_id +#: model:ir.model.fields,field_description:resource_booking.field_resource_booking_type__activity_booking_id +msgid "Next Activity Resource Booking" +msgstr "" + #. module: resource_booking #: model:ir.model.fields,field_description:resource_booking.field_resource_booking__activity_summary #: model:ir.model.fields,field_description:resource_booking.field_resource_booking_type__activity_summary @@ -819,6 +836,11 @@ msgstr "" msgid "Only one event per resource booking can exist." msgstr "" +#. module: resource_booking +#: model_terms:ir.ui.view,arch_db:resource_booking.mail_activity_view_form_popup +msgid "Open Resource Booking" +msgstr "" + #. module: resource_booking #: model_terms:ir.ui.view,arch_db:resource_booking.resource_booking_form msgid "Open a calendar to schedule a meeting for this booking request." @@ -878,6 +900,7 @@ msgstr "" #. module: resource_booking #: model:ir.model,name:resource_booking.model_resource_booking #: model:ir.module.category,name:resource_booking.category_resource_booking +#: model:mail.activity.type,name:resource_booking.mail_activity_data_resource_booking msgid "Resource Booking" msgstr "" diff --git a/resource_booking/i18n/fr_FR.po b/resource_booking/i18n/fr_FR.po index c3065d35..c2abd67f 100644 --- a/resource_booking/i18n/fr_FR.po +++ b/resource_booking/i18n/fr_FR.po @@ -520,6 +520,12 @@ msgstr "La durée doit être positive." msgid "Duration:" msgstr "Durée:" +#. module: resource_booking +#: code:addons/resource_booking/models/mail_activity.py:0 +#, python-format +msgid "Feedback: %(feedback)s" +msgstr "" + #. module: resource_booking #: model:ir.model.fields,field_description:resource_booking.field_resource_booking__message_follower_ids #: model:ir.model.fields,field_description:resource_booking.field_resource_booking_type__message_follower_ids @@ -785,6 +791,17 @@ msgstr "" msgid "Next Activity Deadline" msgstr "Date limite de la prochaine activité" +#. module: resource_booking +#: model:ir.model.fields,field_description:resource_booking.field_mail_activity_mixin__activity_booking_id +#: model:ir.model.fields,field_description:resource_booking.field_product_product__activity_booking_id +#: model:ir.model.fields,field_description:resource_booking.field_product_template__activity_booking_id +#: model:ir.model.fields,field_description:resource_booking.field_res_partner__activity_booking_id +#: model:ir.model.fields,field_description:resource_booking.field_res_users__activity_booking_id +#: model:ir.model.fields,field_description:resource_booking.field_resource_booking__activity_booking_id +#: model:ir.model.fields,field_description:resource_booking.field_resource_booking_type__activity_booking_id +msgid "Next Activity Resource Booking" +msgstr "" + #. module: resource_booking #: model:ir.model.fields,field_description:resource_booking.field_resource_booking__activity_summary #: model:ir.model.fields,field_description:resource_booking.field_resource_booking_type__activity_summary @@ -848,6 +865,11 @@ msgstr "Nombre de messages non lus" msgid "Only one event per resource booking can exist." msgstr "Un seul événement par réservation de ressource peut exister." +#. module: resource_booking +#: model_terms:ir.ui.view,arch_db:resource_booking.mail_activity_view_form_popup +msgid "Open Resource Booking" +msgstr "" + #. module: resource_booking #: model_terms:ir.ui.view,arch_db:resource_booking.resource_booking_form msgid "Open a calendar to schedule a meeting for this booking request." @@ -913,6 +935,7 @@ msgstr "Avis au demandeur" #. module: resource_booking #: model:ir.model,name:resource_booking.model_resource_booking #: model:ir.module.category,name:resource_booking.category_resource_booking +#: model:mail.activity.type,name:resource_booking.mail_activity_data_resource_booking msgid "Resource Booking" msgstr "Réservation de ressources" diff --git a/resource_booking/i18n/resource_booking.pot b/resource_booking/i18n/resource_booking.pot index 6dd1c61c..9b248fd7 100644 --- a/resource_booking/i18n/resource_booking.pot +++ b/resource_booking/i18n/resource_booking.pot @@ -6,6 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 15.0\n" "Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-03-01 11:24+0000\n" +"PO-Revision-Date: 2024-03-01 11:24+0000\n" "Last-Translator: \n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -151,12 +153,24 @@ msgstr "" msgid "Access warning" msgstr "" +#. module: resource_booking +#: model:ir.model.fields,field_description:resource_booking.field_mail_activity_type__category +msgid "Action" +msgstr "" + #. module: resource_booking #: model:ir.model.fields,field_description:resource_booking.field_resource_booking__message_needaction #: model:ir.model.fields,field_description:resource_booking.field_resource_booking_type__message_needaction msgid "Action Needed" msgstr "" +#. module: resource_booking +#: model:ir.model.fields,help:resource_booking.field_mail_activity_type__category +msgid "" +"Actions may trigger specific behavior like opening calendar view or " +"automatically mark as done when a document is uploaded" +msgstr "" + #. module: resource_booking #: model:ir.model.fields,field_description:resource_booking.field_resource_booking__active #: model:ir.model.fields,field_description:resource_booking.field_resource_booking_combination__active @@ -166,10 +180,16 @@ msgstr "" #. module: resource_booking #: model:ir.model.fields,field_description:resource_booking.field_resource_booking__activity_ids +#: model:ir.model.fields,field_description:resource_booking.field_resource_booking__booking_activity_ids #: model:ir.model.fields,field_description:resource_booking.field_resource_booking_type__activity_ids msgid "Activities" msgstr "" +#. module: resource_booking +#: model:ir.model,name:resource_booking.model_mail_activity +msgid "Activity" +msgstr "" + #. module: resource_booking #: model:ir.model.fields,field_description:resource_booking.field_resource_booking__activity_exception_decoration #: model:ir.model.fields,field_description:resource_booking.field_resource_booking_type__activity_exception_decoration @@ -182,6 +202,11 @@ msgstr "" msgid "Activity State" msgstr "" +#. module: resource_booking +#: model:ir.model,name:resource_booking.model_mail_activity_type +msgid "Activity Type" +msgstr "" + #. module: resource_booking #: model:ir.model.fields,field_description:resource_booking.field_resource_booking__activity_type_icon #: model:ir.model.fields,field_description:resource_booking.field_resource_booking_type__activity_type_icon @@ -489,6 +514,12 @@ msgstr "" msgid "Duration:" msgstr "" +#. module: resource_booking +#: code:addons/resource_booking/models/mail_activity.py:0 +#, python-format +msgid "Feedback: %(feedback)s" +msgstr "" + #. module: resource_booking #: model:ir.model.fields,field_description:resource_booking.field_resource_booking__message_follower_ids #: model:ir.model.fields,field_description:resource_booking.field_resource_booking_type__message_follower_ids @@ -815,6 +846,11 @@ msgstr "" msgid "Only one event per resource booking can exist." msgstr "" +#. module: resource_booking +#: model_terms:ir.ui.view,arch_db:resource_booking.mail_activity_view_form_popup +msgid "Open Resource Booking" +msgstr "" + #. module: resource_booking #: model_terms:ir.ui.view,arch_db:resource_booking.resource_booking_form msgid "Open a calendar to schedule a meeting for this booking request." @@ -874,6 +910,7 @@ msgstr "" #. module: resource_booking #: model:ir.model,name:resource_booking.model_resource_booking #: model:ir.module.category,name:resource_booking.category_resource_booking +#: model:mail.activity.type,name:resource_booking.mail_activity_data_resource_booking msgid "Resource Booking" msgstr "" @@ -904,6 +941,8 @@ msgstr "" #. module: resource_booking #: model:ir.model.fields,field_description:resource_booking.field_calendar_event__resource_booking_ids +#: model:ir.model.fields,field_description:resource_booking.field_mail_activity__booking_id +#: model:ir.model.fields.selection,name:resource_booking.selection__mail_activity_type__category__resource_booking msgid "Resource booking" msgstr "" diff --git a/resource_booking/models/__init__.py b/resource_booking/models/__init__.py index 38ad3480..158a4b48 100644 --- a/resource_booking/models/__init__.py +++ b/resource_booking/models/__init__.py @@ -5,3 +5,4 @@ from . import resource_booking_type_combination_rel from . import resource_calendar from . import resource_resource +from . import mail_activity diff --git a/resource_booking/models/mail_activity.py b/resource_booking/models/mail_activity.py new file mode 100644 index 00000000..cb2cb9e1 --- /dev/null +++ b/resource_booking/models/mail_activity.py @@ -0,0 +1,60 @@ +# Copyright 2024 Tecnativa - Carolina Fernandez +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import _, fields, models, tools +from odoo.tools import is_html_empty + + +class MailActivityType(models.Model): + _inherit = "mail.activity.type" + + category = fields.Selection( + selection_add=[("resource_booking", "Resource booking")] + ) + + +class MailActivity(models.Model): + _inherit = "mail.activity" + + booking_id = fields.Many2one( + "resource.booking", string="Resource booking", ondelete="cascade" + ) + + def action_open_resource_booking(self): + self.ensure_one() + action = self.env["ir.actions.actions"]._for_xml_id( + "resource_booking.resource_booking_action" + ) + action["view_mode"] = "form" + del action["views"] + action["res_id"] = self.booking_id.id + ctx = dict(self.env.context) + ctx.update( + { + "default_activity_type_id": self.activity_type_id.id, + "default_name": self.summary or self.res_name, + "default_description": self.note + if not is_html_empty(self.note) + else "", + "default_booking_activity_ids": [(6, 0, self.ids)], + } + ) + action["context"] = ctx + return action + + def _action_done(self, feedback=False, attachment_ids=False): + bookings = self.mapped("booking_id") + messages, activities = super(MailActivity, self)._action_done( + feedback=feedback, attachment_ids=attachment_ids + ) + if feedback: + for booking in bookings: + description = booking.description + description = "%s
%s" % ( + description if not tools.is_html_empty(description) else "", + _("Feedback: %(feedback)s", feedback=tools.plaintext2html(feedback)) + if feedback + else "", + ) + booking.write({"description": description}) + return messages, activities diff --git a/resource_booking/models/resource_booking.py b/resource_booking/models/resource_booking.py index 77fb74c2..85087983 100644 --- a/resource_booking/models/resource_booking.py +++ b/resource_booking/models/resource_booking.py @@ -215,6 +215,9 @@ class ResourceBooking(models.Model): required=True, tracking=True, ) + booking_activity_ids = fields.One2many( + "mail.activity", "booking_id", string="Activities" + ) @api.depends("partner_ids") def _compute_partner_id(self): @@ -584,22 +587,33 @@ def _get_intervals(self, start_dt, end_dt, combination=None): result &= combinations._get_intervals(start_dt, end_dt) return result + def _sync_booking_activities_date(self): + for rec in self.filtered("booking_activity_ids"): + start = rec.start or (datetime.now() + relativedelta(years=1000)) + rec.booking_activity_ids.date_deadline = start + # Set calendar_event_id to show Re-schedule button in activity block + rec.booking_activity_ids.calendar_event_id = rec.meeting_id + @api.model_create_multi def create(self, vals_list): """Sync booking with meeting if needed.""" result = super().create(vals_list) result._sync_meeting() + result._sync_booking_activities_date() return result def write(self, vals): """Sync booking with meeting if needed.""" result = super().write(vals) self._sync_meeting() + if vals.get("start") or "meeting_id" in vals: + self._sync_booking_activities_date() return result def unlink(self): """Unlink meeting if needed.""" self.meeting_id.unlink() + self.booking_activity_ids.unlink() return super().unlink() def name_get(self): @@ -706,6 +720,7 @@ def action_confirm(self): def action_unschedule(self): """Remove associated meetings.""" + self.booking_activity_ids.calendar_event_id = False self.mapped("meeting_id").unlink() # Force recomputing, in case meeting_id is not visible in the form self.write({"meeting_id": False}) diff --git a/resource_booking/static/description/index.html b/resource_booking/static/description/index.html index 16aa8a9d..146ba710 100644 --- a/resource_booking/static/description/index.html +++ b/resource_booking/static/description/index.html @@ -1,3 +1,4 @@ + @@ -366,7 +367,7 @@

Resource booking

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:1b5ee844dde4d92ddebc83454b46b058b45fddf1013e7ee6d17c187c15b74318 +!! source digest: sha256:51d1debd13397d74e8c6b190e42afe83c59d2be4ee084d68f3a52a33d65a414a !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Production/Stable License: AGPL-3 OCA/calendar Translate me on Weblate Try me on Runboat

This module adds a new app to allow you to book resource combinations in given diff --git a/resource_booking/tests/test_backend.py b/resource_booking/tests/test_backend.py index 5cbdbe6c..f91e451e 100644 --- a/resource_booking/tests/test_backend.py +++ b/resource_booking/tests/test_backend.py @@ -1,10 +1,11 @@ # Copyright 2021 Tecnativa - Jairo Llopis # Copyright 2022 Tecnativa - Pedro M. Baeza -# Copyright 2023 Tecnativa - Carolina Fernandezs +# Copyright 2024 Tecnativa - Carolina Fernandez # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from datetime import date, datetime from unittest.mock import patch +from dateutil.relativedelta import relativedelta from freezegun import freeze_time from pytz import utc @@ -906,3 +907,129 @@ def test_resource_is_available_span_days(self): utc.localize(datetime(2021, 3, 14, 2, 0)), ) ) + + +class TestMailActivity(TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.activity_type = cls.env.ref( + "resource_booking.mail_activity_data_resource_booking" + ) + cls.partner = cls.env["res.partner"].create({"name": "T Partner"}) + create_test_data(cls) + cls.mail_activity = cls.env["mail.activity"].create( + { + "activity_type_id": cls.activity_type.id, + "summary": "Test Summary", + "res_model_id": cls.env["ir.model"]._get_id("res.partner"), + "res_id": cls.partner.id, + } + ) + + def _create_booking_from_mail_activity(self, mail_activity): + action = mail_activity.action_open_resource_booking() + booking_form = Form( + self.env[action["res_model"]].with_context(**action["context"]) + ) + booking_form.start = "2021-03-01 08:00:00" + booking_form.type_id = self.rbt + booking_form.combination_auto_assign = False + booking_form.combination_id = self.rbcs[2] + booking_form.duration = 1 + booking_form.description = "Booking Description" + return booking_form.save() + + def test_action_open_resource_booking_full_process(self): + action = self.mail_activity.action_open_resource_booking() + self.assertEqual(action["res_id"], 0) + self.assertEqual(action["view_mode"], "form") + ctx = action["context"] + self.assertEqual(ctx["default_activity_type_id"], self.activity_type.id) + self.assertEqual(action["context"]["default_name"], "Test Summary") + self.assertEqual( + ctx["default_booking_activity_ids"], + [(6, 0, [self.mail_activity.id])], + ) + booking = self._create_booking_from_mail_activity(self.mail_activity) + self.assertTrue(self.mail_activity.calendar_event_id) + self.assertEqual( + self.mail_activity.date_deadline, fields.Date.from_string("2021-03-01") + ) + feedback = "Test Feedback" + messages, activities = self.mail_activity._action_done(feedback=feedback) + self.assertEqual( + booking.description, + "

Booking Description


Feedback:

Test Feedback

", + ) + self.assertNotEqual(messages, []) + self.assertNotEqual(activities, []) + + def test_action_done_without_feedback(self): + booking = self._create_booking_from_mail_activity(self.mail_activity) + messages, activities = self.mail_activity._action_done() + self.assertEqual(booking.description, "

Booking Description

") + self.assertNotEqual(messages, []) + self.assertNotEqual(activities, []) + + @freeze_time("2021-03-01 06:00:00") + def test_sync_booking_activities(self): + booking = self._create_booking_from_mail_activity(self.mail_activity) + self.assertEqual(self.mail_activity.date_deadline, booking.start.date()) + booking.start = "2021-03-02 08:00:00" + self.assertEqual(self.mail_activity.date_deadline, booking.start.date()) + + @freeze_time("2021-03-01 06:00:00") + def test_resource_booking_activity_without_date(self): + booking = self.env["resource.booking"].create( + { + "name": "Test Booking", + "description": "Booking Description", + "type_id": self.rbt.id, + "duration": 1, + "booking_activity_ids": [ + ( + 0, + 0, + { + "activity_type_id": self.activity_type.id, + "summary": "Test Summary", + "note": "Test Note", + "res_model_id": self.env["ir.model"]._get_id("res.partner"), + "res_id": self.partner.id, + }, + ) + ], + } + ) + mail_activity = booking.booking_activity_ids[0] + future_date = datetime.now() + relativedelta(years=1000) + self.assertEqual(mail_activity.date_deadline, future_date.date()) + booking.combination_id = self.rbcs[2].id + booking.combination_auto_assign = False + booking.start = "2021-03-02 08:00:00" + self.assertEqual(mail_activity.date_deadline, booking.start.date()) + + def test_unlink_resource_booking_activity(self): + booking = self._create_booking_from_mail_activity(self.mail_activity) + booking.action_cancel() + self.assertNotEqual( + self.mail_activity.date_deadline, fields.Date.from_string("2021-03-01") + ) + self.assertFalse(self.mail_activity.calendar_event_id) + + def test_resource_booking_schedule_unschedule(self): + booking = self._create_booking_from_mail_activity(self.mail_activity) + res = booking.action_schedule() + self.assertTrue(self.mail_activity.calendar_event_id) + self.env[res["res_model"]].with_context(**res["context"]).create( + {"start": "2024-01-01 08:00:00", "stop": "2024-01-01 09:00:00"} + ) + self.assertEqual( + self.mail_activity.date_deadline, fields.Date.from_string("2024-01-01") + ) + booking.action_unschedule() + self.assertFalse(self.mail_activity.calendar_event_id) + self.assertNotEqual( + self.mail_activity.date_deadline, fields.Date.from_string("2024-01-01") + ) diff --git a/resource_booking/views/mail_activity_views.xml b/resource_booking/views/mail_activity_views.xml new file mode 100644 index 00000000..b5e43fa0 --- /dev/null +++ b/resource_booking/views/mail_activity_views.xml @@ -0,0 +1,45 @@ + + + + mail.activity.form.inherit.booking + mail.activity + + + + {'invisible': [('activity_category', 'in', ['resource_booking','meeting'])]} + + + {'invisible': [('activity_category', 'in', ['resource_booking','meeting'])]} + + + {'invisible': ['|', ('activity_category', 'in', ['resource_booking','meeting', 'phonecall']), ('id', '!=', False)]} + + + {'invisible': ['|', ('activity_category', 'in', ['resource_booking','meeting']), ('chaining_type', '=', 'trigger')]} + + + {'invisible': [('activity_category', 'in', ['resource_booking','meeting'])]} + + + +