how can i use onchange from product field to one2many field of purchase order line odoo - odoo

Like i have one field in product.template with the field name squ_meter which i need to copy this value in custom field of purchase order line with same field name i.e squ_meter and i want to apply onchange on purchase order line field
Any kind of help would be much appreciated. Thanks in advance
Here's my code
class purchase_order_line(osv.osv):
_inherit = 'purchase.order.line'
_columns ={'squ_meter' : fields.float('Square Meter'),
}
purchase_order_line.xml
<field name="name">purchase.order.inherit</field>
<field name="model">purchase.order</field>
<field name="inherit_id" ref="purchase.purchase_order_form"/>
<field name="arch" type="xml">
<xpath expr="//page[#string='Products']//field[#name='order_line']//field[#name='product_qty']" position="after">
<field name="squ_meter"/>
</xpath>
</field>

Related Fields
Related field is useful when you want to keep the values of any relational fields except it's reference then it would be easier way to do it.
OLD API
_columns ={
'squ_meter': fields.related('product_id','squ_meter', type='float', relation='product.product', string='Square Meter', readonly=True),
}
Where:
The first set of parameters are the chain of reference fields to
follow, with the desired field at the end.
type is the type of that desired field.
Use relation if the desired field is still some kind of reference. relation is the table to look up that reference in.
NEW API
There is not anymore fields.related fields.
Instead you just set the name argument related to your model:
squ_meter = Fields.Float(string='Square Meter', related='product_id.squ_meter' , readonly=True)
purchase_order_line.xml
<field name="name">purchase.order.inherit</field>
<field name="model">purchase.order</field>
<field name="inherit_id" ref="purchase.purchase_order_form"/>
<field name="arch" type="xml">
<xpath expr="//page[#string='Products']//field[#name='order_line']//field[#name='product_qty']" position="after">
<field name="squ_meter" readonly="1" />
</xpath>
</field>

Related

Save value in Transient model Odoo 10

I added a new field in account.config.settings model. It displays the new field in settings page and can enter the value. But when i reopen the page the value is not there. I know the Transient model won't store values for long.
But rest of the values still there, how can i achieve this?
Below is my code.
*.py
class AccountSettings(models.TransientModel):
_inherit='account.config.settings'
#api.one
def _get_header(self):
header = fields.Char('Header')
*.xml
<record id="view_account_config_settings_inherit" model="ir.ui.view">
<field name="name">view.account.config.settings.inherit.form</field>
<field name="model">account.config.settings</field>
<field name="inherit_id" ref="account.view_account_config_settings"/>
<field name="arch" type="xml">
<xpath expr="//group[#name='accounting']" position="after">
<group string="Reports" name="reports">
<field name="header" class="oe_inline"/>
</group>
</xpath>
</field>
</record>
In account.config.settings Model you can save your value by using this :
class AccountSettings(models.TransientModel):
_inherit='account.config.settings'
header = fields.Char('Header')
#api.multi
def set_header_defaults(self):
return self.env['ir.values'].sudo().set_default(
'account.config.settings', 'header', self.header)
Try this code:
class AccountSettings(models.TransientModel):
_inherit='account.config.settings'
#api.one
def _get_header(self):
header = fields.Char('Header',config_parameter='header.configuration')
you can name the attribute config_parameter anything you want. And it will be used to get the value of header from other models.
example:
test = self.env['ir.config_parameter'].get_param('**header.configuration**', '').strip()
test will return the temporary stored value in account.config.settings.

Odoo 9 Is there a way to handle authorization with different groups on a certain field in form view?

I'm trying to create a form view.
<field name="is_positive" attrs="{'readonly':[('state','==','final')]}"/>
However there is many attributes like groups and invisible related to authorization so that certain group of people can see the field.
groups="base.group_hr_user"
But Is there a way for certain group can edit the field and the other group cannot?
add a new field to check whether the user is manager or user.
New Api Method
check_user = fields.Boolean(string='user',compute='_compute_user_check')
#api.multi
def _compute_user_check(self):
if self.user_has_groups('purchase.group_purchase_manager'):
self.check_user =True
In view
<field name="is_positive" attrs="{'readonly':[('check_user','=','True')]}"/>
First of all, you cannot use a domain like this one
<field name="is_positive" attrs="{'readonly':[('state','==','final')]}"/>
There is not a '==' operator, use = instead.
Now, to answer your question, if you want to create a special view for another group in which some elements are readonly for one group, and editable in the other, you have to it this way.
For the default view :
<record id="some_model_view" model="ir.ui.view">
<field name="name">some.model.form</field>
<field name="model">some.model</field>
<field name="arch" type="xml">
<form>
<field name="some_field" readonly="1"/>
</form>
<field/>
</record>
For a certain group :
<record id="some_model_view_for_other_group" model="ir.ui.view">
<field name="name">some.model.form</field>
<field name="model">some.model</field>
<field name="inherit_id" ref="my_module.some_model_view"
<field name="groups_id" eval="[(6, 0, [ref('some.first_group')])]" />
<field name="arch" type="xml">
<field name="some_field" position="attributes">
<attribute name="readonly">0</attribute>
</field>
<field/>
</record>
I will show one example to how this functionality works in sale group.
I make the unit price field in the sale order line makes readonly we select the user group user:own documents only The field is editable for other 2 groups user:All documets and manager
Firstly I create a boolean field for checking the user belongs to which group
is_own_user = fields.Boolean(string="Own user", compute='compute_own_user')
Then assigns the boolean field is True when the user belongs the group user:own documents only otherwise assigns to False
#api.depends('product_id')
def compute_own_user(self):
res_user_id = self.env['res.users'].search([('id', '=', self._uid)])
for rec in self:
if res_user_id.has_group('sales_team.group_sale_salesman') and not res_user_id.has_group('sales_team.group_sale_salesman_all_leads'):
rec.is_own_user = True
else:
rec.is_own_user = False
in xml make is_own_user invisible and replaces the unit price field
<xpath expr="//notebook/page/field[#name='order_line']/tree/field[#name='price_unit']" position="replace">
<field name="price_unit" attrs="{'readonly': [('isown_user', '=', True)]}" />
</xpath>

