odoo-8odoo-viewone2many

Set default value while creating record from one2many field - odoo


I want to set default value for multiple fields while creating records from one2many field, in that default value will be taken from the parent model.

Odoo Model Structure

class purchase_order(models.Model):
    _inherit='purchase.order'

    cash_forecast_ids = fields.One2many(comodel_name='cash.forecast', inverse_name='purchase_order_id', string='Payment Schedules')


class cash_forecast(models.Model):
    _name='cash.forecast'

    purchase_order_id = fields.Many2one(comodel_name='purchase.order', string='PO', select=True, copy=False)
    foreign_currency_amount = fields.Float("Foreign Currency Amount", copy=False)
    currency_id = fields.Many2one(comodel_name="res.currency", string="Currency", copy=False)
    company_id = fields.Many2one(comodel_name='res.company', string='Company')

Problem : Now what I want to do is, I want to set currency and company from the purchase order while the cash forecast record will be created from the PO form view, but I don't know how to do it.

NOTE : I am not able take currency or company field related or functional because there are few other situations for which company and currency should be entered manually and in that no PO reference will be set.

PO Form View

<page string="Deliveries &amp; Invoices" position="after">
    <page string="Payment Scedule">
        <field name="cash_forecast_ids" attrs="{'readonly' : [('state','in',['done','cancel'])]}">
            <tree string="Payment Scedule" editable="bottom">
                <field name="name"/>
                <field name="cash_forecast_type_id" required="1" domain="[('add_to_po_payment_schedule','=',True)]" />
                <field name="note" />
                <field name="forecast_date" />
                <field name="period_id" required="1" />
                <field name="foreign_currency_amount" required="1" />
                <field name="currency_id" required="1" />
                <field name="purchase_order_id" invisible="1"/>
                <field name="company_id" required="1" /> 
            </tree>
        </field>
    </page>
</page>

Can any one suggest me, what should I do in that case ?


Solution

  • I got the way how to do it.

    In order to set default values directly while adding records in one2many fields, we need to set values in context with prefix default_field_name : value.

    context="{'default_currency_id' : currency_id, 'default_company_id' : company_id}"

    Note: active_id is not available while you creating new record and with that new record if you provide value in one2many model then active id(s) won't be there. It's only accessible once you save the parent record.

    Solution :

    <field name="cash_forecast_ids" context="{'default_currency_id' : currency_id, 'default_company_id' : company_id}">
        <tree string="Payment Scedule" editable="bottom">
            <field name="name"/>
            <field name="forecast_date" />
            <field name="foreign_currency_amount" required="1" />
            <field name="currency_id" domain="[('id','=',parent.currency_id)]" required="1" />
            <field name="purchase_order_id" invisible="1"/>
            <field name="company_id" domain="[('id','=',parent.company_id)]" required="1" /> 
        </tree>
    </field>
    

    If you want to add domain in fields of one2many model and in that you want to use the values of parent model then you can do it by the following way.

    <field name="company_id" domain="[('id','=',parent.company_id)]" />