mirror of
https://gitlab.com/flectra-community/server-ux.git
synced 2024-12-24 13:21:50 +00:00
95 lines
3.5 KiB
Python
95 lines
3.5 KiB
Python
|
# 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)
|