summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--openerp/addons/test_read_group/__init__.py3
-rw-r--r--openerp/addons/test_read_group/__openerp__.py10
-rw-r--r--openerp/addons/test_read_group/models.py9
-rw-r--r--openerp/addons/test_read_group/tests/__init__.py2
-rw-r--r--openerp/addons/test_read_group/tests/test_empty.py59
-rw-r--r--openerp/models.py6
6 files changed, 88 insertions, 1 deletions
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