def write(self, values): lines = False changed_lines = False if 'product_uom_qty' in values: precision = self.env['decimal.precision'].precision_get( 'Product Unit of Measure') lines = self.filtered( lambda r: r.state == 'sale' and float_compare( r.product_uom_qty, values['product_uom_qty'], precision_digits=precision) == -1) changed_lines = self.filtered( lambda r: r.state == 'sale' and float_compare( r.product_uom_qty, values['product_uom_qty'], precision_digits=precision) != 0) if changed_lines: orders = self.mapped('order_id') for order in orders: order_lines = changed_lines.filtered( lambda x: x.order_id == order) msg = "" if any([ values['product_uom_qty'] < x.product_uom_qty for x in order_lines ]): msg += "<b>" + _( 'The ordered quantity has been decreased. Do not forget to take it into account on your invoices and delivery orders.' ) + '</b>' msg += "<ul>" for line in order_lines: msg += "<li> %s:" % (line.product_id.display_name, ) msg += "<br/>" + _( "Ordered Quantity") + ": %s -> %s <br/>" % ( line.product_uom_qty, float(values['product_uom_qty']), ) if line.product_id.type in ('consu', 'product'): msg += _("Delivered Quantity") + ": %s <br/>" % ( line.qty_delivered, ) msg += _("Invoiced Quantity") + ": %s <br/>" % ( line.qty_invoiced, ) msg += "</ul>" order.message_post(body=msg) # Prevent writing on a locked SO. protected_fields = self._get_protected_fields() if 'done' in self.mapped('order_id.state') and any( f in values.keys() for f in protected_fields): fields = self.env['ir.model.fields'].search([ ('name', 'in', protected_fields), ('model', '=', self._name) ]) raise UserError( _('It is forbidden to modify the following fields in a locked order:\n%s' ) % '\n'.join(fields.mapped('field_description'))) result = super(SaleOrderLine, self).write(values) if lines: lines._action_procurement_create() return result
def write(self, values): if 'display_type' in values and self.filtered(lambda line: line.display_type != values.get('display_type')): raise UserError(_("You cannot change the type of a sale order line. Instead you should delete the current line and create a new line of the proper type.")) if 'product_uom_qty' in values: precision = self.env['decimal.precision'].precision_get('Product Unit of Measure') self.filtered( lambda r: r.state == 'sale' and float_compare(r.product_uom_qty, values['product_uom_qty'], precision_digits=precision) != 0)._update_line_quantity(values) # Prevent writing on a locked SO. protected_fields = self._get_protected_fields() if 'done' in self.mapped('state') and any(f in values.keys() for f in protected_fields): protected_fields_modified = list(set(protected_fields) & set(values.keys())) fields = self.env['ir.model.fields'].search([ ('name', 'in', protected_fields_modified), ('model', '=', self._name) ]) raise UserError( _('It is forbidden to modify the following fields in a locked order:\n%s') % '\n'.join(fields.mapped('field_description')) ) return super().write(values)
def write(self, values): if 'product_uom_qty' in values: precision = self.env['decimal.precision'].precision_get( 'Product Unit of Measure') self.filtered(lambda r: r.state == 'rent' and float_compare( r.product_uom_qty, values['product_uom_qty'], precision_digits=precision) != 0)._update_line_quantity(values) # Prevent writing on a locked SO. protected_fields = self._get_protected_fields() if 'done' in self.mapped('order_id.state') and any( f in values.keys() for f in protected_fields): protected_fields_modified = list( set(protected_fields) & set(values.keys())) fields = self.env['ir.model.fields'].search([ ('name', 'in', protected_fields_modified), ('model', '=', self._name) ]) raise UserError( _('It is forbidden to modify the following fields in a locked order:\n%s' ) % '\n'.join(fields.mapped('field_description'))) result = super(odoolocOrderLine, self).write(values) return result