I Have an one one2many field in Sale Order Line model in that one2many field I have a three fields in them. When I am creating a new sale order record and I am choosing a customer then I am clicking as add an item in Order Lines Page and I am choosing one product and below the product field I added one2many field and I am given the values for them then in tree view itself ... then I am save and close the one2many order lines page record.
Before I am savings the sale order record I am just changing the customer value then I am seeing the product value in that I given one2many record values are false but the record created is showing only that the record inside values get false.
I am having major issue in this...
Is there any bug in the sale order model for the version odoo10..
How can I solve this..?
https://youtu.be/By_B6uOviSU
Here above I given a youtube link that I taken demo for the one2many error.
Here Below I given a source code that I developed in sale order model
sale.py
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import api, fields, models, _
class SaleMandatoryAddons(models.Model):
_name = "sale.mandatory.addons"
_description = "Mandatory Addons"
sale_order_line_id = fields.Many2one('sale.order.line', 'Sale Order Line')
number = fields.Integer('Sequence', required=True)
product_id = fields.Many2one('product.product', 'Item Name', required=True)
quantity = fields.Float('Recommended Quantity', required=True, digits=dp.get_precision('Product Unit of Measure'))
class SaleOptionalAddons(models.Model):
_name = "sale.optional.addons"
_description = "Optional Addons"
sale_order_line_id = fields.Many2one('sale.order.line', 'Sale Order Line')
number = fields.Integer('Sequence', required=True)
product_id = fields.Many2one('product.product', 'Item Name', required=True)
quantity = fields.Float('Actual Recommended Quantity', required=True, digits=dp.get_precision('Product Unit of Measure'))
class SaleOrderLine(models.Model):
_name = 'sale.order.line'
_inherit = 'sale.order.line'
_description = 'Sales Order Line'
mandatory_addons = fields.One2many('sale.mandatory.addons', 'sale_order_line_id', 'Mandatory Addons', copy=True)
optional_addons = fields.One2many('sale.optional.addons', 'sale_order_line_id', 'Optional Addons', copy=True)
sale_order_view.xml
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="view_quotation_form" model="ir.ui.view">
<field name="name">sale.order.form</field>
<field name="model">sale.order</field>
<field name="arch" type="xml">
<form string="Sales Order" class="o_sale_order">
<header>
<button name="%(sale.action_view_sale_advance_payment_inv)d" string="Create Invoice"
type="action" class="btn-primary"
attrs="{'invisible': [('invoice_status', '!=', 'to invoice')]}"/>
<button name="%(sale.action_view_sale_advance_payment_inv)d" string="Create Invoice"
type="action" context="{'default_advance_payment_method': 'percentage'}"
attrs="{'invisible': ['|',('invoice_status', '!=', 'no'), ('state', '!=', 'sale')]}"/>
<button name="action_quotation_send" string="Send by Email" type="object" states="draft" class="btn-primary"/>
<button name="print_quotation" string="Print" type="object" states="draft" class="btn-primary"/>
<button name="action_confirm" states="sent" string="Confirm Sale" class="btn-primary o_sale_confirm" type="object" />
<button name="action_confirm" states="draft" string="Confirm Sale" class="o_sale_confirm" type="object" />
<button name="print_quotation" string="Print" type="object" states="sent,sale"/>
<button name="action_quotation_send" string="Send by Email" type="object" states="sent,sale"/>
<button name="action_cancel" states="draft,sent,sale" type="object" string="Cancel"/>
<button name="action_draft" states="cancel" type="object" string="Set to Quotation"/>
<button name="action_done" type="object" string="Lock" states="sale"
help="If the sale is locked, you can not modify it anymore. However, you will still be able to invoice or deliver."/>
<field name="state" widget="statusbar" statusbar_visible="draft,sent,sale"/>
</header>
<sheet>
<div class="oe_button_box" name="button_box">
<button name="action_view_invoice"
type="object"
class="oe_stat_button"
icon="fa-pencil-square-o"
attrs="{'invisible': [('invoice_count', '=', 0)]}">
<field name="invoice_count" widget="statinfo" string="Invoices"/>
</button>
</div>
<div class="oe_title">
<h1>
<field name="name" readonly="1"/>
</h1>
</div>
<group>
<group>
<field name="partner_id" domain="[('customer','=',True)]" context="{'search_default_customer':1, 'show_address': 1}" options='{"always_reload": True}'/>
<field name="partner_invoice_id" groups="sale.group_delivery_invoice_address" context="{'default_type':'invoice'}"/>
<field name="partner_shipping_id" groups="sale.group_delivery_invoice_address" context="{'default_type':'delivery'}"/>
</group>
<group>
<field name="date_order" attrs="{'invisible': [('state', 'in', ['sale', 'done', 'cancel'])]}"/>
<field name="validity_date" attrs="{'invisible': [('state', 'in', ['sale', 'done'])]}"/>
<field name="confirmation_date" attrs="{'invisible': [('state', 'in', ['draft', 'sent', 'cancel'])]}"/>
<field name="pricelist_id" groups="product.group_sale_pricelist"/>
<field name="currency_id" invisible="1"/>
<field name="payment_term_id" options="{'no_create': True}"/>
</group>
</group>
<notebook>
<page string="Order Lines">
<field name="order_line" mode="tree,kanban"
attrs="{'readonly': [('state', 'in', ('done','cancel'))]}">
<form string="Sales Order Lines">
<group>
<group>
<field name="product_id"
context="{'partner_id':parent.partner_id, 'quantity':product_uom_qty, 'pricelist':parent.pricelist_id, 'uom':product_uom, 'company_id': parent.company_id}"
attrs="{'readonly': ['|', ('qty_invoiced', '>', 0), ('procurement_ids', '!=', [])]}"
/>
<field name="layout_category_id" groups="sale.group_sale_layout"/>
<field name="invoice_status" invisible="1"/>
<field name="qty_to_invoice" invisible="1"/>
<field name="qty_delivered_updateable" invisible="1"/>
<field name="procurement_ids" invisible="1"/>
<field name="price_subtotal" invisible="1"/>
<label for="product_uom_qty" string="Ordered Quantity"/>
<div>
<field
context="{'partner_id':parent.partner_id, 'quantity':product_uom_qty, 'pricelist':parent.pricelist_id, 'uom':product_uom, 'uom_qty_change':True, 'company_id': parent.company_id}"
name="product_uom_qty" class="oe_inline"/>
<field name="product_uom" groups="product.group_uom" class="oe_inline oe_no_button"
attrs="{'readonly': [('state', 'in', ('sale','done', 'cancel'))]}"/>
</div>
<label for="qty_delivered" string="Delivered Quantity" invisible="context.get('hide_sale')"/>
<div invisible="context.get('hide_sale')">
<field name="qty_delivered" attrs="{'readonly': [('qty_delivered_updateable', '=', False)]}"/>
</div>
<label for="qty_invoiced" string="Invoiced Quantity" invisible="context.get('hide_sale')"/>
<div invisible="context.get('hide_sale')">
<field name="qty_invoiced" invisible="context.get('hide_sale')"/>
</div>
<field name="price_unit"/>
<label for="discount" groups="sale.group_discount_per_so_line"/>
<div name="discount" groups="sale.group_discount_per_so_line">
<field name="discount" class="oe_inline"/> %%
</div>
</group>
<group>
<field name="tax_id" widget="many2many_tags" domain="[('type_tax_use','=','sale'),('company_id','=',parent.company_id)]"
attrs="{'readonly': [('qty_invoiced', '>', 0)]}"/>
<label for="customer_lead"/>
<div>
<field name="customer_lead" class="oe_inline"/> days
</div>
<label for="analytic_tag_ids"/>
<div>
<field name="analytic_tag_ids" widget="many2many_tags"/>
</div>
</group>
</group>
<notebook>
<page string="Optional addons" name="addons_optional"
>
<field name="optional_addons"
>
<form>
<group>
<field name="number" />
<field name="product_id" />
<field name="quantity"/>
</group>
</form>
<tree editable="bottom">
<field name="number" />
<field name="product_id" />
<field name="quantity"
string="Quantity"/>
</tree>
</field>
</page>
<page string="Mandatory addons" name="addons_mandatory"
>
<field name="mandatory_addons"
>
<tree editable="bottom">
<field name="number" />
<field name="product_id" />
<field name="quantity" />
</tree>
<form>
<group>
<field name="number"/>
<field name="product_id"/>
<field name="quantity"/>
</group>
</form>
</field>
</page>
</notebook>
<label for="name"/>
<field name="name"/>
<div groups="base.group_no_one">
<label for="invoice_lines"/>
<field name="invoice_lines"/>
</div>
<field name="state" invisible="1"/>
</form>
<tree string="Sales Order Lines" decoration-info="invoice_status=='to invoice'">
<field name="product_id"
attrs="{'readonly': ['|', ('qty_invoiced', '>', 0), ('procurement_ids', '!=', [])]}"
context="{'partner_id':parent.partner_id, 'quantity':product_uom_qty, 'pricelist':parent.pricelist_id, 'uom':product_uom, 'company_id': parent.company_id}"
/>
<field name="layout_category_id" groups="sale.group_sale_layout"/>
<field name="name"/>
<field name="product_uom_qty"
string="Ordered Qty"
context="{'partner_id':parent.partner_id, 'quantity':product_uom_qty, 'pricelist':parent.pricelist_id, 'uom':product_uom, 'company_id': parent.company_id}"
/>
<field name="qty_delivered" invisible="context.get('hide_sale')"
attrs="{'readonly': [('qty_delivered_updateable', '=', False)]}"/>
<field name="qty_invoiced"
invisible="context.get('hide_sale')"/>
<field name="qty_to_invoice" invisible="1"/>
<field name="product_uom"
attrs="{'readonly': [('state', 'in', ('sale','done', 'cancel'))]}"
context="{'company_id': parent.company_id}"
groups="product.group_uom" options='{"no_open": True}'/>
<field name="analytic_tag_ids" groups="analytic.group_analytic_accounting" widget="many2many_tags"/>
<field name="price_unit"
attrs="{'readonly': [('qty_invoiced', '>', 0)]}"/>
<field name="tax_id" widget="many2many_tags" domain="[('type_tax_use','=','sale'),('company_id','=',parent.company_id)]"
attrs="{'readonly': [('qty_invoiced', '>', 0)]}"/>
<field name="discount" groups="sale.group_discount_per_so_line"/>
<field name="price_subtotal" widget="monetary" groups="sale.group_show_price_subtotal"/>
<field name="price_total" widget="monetary" groups="sale.group_show_price_total"/>
<field name="qty_delivered_updateable" invisible="1"/>
<field name="procurement_ids" invisible="1"/>
<field name="state" invisible="1"/>
<field name="invoice_status" invisible="1"/>
<field name="customer_lead" invisible="1"/>
<field name="currency_id" invisible="1"/>
</tree>
<kanban class="o_kanban_mobile">
<field name="product_id"/>
<field name="product_uom_qty"/>
<field name="product_uom" groups="product.group_uom"/>
<field name="price_subtotal"/>
<templates>
<t t-name="kanban-box">
<div t-attf-class="oe_kanban_card oe_kanban_global_click">
<div class="row">
<div class="col-xs-12">
<strong><span><t t-esc="record.product_id.value"/></span></strong>
</div>
</div>
<div class="row">
<div class="col-xs-8 text-muted">
<span><t t-esc="record.product_uom_qty.value"/> <t t-esc="record.product_uom.value"/></span>
</div>
<div class="col-xs-4 text-muted">
<span class="pull-right text-right"><t t-esc="record.price_subtotal.value"/></span>
</div>
</div>
</div>
</t>
</templates>
</kanban>
</field>
<group class="oe_subtotal_footer oe_right" colspan="2" name="sale_total">
<field name="amount_untaxed" widget='monetary' options="{'currency_field': 'currency_id'}"/>
<field name="amount_tax" widget='monetary' options="{'currency_field': 'currency_id'}"/>
<div class="oe_subtotal_footer_separator oe_inline o_td_label">
<label for="amount_total" />
<button name="button_dummy"
states="draft,sent" string="(update)" type="object" class="oe_edit_only oe_link"/>
</div>
<field name="amount_total" nolabel="1" class="oe_subtotal_footer_separator" widget='monetary' options="{'currency_field': 'currency_id'}"/>
</group>
<field name="note" class="oe_inline" placeholder="Setup default terms and conditions in your company settings."/>
<div class="oe_clear"/>
</page>
<page string="Other Information">
<group>
<group string="Sales Information" name="sales_person">
<field name="user_id"/>
<field name="team_id" options="{'no_create': True}"/>
<field name="client_order_ref"/>
<field name="company_id" options="{'no_create': True}" groups="base.group_multi_company"/>
<field name="project_id" attrs="{'invisible':[('state','=','sale')]}" context="{'default_partner_id':partner_invoice_id, 'default_name':name}" groups="analytic.group_analytic_accounting"/>
<field name="related_project_id"
attrs="{'readonly': ['|',('project_id','!=',False),('invoice_count','!=',0),('state','=','sale')],'invisible':[('state','!=','sale')]}"
context="{'default_partner_id':partner_invoice_id, 'default_name':name}"
groups="analytic.group_analytic_accounting"/>
</group>
<group name="sale_pay" string="Invoicing">
<field name="fiscal_position_id" options="{'no_create': True}"/>
<field name="invoice_status"
attrs="{'invisible': [('state', 'not in', ('sale','done'))]}"/>
</group>
<group string="Reporting" name="technical" groups="base.group_no_one">
<field groups="base.group_no_one" name="origin"/>
</group>
</group>
</page>
</notebook>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers"/>
<field name="message_ids" widget="mail_thread"/>
</div>
</form>
</field>
</record>
<record id="action_quotations_form" model="ir.actions.act_window.view">
<field eval="1" name="sequence"/>
<field name="view_mode">form</field>
<field name="view_id" ref="view_quotation_form"/>
<field name="act_window_id" ref="sale.action_quotations"/>
</record>
<record id="action_quotations_tree" model="ir.actions.act_window.view">
<field eval="0" name="sequence"/>
<field name="view_mode">tree</field>
<field name="view_id" ref="sale.view_quotation_tree"/>
<field name="act_window_id" ref="sale.action_quotations"/>
</record>
<record id="view_sale_optional_addons_form" model="ir.ui.view">
<field name="name">sale.optional.addons.form</field>
<field name="model">sale.optional.addons</field>
<field name="arch" type="xml">
<form string="Sales Optional Addons">
<sheet>
<group>
<field name="number" />
<field name="product_id" />
<field name="quantity"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="view_sale_optional_addons_tree" model="ir.ui.view">
<field name="name">sale.optional.addons.tree</field>
<field name="model">sale.optional.addons</field>
<field name="arch" type="xml">
<tree string="Sales Optional Addons">
<field name="number" />
<field name="product_id" />
<field name="quantity"/>
</tree>
</field>
</record>
</odoo>
That's simply too much.