Skip to content

Commit 892eea7

Browse files
[15.0][ADD] heldespk_mgmt: Helpdesk stages per teams
TT45710
1 parent 77cdcc6 commit 892eea7

File tree

9 files changed

+134
-10
lines changed

9 files changed

+134
-10
lines changed

Diff for: helpdesk_mgmt/controllers/myaccount.py

+13-4
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,8 @@ def portal_my_tickets(
6565
searchbar_filters = {
6666
"all": {"label": _("All"), "domain": []},
6767
}
68-
for stage in request.env["helpdesk.ticket.stage"].search([]):
68+
stages = self._get_applicable_stages(HelpdeskTicket.team_id, False)
69+
for stage in stages:
6970
searchbar_filters[str(stage.id)] = {
7071
"label": stage.name,
7172
"domain": [("stage_id", "=", stage.id)],
@@ -182,9 +183,7 @@ def portal_my_ticket(self, ticket_id, access_token=None, **kw):
182183
return request.render("helpdesk_mgmt.portal_helpdesk_ticket_page", values)
183184

184185
def _ticket_get_page_view_values(self, ticket, access_token, **kwargs):
185-
closed_stages = request.env["helpdesk.ticket.stage"].search(
186-
[("close_from_portal", "=", True)]
187-
)
186+
closed_stages = self._get_applicable_stages(ticket.team_id, True)
188187
values = {
189188
"closed_stages": closed_stages, # used to display close buttons
190189
"page_name": "ticket",
@@ -259,3 +258,13 @@ def _ticket_get_order(self, order, groupby):
259258
if not field_name:
260259
return order
261260
return "%s, %s" % (field_name, order)
261+
262+
def _get_applicable_stages(self, team, close_from_portal=False):
263+
domain = [
264+
("team_ids", "in", [False] + team.ids),
265+
]
266+
if close_from_portal:
267+
domain = ["|"] + domain
268+
domain.append(("close_from_portal", "=", True))
269+
270+
return request.env["helpdesk.ticket.stage"].search(domain)

Diff for: helpdesk_mgmt/models/helpdesk_ticket.py

+53-6
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,48 @@ class HelpdeskTicket(models.Model):
1111
_inherit = ["mail.thread.cc", "mail.activity.mixin", "portal.mixin"]
1212

1313
def _get_default_stage_id(self):
14-
return self.env["helpdesk.ticket.stage"].search([], limit=1).id
14+
if self.team_id:
15+
return self.team_id._determine_stage()[self.team_id.id].id
16+
else:
17+
return (
18+
self.env["helpdesk.ticket.stage"]
19+
.search([("team_ids", "=", False)], limit=1)
20+
.id
21+
)
22+
23+
@api.depends("team_id")
24+
def _compute_stage_ids(self):
25+
for ticket in self:
26+
if ticket.team_id:
27+
ticket.stage_id = ticket.team_id._determine_stage()[ticket.team_id.id]
28+
else:
29+
ticket.stage_id = (
30+
self.env["helpdesk.ticket.stage"]
31+
.search([("team_ids", "=", False)], limit=1)
32+
.id
33+
)
34+
35+
def _default_team_id(self):
36+
team_id = (
37+
self.env["helpdesk.ticket.team"]
38+
.search([("user_ids", "in", self.env.uid)], limit=1)
39+
.id
40+
)
41+
if not team_id:
42+
team_id = self.env["helpdesk.ticket.team"].search([], limit=1).id
43+
return team_id
1544

1645
@api.model
1746
def _read_group_stage_ids(self, stages, domain, order):
18-
stage_ids = self.env["helpdesk.ticket.stage"].search([])
19-
return stage_ids
47+
search_domain = [("id", "in", stages.ids)]
48+
if self.env.context.get("default_team_id"):
49+
search_domain = [
50+
"|",
51+
"|",
52+
("team_ids", "=", False),
53+
("team_ids", "in", self.env.context["default_team_id"]),
54+
] + search_domain
55+
return stages.search(search_domain, order=order)
2056

2157
number = fields.Char(string="Ticket number", default="/", readonly=True)
2258
name = fields.Char(string="Title", required=True)
@@ -31,16 +67,22 @@ def _read_group_stage_ids(self, stages, domain, order):
3167
user_ids = fields.Many2many(
3268
comodel_name="res.users", related="team_id.user_ids", string="Users"
3369
)
70+
3471
stage_id = fields.Many2one(
3572
comodel_name="helpdesk.ticket.stage",
3673
string="Stage",
37-
group_expand="_read_group_stage_ids",
74+
compute="_compute_stage_ids",
3875
default=_get_default_stage_id,
39-
tracking=True,
76+
store=True,
77+
readonly=False,
4078
ondelete="restrict",
41-
index=True,
79+
tracking=True,
80+
group_expand="_read_group_stage_ids",
4281
copy=False,
82+
index=True,
83+
domain="['|',('team_ids', '=', team_id),('team_ids','=',False)]",
4384
)
85+
4486
partner_id = fields.Many2one(comodel_name="res.partner", string="Contact")
4587
partner_name = fields.Char()
4688
partner_email = fields.Char(string="Email")
@@ -70,6 +112,8 @@ def _read_group_stage_ids(self, stages, domain, order):
70112
team_id = fields.Many2one(
71113
comodel_name="helpdesk.ticket.team",
72114
string="Team",
115+
default=_default_team_id,
116+
index=True,
73117
)
74118
priority = fields.Selection(
75119
selection=[
@@ -130,6 +174,9 @@ def create(self, vals_list):
130174
vals["number"] = self._prepare_ticket_number(vals)
131175
if vals.get("user_id") and not vals.get("assigned_date"):
132176
vals["assigned_date"] = fields.Datetime.now()
177+
if vals.get("team_id"):
178+
team = self.env["helpdesk.ticket.team"].browse(vals["team_id"])
179+
vals["stage_id"] = team._determine_stage()[team.id].id
133180
return super().create(vals_list)
134181

135182
def copy(self, default=None):

Diff for: helpdesk_mgmt/models/helpdesk_ticket_stage.py

+6
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ class HelpdeskTicketStage(models.Model):
3535
string="Company",
3636
default=lambda self: self.env.company,
3737
)
38+
team_ids = fields.Many2many(
39+
comodel_name="helpdesk.ticket.team",
40+
relation="team_stage_rel",
41+
string="Helpdesk Teams",
42+
help="Specific team that uses this stage. If it is empty all teams could uses",
43+
)
3844

3945
@api.onchange("closed")
4046
def _onchange_closed(self):

Diff for: helpdesk_mgmt/models/helpdesk_ticket_team.py

+14
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,20 @@ class HelpdeskTeam(models.Model):
6767
help="Allow to select this team when creating a new ticket in the portal.",
6868
)
6969

70+
def _determine_stage(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+
limit=1,
81+
)
82+
return result
83+
7084
@api.depends("ticket_ids", "ticket_ids.stage_id")
7185
def _compute_todo_tickets(self):
7286
ticket_model = self.env["helpdesk.ticket"]

Diff for: helpdesk_mgmt/readme/CONTRIBUTORS.rst

+1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727

2828
* Pedro M. Baeza
2929
* Víctor Martínez
30+
* Carolina Fernandez
3031

3132
* `ID42 Sistemas <https://www.id42.com.br>`_:
3233

Diff for: helpdesk_mgmt/static/description/index.html

+1
Original file line numberDiff line numberDiff line change
@@ -568,6 +568,7 @@ <h2><a class="toc-backref" href="#toc-entry-13">Contributors</a></h2>
568568
<li><a class="reference external" href="https://www.tecnativa.com">Tecnativa</a>:<ul>
569569
<li>Pedro M. Baeza</li>
570570
<li>Víctor Martínez</li>
571+
<li>Carolina Fernandez</li>
571572
</ul>
572573
</li>
573574
<li><a class="reference external" href="https://www.id42.com.br">ID42 Sistemas</a>:<ul>

Diff for: helpdesk_mgmt/tests/common.py

+1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ def setUpClass(cls):
3939
cls.team_b = helpdesk_ticket_team.create(
4040
{"name": "Team B", "user_ids": [(6, 0, [cls.user_team.id])]}
4141
)
42+
cls.new_stage = cls.env.ref("helpdesk_mgmt.helpdesk_ticket_stage_new")
4243
cls.ticket_a_unassigned = cls._create_ticket(cls, cls.team_a)
4344
cls.ticket_a_unassigned.priority = "3"
4445
cls.ticket_a_user_own = cls._create_ticket(cls, cls.team_a, cls.user_own)

Diff for: helpdesk_mgmt/tests/test_helpdesk_ticket.py

+42
Original file line numberDiff line numberDiff line change
@@ -97,3 +97,45 @@ def test_helpdesk_ticket_message_new(self):
9797
self.assertEqual(
9898
t.name, title, "The ticket should have the correct (new) title."
9999
)
100+
101+
def test_ticket_with_team_stage(self):
102+
self.new_stage.team_ids = [(6, 0, [self.team_a.id, self.team_b.id])]
103+
in_progress_stage = self.env.ref(
104+
"helpdesk_mgmt.helpdesk_ticket_stage_in_progress"
105+
)
106+
in_progress_stage.team_ids = [(6, 0, [self.team_b.id])]
107+
new_ticket = self.env["helpdesk.ticket"].create(
108+
{
109+
"name": "New Ticket",
110+
"description": "Description",
111+
"team_id": self.team_a.id,
112+
"user_id": self.user.id,
113+
"priority": "1",
114+
}
115+
)
116+
self.assertEqual(new_ticket.stage_id, self.new_stage)
117+
self.new_stage.team_ids = [(6, 0, [self.team_a.id])]
118+
new_ticket.team_id = self.team_b
119+
self.assertEqual(new_ticket.stage_id, in_progress_stage)
120+
self.new_stage.team_ids = False
121+
new_ticket.team_id = False
122+
self.assertEqual(new_ticket.stage_id, self.new_stage)
123+
124+
def test_ticket_without_team_stage(self):
125+
self.new_stage.team_ids = False
126+
self.assertEqual(
127+
self.ticket.stage_id, self.team_a._determine_stage()[self.team_a.id]
128+
)
129+
self.assertEqual(self.ticket.stage_id, self.new_stage)
130+
131+
def test_ticket_without_team(self):
132+
new_ticket = self.env["helpdesk.ticket"].create(
133+
{
134+
"name": "New Ticket",
135+
"description": "Description",
136+
"team_id": False,
137+
"user_id": self.user.id,
138+
"priority": "1",
139+
}
140+
)
141+
self.assertEqual(self.new_stage, new_ticket.stage_id)

Diff for: helpdesk_mgmt/views/helpdesk_ticket_stage_views.xml

+3
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
/>
1313
<separator />
1414
<field name="name" filter_domain="[('name', 'ilike', self)]" />
15+
<field name="team_ids" />
1516
<field name="company_id" groups="base.group_multi_company" />
1617
<group>
1718
<filter
@@ -49,6 +50,7 @@
4950
<group name="main_left">
5051
<field name="sequence" />
5152
<field name="mail_template_id" />
53+
<field name="team_ids" widget="many2many_tags" />
5254
<field
5355
name="company_id"
5456
groups="base.group_multi_company"
@@ -77,6 +79,7 @@
7779
<field name="sequence" widget="handle" />
7880
<field name="name" />
7981
<field name="mail_template_id" />
82+
<field name="team_ids" widget="many2many_tags" />
8083
<field
8184
name="company_id"
8285
optional="hide"

0 commit comments

Comments
 (0)