server-ux/base_tier_validation_server_action/models/tier_definition.py
2021-03-23 20:15:27 +01:00

66 lines
2.6 KiB
Python

# Copyright 2020 Ecosoft (http://ecosoft.co.th)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
import logging
from ast import literal_eval
from flectra import api, fields, models
_logger = logging.getLogger(__name__)
class TierDefinition(models.Model):
_inherit = "tier.definition"
server_action_id = fields.Many2one(
comodel_name="ir.actions.server",
string="Post Approve Action",
domain=[("usage", "=", "ir_actions_server")],
help="Server action triggered as soon as this step is approved",
)
rejected_server_action_id = fields.Many2one(
comodel_name="ir.actions.server",
string="Post Reject Action",
domain=[("usage", "=", "ir_actions_server")],
help="Server action triggered as soon as this step is rejected",
)
auto_validate = fields.Boolean(
string="Auto Validate",
help="Use schedule job to auto validate if condition is met.\n"
"- If no user specified, use job's system user to validate\n"
"- If 1 user matched as reviewer, use the user to validate\n"
"- If > 1 user matched as reviewer, do not auto validate",
)
auto_validate_domain = fields.Char()
def _evaluate_review(self, review):
doc = self.env[review.model].browse(review.res_id)
domain = review.definition_id.auto_validate_domain or "[]"
return doc.filtered_domain(literal_eval(domain))
@api.model
def _cron_auto_tier_validation(self):
reviews = self.env["tier.review"].search(
[("status", "=", "pending"), ("definition_id.auto_validate", "=", True)]
)
for review in reviews:
doc = self._evaluate_review(review)
if not doc:
continue
try:
reviewer = review.reviewer_ids or self.env.user
if len(reviewer) > 1:
_logger.warning(
"Cannot auto tier validate {}: "
"too many reviewers".format(doc)
)
continue
review_doc = doc.with_user(reviewer)
if review_doc.can_review:
sequences = review_doc._get_sequences_to_approve(reviewer)
if review.sequence in sequences:
review_doc._validate_tier(review)
review_doc._update_counter()
_logger.info("Auto tier validate on %s" % review_doc)
except Exception as e:
_logger.error("Cannot auto tier validate {}: {}".format(doc, e))