Current code:
Odoo is the world's easiest all-in-one management software.
It includes hundreds of business apps:
- CRM
- e-Commerce
- Accounting
- Inventory
- PoS
- Project management
- MRP
This question has been flagged
Current code:
Updated :-
#from openerp import models, fields, api, _
from openerp.osv import fields,osv
class stock_location(osv.osv):
_inherit = 'stock.location
# Get stocks quantity
def _get_current_stock(self, cr, uid, ids, fields, arg, context=None):
res = []
quants = []
for obj in self.browse(cr, uid, ids, context=context):
if 'default_product_id' in context:
quants = self.pool.get('stock.quant').search(cr, uid, [('location_id','=',id),('product_id','=?',context.get('default_product_id'))])
else:
quants = self.pool.get('stock.quant').search(cr, uid, [('location_id','=',id)])
for quant in self.pool.get('stock.quant').browse(cr, uid, quants, context):
res[obj.id] += quant.qty
return res
# Get locations ids
def _get_locations(self, cr, uid, ids, context=None):
res = []
for quant in self.pool.get('stock.quants').browse(cr, uid, ids, context=context):
if quant.location_id:
res.append(quant.location_id.id)
return res
# Fields declaration
_columns = {
'loca': fields.char('Location'),
'qty': fields.function(_get_current_stock, type = "float", string = 'Qty', store = {'stock.quants': (_get_locations, ['location_id','qty'], 1 ) } ),
}
# Overriding name_get
def name_get(self, cr, uid, ids, context=None):
res = []
for loc in self.browse(cr, uid, ids, context):
res.append((loc.id, loc.name + " / " + str(loc.qty) + " Units" or ''))
return res
It won't work because qty is a function field. You cannot domain (filter) using qty field.
For the error, you need to use use '&' instead of '&' in the XML.
Sorry, another one: with or without '&' the definition is the same. The default operator is '&' and in the case of multi operator, it will process the most middle operator with the 2 fields after it, then the result will be processed with the next operator at the left of the first operator and the next field at the right of the first 2 fields, and so on.... Any missing operator will be replaced with '&'.
Hi Robert, You can only use the domain if the field is stored. Regards, André
Please refer the updated answer.....
Rob, please provide the error you are getting....
from terminal you can get the error in detail, take it from there
how r u starting ur server??? from terminal only(both in windows and linux) , isn't it! if not then start using terminal there you can track the errors in detail.
yes, that only. through ssh take the access of the server(kill the previous process and restart) now you can see the overall flow and your error in detail too.
keep remember to restart the server using '&' (./openerp-server &) so that if you close the terminal also the server would be running
go through the same scenario you were going earlier and getting the error, and then take a look at the terminal, you can get it here too..... trying tracing the flow from file to file..
what is showing at browser ??
in your code under "_get_current_stock" function bring "return res" out of the loop, and same for "_get_locations " too...... rest all is seeming to be right, rather if your data fetching is correct.....
I can't see what is the problem here using the qty in a domain. The question is not clear or seems to be lost in edits
if qty is a functional field you can use "store" attribute at functional field declaration to store it in DB, and then you can simply apply the domain .
You can not just give store=true, store attribute will work as a trigger which will be triggered when the parameter passed as its value changes, for ex: store = { 'objectname': ( functionname, ['fieldname1', 'fieldname2'], priority) } here, "objectname" is the name of object which will be responsible for triggering the store attribute. "functionname" is the name of the function which will be executed when the values of fields "fieldname1", "fieldname2" of object "objectname" changes. "priority" is the priority of this object sequence(if more than one objects are passed)
for your field: fields.Float(compute='_get_current_stock', string = 'Qty', store = true) you can simply declare it as a functional field as : fields.function(_get_current_stock, type="float", string = 'Qty', store = { 'objectname': (functionname, ['fieldname1', 'fieldname2'], priority) } ) here the objectname is the one, on change of whose fields value the value of your field is changing, as for now i think its ''stock.quant'' object and its field is 'qty'. At "functioname" function you have to return the id(s) of the record of current object you want to change. this will simply store your values in the database. For further details you can use: https://doc.odoo.com/6.0/developer/2_5_Objects_Fields_Methods/field_type/
yes somewhat correct, but under store attribute you have to take another function(inspite of _get_current_stock) that must return the ids of your stock.location object that has to be changed.
I have modified my answer, you can go through it....
Enjoying the discussion? Don't just read, join in!
Create an account today to enjoy exclusive features and engage with our awesome community!
Sign up
hi! is this the same indentation you are using ? "def _get_locations(self, cr, uid, ids, context=None):" should be out of the above function, as it is a new seperate function. and same for "def name_get".
you have kept the "qty" field declaration inside the "_get_current_stock" function, if this is the same same indentation u r using, then pls correct it .
check my answer below.
try converting your code as per old api..... as replace model.model with osv.osv, remove @api.one, @api.depends(), @api.multi and field.reference to fields.function(). 'res' is not any reserved keyword by odoo, its just a variable taken for storing the result.
you have to change "self.env" to "self.pool.get()" ..... and put '_get_current_stock' and '_get_locations' before field declarations as python interprets
Check updated answer below and verify indentations and braces...
can u explain your error in detail
You don't need to use "self.id" as you are already browsing the record and for that instance the object is stored in "obj" variable, so you can use "obj.id" instead of 'self.id"
Robx, i think its better , if we go through your code live, so that we can get the cause and your error in detail, if its possible forward me your skype id to my email(mail@pawanmisra.info) or any other way u want to go through.....
Rob, under "_get_current_stock" function you have kept "self.res[obj.id]" , inspite you dont need self, because there is no attribute named res in self object, so try removing self and make it to res only...., further there is not more issues seeming to be there in your code updated......