Hola,
He creado un campo que se encuentra dentro de las lineas de ventas heredando la clase sale.order.line. A este campo le he asignado una condición de sólo lectura mediante atributo readonly en el xml, y a su vez es calculado segun otra un metodo onchange en el py.
El problema está en que al modificar la linea de venta el campo calculado no se guarda en la base de datos.
Por lo que he podido leer al respecto, odoo usa los campos readonly con fines meramente informativos, por lo que no los almacena en la base de datos, y he leido varias alternativas para solucionar mi problema:
Sobrescribir los metodos
create o
write de la clase padre y, como alternativa, usar "
web_readonly_bypass".
He intentado esas soluciones pero no he sido capaz de solucionarlo.
¿Sabriais que hago mal,o si hay alguna otra solucion?
Os adjunto el código para explicarlo mejor:
Cod Python
class SaleOrderLineExt(models.Model):
_inherit ='sale.order.line'
tipo_coste = fields.Selection([
('a','A'),
('b','B'),
('c','C'),
('d','D'),
('e','E'),
('f','F'),
('g','G')])
coste_bruto = fields.Float(
string = "Coste bruto")
prueba_log_tipo_coste = fields.Boolean()
@api.one
@api.onchange('tipo_coste')
def _calcular_coste_bruto(self):
if self.tipo_coste == 'c' or self.tipo_coste == 'd' or self.tipo_coste == 'e':
self.prueba_log_tipo_coste = True
else:
self.prueba_log_tipo_coste = False
if self.tipo_coste == 'a' or self.tipo_coste == 'b':
self.coste_bruto = self.product_id.standard_price
elif self.tipo_coste == 'c':
self.coste_bruto = 10
elif self.tipo_coste == 'd':
self.coste_bruto = 20
elif self.tipo_coste == 'e':
self.coste_bruto = 30
else:
self.coste_bruto = 0
@api.model
def create(self, vals):
if self.tipo_coste == 'c':
vals['coste_bruto'] = 10
if self.tipo_coste == 'd':
vals['coste_bruto'] = 20
if self.tipo_coste == 'e':
vals['coste_bruto'] = 30
return super(sale_order_line, self).create(vals)
@api.multi
def write(self, vals):
if self.tipo_coste == 'c':
vals['coste_bruto'] = 10
if self.tipo_coste == 'd':
vals['coste_bruto'] = 20
if self.tipo_coste == 'e':
vals['coste_bruto'] = 30
return super(sale_order_line, self).write(vals)
Vistas xml
<record model="ir.ui.view" id="sale_order_ext_form">
<field name="name">sale.order.ext.form</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form"/>
<field name="arch" type="xml">
<data>
<xpath expr="//notebook/page/field[@name='order_line']/tree[@string='Sales Order Lines']" position="replace">
<tree string="Sales Order Lines" editable="bottom">
<field name="coste_bruto" attrs="{'readonly':[('prueba_log_tipo_coste','=',True)]}"/>
...
...
Saludos