Skip to content

Commit f466837

Browse files
committed
[IMP] helpdesk_mgmt: Simplify logic
- Remove default - Centralize method for determining applicable stages - Make compatible with multi-company
1 parent bb7b618 commit f466837

File tree

6 files changed

+27
-59
lines changed

6 files changed

+27
-59
lines changed

Diff for: helpdesk_mgmt/controllers/main.py

+3-9
Original file line numberDiff line numberDiff line change
@@ -84,11 +84,8 @@ def _prepare_submit_ticket_vals(self, **kw):
8484
"partner_id": request.env.user.partner_id.id,
8585
"partner_name": request.env.user.partner_id.name,
8686
"partner_email": request.env.user.partner_id.email,
87-
# Need to set stage_id so that the _track_template() method is called
88-
# and the mail is sent automatically if applicable
89-
"stage_id": request.env["helpdesk.ticket"]
90-
.with_company(company.id)
91-
.default_get(["stage_id"])["stage_id"],
87+
# For making sure `stage_id` computed writable is called by dependencies
88+
"team_id": False,
9289
}
9390
if company.helpdesk_mgmt_portal_select_team and kw.get("team"):
9491
team = (
@@ -98,10 +95,7 @@ def _prepare_submit_ticket_vals(self, **kw):
9895
[("id", "=", int(kw.get("team"))), ("show_in_portal", "=", True)]
9996
)
10097
)
101-
stage_id = (
102-
request.env["helpdesk.ticket"].sudo()._get_applicable_stages(team)[0]
103-
)
104-
vals.update({"team_id": team.id, "stage_id": stage_id.id})
98+
vals.update({"team_id": team.id})
10599
return vals
106100

107101
@http.route("/submitted/ticket", type="http", auth="user", website=True, csrf=True)

Diff for: helpdesk_mgmt/controllers/myaccount.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ def portal_my_ticket(self, ticket_id, access_token=None, **kw):
182182
return request.render("helpdesk_mgmt.portal_helpdesk_ticket_page", values)
183183

