From 2322dbaae14aa529c6254bcefad4af6f95f3ada3 Mon Sep 17 00:00:00 2001 From: Marc Durepos Date: Wed, 26 Feb 2025 21:25:37 -0500 Subject: [PATCH] fsm_visit_confirmation: completely separated from ratings now --- fsm_visit_confirmation/__init__.py | 3 +- fsm_visit_confirmation/__manifest__.py | 1 + .../data/mail_templates.xml | 2 +- fsm_visit_confirmation/models/__init__.py | 2 ++ fsm_visit_confirmation/models/project_task.py | 28 +++++++++++++++++++ .../models/project_task_type.py | 11 ++++++++ .../tests/test_fsm_visit_confirmation.py | 21 +++++++++++++- .../views/project_task_type_views.xml | 13 +++++++++ 8 files changed, 78 insertions(+), 3 deletions(-) create mode 100644 fsm_visit_confirmation/models/__init__.py create mode 100644 fsm_visit_confirmation/models/project_task.py create mode 100644 fsm_visit_confirmation/models/project_task_type.py create mode 100644 fsm_visit_confirmation/views/project_task_type_views.xml diff --git a/fsm_visit_confirmation/__init__.py b/fsm_visit_confirmation/__init__.py index a03bfd0..91c5580 100644 --- a/fsm_visit_confirmation/__init__.py +++ b/fsm_visit_confirmation/__init__.py @@ -1 +1,2 @@ -from . import controllers \ No newline at end of file +from . import controllers +from . import models diff --git a/fsm_visit_confirmation/__manifest__.py b/fsm_visit_confirmation/__manifest__.py index 45c58e3..175d870 100644 --- a/fsm_visit_confirmation/__manifest__.py +++ b/fsm_visit_confirmation/__manifest__.py @@ -46,6 +46,7 @@ "data": [ "data/mail_templates.xml", "views/project_portal_project_task_templates.xml", + "views/project_task_type_views.xml", ], "installable": True, "auto_install": False, diff --git a/fsm_visit_confirmation/data/mail_templates.xml b/fsm_visit_confirmation/data/mail_templates.xml index cadc3d9..888aaba 100644 --- a/fsm_visit_confirmation/data/mail_templates.xml +++ b/fsm_visit_confirmation/data/mail_templates.xml @@ -2,7 +2,7 @@ FSM Visit Confirmation - + Service Visit Confirmation: {{ object.name }} {{ user.email_formatted }} {{ object.work_order_contacts and object.work_order_contacts[0].id or object.partner_id.id }} diff --git a/fsm_visit_confirmation/models/__init__.py b/fsm_visit_confirmation/models/__init__.py new file mode 100644 index 0000000..8e80a68 --- /dev/null +++ b/fsm_visit_confirmation/models/__init__.py @@ -0,0 +1,2 @@ +from . import project_task_type +from . import project_task diff --git a/fsm_visit_confirmation/models/project_task.py b/fsm_visit_confirmation/models/project_task.py new file mode 100644 index 0000000..d8029c5 --- /dev/null +++ b/fsm_visit_confirmation/models/project_task.py @@ -0,0 +1,28 @@ +from odoo import models + + +class ProjectTask(models.Model): + _inherit = "project.task" + + def write(self, vals): + # Store old stage for comparison + old_stages = {task.id: task.stage_id for task in self} + + # Execute original write method + result = super().write(vals) + + # If stage changed and new stage has an approval template, send the email + if "stage_id" in vals: + for task in self.filtered( + lambda task: task.stage_id != old_stages[task.id] + and task.stage_id.approval_template_id + ): + task.stage_id.approval_template_id.send_mail( + task.id, + force_send=True, + email_values={ + "email_to": task.partner_id.email if task.partner_id else False + }, + ) + + return result diff --git a/fsm_visit_confirmation/models/project_task_type.py b/fsm_visit_confirmation/models/project_task_type.py new file mode 100644 index 0000000..ce6709a --- /dev/null +++ b/fsm_visit_confirmation/models/project_task_type.py @@ -0,0 +1,11 @@ +from odoo import fields, models + + +class ProjectTaskType(models.Model): + _inherit = 'project.task.type' + + approval_template_id = fields.Many2one( + 'mail.template', + string='Approval Template', + help='Template to use for approval emails when a task reaches this stage.' + ) diff --git a/fsm_visit_confirmation/tests/test_fsm_visit_confirmation.py b/fsm_visit_confirmation/tests/test_fsm_visit_confirmation.py index 501dfc7..566b21c 100644 --- a/fsm_visit_confirmation/tests/test_fsm_visit_confirmation.py +++ b/fsm_visit_confirmation/tests/test_fsm_visit_confirmation.py @@ -3,13 +3,14 @@ import logging from datetime import datetime, timedelta from odoo import http +from odoo.addons.mail.tests.common import MailCommon from odoo.tests import HttpCase, tagged _logger = logging.getLogger(__name__) @tagged("post_install", "-at_install") -class TestFSMVisitConfirmation(HttpCase): +class TestFSMVisitConfirmation(HttpCase, MailCommon): def setUp(self): super().setUp() @@ -142,6 +143,24 @@ class TestFSMVisitConfirmation(HttpCase): ) self.assertTrue(messages, "A message should be posted on the task") + def test_03_stage_approved_sends_email(self): + """Test that moving a task to the approved stage sends an email""" + # Set the approval template on the approved stage + template = self.env.ref( + "fsm_visit_confirmation.fsm_visit_confirmation_email_template" + ) + self.stage_approved.approval_template_id = template + + with self.mock_mail_gateway(): + self.task.write({"stage_id": self.stage_approved.id}) + + self.assertEqual( + len(self._new_mails), + 1, + "Moving task to approved stage should send an email", + ) + self.assertEqual(self._new_mails[0].email_to, self.customer.email) + def test_02_task_request_changes_flow(self): """Test the complete task request changes flow""" # Test the FSM confirmation change endpoint diff --git a/fsm_visit_confirmation/views/project_task_type_views.xml b/fsm_visit_confirmation/views/project_task_type_views.xml new file mode 100644 index 0000000..86ba4fe --- /dev/null +++ b/fsm_visit_confirmation/views/project_task_type_views.xml @@ -0,0 +1,13 @@ + + + + project.task.type.form.inherit.fsm.visit.confirmation + project.task.type + + + + + + + +