server-ux/base_tier_validation_forward/models/tier_validation.py

95 lines
3.5 KiB
Python
Raw Permalink Normal View History

2024-10-01 05:56:39 +00:00
# Copyright 2020 Ecosoft Co., Ltd. (http://ecosoft.co.th)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from flectra import _, api, fields, models
class TierValidation(models.AbstractModel):
_inherit = "tier.validation"
can_forward = fields.Boolean(compute="_compute_can_forward")
def _compute_can_forward(self):
for rec in self:
if not rec.can_review:
rec.can_forward = False
continue
sequences = self._get_sequences_to_approve(self.env.user)
reviews = rec.review_ids.filtered(
lambda r, sqs=sequences: r.sequence in sqs
)
definitions = reviews.mapped("definition_id")
rec.can_forward = True in definitions.mapped("has_forward")
@api.model
def _calc_reviews_validated(self, reviews):
"""Override for different validation policy."""
if not reviews:
return False
return not any(
[s not in ("approved", "forwarded") for s in reviews.mapped("status")]
)
def _get_forwarded_notification_subtype(self):
return "base_tier_validation.mt_tier_validation_forwarded"
def forward_tier(self):
self.ensure_one()
sequences = self._get_sequences_to_approve(self.env.user)
reviews = self.review_ids.filtered(lambda r: r.sequence in sequences)
ctx = self._add_comment("forward", reviews)["context"]
comment = (
self.env["comment.wizard"].with_context(**ctx).create({"comment": "/"})
)
wizard = self.env.ref("base_tier_validation_forward.view_forward_wizard")
return {
"name": _("Forward"),
"type": "ir.actions.act_window",
"view_mode": "form",
"res_model": "tier.validation.forward.wizard",
"views": [(wizard.id, "form")],
"view_id": wizard.id,
"target": "new",
"context": {
"default_res_id": self.id,
"default_res_model": self._name,
"comment_id": comment.id,
},
}
def _forward_tier(self, tiers=False):
self.ensure_one()
tier_reviews = tiers or self.review_ids
user_reviews = tier_reviews.filtered(
lambda r: r.status != "approved" and (self.env.user in r.reviewer_ids)
)
user_reviews.write(
{
"status": "forwarded",
"done_by": self.env.user.id,
"reviewed_date": fields.Datetime.now(),
}
)
for review in user_reviews:
rec = self.env[review.model].browse(review.res_id)
rec._notify_forwarded_reviews()
def _notify_forwarded_reviews(self):
post = "message_post"
if hasattr(self, post):
# Notify state change
getattr(self, post)(
subtype_xmlid=self._get_forwarded_notification_subtype(),
body=self._notify_forwarded_reviews_body(),
)
def _notify_forwarded_reviews_body(self):
has_comment = self.review_ids.filtered(
lambda r: (self.env.user in r.reviewer_ids) and r.comment
)
if has_comment:
comment = has_comment.mapped("comment")[0]
return _("A review was forwarded from %(user_name)s %(comment)s") % (
{"user_name": self.env.user.name, "comment": comment}
)
return _("A review was forwarded by %s.") % (self.env.user.name)