~credativ/openobject-server/trunk-csv-import-domain

« back to all changes in this revision

Viewing changes to openerp/osv/fields.py

  • Committer: Christophe Simonis
  • Date: 2014-04-15 16:23:21 UTC
  • Revision ID: chs@openerp.com-20140415162321-l8hgeh6s48252zhl
[IMP] orm: postprocess function field values in batch

Show diffs side-by-side

added added

removed removed

Lines of Context:
1214
1214
        return self._fnct_search(obj, cr, uid, obj, name, args, context=context)
1215
1215
 
1216
1216
    def postprocess(self, cr, uid, obj, field, value=None, context=None):
 
1217
        return self._postprocess_batch(cr, uid, obj, field, {0: value}, context=context)[0]
 
1218
 
 
1219
    def _postprocess_batch(self, cr, uid, obj, field, values, context=None):
 
1220
        if not values:
 
1221
            return values
 
1222
 
1217
1223
        if context is None:
1218
1224
            context = {}
1219
 
        result = value
 
1225
 
1220
1226
        field_type = obj._columns[field]._type
1221
 
        if field_type == "many2one":
1222
 
            # make the result a tuple if it is not already one
1223
 
            if isinstance(value, (int,long)) and hasattr(obj._columns[field], 'relation'):
1224
 
                obj_model = obj.pool[obj._columns[field].relation]
1225
 
                dict_names = dict(obj_model.name_get(cr, SUPERUSER_ID, [value], context))
1226
 
                result = (value, dict_names[value])
1227
 
 
1228
 
        if field_type == 'binary':
1229
 
            if context.get('bin_size'):
1230
 
                # client requests only the size of binary fields
1231
 
                result = get_nice_size(value)
1232
 
            elif not context.get('bin_raw'):
1233
 
                result = sanitize_binary_value(value)
1234
 
 
1235
 
        if field_type == "integer" and value > xmlrpclib.MAXINT:
 
1227
        new_values = dict(values)
 
1228
 
 
1229
        if field_type == "integer":
1236
1230
            # integer/long values greater than 2^31-1 are not supported
1237
1231
            # in pure XMLRPC, so we have to pass them as floats :-(
1238
1232
            # This is not needed for stored fields and non-functional integer
1239
1233
            # fields, as their values are constrained by the database backend
1240
1234
            # to the same 32bits signed int limit.
1241
 
            result = __builtin__.float(value)
1242
 
        return result
 
1235
            for rid, value in values.iteritems():
 
1236
                if value and value > xmlrpclib.MAXINT:
 
1237
                    new_values[rid] = __builtin__.float(value)
 
1238
 
 
1239
        elif field_type == 'binary':
 
1240
            if context.get('bin_size'):
 
1241
                # client requests only the size of binary fields
 
1242
                for rid, value in values.iteritems():
 
1243
                    if value:
 
1244
                        new_values[rid] = get_nice_size(value)
 
1245
            elif not context.get('bin_raw'):
 
1246
                for rid, value in values.iteritems():
 
1247
                    if value:
 
1248
                        new_values[rid] = sanitize_binary_value(value)
 
1249
 
 
1250
        elif field_type == "many2one" and hasattr(obj._columns[field], 'relation'):
 
1251
            # make the result a tuple if it is not already one
 
1252
            if all(isinstance(value, (int, long)) for value in values.values() if value):
 
1253
                obj_model = obj.pool[obj._columns[field].relation]
 
1254
                ids = [i for i in values.values() if i]
 
1255
                dict_names = dict(obj_model.name_get(cr, SUPERUSER_ID, ids, context))
 
1256
                for rid, value in values.iteritems():
 
1257
                    if value:
 
1258
                        new_values[rid] = (value, dict_names[value])
 
1259
 
 
1260
        return new_values
1243
1261
 
1244
1262
    def get(self, cr, obj, ids, name, uid=False, context=None, values=None):
1245
1263
        result = self._fnct(obj, cr, uid, ids, name, self._arg, context)
1246
 
        for id in ids:
1247
 
            if self._multi and id in result:
1248
 
                for field, value in result[id].iteritems():
1249
 
                    if value:
1250
 
                        result[id][field] = self.postprocess(cr, uid, obj, field, value, context)
1251
 
            elif result.get(id):
1252
 
                result[id] = self.postprocess(cr, uid, obj, name, result[id], context)
 
1264
        if self._multi:
 
1265
            swap = {}
 
1266
            for rid, values in result.iteritems():
 
1267
                for f, v in values.iteritems():
 
1268
                    if f not in name:
 
1269
                        continue
 
1270
                    swap.setdefault(f, {})[rid] = v
 
1271
 
 
1272
            for field, values in swap.iteritems():
 
1273
                new_values = self._postprocess_batch(cr, uid, obj, field, values, context)
 
1274
                for rid, value in new_values.iteritems():
 
1275
                    result[rid][field] = value
 
1276
 
 
1277
        else:
 
1278
            result = self._postprocess_batch(cr, uid, obj, name, result, context)
 
1279
 
1253
1280
        return result
1254
1281
 
1255
1282
    def set(self, cr, obj, id, name, value, user=None, context=None):