Skip to content

Commit 27536af

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

File tree

10 files changed

+121
-17
lines changed

10 files changed

+121
-17
lines changed

Diff for: helpdesk_mgmt/controllers/main.py

-5
Original file line numberDiff line numberDiff line change
@@ -84,11 +84,6 @@ 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"],
9287
}
9388
if company.helpdesk_mgmt_portal_select_team and kw.get("team"):
9489
team = (

Diff for: helpdesk_mgmt/controllers/myaccount.py

+15-2
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,13 @@ def portal_my_tickets(
6565
searchbar_filters = {
6666
"all": {"label": _("All"), "domain": []},
6767
}
68-
for stage in request.env["helpdesk.ticket.stage"].search([]):
68+
for stage in request.env["helpdesk.ticket.stage"].search(
69+
[
70+
"|",
71+
("team_ids", "=", HelpdeskTicket.team_id.id),
72+
("team_ids", "=", False),
73+
]
74+
):
6975
searchbar_filters[str(stage.id)] = {
7076
"label": stage.name,
7177
"domain": [("stage_id", "=", stage.id)],
@@ -183,8 +189,15 @@ def portal_my_ticket(self, ticket_id, access_token=None, **kw):
183189

184190
def _ticket_get_page_view_values(self, ticket, access_token, **kwargs):
185191
closed_stages = request.env["helpdesk.ticket.stage"].search(
186-
[("close_from_portal", "=", True)]
192+
[
193+
"&",
194+
"|",
195+
("team_ids", "=", ticket.team_id.id),
196+
("team_ids", "=", False),
197+
("close_from_portal", "=", True),
198+
]
187199
)
200+
188201
values = {
189202
"closed_stages": closed_stages, # used to display close buttons
190203
"page_name": "ticket",

Diff for: helpdesk_mgmt/models/helpdesk_ticket.py

+42-10
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,38 @@ 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+
)
1534

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

2147
number = fields.Char(string="Ticket number", default="/", readonly=True)
2248
name = fields.Char(string="Title", required=True)
@@ -31,16 +57,22 @@ def _read_group_stage_ids(self, stages, domain, order):
3157
user_ids = fields.Many2many(
3258
comodel_name="res.users", related="team_id.user_ids", string="Users"
3359
)
60+
3461
stage_id = fields.Many2one(
3562
comodel_name="helpdesk.ticket.stage",
3663
string="Stage",
37-
group_expand="_read_group_stage_ids",
64+
compute="_compute_stage_ids",
3865
default=_get_default_stage_id,
39-
tracking=True,
66+
store=True,
67+
readonly=False,
4068
ondelete="restrict",
41-
index=True,
69+
tracking=True,
70+
group_expand="_read_group_stage_ids",
4271
copy=False,
72+
index=True,
73+
domain="['|',('team_ids', '=', team_id),('team_ids','=',False)]",
4374
)
75+
4476
partner_id = fields.Many2one(comodel_name="res.partner", string="Contact")
4577
partner_name = fields.Char()
4678
partner_email = fields.Char(string="Email")
@@ -67,10 +99,7 @@ def _read_group_stage_ids(self, stages, domain, order):
6799
comodel_name="helpdesk.ticket.category",
68100
string="Category",
69101
)
70-
team_id = fields.Many2one(
71-
comodel_name="helpdesk.ticket.team",
72-
string="Team",
73-
)
102+
team_id = fields.Many2one(comodel_name="helpdesk.ticket.team", string="Team")
74103
priority = fields.Selection(
75104
selection=[
76105
("0", "Low"),
@@ -130,6 +159,9 @@ def create(self, vals_list):
130159
vals["number"] = self._prepare_ticket_number(vals)
131160
if vals.get("user_id") and not vals.get("assigned_date"):
132161
vals["assigned_date"] = fields.Datetime.now()
162+
if vals.get("team_id"):
163+
team = self.env["helpdesk.ticket.team"].browse(vals["team_id"])
164+
vals["stage_id"] = team._determine_stage()[team.id].id
133165
return super().create(vals_list)
134166

135167
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

+10
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,16 @@ 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+
result = dict.fromkeys(self.ids, self.env["helpdesk.ticket.stage"])
72+
for team in self:
73+
result[team.id] = self.env["helpdesk.ticket.stage"].search(
74+
["|", ("team_ids", "=", False), ("team_ids", "in", team.id)],
75+
order="sequence",
76+
limit=1,
77+
)
78+
return result
79+
7080
@api.depends("ticket_ids", "ticket_ids.stage_id")
7181
def _compute_todo_tickets(self):
7282
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)