X-Git-Url: http://git.inspyration.org/?a=blobdiff_plain;f=bin%2Fosv%2Form.py;h=f0678d91903c5c9d3cfa58421db2265891917e11;hb=41c9098ca994a3712bcdd0e6dc61805ed946b02d;hp=2b7fe0ce9899ac93b7e5b373e1bd0c195dc7a7b6;hpb=e5527663523bcaa27d00375a36304d8462c61bc6;p=odoo%2Fodoo.git diff --git a/bin/osv/orm.py b/bin/osv/orm.py index 2b7fe0c..f0678d9 100644 --- a/bin/osv/orm.py +++ b/bin/osv/orm.py @@ -41,6 +41,7 @@ import calendar import copy import datetime import logging +import warnings import operator import pickle import re @@ -126,12 +127,14 @@ class browse_record_list(list): class browse_record(object): logger = netsvc.Logger() - def __init__(self, cr, uid, id, table, cache, context=None, list_class = None, fields_process={}): + def __init__(self, cr, uid, id, table, cache, context=None, list_class=None, fields_process=None): ''' table : the object (inherited from orm) context : dictionary with an optional context ''' - if not context: + if fields_process is None: + fields_process = {} + if context is None: context = {} self._list_class = list_class or browse_record_list self._cr = cr @@ -404,7 +407,9 @@ class orm_template(object): def read_group(self, cr, uid, domain, fields, groupby, offset=0, limit=None, context=None): raise NotImplementedError(_('The read_group method is not implemented on this object !')) - def _field_create(self, cr, context={}): + def _field_create(self, cr, context=None): + if context is None: + context = {} cr.execute("SELECT id FROM ir_model WHERE model=%s", (self._name,)) if not cr.rowcount: cr.execute('SELECT nextval(%s)', ('ir_model_id_seq',)) @@ -489,8 +494,8 @@ class orm_template(object): break cr.commit() - def _auto_init(self, cr, context={}): - self._field_create(cr, context) + def _auto_init(self, cr, context=None): + self._field_create(cr, context=context) def __init__(self, cr): if not self._name and not hasattr(self, '_inherit'): @@ -506,7 +511,7 @@ class orm_template(object): if not self._table: self._table = self._name.replace('.', '_') - def browse(self, cr, uid, select, context=None, list_class=None, fields_process={}): + def browse(self, cr, uid, select, context=None, list_class=None, fields_process=None): """ Fetch records as objects allowing to use dot notation to browse fields and relations @@ -517,8 +522,6 @@ class orm_template(object): :rtype: object or list of objects requested """ - if not context: - context = {} self._list_class = list_class or browse_record_list cache = {} # need to accepts ints and longs because ids coming from a method @@ -526,7 +529,7 @@ class orm_template(object): if isinstance(select, (int, long)): return browse_record(cr, uid, select, self, cache, context=context, list_class=self._list_class, fields_process=fields_process) elif isinstance(select, list): - return self._list_class([browse_record(cr, uid, id, self, cache, context=context, list_class=self._list_class, fields_process=fields_process) for id in select], context) + return self._list_class([browse_record(cr, uid, id, self, cache, context=context, list_class=self._list_class, fields_process=fields_process) for id in select], context=context) else: return browse_null() @@ -554,8 +557,8 @@ class orm_template(object): lines = [] data = map(lambda x: '', range(len(fields))) + done = [] for fpos in range(len(fields)): - done = [] f = fields[fpos] if f: r = row @@ -600,7 +603,8 @@ class orm_template(object): fields2 = map(lambda x: (x[:i+1]==f[:i+1] and x[i+1:]) \ or [], fields) if fields2 in done: - break + if [x for x in fields2 if x]: + break done.append(fields2) for row2 in r: lines2 = self.__export_row(cr, uid, row2, fields2, @@ -976,6 +980,8 @@ class orm_template(object): for key in self.pool._sql_error.keys(): if key in e[0]: msg = self.pool._sql_error[key] + if hasattr(msg, '__call__'): + msg = msg(cr, uid, [res_id,], context=context) break return (-1, res, 'Line ' + str(counter) +' : ' + msg, '') if isinstance(e, osv.orm.except_orm): @@ -1049,9 +1055,14 @@ class orm_template(object): # Check presence of __call__ directly instead of using # callable() because it will be deprecated as of Python 3.0 if hasattr(msg, '__call__'): - txt_msg, params = msg(self, cr, uid, ids) - tmp_msg = trans._get_source(cr, uid, self._name, 'constraint', lng, source=txt_msg) or txt_msg - translated_msg = tmp_msg % params + tmp_msg = msg(self, cr, uid, ids, context=context) + # Why translate something that has been generated dynamically? + # tmp_msg = trans._get_source(cr, uid, self._name, 'constraint', lng, source=txt_msg) or txt_msg + if isinstance(tmp_msg, tuple): + tmp_msg, params = tmp_msg + translated_msg = tmp_msg % params + else: + translated_msg = tmp_msg else: translated_msg = trans._get_source(cr, uid, self._name, 'constraint', lng, source=msg) or msg error_msgs.append( @@ -1274,7 +1285,7 @@ class orm_template(object): context = {} result = False fields = {} - childs = True + children = True def encode(s): if isinstance(s, unicode): @@ -1328,7 +1339,7 @@ class orm_template(object): if column: relation = self.pool.get(column._obj) - childs = False + children = False views = {} for f in node: if f.tag in ('form', 'tree', 'graph'): @@ -1390,7 +1401,7 @@ class orm_template(object): node.set('sum', trans) for f in node: - if childs or (node.tag == 'field' and f.tag in ('filter','separator')): + if children or (node.tag == 'field' and f.tag in ('filter','separator')): fields.update(self.__view_look_dom(cr, user, f, view_id, context)) return fields @@ -1437,7 +1448,7 @@ class orm_template(object): fields = self.fields_get(cr, user, fields_def.keys(), context) for field in fields_def: if field == 'id': - # sometime, the view may containt the (invisible) field 'id' needed for a domain (when 2 objects have cross references) + # sometime, the view may contain the (invisible) field 'id' needed for a domain (when 2 objects have cross references) fields['id'] = {'readonly': True, 'type': 'integer', 'string': 'ID'} elif field in fields: fields[field].update(fields_def[field]) @@ -1498,14 +1509,14 @@ class orm_template(object): return arch - def __get_default_search_view(self, cr, uid, context={}): + def __get_default_search_view(self, cr, uid, context=None): def encode(s): if isinstance(s, unicode): return s.encode('utf8') return s - view = self.fields_view_get(cr, uid, False, 'form', context) + view = self.fields_view_get(cr, uid, False, 'form', context=context) root = etree.fromstring(encode(view['arch'])) res = etree.XML("""""" % root.get("string", "")) @@ -2355,8 +2366,7 @@ class orm(orm_template): where += ' order by '+self._parent_order cr.execute('SELECT id FROM '+self._table+' WHERE '+where) pos2 = pos + 1 - childs = cr.fetchall() - for id in childs: + for id in cr.fetchall(): pos2 = browse_rec(id[0], pos2) cr.execute('update '+self._table+' set parent_left=%s, parent_right=%s where id=%s', (pos, pos2, root)) return pos2 + 1 @@ -2411,7 +2421,9 @@ class orm(orm_template): self.__schema.debug("Table '%s': column '%s': dropped NOT NULL constraint", self._table, column['attname']) - def _auto_init(self, cr, context={}): + def _auto_init(self, cr, context=None): + if context is None: + context = {} store_compute = False create = False todo_end = [] @@ -4092,10 +4104,14 @@ class orm(orm_template): else: default['state'] = self._defaults['state'] - context_wo_lang = context + context_wo_lang = context.copy() if 'lang' in context: del context_wo_lang['lang'] - data = self.read(cr, uid, [id], context=context_wo_lang)[0] + data = self.read(cr, uid, [id,], context=context_wo_lang) + if data: + data = data[0] + else: + raise IndexError( _("Record #%d of %s not found, cannot copy!") %( id, self._name)) fields = self.fields_get(cr, uid, context=context) for f in fields: @@ -4154,9 +4170,9 @@ class orm(orm_template): old_record, new_record = self.read(cr, uid, [old_id, new_id], [field_name], context=context) # here we rely on the order of the ids to match the translations # as foreseen in copy_data() - old_childs = sorted(old_record[field_name]) - new_childs = sorted(new_record[field_name]) - for (old_child, new_child) in zip(old_childs, new_childs): + old_children = sorted(old_record[field_name]) + new_children = sorted(new_record[field_name]) + for (old_child, new_child) in zip(old_children, new_children): # recursive copy of translations here target_obj.copy_translations(cr, uid, old_child, new_child, context=context) # and for translatable fields we keep them for copy @@ -4206,6 +4222,12 @@ class orm(orm_template): return cr.fetchone()[0] == len(ids) def check_recursion(self, cr, uid, ids, parent=None): + warnings.warn("You are using deprecated %s.check_recursion(). Please use the '_check_recursion()' instead!" % \ + self._name, DeprecationWarning, stacklevel=3) + assert ' ' not in (parent or '') + return self._check_recursion(cr, uid, ids, parent) + + def _check_recursion(self, cr, uid, ids, parent=None): """ Verifies that there is no loop in a hierarchical structure of records, by following the parent relationship using the **parent** field until a loop