knowledge/document_page_approval/models/document_page.py
Víctor Martínez f606356ca0 [MIG] document_page_approval: Finish migration
Changes done:
- Squash administrative commits
- Purge translations
- Remove ir.model.access.csv file
- Improve tests (change to setUpClass)
- Replace name_get() to _compute_display_name() (document_page)
- Remove readonly=1 (redudant, it already is) defined in approved_uid and approved_date fields in views
- Restore readonly=1 to the state field
- Remove duplicate Back to draft button

TT51529
2025-02-28 09:42:12 +05:30

145 lines
4.9 KiB
Python

# Copyright (C) 2013 Savoir-faire Linux (<http://www.savoirfairelinux.com>).
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import api, fields, models
from odoo.tools.safe_eval import safe_eval
class DocumentPage(models.Model):
"""Useful to know the state of a document."""
_inherit = "document.page"
history_ids = fields.One2many(domain=[("state", "=", "approved")])
approved_date = fields.Datetime(
"Approved Date",
related="history_head.approved_date",
store=True,
index=True,
)
approved_uid = fields.Many2one(
"res.users",
"Approved by",
related="history_head.approved_uid",
store=True,
index=True,
)
approval_required = fields.Boolean(
"Require approval",
help="Require approval for changes on this page or its child pages.",
)
approver_gid = fields.Many2one(
"res.groups",
"Approver group",
help="Users must also belong to the Approvers group",
)
is_approval_required = fields.Boolean(
"Approval required",
help="If true, changes of this page require approval",
compute="_compute_is_approval_required",
recursive=True,
)
am_i_approver = fields.Boolean(compute="_compute_am_i_approver")
approver_group_ids = fields.Many2many(
"res.groups",
string="Approver groups",
help="Groups that can approve changes to this document",
compute="_compute_approver_group_ids",
recursive=True,
)
# pylint: disable=W8113
has_changes_pending_approval = fields.Boolean(
compute="_compute_has_changes_pending_approval",
string="Has changes pending approval",
)
user_has_drafts = fields.Boolean(
compute="_compute_user_has_drafts", string="User has drafts?"
)
def _valid_field_parameter(self, field, name):
return name == "order" or super()._valid_field_parameter(field, name)
@api.depends("approval_required", "parent_id.is_approval_required")
def _compute_is_approval_required(self):
"""Check if the document required approval based on his parents."""
for page in self:
res = page.approval_required
if page.parent_id:
res = res or page.parent_id.is_approval_required
page.is_approval_required = res
@api.depends("approver_gid", "parent_id.approver_group_ids")
def _compute_approver_group_ids(self):
"""Compute the approver groups based on his parents."""
for page in self:
res = page.approver_gid
if page.parent_id:
res = res | page.parent_id.approver_group_ids
page.approver_group_ids = res
@api.depends("is_approval_required", "approver_group_ids")
def _compute_am_i_approver(self):
"""Check if the current user can approve changes to this page."""
for rec in self:
rec.am_i_approver = rec.can_user_approve_this_page(self.env.user)
def can_user_approve_this_page(self, user):
"""Check if a user can approve this page."""
self.ensure_one()
# if it's not required, anyone can approve
if not self.is_approval_required:
return True
# if user belongs to 'Knowledge / Manager', he can approve anything
if user.has_group("document_page.group_document_manager"):
return True
# to approve, user must have approver rights
if not user.has_group("document_page_approval.group_document_approver_user"):
return False
# if there aren't any approver_groups_defined, user can approve
if not self.approver_group_ids:
return True
# to approve, user must belong to any of the approver groups
return len(user.groups_id & self.approver_group_ids) > 0
def _compute_has_changes_pending_approval(self):
history = self.env["document.page.history"]
for rec in self:
changes = history.search_count(
[("page_id", "=", rec.id), ("state", "=", "to approve")]
)
rec.has_changes_pending_approval = changes > 0
def _compute_user_has_drafts(self):
history = self.env["document.page.history"]
for rec in self:
changes = history.search_count(
[("page_id", "=", rec.id), ("state", "=", "draft")]
)
rec.user_has_drafts = changes > 0
def _create_history(self, vals):
res = super()._create_history(vals)
res.action_to_approve()
return res
def action_changes_pending_approval(self):
self.ensure_one()
action = self.env["ir.actions.act_window"]._for_xml_id(
"document_page_approval.action_change_requests"
)
context = safe_eval(action["context"])
context["search_default_page_id"] = self.id
context["default_page_id"] = self.id
action["context"] = context
return action