Merge lp:~openerp-dev/openobject-server/7.0-func-field-postprocess-batch-chs into lp:openobject-server/7.0

Proposed by Christophe Simonis (OpenERP)
Status: Merged
Merge reported by: Christophe Simonis (OpenERP)
Merged at revision: not available
Proposed branch: lp:~openerp-dev/openobject-server/7.0-func-field-postprocess-batch-chs
Merge into: lp:openobject-server/7.0
Diff against target: 98 lines (+52/-25)
1 file modified
openerp/osv/fields.py (+52/-25)
To merge this branch: bzr merge lp:~openerp-dev/openobject-server/7.0-func-field-postprocess-batch-chs
Reviewer Review Type Date Requested Status
OpenERP Core Team Pending
Review via email: mp+208224@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Christophe Simonis (OpenERP) (kangol) wrote :

merged in trunk (no IMP in stable)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'openerp/osv/fields.py'
2--- openerp/osv/fields.py 2014-02-13 10:08:36 +0000
3+++ openerp/osv/fields.py 2014-02-25 20:39:27 +0000
4@@ -1111,42 +1111,69 @@
5 return self._fnct_search(obj, cr, uid, obj, name, args, context=context)
6
7 def postprocess(self, cr, uid, obj, field, value=None, context=None):
8+ return self._postprocess_batch(cr, uid, obj, field, {0: value}, context=context)[0]
9+
10+ def _postprocess_batch(self, cr, uid, obj, field, values, context=None):
11+ if not values:
12+ return values
13+
14 if context is None:
15 context = {}
16- result = value
17+
18 field_type = obj._columns[field]._type
19- if field_type == "many2one":
20- # make the result a tuple if it is not already one
21- if isinstance(value, (int,long)) and hasattr(obj._columns[field], 'relation'):
22- obj_model = obj.pool.get(obj._columns[field].relation)
23- dict_names = dict(obj_model.name_get(cr, SUPERUSER_ID, [value], context))
24- result = (value, dict_names[value])
25-
26- if field_type == 'binary':
27- if context.get('bin_size'):
28- # client requests only the size of binary fields
29- result = get_nice_size(value)
30- elif not context.get('bin_raw'):
31- result = sanitize_binary_value(value)
32-
33- if field_type == "integer" and value > xmlrpclib.MAXINT:
34+ new_values = dict(values)
35+
36+ if field_type == "integer":
37 # integer/long values greater than 2^31-1 are not supported
38 # in pure XMLRPC, so we have to pass them as floats :-(
39 # This is not needed for stored fields and non-functional integer
40 # fields, as their values are constrained by the database backend
41 # to the same 32bits signed int limit.
42- result = __builtin__.float(value)
43- return result
44+ for rid, value in values.iteritems():
45+ if value and value > xmlrpclib.MAXINT:
46+ new_values[rid] = __builtin__.float(value)
47+
48+ elif field_type == 'binary':
49+ if context.get('bin_size'):
50+ # client requests only the size of binary fields
51+ for rid, value in values.iteritems():
52+ if value:
53+ new_values[rid] = get_nice_size(value)
54+ elif not context.get('bin_raw'):
55+ for rid, value in values.iteritems():
56+ if value:
57+ new_values[rid] = sanitize_binary_value(value)
58+
59+ elif field_type == "many2one" and hasattr(obj._columns[field], 'relation'):
60+ # make the result a tuple if it is not already one
61+ if all(isinstance(value, (int, long)) for value in values.values() if value):
62+ obj_model = obj.pool[obj._columns[field].relation]
63+ ids = [i for i in values.values() if i]
64+ dict_names = dict(obj_model.name_get(cr, SUPERUSER_ID, ids, context))
65+ for rid, value in values.iteritems():
66+ if value:
67+ new_values[rid] = (value, dict_names[value])
68+
69+ return new_values
70
71 def get(self, cr, obj, ids, name, uid=False, context=None, values=None):
72 result = self._fnct(obj, cr, uid, ids, name, self._arg, context)
73- for id in ids:
74- if self._multi and id in result:
75- for field, value in result[id].iteritems():
76- if value:
77- result[id][field] = self.postprocess(cr, uid, obj, field, value, context)
78- elif result.get(id):
79- result[id] = self.postprocess(cr, uid, obj, name, result[id], context)
80+ if self._multi:
81+ swap = {}
82+ for rid, values in result.iteritems():
83+ for f, v in values.iteritems():
84+ if f not in name:
85+ continue
86+ swap.setdefault(f, {})[rid] = v
87+
88+ for field, values in swap.iteritems():
89+ new_values = self._postprocess_batch(cr, uid, obj, field, values, context)
90+ for rid, value in new_values.iteritems():
91+ result[rid][field] = value
92+
93+ else:
94+ result = self._postprocess_batch(cr, uid, obj, name, result, context)
95+
96 return result
97
98 def set(self, cr, obj, id, name, value, user=None, context=None):