From e91128f25188533bfe3f3c46d035f4d5ee22d5a4 Mon Sep 17 00:00:00 2001 From: Fabien Pinckaers Date: Fri, 16 Apr 2010 22:11:24 +0200 Subject: [PATCH] [IMP] group_read bzr revid: fp@tinyerp.com-20100416201124-nuic37h8ni51xkcq --- bin/osv/orm.py | 49 +++++++++++++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 18 deletions(-) diff --git a/bin/osv/orm.py b/bin/osv/orm.py index ded8ad7e5d3..eedabdb1ba0 100644 --- a/bin/osv/orm.py +++ b/bin/osv/orm.py @@ -1955,9 +1955,6 @@ class orm(orm_template): * 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: @@ -1972,7 +1969,13 @@ class orm(orm_template): 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 ') @@ -1985,12 +1988,15 @@ class orm(orm_template): 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 @@ -1998,9 +2004,15 @@ class orm(orm_template): 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(): @@ -2008,14 +2020,15 @@ class orm(orm_template): 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] @@ -2026,7 +2039,7 @@ class orm(orm_template): 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