95 lines
4.4 KiB
Python
95 lines
4.4 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
from odoo.tools.json import scriptsafe as json_scriptsafe
|
|
|
|
from odoo import api, exceptions, fields, models, _
|
|
|
|
from .base_automation import get_webhook_request_payload
|
|
|
|
class ServerAction(models.Model):
|
|
_inherit = "ir.actions.server"
|
|
|
|
name = fields.Char(compute='_compute_name', store=True, readonly=False)
|
|
|
|
usage = fields.Selection(selection_add=[
|
|
('base_automation', 'Automation Rule')
|
|
], ondelete={'base_automation': 'cascade'})
|
|
base_automation_id = fields.Many2one('base.automation', string='Automation Rule', ondelete='cascade')
|
|
|
|
@api.constrains('model_id', 'base_automation_id')
|
|
def _check_model_coherency_with_automation(self):
|
|
for action in self.filtered('base_automation_id'):
|
|
if action.model_id != action.base_automation_id.model_id:
|
|
raise exceptions.ValidationError(
|
|
_("Model of action %(action_name)s should match the one from automated rule %(rule_name)s.",
|
|
action_name=action.name,
|
|
rule_name=action.base_automation_id.name
|
|
)
|
|
)
|
|
|
|
@api.depends('usage')
|
|
def _compute_available_model_ids(self):
|
|
""" Stricter model limit: based on automation rule """
|
|
super()._compute_available_model_ids()
|
|
rule_based = self.filtered(lambda action: action.usage == 'base_automation')
|
|
for action in rule_based:
|
|
rule_model = action.base_automation_id.model_id
|
|
action.available_model_ids = rule_model.ids if rule_model in action.available_model_ids else []
|
|
|
|
@api.depends('state', 'update_field_id', 'crud_model_id', 'value', 'evaluation_type', 'template_id', 'partner_ids', 'activity_summary', 'sms_template_id', 'webhook_url')
|
|
def _compute_name(self):
|
|
''' Only server actions linked to a base_automation get an automatic name. '''
|
|
to_update = self.filtered('base_automation_id')
|
|
for action in to_update:
|
|
match action.state:
|
|
case 'object_write':
|
|
action_type = _("Update") if action.evaluation_type == 'value' else _("Compute")
|
|
action.name = f"{action_type} {action._stringify_path()}"
|
|
case 'object_create':
|
|
action.name = _(
|
|
"Create %(model_name)s with name %(value)s",
|
|
model_name=action.crud_model_id.name,
|
|
value=action.value
|
|
)
|
|
case 'webhook':
|
|
action.name = _("Send Webhook Notification")
|
|
case 'sms':
|
|
action.name = _(
|
|
'Send SMS: %(template_name)s',
|
|
template_name=action.sms_template_id.name
|
|
)
|
|
case 'mail_post':
|
|
action.name = _(
|
|
'Send email: %(template_name)s',
|
|
template_name=action.template_id.name
|
|
)
|
|
case 'followers':
|
|
action.name = _(
|
|
'Add followers: %(partner_names)s',
|
|
partner_names=', '.join(action.partner_ids.mapped('name'))
|
|
)
|
|
case 'remove_followers':
|
|
action.name = _(
|
|
'Remove followers: %(partner_names)s',
|
|
partner_names=', '.join(action.partner_ids.mapped('name'))
|
|
)
|
|
case 'next_activity':
|
|
action.name = _(
|
|
'Create activity: %(activity_name)s',
|
|
activity_name=action.activity_summary or action.activity_type_id.name
|
|
)
|
|
case other:
|
|
action.name = dict(action._fields['state']._description_selection(self.env))[action.state]
|
|
# Not sure, but IIRC assignation is mandatory and I don't want the name to be reset by accident
|
|
for action in (self - to_update):
|
|
action.name = action.name or ''
|
|
|
|
def _get_eval_context(self, action=None):
|
|
eval_context = super()._get_eval_context(action)
|
|
if action and action.state == "code":
|
|
eval_context['json'] = json_scriptsafe
|
|
payload = get_webhook_request_payload()
|
|
if payload:
|
|
eval_context["payload"] = payload
|
|
return eval_context
|