diff --git a/crm_lead_to_task/__init__.py b/crm_lead_to_task/__init__.py index 73db51cb2da..a90b62cfa26 100644 --- a/crm_lead_to_task/__init__.py +++ b/crm_lead_to_task/__init__.py @@ -1,2 +1,3 @@ # License LGPL-3 - See https://www.gnu.org/licenses/lgpl-3.0.html +from . import models from . import wizard diff --git a/crm_lead_to_task/__manifest__.py b/crm_lead_to_task/__manifest__.py index 10613798c24..b1e50bd646c 100644 --- a/crm_lead_to_task/__manifest__.py +++ b/crm_lead_to_task/__manifest__.py @@ -18,5 +18,6 @@ "security/ir.model.access.csv", "wizard/crm_lead_convert2task_views.xml", "views/crm_lead_views.xml", + "views/project_task_views.xml", ], } diff --git a/crm_lead_to_task/models/__init__.py b/crm_lead_to_task/models/__init__.py new file mode 100644 index 00000000000..b90fb24ae6c --- /dev/null +++ b/crm_lead_to_task/models/__init__.py @@ -0,0 +1,2 @@ +from . import crm_lead +from . import project_task diff --git a/crm_lead_to_task/models/crm_lead.py b/crm_lead_to_task/models/crm_lead.py new file mode 100644 index 00000000000..f3188727655 --- /dev/null +++ b/crm_lead_to_task/models/crm_lead.py @@ -0,0 +1,27 @@ +# Copyright (C) 2024 Open Source Integrators +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import _, api, fields, models + + +class CrmLead(models.Model): + _inherit = "crm.lead" + + task_ids = fields.One2many("project.task", "lead_id") + task_count = fields.Integer(compute="_compute_task_count") + + @api.depends("task_ids") + def _compute_task_count(self): + for lead in self: + lead.task_count = len(lead.task_ids) + + def action_view_tasks(self): + self.ensure_one() + return { + "type": "ir.actions.act_window", + "res_model": "project.task", + "view_mode": "tree,form", + "domain": [("lead_id", "=", self.id)], + "context": {"default_search_lead_id": self.id}, + "name": _("Tasks from crm lead %s") % self.name, + } diff --git a/crm_lead_to_task/models/project_task.py b/crm_lead_to_task/models/project_task.py new file mode 100644 index 00000000000..cb3669dc114 --- /dev/null +++ b/crm_lead_to_task/models/project_task.py @@ -0,0 +1,21 @@ +# Copyright (C) 2024 Open Source Integrators +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import _, fields, models + + +class ProjectTask(models.Model): + _inherit = "project.task" + + lead_id = fields.Many2one("crm.lead") + + def action_view_lead(self): + self.ensure_one() + return { + "type": "ir.actions.act_window", + "res_model": "crm.lead", + "view_mode": "form", + "res_id": self.lead_id.id, + "target": "current", + "name": _("Lead: %s") % self.lead_id.name, + } diff --git a/crm_lead_to_task/tests/__init__.py b/crm_lead_to_task/tests/__init__.py index 46f4da62b7c..2ede1cfe352 100644 --- a/crm_lead_to_task/tests/__init__.py +++ b/crm_lead_to_task/tests/__init__.py @@ -1,2 +1,3 @@ # License LGPL-3 - See https://www.gnu.org/licenses/lgpl-3.0.html from . import test_crm_project +from . import test_crm_lead_task diff --git a/crm_lead_to_task/tests/test_crm_lead_task.py b/crm_lead_to_task/tests/test_crm_lead_task.py new file mode 100644 index 00000000000..c3d9b0ec053 --- /dev/null +++ b/crm_lead_to_task/tests/test_crm_lead_task.py @@ -0,0 +1,59 @@ +# Copyright (C) 2024 Open Source Integrators +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import _ +from odoo.tests.common import TransactionCase + + +class TestCrmLeadTask(TransactionCase): + def setUp(self): + super().setUp() + + # Create a CRM lead + self.lead = self.env["crm.lead"].create( + { + "name": "Test Lead", + "description": "Description", + } + ) + + # Create tasks related to the lead + self.task1 = self.env["project.task"].create( + { + "name": "Test Task 1", + "lead_id": self.lead.id, + } + ) + self.task2 = self.env["project.task"].create( + { + "name": "Test Task 2", + "lead_id": self.lead.id, + } + ) + + def test_task_count_computation(self): + """Test that the task_count field correctly reflects the number of tasks""" + lead = self.env["crm.lead"].browse(self.lead.id) + self.assertEqual(lead.task_count, 2, "Task count should be 2.") + + def test_action_view_tasks(self): + """Test that action_view_tasks returns the correct action""" + action = self.lead.action_view_tasks() + + expected_domain = [("lead_id", "=", self.lead.id)] + self.assertEqual(action["type"], "ir.actions.act_window") + self.assertEqual(action["res_model"], "project.task") + self.assertEqual(action["view_mode"], "tree,form") + self.assertEqual(action["domain"], expected_domain) + self.assertEqual(action["context"]["default_search_lead_id"], self.lead.id) + self.assertEqual(action["name"], _("Tasks from crm lead %s") % self.lead.name) + + def test_action_view_leads(self): + """Test that action_view_lead returns the correct action""" + action = self.task1.action_view_lead() + + self.assertEqual(action["type"], "ir.actions.act_window") + self.assertEqual(action["res_model"], "crm.lead") + self.assertEqual(action["view_mode"], "form") + self.assertEqual(action["res_id"], self.lead.id) + self.assertEqual(action["name"], _("Lead: %s") % self.lead.name) diff --git a/crm_lead_to_task/views/crm_lead_views.xml b/crm_lead_to_task/views/crm_lead_views.xml index c71064dfbab..a1cd4335437 100644 --- a/crm_lead_to_task/views/crm_lead_views.xml +++ b/crm_lead_to_task/views/crm_lead_views.xml @@ -15,6 +15,29 @@ groups="project.group_project_user" /> + + + + + diff --git a/crm_lead_to_task/views/project_task_views.xml b/crm_lead_to_task/views/project_task_views.xml new file mode 100644 index 00000000000..34be798c1e4 --- /dev/null +++ b/crm_lead_to_task/views/project_task_views.xml @@ -0,0 +1,25 @@ + + + + project.task.view.form.inherit.crm.lead.to.task + project.task + + + + + + + + + + diff --git a/crm_lead_to_task/wizard/crm_lead_convert2task.py b/crm_lead_to_task/wizard/crm_lead_convert2task.py index 109ba4fcecb..d4e9ccbd0ec 100644 --- a/crm_lead_to_task/wizard/crm_lead_convert2task.py +++ b/crm_lead_to_task/wizard/crm_lead_convert2task.py @@ -39,6 +39,7 @@ def action_lead_to_project_task(self): "project_id": self.project_id.id, "partner_id": partner.id, "email_cc": lead.email_cc, + "lead_id": lead.id, } task = self.env["project.task"].create(vals) # move the mail thread