python - 如何使树视图和表单视图中的特定记录在odoo中不可编辑?
问题描述
我有一个带有“状态”(选择)属性的实体法案(西班牙语 factura)。是否可以使用 (state='pendiente' 或 state='pagad') 将“Bill”中的所有记录设为只读?这意味着当用户单击树视图上的特定账单时,他无法编辑任何“账单”字段。这是我的代码
class PlanificacionFactura(models.Model):
_name = 'utepda_planificacion.factura'
_rec_name = 'numero'
_description = 'Factura'
_inherit = ['mail.thread', 'mail.activity.mixin']
fecha = fields.Date(string='Fecha')
monto_total = fields.Monetary(string='Monto a pagar', currency_field='currency_id')
pago_acumulado = fields.Monetary(compute='_compute_pago_acumulado', string='Pago Acumulado' ,currency_field='currency_id')
currency_id = fields.Many2one('res.currency', string='Moneda', required=True, domain=[('name', 'in', ('USD', 'DOP'))] , default=lambda self: self.env.ref("base.DOP"))
pago_pendiente = fields.Monetary(compute='_compute_pago_pendiente', string='Pendiente de pago', currency_field='currency_id')
state = fields.Selection([
('creado', 'Creada'),
('pendiente','Pagada parcialmente'),
('pagado','Pagada')
], string='Estado', default='pagado', compute='_compute_state' )
@api.depends('pago_acumulado','monto_total')
def _compute_state(self):
for record in self:
if record.pago_acumulado > 0 and record.pago_acumulado < record.monto_total:
record.state='pendiente'
elif record.pago_acumulado == record.monto_total:
record.state = 'pagado'
else:
record.state='creado'
@api.model
def fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False):
res = super(PlanificacionFactura, self).fields_view_get(view_id=view_id, view_type=view_type, toolbar=toolbar, submenu=submenu)
if view_type == 'form':
doc = etree.XML(res['arch'])
for node in doc.xpath("//field[@name='fecha']"):
node.set('options', "{'datepicker': {'maxDate': '%s'}}" % fields.Date.today().strftime(DEFAULT_SERVER_DATE_FORMAT))
if 'params' in self.env.context and 'id' in self.env.context['params']:
values = self.search_read([('id', '=', self.env.context['params']['id'])], fields=['state'])
if values[0]['state'] == 'pagado':
# Disable edit mode on form view based on `state` field
for node in doc.xpath("//form"):
node.set('edit', '0')
res['arch'] = etree.tostring(doc)
return res
我在状态栏中使状态可见
<header>
<field name="state" widget="statusbar"/>
</header>
解决方案
您可以在表单加载后立即覆盖FormRenderer
以检查该字段。state
您可以将条件指定为域并使用web.Domain类使用当前记录字段值来计算它。
var FormRenderer = require('web.FormRenderer');
var Domain = require("web.Domain");
FormRenderer.include({
autofocus: function () {
this.show_hide_edit_button();
return this._super();
},
show_hide_edit_button : function () {
if( 'disable_edit_mode' in this.arch.attrs && this.arch.attrs.disable_edit_mode) {
var domain = Domain.prototype.stringToArray(this.arch.attrs.disable_edit_mode)
var button = $(".o_form_button_edit");
if (button) {
var hide_edit = new Domain(domain).compute(this.state.data);
// If you just need to disable edit button
// button.prop('disabled', hide_edit);
// button is shown if the parameter is true and hidden if it is false
button.toggle(!hide_edit);
}
}
},
});
使用disable_edit_mode
属性设置域条件:
<form disable_edit_mode="[('state', '=', 'pagado')]">
请参阅在资产包中添加文件以将上述代码添加到您的模块中。
推荐阅读
- sql-server - 如果 sysname 不能为 null,如何在此 SQL Server 系统存储过程中 sysname = null?
- excel - 如何使用 Excel 中一个选项卡上的列表在另一个选项卡中创建新列?
- ios - 使 NSManagedObject 可编码并存储图像数据
- python - 在 tkinter 中使用 if 语句进行绘图,而不是执行
- javascript - 如何使用 Fancytree 删除文件内容?
- python - Python 中带有色调颜色图和图例的 3D 散点图
- javascript - Chrome 扩展代码在弹出窗口中打开和关闭我的扩展
- python - 多元多项式回归
- angular - Angular表单提交不工作
- python - 获取 API 数据并在 GUI 窗口中显示