184184
def _ticket_get_page_view_values(self, ticket, access_token, **kwargs):
185-
closed_stages = ticket._get_applicable_stages(ticket.team_id).filtered(
185+
closed_stages = ticket.team_id._get_applicable_stages().filtered(
186186
lambda s: s.close_from_portal
187187
)
188188
values = {

Diff for: helpdesk_mgmt/models/helpdesk_ticket.py

+10-33
Original file line numberDiff line numberDiff line change
@@ -10,39 +10,24 @@ class HelpdeskTicket(models.Model):
1010
_mail_post_access = "read"
1111
_inherit = ["mail.thread.cc", "mail.activity.mixin", "portal.mixin"]
1212

13-
def _get_applicable_stages(self, team):
14-
if team:
15-
return team._determine_stages()[team.id]
16-
else:
17-
return self.env["helpdesk.ticket.stage"].search([("team_ids", "=", False)])
18-
19-
def _get_default_stage_id(self):
20-
return self._get_applicable_stages(self.team_id)[:1]
21-
2213
@api.depends("team_id")
2314
def _compute_stage_id(self):
2415
for ticket in self:
25-
ticket.stage_id = self._get_applicable_stages(ticket.team_id)[:1]
26-
27-
def _default_team_id(self):
28-
team_id = (
29-
self.env["helpdesk.ticket.team"]
30-
.search([("user_ids", "in", self.env.uid)], limit=1)
31-
.id
32-
)
33-
if not team_id:
34-
team_id = self.env["helpdesk.ticket.team"].search([], limit=1).id
35-
return team_id
16+
ticket.stage_id = ticket.team_id._get_applicable_stages()[:1]
3617

3718
@api.model
3819
def _read_group_stage_ids(self, stages, domain, order):
39-
search_domain = [("id", "in", stages.ids)]
40-
if self.env.context.get("default_team_id"):
20+
"""Show always the stages without team, or stages of the default team."""
21+
search_domain = [
22+
"|",
23+
("id", "in", stages.ids),
24+
("team_ids", "=", False),
25+
]
26+
default_team_id = self.default_get(["team_id"])["team_id"]
27+
if default_team_id:
4128
search_domain = [
4229
"|",
43-
"|",
44-
("team_ids", "=", False),
45-
("team_ids", "in", self.env.context["default_team_id"]),
30+
("team_ids", "=", default_team_id),
4631
] + search_domain
4732
return stages.search(search_domain, order=order)
4833

@@ -59,12 +44,10 @@ def _read_group_stage_ids(self, stages, domain, order):
5944
user_ids = fields.Many2many(
6045
comodel_name="res.users", related="team_id.user_ids", string="Users"
6146
)
62-
6347
stage_id = fields.Many2one(
6448
comodel_name="helpdesk.ticket.stage",
6549
string="Stage",
6650
compute="_compute_stage_id",
67-
default=_get_default_stage_id,
6851
store=True,
6952
readonly=False,
7053
ondelete="restrict",
@@ -74,11 +57,9 @@ def _read_group_stage_ids(self, stages, domain, order):
7457
index=True,
7558
domain="['|',('team_ids', '=', team_id),('team_ids','=',False)]",
7659
)
77-
7860
partner_id = fields.Many2one(comodel_name="res.partner", string="Contact")
7961
partner_name = fields.Char()
8062
partner_email = fields.Char(string="Email")
81-
8263
last_stage_update = fields.Datetime(default=fields.Datetime.now)
8364
assigned_date = fields.Datetime()
8465
closed_date = fields.Datetime()
@@ -104,7 +85,6 @@ def _read_group_stage_ids(self, stages, domain, order):
10485
team_id = fields.Many2one(
10586
comodel_name="helpdesk.ticket.team",
10687
string="Team",
107-
default=_default_team_id,
10888
index=True,
10989
)
11090
priority = fields.Selection(
@@ -166,9 +146,6 @@ def create(self, vals_list):
166146
vals["number"] = self._prepare_ticket_number(vals)
167147
if vals.get("user_id") and not vals.get("assigned_date"):
168148
vals["assigned_date"] = fields.Datetime.now()
169-
if vals.get("team_id"):
170-
team = self.env["helpdesk.ticket.team"].browse(vals["team_id"])
171-
vals["stage_id"] = team._determine_stages()[team.id][0].id
172149
return super().create(vals_list)
173150

174151
def copy(self, default=None):

Diff for: helpdesk_mgmt/models/helpdesk_ticket_stage.py

+1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ class HelpdeskTicketStage(models.Model):
4040
relation="team_stage_rel",
4141
string="Helpdesk Teams",
4242
help="Specific team that uses this stage. If it is empty all teams could uses",
43+
domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]",
4344
)
4445

4546
@api.onchange("closed")

Diff for: helpdesk_mgmt/models/helpdesk_ticket_team.py

+12-13
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ class HelpdeskTeam(models.Model):
4848
inverse_name="team_id",
4949
string="Tickets",
5050
)
51-
5251
todo_ticket_count = fields.Integer(
5352
string="Number of tickets", compute="_compute_todo_tickets"
5453
)
@@ -67,18 +66,18 @@ class HelpdeskTeam(models.Model):
6766
help="Allow to select this team when creating a new ticket in the portal.",
6867
)
6968

70-
def _determine_stages(self):
71-
"""Get a dict with the stage per team that should be set as first to a created ticket
72-
:returns a mapping of team identifier with the stage.
73-
:rtype : dict (key=team_id, value=record of helpdesk.ticket.stage)
74-
"""
75-
result = dict.fromkeys(self.ids, self.env["helpdesk.ticket.stage"])
76-
for team in self:
77-
result[team.id] = self.env["helpdesk.ticket.stage"].search(
78-
["|", ("team_ids", "=", False), ("team_ids", "in", team.id)],
79-
order="sequence",
80-
)
81-
return result
69+
def _get_applicable_stages(self):
70+
if self:
71+
domain = [
72+
("company_id", "=", self.company_id.id),
73+
("team_ids", "in", [False, self.id]),
74+
]
75+
else:
76+
domain = [
77+
("company_id", "=", self.env.company.id),
78+
("team_ids", "=", False),
79+
]
80+
return self.env["helpdesk.ticket.stage"].search(domain)
8281

8382
@api.depends("ticket_ids", "ticket_ids.stage_id")
8483
def _compute_todo_tickets(self):

Diff for: helpdesk_mgmt/tests/test_helpdesk_ticket.py

-3
Original file line numberDiff line numberDiff line change
@@ -123,9 +123,6 @@ def test_ticket_with_team_stage(self):
123123

124124
def test_ticket_without_team_stage(self):
125125
self.new_stage.team_ids = False
126-
self.assertEqual(
127-
self.ticket.stage_id, self.team_a._determine_stages()[self.team_a.id][0]
128-
)
129126
self.assertEqual(self.ticket.stage_id, self.new_stage)
130127

131128
def test_ticket_without_team(self):

0 commit comments

Comments
 (0)