[IMP] read_group: better version of ec12e529c8

Simpler fix for handling of grouping on an empty date/datetime, adds a
few tests.
This commit is contained in:
Xavier Morel
2016-04-20 12:54:54 +02:00
parent e113ba6599
commit e23a879e57
6 changed files with 88 additions and 1 deletions
@@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
from . import models
@@ -0,0 +1,10 @@
# -*- coding: utf-8 -*-
{
'name': "test read_group",
'description': "Tests for read_group",
'category': 'Tests',
'version': '0.1',
'depends': ['base'],
}
+9
View File
@@ -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")
@@ -0,0 +1,2 @@
# -*- coding: utf-8 -*-
from . import test_empty
@@ -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,
}])
+5 -1
View File
@@ -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