* if user tries to bypass access rules for read on the requested object
"""
- groupby_list = groupby
- if isinstance(groupby, list):
- groupby = groupby[0]
context = context or {}
self.pool.get('ir.model.access').check(cr, uid, self._name, 'read', context=context)
if not fields:
tables.append(t)
# Take care of adding join(s) if groupby is an '_inherits'ed field
- tables, where_clause = self._inherits_join_calc(groupby,tables,where_clause)
+ groupby_list = groupby
+ if groupby:
+ if groupby and isinstance(groupby, list):
+ groupby = groupby[0]
+ tables, where_clause = self._inherits_join_calc(groupby,tables,where_clause)
+ else:
+ where_clause = ''
if len(where_clause):
where_clause = ' where '+string.join(where_clause, ' and ')
float_int_fields = filter(lambda x: fget[x]['type'] in ('float','integer'), fields)
sum = {}
+ flist = ''
group_by = groupby
- if fget.get(groupby,False) and fget[groupby]['type'] in ('date','datetime'):
- flist = "to_char(%s,'yyyy-mm') as %s "%(groupby,groupby)
- groupby = "to_char(%s,'yyyy-mm')"%(groupby)
- else:
- flist = groupby
+ if groupby:
+ if fget.get(groupby,False) and fget[groupby]['type'] in ('date','datetime'):
+ flist = "to_char(%s,'yyyy-mm') as %s "%(groupby,groupby)
+ groupby = "to_char(%s,'yyyy-mm')"%(groupby)
+ else:
+ flist = groupby
+
fields_pre = [f for f in float_int_fields if
f == self.CONCURRENCY_CHECK_FIELD
for f in fields_pre:
if f not in ['id','sequence']:
operator = fget[f].get('group_operator','sum')
- flist += ','+operator+'('+f+') as '+f
+ if flist:
+ flist += ','
+ flist += operator+'('+f+') as '+f
- cr.execute('select min(%s.id) as id,' % self._table + flist + ' from ' + ','.join(tables) + where_clause + ' group by '+ groupby + limit_str + offset_str, where_params)
+ if groupby:
+ gb = ' group by '+groupby
+ else:
+ gb = ''
+ cr.execute('select min(%s.id) as id,' % self._table + flist + ' from ' + ','.join(tables) + where_clause + gb + limit_str + offset_str, where_params)
alldata = {}
groupby = group_by
for r in cr.dictfetchall():
if val == None:r[fld] = False
alldata[r['id']] = r
del r['id']
- data = self.read(cr, uid, alldata.keys(), [groupby], context=context)
+ data = self.read(cr, uid, alldata.keys(), groupby and [groupby] or [], context=context)
today = datetime.date.today()
-
for d in data:
- d['__domain'] = [(groupby,'=',alldata[d['id']][groupby] or False)] + domain
- if not isinstance(groupby_list,(str, unicode)):
- d['__context'] = {'group_by':groupby_list[1:]}
- if fget.has_key(groupby):
+ if groupby:
+ d['__domain'] = [(groupby,'=',alldata[d['id']][groupby] or False)] + domain
+ if not isinstance(groupby_list,(str, unicode)):
+ if not context.get('group_by_no_leaf', False):
+ d['__context'] = {'group_by':groupby_list[1:]}
+ if groupby and fget.has_key(groupby):
if d[groupby] and fget[groupby]['type'] in ('date','datetime'):
dt = datetime.datetime.strptime(alldata[d['id']][groupby][:7],'%Y-%m')
days = calendar.monthrange(dt.year, dt.month)[1]
elif fget[groupby]['type'] == 'many2one':
d[groupby] = d[groupby] and ((type(d[groupby])==type(1)) and d[groupby] or d[groupby][1]) or ''
- del alldata[d['id']][groupby]
+ del alldata[d['id']][groupby]
d.update(alldata[d['id']])
del d['id']
return data