I have a many2one field like this
state = fields.Many2one ("ags.traffic.operation.state")
state has the following fields
name = fields.Char
sequence = fields.Integer
type = fields.Selection
in my view i have
<field name = "state" widget = "statusbar" clickable = "True" / >
how can i access those fields to set a default value?
if you want to define the field that gets shown in the drop-down in your view in your model define _rec_name this tells odoo to display that field (in a drop down or in a many2many tag field) when a many2one or one2one relationship is created between that model and another model. for example if you want the sequence number to display in the drop down just set
_recname = 'sequence'
but by default odoo checks the model's field and if it finds a name field (just like you have defined in your model). it uses that as the default display name.
if you want to search records in odoo you can use the search method. please see the documentation for more information about the odoo ORM
https://www.odoo.com/documentation/8.0/reference/orm.html#openerp.models.Model.browse
search(args[, offset=0][, limit=None][, order=None][, count=False])
but a typical example is
search_records = self.env['your.model'].search([('id', 'in', ids)])
Related
what is related attribute , what it can be used for ? and how to add a related attribute .
I'm trying to add a related field for total amount.
Related Field
In such case we need to take the value from any other table but we already have the reference of that table in our model, in that case we can utilize one functionality with that we can add the multiple fields from the reference table by just having the only one reference field in our model.
One relational field (Many2one) of the source model is mandatory to
have in the destination model to create relational field.
Consider the company_currency_id field from the res.currency model is there in the destination model then you can get the current rate of that currency in your target model.
syntax: v7
_columns = {
'current_rate': fields.related('company_currency_id','rate_silent', type='float', relation='res.currency',digits_compute=dp.get_precision( 'Account'), string='Current Rate', readonly=True),
}
Here,
company_currency_id => the field in the same model through which the new field will be relate,
rate_silent => is the field which you are going to relate with new field, means the field from source model,
relation => is the source model name,
type => is the datatype of the source field
Syntax: v8 and newer version
current_rate = fields.Float(string='Current Rate', related='company_currency_id.rate_silent', store=True, readonly=True)
Note :
Value is available in that field only after you save the record.
When you update value in your newly defined related field it
will be updated in source field as well, though it's always advisable
to set readonly in newly defined field.
In context of Odoo related field means, that its value will be
read from another table (related table) --> store=False
read from another table, but stored in the table its defined on --> store=True
Examples (Odoo V8):
sale.order currency_id: it is persisted in product_pricelist
stock_quant packaging_type_id: it is persisted in product_packaging and stock_quant. Everytime you change the value on product_packinging it will be updated on stock_quant, too, not vice versa.
**Related Field* is used when you wanted to pull a value from another model you can use related field on fields.
Here is an example for you.
order_id = fields.Many2one(comodel_name='sale.order', 'Sale Order')
order_amount = fields.Monetary(string='Order Amount',
store=True,
related='order_id.amount_total')
you must add a Many2one field in the model which relates to the model you want to access a field. in our case model is sale.order.
with the related kwarg you can relate field of the related model defined in the Many2one field. in our case order_id.
Setting the store kwarg will automatically store the value in database. With new API the value of the related field will be automatically updated.(Reference)
Hope this helps!
I have 2 fields in res.partner that I would like to display in a tree view for account.invoice based on the partner_id field. I'm wondering how I can do that (reference another model and field) through the tree view web interface, due to the SaaS version not allowing programmatic access.
Thanks in advance!
create related field in you account.invoice model to the fields of res.partner
x_invoice_preference=fields.Selection(related="partner_id.x_invoice_preference")
it's a good practice to name the related field the same name in the other model
Little exemple :
class class1(models.Model):
_name = 'table1'
name = fields.Char()
class class2(models.Model):
_name = 'table2'
table1_id = fields.Many2one('table1','table 1');
#this how you create a related field in order to
#show it in the form or the tree when you select the value of the many2one field it
# will have the same value of the vield name of the tabl1
name = fields.Char(related="table1_id.name",readonly=True)
#field_name m2onField.field_name
Odoo do an Auto Populate a Grid when a user Creating a new information with One2many relations fields?
this is my Example Auto Populate
def getCheckListId(self):
self.env.cr.execute("select 1 employee_id,1 PARAM1,1 PARAM2,1 PARAM3,1 PARAM3,1 PARAM4 from hr_employee_checklist ")
checklistTemplates = self.env.cr.fetchall()
return checklistTemplates
And this function will be used as a default in One2ManyFields
employee_checklists = fields.One2many('hr.employee_checklist','employee_id', readonly=False,copy=False, default = getCheckListId)
But I have an error
the error is
AttributeError: 'str' object has no attribute 'iteritems'
Can someone help me with this problem or other ways to populate Grid in Odoo
One2many
One2many field; the value of such a field is the recordset of all the records in comodel_name such that the field inverse_name is equal to the current record.
Parameters
comodel_name -- name of the target model (string)
inverse_name -- name of the inverse Many2one field in comodel_name
(string)
domain -- an optional domain to set on candidate values on the client
side (domain or string)
context -- an optional context to use on the client side when
handling that field (dictionary)
auto_join -- whether JOINs are generated upon search through that
field (boolean, by default False)
limit -- optional limit to use upon read (integer)
So, One2many fields always contains comodel's reference value, you just need to give ids of that relational field, remaining things will maintain by odoo engine it self.
#api.model
def getCheckListId(self):
return self.env['hr.employee.checklist'].search([]).ids
How can I predefinde/prefilter a many2one field?
As example product.category has a type, in my view the user should only be able to select a product.category based on the category type.
//field in model
category_id = fields.Many2one(comodel_name="product.category", string="ebay Category", required=True)
//field in view
How can I prefilter the select in view to offer only categories with type 'external'???
That's what domain is for:
To have the selectable list filtered by type 'external' add:
domain=[('type', '=', 'external')]
You can set the domain either in the field definition (python file) or in the view field (XML file). The actual filter is done by the view; if you set the domain on the field it works as an implicit default domain for the view field.
If you install Openerp 7 with recruitment module. And create a simple entry with following values e.g.
Subject (internal field name = 'name') = 10 Year Experience
Applicant Name = Jhon Smith
Then if you create a custom module with following columns
_columns = {
'applicant_id': fields.many2one('hr.applicant', 'Applicant', required=True),
}
The view widget by default will show a drop-down with the Subject (internal field name ='name') field but i want to show applicant name (internal field name='partner_name') field in drop down, when creating a new record in my custom module.
In Summary how can I display Applicant's Name instead of Subject in drop-down widget in my custom module.
In openerp there is a function called name_get().This function returns a list of tuples containing ID of the record and name tobe displayed. So override this function and return list of tuples containing ID of the record and applicant name
You need to define applicant_id in _rec_name in your custom module.
Try this:
_rec_name = 'applicant_id'
Have a look at Predefined fields.