How to set default field value from xml code in odoo?

In sales order module I have created a new customised form view, in sale.py file I have created a new field 'is_sample'
'is_sample': fields.boolean("Specimen Order", store=False),
I want to set its default value from xml code so that it doesn't get affected in default form view. I have tried in four ways,
1)<field name="is_sample" eval="True"/>
2)<field name="is_sample" domain="[('is_sample','=',True)]"/>
3)<record id="action_specimen_orders" model="ir.actions.act_window">
<field name="type">ir.actions.act_window</field>
<field name="context">{'is_sample': 'True'}</field>
...
4)<record id="action_specimen_orders" model="ir.actions.act_window">
<field name="type">ir.actions.act_window</field>
<field name="domain">[('is_sample','=','True')]</field>
...
There is an easiest way to set default value from the xml, generally you can it for all those fields of the model. For that you need to add dictionary key/value pair to set default value for any field.
General syntax
default_field_name : default_value
To set default value you need to pass context with window action in which you need to set one key/value pair in context as shown in syntax. default_ is the prefix which needs to be set with field name as key.
Try following:
<record id="action_specimen_orders" model="ir.actions.act_window">
<field name="type">ir.actions.act_window</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="context">{'default_is_sample': True}</field>
</record>
If you want your product must be available in POS, you have to do like:
<record id="module_name.action_name" model="ir.actions.act_window">
<field name="name">My Menu</field>
<field name="res_model">object.name</field>
<field name="context">{'default_available_in_pos':1}
</field>
</record>

Odoo 9 How to sort order for a field in form view

I've been trying to modify project issue object.
and When I click Assign to field, It shows a list of users with dropdown.
But I'd like to change its order to DESC.
Is there any thing I can do in View?
here is my code below
<record id="project_issue_custom_form" model="ir.ui.view">
<field name="inherit_id" ref="project_issue.project_issue_form_view"/>
<field name="model">project.issue</field>
<field name="arch" type="xml">
<field name="user_id" position="attributes">
<attribute name="default_order">sequence desc</attribute>
</field>
</field>
</record>
Also I tried in controller
class Project_issue(models.Model):
_inherit = "project.issue"
_order = "user_id desc"
But It still doesn't affected.
The tag default_order can only be used for lists and kanban views. But you want to change the order of the content of a many2one field (user_id on project.issue).
Your second approach has potential. But it is the wrong model:
class ResUsers(models.Model):
_inherit = "res.users"
_order = "name desc" # or id

Making a module inherit from sale module

i created a module to inherit from the Sale module , the field i changed appers just fine on the interface here is my module :
ventes.py
from osv import fields,osv
import time
from datetime import datetime
from tools.translate import _
class ventes(osv.osv):
_inherit='sale.order'
_columns = {
'prenom': fields.many2one('patient','Patient', required=True),
}
ventes()
ventes_view.xml
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<record model="ir.ui.view" id="view_sales_inherit">
<field name="name">sale.order.form.inherit</field>
<field name="model">sale.order</field>
<field name="type">form</field>
<field name="inherit_id" ref="sale.view_order_form">form</field>
<field name="arch" type="xml">
<field name="name" position="after">
<label for="prenom" class="oe_edit_only"/>
<h1>
<field name="prenom"/>
</h1>
</field>
<field name="partner_id" position="replace"/>
</field>
</record>
</data>
</openerp>
the problem is when i create a sale order , in the place of the client names i get the patients name ( witch is what i was looking for ) but the problem is when i want to add a product to that sale order i get the following error:
Error: Could not get field with name 'parent.partner_id' for onchange 'product_uom_change(parent.pricelist_id,product_id,product_uom_qty,product_uom,product_uos_qty,product_uos,name,parent.partner_id, False, False, parent.date_order, context)'
Plz help me, i dont know how to make it work with my patient's id and not the partner_id ??!!
what are you doing it totally nonsense? what are doing is you removed the partner_id, but in the onchange method of the sale_order it used as like in your case product_uom_onchane()
in this onchange method partner_id is passed from xml side, so if you want to used pateint_id instead of partner_id, then you have to change all over whre partner_id used to patient_id
hope this helpful