Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[14.0][IMP] hr_timesheet_sheet: Improve search speed for can_review field #630

Open
wants to merge 1 commit into
base: 14.0
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
50 changes: 31 additions & 19 deletions hr_timesheet_sheet/models/hr_timesheet_sheet.py
Original file line number Diff line number Diff line change
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."""
review_policy_domains = []
for pairing in self._review_policy_reviewer_group_pairings():
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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