diff --git a/helpdesk_mgmt/controllers/myaccount.py b/helpdesk_mgmt/controllers/myaccount.py index 1eca8c0109..f2e40cef98 100644 --- a/helpdesk_mgmt/controllers/myaccount.py +++ b/helpdesk_mgmt/controllers/myaccount.py @@ -65,7 +65,8 @@ def portal_my_tickets( searchbar_filters = { "all": {"label": _("All"), "domain": []}, } - for stage in request.env["helpdesk.ticket.stage"].search([]): + stages = self._get_applicable_stages(HelpdeskTicket.team_id, False) + for stage in stages: searchbar_filters[str(stage.id)] = { "label": stage.name, "domain": [("stage_id", "=", stage.id)], @@ -182,9 +183,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 = request.env["helpdesk.ticket.stage"].search( - [("close_from_portal", "=", True)] - ) + closed_stages = self._get_applicable_stages(ticket.team_id, True) values = { "closed_stages": closed_stages, # used to display close buttons "page_name": "ticket", @@ -259,3 +258,13 @@ def _ticket_get_order(self, order, groupby): if not field_name: return order return "%s, %s" % (field_name, order) + + def _get_applicable_stages(self, team, close_from_portal=False): + domain = [ + ("team_ids", "in", [False] + team.ids), + ] + if close_from_portal: + domain = ["|"] + domain + domain.append(("close_from_portal", "=", True)) + + return request.env["helpdesk.ticket.stage"].search(domain) diff --git a/helpdesk_mgmt/models/helpdesk_ticket.py b/helpdesk_mgmt/models/helpdesk_ticket.py index b8c8a3669d..19d15410fb 100644 --- a/helpdesk_mgmt/models/helpdesk_ticket.py +++ b/helpdesk_mgmt/models/helpdesk_ticket.py @@ -10,13 +10,45 @@ 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_stage()[team.id].id + else: + return ( + self.env["helpdesk.ticket.stage"] + .search([("team_ids", "=", False)], limit=1) + .id + ) + def _get_default_stage_id(self): - return self.env["helpdesk.ticket.stage"].search([], limit=1).id + return self._get_applicable_stages(self.team_id) + + @api.depends("team_id") + def _compute_stage_ids(self): + for ticket in self: + ticket.stage_id = self._get_applicable_stages(ticket.team_id) + + 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 @api.model def _read_group_stage_ids(self, stages, domain, order): - stage_ids = self.env["helpdesk.ticket.stage"].search([]) - return stage_ids + search_domain = [("id", "in", stages.ids)] + if self.env.context.get("default_team_id"): + search_domain = [ + "|", + "|", + ("team_ids", "=", False), + ("team_ids", "in", self.env.context["default_team_id"]), + ] + search_domain + return stages.search(search_domain, order=order) number = fields.Char(string="Ticket number", default="/", readonly=True) name = fields.Char(string="Title", required=True) @@ -31,16 +63,22 @@ 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", - group_expand="_read_group_stage_ids", + compute="_compute_stage_ids", default=_get_default_stage_id, - tracking=True, + store=True, + readonly=False, ondelete="restrict", - index=True, + tracking=True, + group_expand="_read_group_stage_ids", copy=False, + 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") @@ -70,6 +108,8 @@ 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( selection=[ @@ -130,6 +170,9 @@ 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_stage()[team.id].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 7d1fc7e469..e220b5b5e6 100644 --- a/helpdesk_mgmt/models/helpdesk_ticket_stage.py +++ b/helpdesk_mgmt/models/helpdesk_ticket_stage.py @@ -35,6 +35,12 @@ class HelpdeskTicketStage(models.Model): string="Company", default=lambda self: self.env.company, ) + team_ids = fields.Many2many( + comodel_name="helpdesk.ticket.team", + relation="team_stage_rel", + string="Helpdesk Teams", + help="Specific team that uses this stage. If it is empty all teams could uses", + ) @api.onchange("closed") def _onchange_closed(self): diff --git a/helpdesk_mgmt/models/helpdesk_ticket_team.py b/helpdesk_mgmt/models/helpdesk_ticket_team.py index 7f141d33eb..411ac6a452 100644 --- a/helpdesk_mgmt/models/helpdesk_ticket_team.py +++ b/helpdesk_mgmt/models/helpdesk_ticket_team.py @@ -67,6 +67,20 @@ class HelpdeskTeam(models.Model): help="Allow to select this team when creating a new ticket in the portal.", ) + def _determine_stage(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", + limit=1, + ) + return result + @api.depends("ticket_ids", "ticket_ids.stage_id") def _compute_todo_tickets(self): ticket_model = self.env["helpdesk.ticket"] diff --git a/helpdesk_mgmt/readme/CONTRIBUTORS.rst b/helpdesk_mgmt/readme/CONTRIBUTORS.rst index 15e2effd37..5b4696871e 100644 --- a/helpdesk_mgmt/readme/CONTRIBUTORS.rst +++ b/helpdesk_mgmt/readme/CONTRIBUTORS.rst @@ -27,6 +27,7 @@ * Pedro M. Baeza * Víctor Martínez + * Carolina Fernandez * `ID42 Sistemas `_: diff --git a/helpdesk_mgmt/static/description/index.html b/helpdesk_mgmt/static/description/index.html index be455c12f6..319f97afa6 100644 --- a/helpdesk_mgmt/static/description/index.html +++ b/helpdesk_mgmt/static/description/index.html @@ -568,6 +568,7 @@

Contributors

  • Tecnativa:
  • ID42 Sistemas: