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
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

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 @@
+
+
+
+