Skip to content

Commit

Permalink
[IMP] helpdesk_mgmt: Simplify logic
Browse files Browse the repository at this point in the history
- Remove default
- Centralize method for determining applicable stages
- Make compatible with multi-company
  • Loading branch information
pedrobaeza committed Jan 16, 2024
1 parent bb7b618 commit 1e4f32e
Show file tree
Hide file tree
Showing 5 changed files with 26 additions and 58 deletions.
12 changes: 3 additions & 9 deletions helpdesk_mgmt/controllers/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,11 +84,8 @@ def _prepare_submit_ticket_vals(self, **kw):
"partner_id": request.env.user.partner_id.id,
"partner_name": request.env.user.partner_id.name,
"partner_email": request.env.user.partner_id.email,
# Need to set stage_id so that the _track_template() method is called
# and the mail is sent automatically if applicable
"stage_id": request.env["helpdesk.ticket"]
.with_company(company.id)
.default_get(["stage_id"])["stage_id"],
# For making sure `stage_id` computed writable is called by dependencies
"team_id": False,
}
if company.helpdesk_mgmt_portal_select_team and kw.get("team"):
team = (
Expand All @@ -98,10 +95,7 @@ def _prepare_submit_ticket_vals(self, **kw):
[("id", "=", int(kw.get("team"))), ("show_in_portal", "=", True)]
)
)
stage_id = (
request.env["helpdesk.ticket"].sudo()._get_applicable_stages(team)[0]
)
vals.update({"team_id": team.id, "stage_id": stage_id.id})
vals.update({"team_id": team.id})
return vals

@http.route("/submitted/ticket", type="http", auth="user", website=True, csrf=True)
Expand Down
43 changes: 10 additions & 33 deletions helpdesk_mgmt/models/helpdesk_ticket.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,39 +10,24 @@ 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_stages()[team.id]
else:
return self.env["helpdesk.ticket.stage"].search([("team_ids", "=", False)])

def _get_default_stage_id(self):
return self._get_applicable_stages(self.team_id)[:1]

@api.depends("team_id")
def _compute_stage_id(self):
for ticket in self:
ticket.stage_id = self._get_applicable_stages(ticket.team_id)[:1]

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
ticket.stage_id = ticket.team_id._get_applicable_stages()[:1]

@api.model
def _read_group_stage_ids(self, stages, domain, order):
search_domain = [("id", "in", stages.ids)]
if self.env.context.get("default_team_id"):
"""Show always the stages without team, or stages of the default team."""
search_domain = [
"|",
("id", "in", stages.ids),
("team_ids", "=", False),
]
default_team_id = self.default_get(["team_id"])["team_id"]
if default_team_id:
search_domain = [
"|",
"|",
("team_ids", "=", False),
("team_ids", "in", self.env.context["default_team_id"]),
("team_ids", "=", default_team_id),
] + search_domain
return stages.search(search_domain, order=order)

Expand All @@ -59,12 +44,10 @@ 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",
compute="_compute_stage_id",
default=_get_default_stage_id,
store=True,
readonly=False,
ondelete="restrict",
Expand All @@ -74,11 +57,9 @@ def _read_group_stage_ids(self, stages, domain, order):
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")

last_stage_update = fields.Datetime(default=fields.Datetime.now)
assigned_date = fields.Datetime()
closed_date = fields.Datetime()
Expand All @@ -104,7 +85,6 @@ 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(
Expand Down Expand Up @@ -166,9 +146,6 @@ 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_stages()[team.id][0].id
return super().create(vals_list)

def copy(self, default=None):
Expand Down
1 change: 1 addition & 0 deletions helpdesk_mgmt/models/helpdesk_ticket_stage.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ class HelpdeskTicketStage(models.Model):
relation="team_stage_rel",
string="Helpdesk Teams",
help="Specific team that uses this stage. If it is empty all teams could uses",
domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]",
)

@api.onchange("closed")
Expand Down
25 changes: 12 additions & 13 deletions helpdesk_mgmt/models/helpdesk_ticket_team.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,6 @@ class HelpdeskTeam(models.Model):
inverse_name="team_id",
string="Tickets",
)

todo_ticket_count = fields.Integer(
string="Number of tickets", compute="_compute_todo_tickets"
)
Expand All @@ -67,18 +66,18 @@ class HelpdeskTeam(models.Model):
help="Allow to select this team when creating a new ticket in the portal.",
)

def _determine_stages(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",
)
return result
def _get_applicable_stages(self):
if self:
domain = [
("company_id", "=", self.company_id.id),
("team_ids", "in", [False, self.id]),
]
else:
domain = [
("company_id", "=", self.env.company.id),
("team_ids", "=", False),
]
return self.env["helpdesk.ticket.stage"].search(domain)

@api.depends("ticket_ids", "ticket_ids.stage_id")
def _compute_todo_tickets(self):
Expand Down
3 changes: 0 additions & 3 deletions helpdesk_mgmt/tests/test_helpdesk_ticket.py
Original file line number Diff line number Diff line change
Expand Up @@ -123,9 +123,6 @@ def test_ticket_with_team_stage(self):

def test_ticket_without_team_stage(self):
self.new_stage.team_ids = False
self.assertEqual(
self.ticket.stage_id, self.team_a._determine_stages()[self.team_a.id][0]
)
self.assertEqual(self.ticket.stage_id, self.new_stage)

def test_ticket_without_team(self):
Expand Down

0 comments on commit 1e4f32e

Please sign in to comment.