From fc9e2d29ebd6cbcec8bf03e32e5e359086b57068 Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Tue, 16 Jan 2024 18:54:50 +0100 Subject: [PATCH] [IMP] helpdesk_mgmt: Simplify logic - Remove default - Centralize method for determining applicable stages - Make compatible with multi-company --- helpdesk_mgmt/README.rst | 3 +- helpdesk_mgmt/controllers/main.py | 25 +++++------ helpdesk_mgmt/controllers/myaccount.py | 2 +- helpdesk_mgmt/models/helpdesk_ticket.py | 43 +++++-------------- helpdesk_mgmt/models/helpdesk_ticket_stage.py | 1 + helpdesk_mgmt/models/helpdesk_ticket_team.py | 27 ++++++------ helpdesk_mgmt/static/description/index.html | 2 +- helpdesk_mgmt/tests/test_helpdesk_ticket.py | 8 ---- 8 files changed, 39 insertions(+), 72 deletions(-) diff --git a/helpdesk_mgmt/README.rst b/helpdesk_mgmt/README.rst index 2f00a2cb67..56c09306b6 100644 --- a/helpdesk_mgmt/README.rst +++ b/helpdesk_mgmt/README.rst @@ -7,7 +7,7 @@ Helpdesk Management !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:37cc770b0537354407fedcbe0d568ba9bdd6aa460144a7af475c60ae3f91ad27 + !! source digest: sha256:a417b3ef325ea73b03c6c64e0476702e5a35949224072491138ce827feb4d6e7 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png @@ -214,6 +214,7 @@ Contributors * Pedro M. Baeza * Víctor Martínez + * Carolina Fernandez * `ID42 Sistemas `_: diff --git a/helpdesk_mgmt/controllers/main.py b/helpdesk_mgmt/controllers/main.py index 175c2126d7..ff3d20dc99 100644 --- a/helpdesk_mgmt/controllers/main.py +++ b/helpdesk_mgmt/controllers/main.py @@ -70,38 +70,33 @@ def _prepare_submit_ticket_vals(self, **kw): category = http.request.env["helpdesk.ticket.category"].browse( int(kw.get("category")) ) - company = category.company_id or http.request.env.user.company_id + company = category.company_id or http.request.env.company vals = { "company_id": company.id, "category_id": category.id, "description": plaintext2html(kw.get("description")), "name": kw.get("subject"), "attachment_ids": False, - "channel_id": request.env["helpdesk.ticket.channel"] - .sudo() - .search([("name", "=", "Web")]) - .id, + "channel_id": request.env.ref( + "helpdesk_mgmt.helpdesk_ticket_channel_web", False + ).id, "partner_id": request.env.user.partner_id.id, "partner_name": request.env.user.partner_id.name, "partner_email": request.env.user.partner_id.email, - # Need to set stage_id so that the _track_template() method is called - # and the mail is sent automatically if applicable - "stage_id": request.env["helpdesk.ticket"] - .with_company(company.id) - .default_get(["stage_id"])["stage_id"], } + team = http.request.env["helpdesk.ticket.team"] if company.helpdesk_mgmt_portal_select_team and kw.get("team"): team = ( http.request.env["helpdesk.ticket.team"] - .sudo() + .with_company(company) .search( [("id", "=", int(kw.get("team"))), ("show_in_portal", "=", True)] ) ) - stage_id = ( - request.env["helpdesk.ticket"].sudo()._get_applicable_stages(team)[0] - ) - vals.update({"team_id": team.id, "stage_id": stage_id.id}) + vals["team_id"] = team.id + # Need to set stage_id so that the _track_template() method is called + # and the mail is sent automatically if applicable + vals["stage_id"] = team._get_applicable_stages()[:1].id return vals @http.route("/submitted/ticket", type="http", auth="user", website=True, csrf=True) diff --git a/helpdesk_mgmt/controllers/myaccount.py b/helpdesk_mgmt/controllers/myaccount.py index 2db3e0ca99..b5b8a4bdaf 100644 --- a/helpdesk_mgmt/controllers/myaccount.py +++ b/helpdesk_mgmt/controllers/myaccount.py @@ -182,7 +182,7 @@ def portal_my_ticket(self, ticket_id, access_token=None, **kw): return request.render("helpdesk_mgmt.portal_helpdesk_ticket_page", values) def _ticket_get_page_view_values(self, ticket, access_token, **kwargs): - closed_stages = ticket._get_applicable_stages(ticket.team_id).filtered( + closed_stages = ticket.team_id._get_applicable_stages().filtered( lambda s: s.close_from_portal ) values = { diff --git a/helpdesk_mgmt/models/helpdesk_ticket.py b/helpdesk_mgmt/models/helpdesk_ticket.py index 17ef106e45..a843d63851 100644 --- a/helpdesk_mgmt/models/helpdesk_ticket.py +++ b/helpdesk_mgmt/models/helpdesk_ticket.py @@ -10,39 +10,24 @@ class HelpdeskTicket(models.Model): _mail_post_access = "read" _inherit = ["mail.thread.cc", "mail.activity.mixin", "portal.mixin"] - def _get_applicable_stages(self, team): - if team: - return team._determine_stages()[team.id] - else: - return self.env["helpdesk.ticket.stage"].search([("team_ids", "=", False)]) - - def _get_default_stage_id(self): - return self._get_applicable_stages(self.team_id)[:1] - @api.depends("team_id") def _compute_stage_id(self): for ticket in self: - ticket.stage_id = self._get_applicable_stages(ticket.team_id)[:1] - - def _default_team_id(self): - team_id = ( - self.env["helpdesk.ticket.team"] - .search([("user_ids", "in", self.env.uid)], limit=1) - .id - ) - if not team_id: - team_id = self.env["helpdesk.ticket.team"].search([], limit=1).id - return team_id + ticket.stage_id = ticket.team_id._get_applicable_stages()[:1] @api.model def _read_group_stage_ids(self, stages, domain, order): - search_domain = [("id", "in", stages.ids)] - if self.env.context.get("default_team_id"): + """Show always the stages without team, or stages of the default team.""" + search_domain = [ + "|", + ("id", "in", stages.ids), + ("team_ids", "=", False), + ] + default_team_id = self.default_get(["team_id"])["team_id"] + if default_team_id: search_domain = [ "|", - "|", - ("team_ids", "=", False), - ("team_ids", "in", self.env.context["default_team_id"]), + ("team_ids", "=", default_team_id), ] + search_domain return stages.search(search_domain, order=order) @@ -59,12 +44,10 @@ def _read_group_stage_ids(self, stages, domain, order): user_ids = fields.Many2many( comodel_name="res.users", related="team_id.user_ids", string="Users" ) - stage_id = fields.Many2one( comodel_name="helpdesk.ticket.stage", string="Stage", compute="_compute_stage_id", - default=_get_default_stage_id, store=True, readonly=False, ondelete="restrict", @@ -74,11 +57,9 @@ def _read_group_stage_ids(self, stages, domain, order): index=True, domain="['|',('team_ids', '=', team_id),('team_ids','=',False)]", ) - partner_id = fields.Many2one(comodel_name="res.partner", string="Contact") partner_name = fields.Char() partner_email = fields.Char(string="Email") - last_stage_update = fields.Datetime(default=fields.Datetime.now) assigned_date = fields.Datetime() closed_date = fields.Datetime() @@ -104,7 +85,6 @@ def _read_group_stage_ids(self, stages, domain, order): team_id = fields.Many2one( comodel_name="helpdesk.ticket.team", string="Team", - default=_default_team_id, index=True, ) priority = fields.Selection( @@ -166,9 +146,6 @@ def create(self, vals_list): vals["number"] = self._prepare_ticket_number(vals) if vals.get("user_id") and not vals.get("assigned_date"): vals["assigned_date"] = fields.Datetime.now() - if vals.get("team_id"): - team = self.env["helpdesk.ticket.team"].browse(vals["team_id"]) - vals["stage_id"] = team._determine_stages()[team.id][0].id return super().create(vals_list) def copy(self, default=None): diff --git a/helpdesk_mgmt/models/helpdesk_ticket_stage.py b/helpdesk_mgmt/models/helpdesk_ticket_stage.py index e220b5b5e6..6686712563 100644 --- a/helpdesk_mgmt/models/helpdesk_ticket_stage.py +++ b/helpdesk_mgmt/models/helpdesk_ticket_stage.py @@ -40,6 +40,7 @@ class HelpdeskTicketStage(models.Model): relation="team_stage_rel", string="Helpdesk Teams", help="Specific team that uses this stage. If it is empty all teams could uses", + domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]", ) @api.onchange("closed") diff --git a/helpdesk_mgmt/models/helpdesk_ticket_team.py b/helpdesk_mgmt/models/helpdesk_ticket_team.py index a3caa0bb9e..75df44609b 100644 --- a/helpdesk_mgmt/models/helpdesk_ticket_team.py +++ b/helpdesk_mgmt/models/helpdesk_ticket_team.py @@ -48,7 +48,6 @@ class HelpdeskTeam(models.Model): inverse_name="team_id", string="Tickets", ) - todo_ticket_count = fields.Integer( string="Number of tickets", compute="_compute_todo_tickets" ) @@ -67,18 +66,20 @@ class HelpdeskTeam(models.Model): help="Allow to select this team when creating a new ticket in the portal.", ) - def _determine_stages(self): - """Get a dict with the stage per team that should be set as first to a created ticket - :returns a mapping of team identifier with the stage. - :rtype : dict (key=team_id, value=record of helpdesk.ticket.stage) - """ - result = dict.fromkeys(self.ids, self.env["helpdesk.ticket.stage"]) - for team in self: - result[team.id] = self.env["helpdesk.ticket.stage"].search( - ["|", ("team_ids", "=", False), ("team_ids", "in", team.id)], - order="sequence", - ) - return result + def _get_applicable_stages(self): + if self: + domain = [ + ("company_id", "in", [False, self.company_id.id]), + "|", + ("team_ids", "=", False), + ("team_ids", "=", self.id), + ] + else: + domain = [ + ("company_id", "in", [False, self.env.company.id]), + ("team_ids", "=", False), + ] + return self.env["helpdesk.ticket.stage"].search(domain) @api.depends("ticket_ids", "ticket_ids.stage_id") def _compute_todo_tickets(self): diff --git a/helpdesk_mgmt/static/description/index.html b/helpdesk_mgmt/static/description/index.html index b1ee4f4a6c..613f612b42 100644 --- a/helpdesk_mgmt/static/description/index.html +++ b/helpdesk_mgmt/static/description/index.html @@ -367,7 +367,7 @@

Helpdesk Management

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:37cc770b0537354407fedcbe0d568ba9bdd6aa460144a7af475c60ae3f91ad27 +!! source digest: sha256:a417b3ef325ea73b03c6c64e0476702e5a35949224072491138ce827feb4d6e7 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Beta License: AGPL-3 OCA/helpdesk Translate me on Weblate Try me on Runboat

This module adds Helpdesk functionality in Odoo.

diff --git a/helpdesk_mgmt/tests/test_helpdesk_ticket.py b/helpdesk_mgmt/tests/test_helpdesk_ticket.py index bc5c3334f1..abc4ced815 100644 --- a/helpdesk_mgmt/tests/test_helpdesk_ticket.py +++ b/helpdesk_mgmt/tests/test_helpdesk_ticket.py @@ -121,19 +121,11 @@ def test_ticket_with_team_stage(self): new_ticket.team_id = False self.assertEqual(new_ticket.stage_id, self.new_stage) - def test_ticket_without_team_stage(self): - self.new_stage.team_ids = False - self.assertEqual( - self.ticket.stage_id, self.team_a._determine_stages()[self.team_a.id][0] - ) - self.assertEqual(self.ticket.stage_id, self.new_stage) - def test_ticket_without_team(self): new_ticket = self.env["helpdesk.ticket"].create( { "name": "New Ticket", "description": "Description", - "team_id": False, "user_id": self.user.id, "priority": "1", }