[FIX] orm: correct read_group when searching by month
bzr revid: chs@openerp.com-20130930125946-exr791f83seaa9br
This commit is contained in:
parent
38a2ca7f3f
commit
03ef8485d7
|
@ -39,7 +39,6 @@
|
|||
|
||||
"""
|
||||
|
||||
import babel.dates
|
||||
import calendar
|
||||
import collections
|
||||
import copy
|
||||
|
@ -54,6 +53,8 @@ import time
|
|||
import traceback
|
||||
import types
|
||||
|
||||
import babel.dates
|
||||
import dateutil.parser
|
||||
import psycopg2
|
||||
from lxml import etree
|
||||
|
||||
|
@ -2736,7 +2737,8 @@ class BaseModel(object):
|
|||
d['__context'] = {'group_by': groupby_list[1:]}
|
||||
if groupby and groupby in fget:
|
||||
if d[groupby] and fget[groupby]['type'] in ('date', 'datetime'):
|
||||
groupby_datetime = datetime.datetime.strptime(alldata[d['id']][groupby], '%Y-%m-%d')
|
||||
_default = datetime.datetime(1970, 1, 1) # force starts of month
|
||||
groupby_datetime = dateutil.parser.parse(alldata[d['id']][groupby], default=_default)
|
||||
d[groupby] = babel.dates.format_date(
|
||||
groupby_datetime, format=group_by_params.get('display_format', 'MMMM yyyy'), locale=context.get('lang', 'en_US'))
|
||||
if group_by_params.get('interval') == 'month':
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
from collections import defaultdict
|
||||
from openerp.tools import mute_logger
|
||||
import common
|
||||
|
||||
|
@ -100,6 +101,57 @@ class TestORM(common.TransactionCase):
|
|||
found = self.partner.search_read(self.cr, UID, [['name', '=', 'Does not exists']], ['name'])
|
||||
self.assertEqual(len(found), 0)
|
||||
|
||||
def test_groupby_date(self):
|
||||
partners = dict(
|
||||
A='2012-11-19',
|
||||
B='2012-12-17',
|
||||
C='2012-12-31',
|
||||
D='2013-01-07',
|
||||
E='2013-01-14',
|
||||
F='2013-01-28',
|
||||
G='2013-02-11',
|
||||
)
|
||||
|
||||
all_partners = []
|
||||
partners_by_day = defaultdict(set)
|
||||
partners_by_month = defaultdict(set)
|
||||
partners_by_year = defaultdict(set)
|
||||
|
||||
for name, date in partners.items():
|
||||
p = self.partner.create(self.cr, UID, dict(name=name, date=date))
|
||||
all_partners.append(p)
|
||||
partners_by_day[date].add(p)
|
||||
partners_by_month[date.rsplit('-', 1)[0]].add(p)
|
||||
partners_by_year[date.split('-', 1)[0]].add(p)
|
||||
|
||||
def read_group(interval, domain=None):
|
||||
main_domain = [('id', 'in', all_partners)]
|
||||
if domain:
|
||||
domain = ['&'] + main_domain + domain
|
||||
else:
|
||||
domain = main_domain
|
||||
|
||||
display_format, groupby_format = {
|
||||
'year': ('YYYY', 'yyyy'),
|
||||
'month': ('YYYY-MM', 'yyyy-mm'),
|
||||
'day': ('yyyy-MM-dd', 'yyyy-mm-dd'),
|
||||
}[interval]
|
||||
|
||||
datetime_format = {
|
||||
'date': dict(interval=interval, display_format=display_format, groupby_format=groupby_format)
|
||||
}
|
||||
context = dict(datetime_format=datetime_format)
|
||||
|
||||
rg = self.partner.read_group(self.cr, self.uid, domain, ['date'], 'date', context=context)
|
||||
result = {}
|
||||
for r in rg:
|
||||
result[r['date']] = set(self.partner.search(self.cr, self.uid, r['__domain']))
|
||||
return result
|
||||
|
||||
self.assertDictEqual(read_group('day'), partners_by_day)
|
||||
self.assertDictEqual(read_group('month'), partners_by_month)
|
||||
self.assertDictEqual(read_group('year'), partners_by_year)
|
||||
|
||||
|
||||
class TestInherits(common.TransactionCase):
|
||||
""" test the behavior of the orm for models that use _inherits;
|
||||
|
|
Loading…
Reference in New Issue