[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:
@@ -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'],
|
||||
}
|
||||
@@ -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
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user