From 03ef8485d79e556cad2be91f79ccad316f967e48 Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Mon, 30 Sep 2013 14:59:46 +0200 Subject: [PATCH] [FIX] orm: correct read_group when searching by month bzr revid: chs@openerp.com-20130930125946-exr791f83seaa9br --- openerp/osv/orm.py | 6 +++-- openerp/tests/test_orm.py | 52 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index 608b8043706..b5440c2be44 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -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': diff --git a/openerp/tests/test_orm.py b/openerp/tests/test_orm.py index 91b2cb0f278..9e2a9c4a65f 100644 --- a/openerp/tests/test_orm.py +++ b/openerp/tests/test_orm.py @@ -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;