Skip to content

Commit

Permalink
[IMP] hr_timesheet_sheet: Improve search speed for can_review field
Browse files Browse the repository at this point in the history
  • Loading branch information
lpolitanski-tempoconsulting committed Jan 24, 2024
1 parent 994ec4d commit 557fa05
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 19 deletions.
50 changes: 31 additions & 19 deletions hr_timesheet_sheet/models/hr_timesheet_sheet.py
Expand Up @@ -198,21 +198,11 @@ def _compute_can_review(self):

@api.model
def _search_can_review(self, operator, value):
def check_in(users):
return self.env.user in users

def check_not_in(users):
return self.env.user not in users

review_policies = self._get_user_possible_review_policies()
if (operator == "=" and value) or (operator in ["<>", "!="] and not value):
check = check_in
return review_policies if review_policies else [("id", "=", False)]
else:
check = check_not_in

sheets = self.search([]).filtered(
lambda sheet: check(sheet._get_possible_reviewers())
)
return [("id", "in", sheets.ids)]
return ["!"] + review_policies if review_policies else review_policies

@api.depends("name", "employee_id")
def _compute_complete_name(self):
Expand Down Expand Up @@ -326,15 +316,37 @@ def _check_company_id_add_line_task_id(self):
)
)

@api.model
def _review_policy_reviewer_group_pairings(self):
return [
{"group": "hr.group_hr_user", "review_policy": "hr"},
{"group": "hr.group_hr_manager", "review_policy": "hr_manager"},
{
"group": "hr_timesheet.group_hr_timesheet_approver",
"review_policy": "timesheet_manager",
},
]

@api.model
def _get_user_possible_review_policies(self):
"""Domains for which the logged-in user is allowed to review sheets."""
for pairing in self._review_policy_reviewer_group_pairings():
review_policy_domains = []
if self.user_has_groups(pairing["group"]):
review_policy_domains = (
[("review_policy", "=", pairing["review_policy"])]
if not review_policy_domains
else ["|", ("review_policy", "=", pairing["review_policy"])]
+ review_policy_domains
)
return review_policy_domains

def _get_possible_reviewers(self):
self.ensure_one()
res = self.env["res.users"].browse(SUPERUSER_ID)
if self.review_policy == "hr":
res |= self.env.ref("hr.group_hr_user").users
elif self.review_policy == "hr_manager":
res |= self.env.ref("hr.group_hr_manager").users
elif self.review_policy == "timesheet_manager":
res |= self.env.ref("hr_timesheet.group_hr_timesheet_approver").users
for pairing in self._review_policy_reviewer_group_pairings():
if self.review_policy == pairing["review_policy"]:
res |= self.env.ref(pairing["group"]).users
return res

def _get_timesheet_sheet_company(self):
Expand Down
Expand Up @@ -52,6 +52,21 @@ def _get_complete_name_components(self):
result += [self.department_id.name_get()[0][1]]
return result

@api.model
def _get_user_possible_review_policies(self):
review_policy_domains = super()._get_user_possible_review_policies()
department_manager_domain = [
"&",
("review_policy", "=", "department_manager"),
("department_id.manager_id.user_id", "=", self.env.uid),
]
review_policy_domains = (
department_manager_domain
if not review_policy_domains
else ["|"] + department_manager_domain + review_policy_domains
)
return review_policy_domains

def _get_possible_reviewers(self):
self.ensure_one()
res = super()._get_possible_reviewers()
Expand Down
Expand Up @@ -62,6 +62,21 @@ def _check_company_id_project_id(self):
)
)

@api.model
def _get_user_possible_review_policies(self):
review_policy_domains = super()._get_user_possible_review_policies()
project_manager_domain = [
"&",
("review_policy", "=", "project_manager"),
("project_id.user_id", "=", self.env.uid),
]
review_policy_domains = (
project_manager_domain
if not review_policy_domains
else ["|"] + project_manager_domain + review_policy_domains
)
return review_policy_domains

def _get_possible_reviewers(self):
self.ensure_one()
res = super()._get_possible_reviewers()
Expand Down

0 comments on commit 557fa05

Please sign in to comment.