Skip to content

Commit bb7b618

Browse files
[IMP] heldespk_mgmt: Helpdesk stages per teams
TT45710
1 parent 77cdcc6 commit bb7b618

22 files changed

+178
-9
lines changed

Diff for: helpdesk_mgmt/controllers/main.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,10 @@ def _prepare_submit_ticket_vals(self, **kw):
9898
[("id", "=", int(kw.get("team"))), ("show_in_portal", "=", True)]
9999
)
100100
)
101-
vals.update({"team_id": team.id})
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})
102105
return vals
103106

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

Diff for: helpdesk_mgmt/controllers/myaccount.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -182,8 +182,8 @@ 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 = request.env["helpdesk.ticket.stage"].search(
186-
[("close_from_portal", "=", True)]
185+
closed_stages = ticket._get_applicable_stages(ticket.team_id).filtered(
186+
lambda s: s.close_from_portal
187187
)
188188
values = {
189189
"closed_stages": closed_stages, # used to display close buttons

Diff for: helpdesk_mgmt/i18n/de.po

+5
Original file line numberDiff line numberDiff line change
@@ -728,6 +728,11 @@ msgstr "Helpdesk Teamsuche"
728728
msgid "Helpdesk Team name..."
729729
msgstr "Helpdesk Teamname..."
730730

731+
#. module: helpdesk_mgmt
732+
#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage__team_ids
733+
msgid "Helpdesk Teams"
734+
msgstr ""
735+
731736
#. module: helpdesk_mgmt
732737
#: model:ir.actions.act_window,name:helpdesk_mgmt.action_helpdesk_ticket_kanban_from_dashboard
733738
#: model:ir.model,name:helpdesk_mgmt.model_helpdesk_ticket

Diff for: helpdesk_mgmt/i18n/en_GB.po

+5
Original file line numberDiff line numberDiff line change
@@ -718,6 +718,11 @@ msgstr ""
718718
msgid "Helpdesk Team name..."
719719
msgstr ""
720720

721+
#. module: helpdesk_mgmt
722+
#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage__team_ids
723+
msgid "Helpdesk Teams"
724+
msgstr ""
725+
721726
#. module: helpdesk_mgmt
722727
#: model:ir.actions.act_window,name:helpdesk_mgmt.action_helpdesk_ticket_kanban_from_dashboard
723728
#: model:ir.model,name:helpdesk_mgmt.model_helpdesk_ticket

Diff for: helpdesk_mgmt/i18n/es.po

+5
Original file line numberDiff line numberDiff line change
@@ -865,6 +865,11 @@ msgstr "Buscar equipo del servicio de asistencia"
865865
msgid "Helpdesk Team name..."
866866
msgstr "Nombre del equipo..."
867867

868+
#. module: helpdesk_mgmt
869+
#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage__team_ids
870+
msgid "Helpdesk Teams"
871+
msgstr "Equipos del servicio de asistencia"
872+
868873
#. module: helpdesk_mgmt
869874
#: model:ir.actions.act_window,name:helpdesk_mgmt.action_helpdesk_ticket_kanban_from_dashboard
870875
#: model:ir.model,name:helpdesk_mgmt.model_helpdesk_ticket

Diff for: helpdesk_mgmt/i18n/es_AR.po

+5
Original file line numberDiff line numberDiff line change
@@ -858,6 +858,11 @@ msgstr "Buscar Equipo de Mesa de Ayuda"
858858
msgid "Helpdesk Team name..."
859859
msgstr "Nombre del equipo..."
860860

861+
#. module: helpdesk_mgmt
862+
#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage__team_ids
863+
msgid "Helpdesk Teams"
864+
msgstr "Equipos de la Mesa de Ayuda"
865+
861866
#. module: helpdesk_mgmt
862867
#: model:ir.actions.act_window,name:helpdesk_mgmt.action_helpdesk_ticket_kanban_from_dashboard
863868
#: model:ir.model,name:helpdesk_mgmt.model_helpdesk_ticket

Diff for: helpdesk_mgmt/i18n/fr.po

+5
Original file line numberDiff line numberDiff line change
@@ -731,6 +731,11 @@ msgstr "Recherche d'équipe d'assistance"
731731
msgid "Helpdesk Team name..."
732732
msgstr "Nom de l'équipe d'assistance ..."
733733

734+
#. module: helpdesk_mgmt
735+
#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage__team_ids
736+
msgid "Helpdesk Teams"
737+
msgstr ""
738+
734739
#. module: helpdesk_mgmt
735740
#: model:ir.actions.act_window,name:helpdesk_mgmt.action_helpdesk_ticket_kanban_from_dashboard
736741
#: model:ir.model,name:helpdesk_mgmt.model_helpdesk_ticket

Diff for: helpdesk_mgmt/i18n/helpdesk_mgmt.pot

+5
Original file line numberDiff line numberDiff line change
@@ -685,6 +685,11 @@ msgstr ""
685685
msgid "Helpdesk Team name..."
686686
msgstr ""
687687

688+
#. module: helpdesk_mgmt
689+
#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage__team_ids
690+
msgid "Helpdesk Teams"
691+
msgstr ""
692+
688693
#. module: helpdesk_mgmt
689694
#: model:ir.actions.act_window,name:helpdesk_mgmt.action_helpdesk_ticket_kanban_from_dashboard
690695
#: model:ir.model,name:helpdesk_mgmt.model_helpdesk_ticket

Diff for: helpdesk_mgmt/i18n/hu.po

+5
Original file line numberDiff line numberDiff line change
@@ -722,6 +722,11 @@ msgstr "Csapat keresés"
722722
msgid "Helpdesk Team name..."
723723
msgstr "Csapat neve..."
724724

725+
#. module: helpdesk_mgmt
726+
#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage__team_ids
727+
msgid "Helpdesk Teams"
728+
msgstr ""
729+
725730
#. module: helpdesk_mgmt
726731
#: model:ir.actions.act_window,name:helpdesk_mgmt.action_helpdesk_ticket_kanban_from_dashboard
727732
#: model:ir.model,name:helpdesk_mgmt.model_helpdesk_ticket

Diff for: helpdesk_mgmt/i18n/it.po

+5
Original file line numberDiff line numberDiff line change
@@ -724,6 +724,11 @@ msgstr "Cerca Team Helpdesk"
724724
msgid "Helpdesk Team name..."
725725
msgstr "Nome Team Helpdesk..."
726726

727+
#. module: helpdesk_mgmt
728+
#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage__team_ids
729+
msgid "Helpdesk Teams"
730+
msgstr ""
731+
727732
#. module: helpdesk_mgmt
728733
#: model:ir.actions.act_window,name:helpdesk_mgmt.action_helpdesk_ticket_kanban_from_dashboard
729734
#: model:ir.model,name:helpdesk_mgmt.model_helpdesk_ticket

Diff for: helpdesk_mgmt/i18n/pl.po

+5
Original file line numberDiff line numberDiff line change
@@ -721,6 +721,11 @@ msgstr ""
721721
msgid "Helpdesk Team name..."
722722
msgstr ""
723723

724+
#. module: helpdesk_mgmt
725+
#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage__team_ids
726+
msgid "Helpdesk Teams"
727+
msgstr ""
728+
724729
#. module: helpdesk_mgmt
725730
#: model:ir.actions.act_window,name:helpdesk_mgmt.action_helpdesk_ticket_kanban_from_dashboard
726731
#: model:ir.model,name:helpdesk_mgmt.model_helpdesk_ticket

Diff for: helpdesk_mgmt/i18n/pt.po

+5
Original file line numberDiff line numberDiff line change
@@ -726,6 +726,11 @@ msgstr "Pesquisar na Equipa de Helpdesk"
726726
msgid "Helpdesk Team name..."
727727
msgstr "Nome da Equipe de helpdesk..."
728728

729+
#. module: helpdesk_mgmt
730+
#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage__team_ids
731+
msgid "Helpdesk Teams"
732+
msgstr ""
733+
729734
#. module: helpdesk_mgmt
730735
#: model:ir.actions.act_window,name:helpdesk_mgmt.action_helpdesk_ticket_kanban_from_dashboard
731736
#: model:ir.model,name:helpdesk_mgmt.model_helpdesk_ticket

Diff for: helpdesk_mgmt/i18n/pt_BR.po

+5
Original file line numberDiff line numberDiff line change
@@ -728,6 +728,11 @@ msgstr "Buscar em Equipe de Atendimento"
728728
msgid "Helpdesk Team name..."
729729
msgstr "Buscar em Equipe de Atendimento"
730730

731+
#. module: helpdesk_mgmt
732+
#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage__team_ids
733+
msgid "Helpdesk Teams"
734+
msgstr ""
735+
731736
#. module: helpdesk_mgmt
732737
#: model:ir.actions.act_window,name:helpdesk_mgmt.action_helpdesk_ticket_kanban_from_dashboard
733738
#: model:ir.model,name:helpdesk_mgmt.model_helpdesk_ticket

Diff for: helpdesk_mgmt/i18n/tr.po

+5
Original file line numberDiff line numberDiff line change
@@ -729,6 +729,11 @@ msgstr "Yardım Masası Ekibi Arama"
729729
msgid "Helpdesk Team name..."
730730
msgstr "Yardım Masası Ekip adı..."
731731

732+
#. module: helpdesk_mgmt
733+
#: model:ir.model.fields,field_description:helpdesk_mgmt.field_helpdesk_ticket_stage__team_ids
734+
msgid "Helpdesk Teams"
735+
msgstr ""
736+
732737
#. module: helpdesk_mgmt
733738
#: model:ir.actions.act_window,name:helpdesk_mgmt.action_helpdesk_ticket_kanban_from_dashboard
734739
#: model:ir.model,name:helpdesk_mgmt.model_helpdesk_ticket

Diff for: helpdesk_mgmt/models/helpdesk_ticket.py

+45-6
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,41 @@ 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+
1319
def _get_default_stage_id(self):
14-
return self.env["helpdesk.ticket.stage"].search([], limit=1).id
20+
return self._get_applicable_stages(self.team_id)[:1]
21+
22+
@api.depends("team_id")
23+
def _compute_stage_id(self):
24+
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
1536

1637
@api.model
1738
def _read_group_stage_ids(self, stages, domain, order):
18-
stage_ids = self.env["helpdesk.ticket.stage"].search([])
19-
return stage_ids
39+
search_domain = [("id", "in", stages.ids)]
40+
if self.env.context.get("default_team_id"):
41+
search_domain = [
42+
"|",
43+
"|",
44+
("team_ids", "=", False),
45+
("team_ids", "in", self.env.context["default_team_id"]),
46+
] + search_domain
47+
return stages.search(search_domain, order=order)
2048

2149
number = fields.Char(string="Ticket number", default="/", readonly=True)
2250
name = fields.Char(string="Title", required=True)
@@ -31,16 +59,22 @@ def _read_group_stage_ids(self, stages, domain, order):
3159
user_ids = fields.Many2many(
3260
comodel_name="res.users", related="team_id.user_ids", string="Users"
3361
)
62+
3463
stage_id = fields.Many2one(
3564
comodel_name="helpdesk.ticket.stage",
3665
string="Stage",
37-
group_expand="_read_group_stage_ids",
66+
compute="_compute_stage_id",
3867
default=_get_default_stage_id,
39-
tracking=True,
68+
store=True,
69+
readonly=False,
4070
ondelete="restrict",
41-
index=True,
71+
tracking=True,
72+
group_expand="_read_group_stage_ids",
4273
copy=False,
74+
index=True,
75+
domain="['|',('team_ids', '=', team_id),('team_ids','=',False)]",
4376
)
77+
4478
partner_id = fields.Many2one(comodel_name="res.partner", string="Contact")
4579
partner_name = fields.Char()
4680
partner_email = fields.Char(string="Email")
@@ -70,6 +104,8 @@ def _read_group_stage_ids(self, stages, domain, order):
70104
team_id = fields.Many2one(
71105
comodel_name="helpdesk.ticket.team",
72106
string="Team",
107+
default=_default_team_id,
108+
index=True,
73109
)
74110
priority = fields.Selection(
75111
selection=[
@@ -130,6 +166,9 @@ def create(self, vals_list):
130166
vals["number"] = self._prepare_ticket_number(vals)
131167
if vals.get("user_id") and not vals.get("assigned_date"):
132168
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
133172
return super().create(vals_list)
134173

135174
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

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

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
82+
7083
@api.depends("ticket_ids", "ticket_ids.stage_id")
7184
def _compute_todo_tickets(self):
7285
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_stages()[self.team_a.id][0]
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)