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