class ApprovalFlow(models.Model): _name = 'approval.flow' _description = u'审批流程' def _compute_domain(self): all_cls = inspect.getmembers(sys.modules[__name__], inspect.isclass) odoo_cls = [getattr(cls[1], '_name') for cls in all_cls if cls[1].__bases__[0].__name__ == 'Model'] # 排除当前的对象 odoo_cls += [model.model for model in self.env['ir.model'].search([('transient', '=', True)])] # 排除临时对象 return [('model', 'not in', odoo_cls)] approval_cannot_run = fields.Char(u'完成后不能执行操作', help=u'审批流程完成后不能能执行的操作,修改,删除', store=True) name = fields.Char(u'名称') model_id = fields.Many2one('ir.model', u'模型', domain=_compute_domain, index=1) 如果选择完成后不能删除重写生成方法怎么写
时间: 2024-01-28 11:03:52 浏览: 187
如果您想在完成审批流程后禁止对该记录进行删除操作,可以尝试重写Odoo的“unlink”方法。您可以将以下代码添加到您的“ApprovalFlow”类中:
```python
@api.multi
def unlink(self):
for flow in self:
if flow.state != 'draft':
raise UserError(_('Cannot delete a record in approval flow.'))
return super(ApprovalFlow, self).unlink()
```
在这个新的“unlink”方法中,我们首先检查当前记录的状态是否为“draft”,如果不是,则抛出一个用户错误,阻止删除操作。如果状态为“draft”,则调用原始的“unlink”方法以正常执行删除操作。
请注意,在重写Odoo的方法时,尽量不要直接修改原始方法。相反,您应该使用Odoo的装饰器来定义新的方法,以确保您的代码可以与任何未来的Odoo版本兼容。
相关问题
class ApprovalFlow(models.Model): _name = 'approval.flow' _description = u'审批流程' def _compute_domain(self): all_cls = inspect.getmembers(sys.modules[__name__], inspect.isclass) odoo_cls = [getattr(cls[1], '_name') for cls in all_cls if cls[1].__bases__[0].__name__ == 'Model'] # 排除当前的对象 odoo_cls += [model.model for model in self.env['ir.model'].search([('transient', '=', True)])] # 排除临时对象 return [('model', 'not in', odoo_cls)] name = fields.Char(u'名称') model_id = fields.Many2one('ir.model', u'模型', domain=_compute_domain, index=1) model_name = fields.Char(related="model_id.model", string='模型名称') condition = fields.Char(u'条件', help=u'请遵循odoo的domain的写法,如:[("field_name", "=", value)]',store=True) class RokedispatchordermanagementPriceApprove(models.Model): _name = 'roke.dispatch.order.management.price.approve' _inherit = ['mail.thread', 'mail.activity.mixin'] _description = "派船单应付审核" _rec_name = "code" order_id = fields.Many2one('roke.dispatch.order.management', string='派船单', ondelete='cascade') code = fields.Char(string='单据编号', store=True, related='order_id.code') class Rokedispatchordermanagement(models.Model): _name = 'roke.dispatch.order.management' _inherit = ['mail.thread', 'mail.activity.mixin'] _description = "派船单" _rec_name = "code" client = fields.Many2one('roke.partner', string='客户', tracking=True, required=True,) department_manager = fields.Many2one('res.users', string='创建人', tracking=True, default=lambda self: self.env.user.id) box_number = fields.Char(string='箱号') shipping_companies = fields.Char(string='船公司') field_station = fields.Char(string='场站') ship_name_voyage = fields.Char(string='船名航次') port_of_discharge = fields.Char(string='卸货港') box_type = fields.Many2one('roke.box.type', string='箱型') code = fields.Char(string='单据编号', track_visibility='onchange') 派传单应付审核表提交审核在审批流程的条件里面有记录同时如果选择完成之后不能删除派船单这条审批通过的不能删除要重新写删除方法怎么写
首先,在 ApprovalFlow 类中的 _compute_domain 方法中,通过 inspect.getmembers 方法获取当前模块中所有的类,然后筛选出继承自 Model 类的类,并将其对应的模型名存储在 odoo_cls 列表中。同时,通过查询 ir.model 模型获取所有的临时对象,并将其对应的模型名也存储在 odoo_cls 列表中。最后,将所有不在 odoo_cls 列表中的模型名作为 domain 返回,以在创建 ApprovalFlow 对象时限制模型选择范围。
其次,在 RokedispatchordermanagementPriceApprove 类中,使用了 _inherit 属性继承了 mail.thread 和 mail.activity.mixin 两个类,使得该模型具有邮件和活动的功能。同时,该模型关联了 Rokedispatchordermanagement 模型,并且定义了一个 code 字段,用于存储派船单的单据编号。
最后,在 Rokedispatchordermanagement 类中,定义了派船单的各个字段,其中包括一个 code 字段用于存储单据编号。如果要在审批通过后禁止删除,可以在 RokedispatchordermanagementPriceApprove 类中重载 unlink 方法,在其中判断当前记录是否已经通过审批,如果通过审批则不允许删除,否则可以删除。代码示例如下:
```python
class RokedispatchordermanagementPriceApprove(models.Model):
...
def unlink(self):
for rec in self:
if rec.state == 'approved':
raise UserError("已通过审批的记录不能删除!")
return super(RokedispatchordermanagementPriceApprove, self).unlink()
```
需要注意的是,在上述代码中,假设该模型有一个 state 字段用于记录当前记录的状态,当 state 等于 approved 时表示已经通过审批。如果没有 state 字段,需要根据实际情况进行修改。另外,如果其他模型也需要在审批通过后禁止删除,可以类似地在对应的模型中重载 unlink 方法。
class ApprovalFlow(models.Model): _name = 'approval.flow' _description = u'审批流程' approval_cannot_run_id = fields.Many2many('execute.function.not.list', 'function_not_rel', u'完成后不能执行操作', help=u'审批流程完成后不能能执行的操作,修改,删除') class Rokedispatchordermanagement(models.Model): _name = 'roke.dispatch.order.management' _inherit = ['mail.thread', 'mail.activity.mixin'] _description = "派船单" _rec_name = "code" client = fields.Many2one('roke.partner', string='客户', tracking=True, required=True, ) department_manager = fields.Many2one('res.users', string='创建人', tracking=True, default=lambda self: self.env.user.id) box_number = fields.Char(string='箱号') shipping_companies = fields.Char(string='船公司') field_station = fields.Char(string='场站') ship_name_voyage = fields.Char(string='船名航次') port_of_discharge = fields.Char(string='卸货港') box_type = fields.Many2one('roke.box.type', string='箱型') code = fields.Char(string='单据编号', track_visibility='onchange') def unlink(self): audit = self.env['approval.flow'] for record in audit: if record.approval_can_run_id == '删除': raise UserError("不能删除") return super(Rokedispatchordermanagement, self).unlink() approval.flow模型在另一个文件中在roke.dispatch.order.management重新删除方法不能删除approval_can_run_id值等于删除的
根据你的代码,我理解您想要在删除Rokedispatchordermanagement模型的记录之前,检查approval_can_run_id值是否等于“删除”,如果是,则不允许删除。但是,您的代码中有几个错误。
首先,您需要将“unlink”方法的重写代码放在“Rokedispatchordermanagement”模型中,而不是在“approval.flow”模型中。
其次,您应该在每个记录上检查approval_can_run_id的值,而不是在“approval.flow”模型上进行操作。您可以使用“self”关键字来引用当前记录。
最后,您需要使用“in”运算符来检查approval_can_run_id是否包含“删除”值,而不是使用“==”运算符来比较。
下面是更正后的代码:
```
class Rokedispatchordermanagement(models.Model):
_name = 'roke.dispatch.order.management'
_inherit = ['mail.thread', 'mail.activity.mixin']
_description = "派船单"
_rec_name = "code"
client = fields.Many2one('roke.partner', string='客户', tracking=True, required=True)
department_manager = fields.Many2one('res.users', string='创建人', tracking=True, default=lambda self: self.env.user.id)
box_number = fields.Char(string='箱号')
shipping_companies = fields.Char(string='船公司')
field_station = fields.Char(string='场站')
ship_name_voyage = fields.Char(string='船名航次')
port_of_discharge = fields.Char(string='卸货港')
box_type = fields.Many2one('roke.box.type', string='箱型')
code = fields.Char(string='单据编号', track_visibility='onchange')
def unlink(self):
for record in self:
if '删除' in record.approval_can_run_id.mapped('name'):
raise UserError("不能删除")
return super(Rokedispatchordermanagement, self).unlink()
```
这个更正后的代码应该可以达到您想要的效果。
阅读全文