ODOO在10版本之后就删除了workflow。在11、12代码里,可以发现了其他实现工作流的方式。
拿PLM的工程变更单为例。
在每个阶段,我们都可以配置多个审批用户,而批准类型为三种:批准,但审批是可选的;必须批准;仅备注。
很好奇。看看代码。
阶段的对象为“mrp.eco.stage”:
class MrpEcoStage(models.Model):
_name = 'mrp.eco.stage'
_description = 'ECO Stage'
_order = "sequence, id"
_fold_name = 'folded'
...
approval_template_ids = fields.One2many('mrp.eco.approval.template', 'stage_id', 'Approvals')
...
审核的对象“mrp.eco.approval.template”
class MrpEcoApprovalTemplate(models.Model):
_name = "mrp.eco.approval.template"
_order = "sequence"
_description = 'ECO Approval Template'
name = fields.Char('Role', required=True)
...
# 三种审核类型:
approval_type = fields.Selection([
('optional', 'Approves, but the approval is optional'),
('mandatory', 'Is required to approve'),
('comment', 'Comments only')], 'Approval Type',
default='mandatory', required=True)
user_ids = fields.Many2many('res.users', string='Users', required=True)
stage_id = fields.Many2one('mrp.eco.stage', 'Stage', required=True)
...
ECO里会有:
class MrpEco(models.Model):
_name = 'mrp.eco'
_description = 'Engineering Change Order (ECO)'
_inherit = ['mail.thread', 'mail.activity.mixin']
...
stage_id = fields.Many2one(
'mrp.eco.stage', 'Stage', ondelete='restrict', copy=False, domain="[('type_id', '=', type_id)]",
group_expand='_read_group_stage_ids', track_visibility='onchange',
default=lambda self: self.env['mrp.eco.stage'].search([('type_id', '=', self._context.get('default_type_id'))], limit=1))
...
approval_ids = fields.One2many('mrp.eco.approval', 'eco_id', 'Approvals', help='Approvals by stage')
...
mrp.eco.approval套了一层template:
class MrpEcoApproval(models.Model):
_name = "mrp.eco.approval"
_description = 'ECO Approval'
eco_id = fields.Many2one(
'mrp.eco', 'ECO',
ondelete='cascade', required=True)
approval_template_id = fields.Many2one(
'mrp.eco.approval.template', 'Template',
ondelete='cascade', required=True)
name = fields.Char('Role', related='approval_template_id.name', store=True, readonly=False)
user_id = fields.Many2one(
'res.users', 'Approved by')
required_user_ids = fields.Many2many(
'res.users', string='Requested Users', related='approval_template_id.user_ids', readonly=False)
template_stage_id = fields.Many2one(
'mrp.eco.stage', 'Approval Stage',
related='approval_template_id.stage_id', store=True, readonly=False)
eco_stage_id = fields.Many2one(
'mrp.eco.stage', 'ECO Stage',
related='eco_id.stage_id', store=True, readonly=False)
status = fields.Selection([
('none', 'Not Yet'),
('comment', 'Commented'),
('approved', 'Approved'),
('rejected', 'Rejected')], string='Status',
default='none', required=True)
is_approved = fields.Boolean(
compute='_compute_is_approved', store=True)
is_rejected = fields.Boolean(
compute='_compute_is_rejected', store=True)
关键在ECO这里:
...
@api.multi
@api.depends('approval_ids')
def _compute_user_can_approve(self):
approvals = self.env['mrp.eco.approval'].search([
('eco_id', 'in', self.ids),
('status', 'not in', ['approved']),
('template_stage_id', 'in', self.mapped('stage_id').ids),
('approval_template_id.approval_type', 'in', ('mandatory', 'optional')),
('required_user_ids', 'in', self.env.uid)])
to_approve_eco_ids = approvals.mapped('eco_id').ids
for eco in self:
eco.user_can_approve = eco.id in to_approve_eco_ids.
...
@api.multi
@api.depends('approval_ids')
def _compute_user_can_reject(self):
approvals = self.env['mrp.eco.approval'].search([
('eco_id', 'in', self.ids),
('status', 'not in', ['rejected']),
('template_stage_id', 'in', self.mapped('stage_id').ids),
('approval_template_id.approval_type', 'in', ('mandatory', 'optional')),
('required_user_ids', 'in', self.env.uid)])
to_reject_eco_ids = approvals.mapped('eco_id').ids
for eco in self:
self.user_can_reject = eco.id in to_reject_eco_ids
and something with the views.
...

2020-02-23 12:46:52