mirror of
https://github.com/OCA/knowledge.git
synced 2025-07-13 15:34:49 -06:00

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
145 lines
4.9 KiB
Python
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
|