From e23a879e579fcda19e70b65b6cb15875a0df8e2e Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 20 Apr 2016 12:51:59 +0200 Subject: [PATCH] [IMP] read_group: better version of ec12e529c8 Simpler fix for handling of grouping on an empty date/datetime, adds a few tests. --- openerp/addons/test_read_group/__init__.py | 3 + openerp/addons/test_read_group/__openerp__.py | 10 ++++ openerp/addons/test_read_group/models.py | 9 +++ .../addons/test_read_group/tests/__init__.py | 2 + .../test_read_group/tests/test_empty.py | 59 +++++++++++++++++++ openerp/models.py | 6 +- 6 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 openerp/addons/test_read_group/__init__.py create mode 100644 openerp/addons/test_read_group/__openerp__.py create mode 100644 openerp/addons/test_read_group/models.py create mode 100644 openerp/addons/test_read_group/tests/__init__.py create mode 100644 openerp/addons/test_read_group/tests/test_empty.py diff --git a/openerp/addons/test_read_group/__init__.py b/openerp/addons/test_read_group/__init__.py new file mode 100644 index 00000000000..cde864bae21 --- /dev/null +++ b/openerp/addons/test_read_group/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import models diff --git a/openerp/addons/test_read_group/__openerp__.py b/openerp/addons/test_read_group/__openerp__.py new file mode 100644 index 00000000000..5cb172e4cfb --- /dev/null +++ b/openerp/addons/test_read_group/__openerp__.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +{ + 'name': "test read_group", + 'description': "Tests for read_group", + + 'category': 'Tests', + 'version': '0.1', + + 'depends': ['base'], +} diff --git a/openerp/addons/test_read_group/models.py b/openerp/addons/test_read_group/models.py new file mode 100644 index 00000000000..98b56a81195 --- /dev/null +++ b/openerp/addons/test_read_group/models.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- +from openerp import fields, models + + +class GroupOnDate(models.Model): + _name = 'test_read_group.on_date' + + date = fields.Date("Date") + value = fields.Integer("Value") diff --git a/openerp/addons/test_read_group/tests/__init__.py b/openerp/addons/test_read_group/tests/__init__.py new file mode 100644 index 00000000000..6923cb9047e --- /dev/null +++ b/openerp/addons/test_read_group/tests/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +from . import test_empty diff --git a/openerp/addons/test_read_group/tests/test_empty.py b/openerp/addons/test_read_group/tests/test_empty.py new file mode 100644 index 00000000000..d08a881d71f --- /dev/null +++ b/openerp/addons/test_read_group/tests/test_empty.py @@ -0,0 +1,59 @@ +# -*- coding: utf-8 -*- +from openerp.tests import common + + +class TestEmptyDate(common.TransactionCase): + """ Test what happens when grouping on date fields and getting a "false" + grouping value + """ + def setUp(self): + super(TestEmptyDate, self).setUp() + self.Model = self.env['test_read_group.on_date'] + + def test_empty_only(self): + self.Model.create({'value': 1}) + self.Model.create({'value': 2}) + self.Model.create({'value': 3}) + + gb = self.Model.read_group([], ['date', 'value'], ['date'], lazy=False) + + self.assertEqual(gb, [{ + '__count': 3, + '__domain': [('date', '=', False)], + 'date': False, + 'value': 6 + }]) + + def test_empty_by_span(self): + self.Model.create({'value': 1}) + self.Model.create({'value': 2}) + self.Model.create({'value': 3}) + + gb = self.Model.read_group([], ['date', 'value'], ['date:quarter'], lazy=False) + + self.assertEqual(gb, [{ + '__count': 3, + '__domain': [('date', '=', False)], + 'date:quarter': False, + 'value': 6 + }]) + + def test_mixed(self): + self.Model.create({'date': False, 'value': 1}) + self.Model.create({'date': False, 'value': 2}) + self.Model.create({'date': '1916-12-18', 'value': 3}) + self.Model.create({'date': '1916-12-18', 'value': 4}) + + gb = self.Model.read_group([], ['date', 'value'], ['date'], lazy=False) + + self.assertSequenceEqual(sorted(gb, key=lambda r: r['date']), [{ + '__count': 2, + '__domain': [('date', '=', False)], + 'date': False, + 'value': 3, + }, { + '__count': 2, + '__domain': ['&', ('date', '>=', '1916-12-01'), ('date', '<', '1917-01-01')], + 'date': 'December 1916', + 'value': 7, + }]) diff --git a/openerp/models.py b/openerp/models.py index 56be38ecfab..0f49f5f222e 100644 --- a/openerp/models.py +++ b/openerp/models.py @@ -2172,7 +2172,11 @@ class BaseModel(object): # (range, label) by just the formatted label, in-place for group in result: for df in dt: - if group.get(df, False) and (len(group[df])>1): + # could group on a date(time) field which is empty in some + # records, in which case as with m2o the _raw value will be + # `False` instead of a (value, label) pair. In that case, + # leave the `False` value alone + if group.get(df): group[df] = group[df][1] return result