changeset 080a43fdf5d2 in trytond:default
details: https://hg.tryton.org/trytond?cmd=changeset;node=080a43fdf5d2
description:
Support PYSON comparison of date and datetime
issue4879
review270061002
diffstat:
CHANGELOG | 1 +
trytond/pyson.py | 24 +++++++++--
trytond/tests/test_pyson.py | 90 ++++++++++++++++++++++++++++++++++++++++++++-
3 files changed, 108 insertions(+), 7 deletions(-)
diffs (190 lines):
diff -r 732b6463c641 -r 080a43fdf5d2 CHANGELOG
--- a/CHANGELOG Sat Aug 29 18:26:14 2020 +0200
+++ b/CHANGELOG Sat Sep 05 22:59:38 2020 +0200
@@ -1,3 +1,4 @@
+* Support PYSON comparison of date and datetime
* Add cron task to clean old queue tasks
* Add option to run cron once
* Add defaults option to route
diff -r 732b6463c641 -r 080a43fdf5d2 trytond/pyson.py
--- a/trytond/pyson.py Sat Aug 29 18:26:14 2020 +0200
+++ b/trytond/pyson.py Sat Sep 05 22:59:38 2020 +0200
@@ -302,11 +302,15 @@
super(Greater, self).__init__()
for i in (statement1, statement2):
if isinstance(i, PYSON):
- assert i.types().issubset({int, float, type(None)}), \
- 'statement must be an integer or a float'
+ assert i.types().issubset({
+ int, float, type(None),
+ datetime.datetime, datetime.date}), \
+ 'statement must be an integer, float, date or datetime'
else:
- assert isinstance(i, (int, float, type(None))), \
- 'statement must be an integer or a float'
+ assert isinstance(i, (
+ int, float, type(None),
+ datetime.datetime, datetime.date)), \
+ 'statement must be an integer, float, date or datetime'
if isinstance(equal, PYSON):
if equal.types() != {bool}:
equal = Bool(equal)
@@ -338,11 +342,19 @@
dct[i] = 0.0
if not isinstance(dct[i], (int, float)):
dct = dct.copy()
- dct[i] = float(dct[i])
+ stmt = dct[i]
+ if isinstance(stmt, datetime.datetime):
+ stmt = stmt.timestamp()
+ elif isinstance(stmt, datetime.date):
+ time = datetime.time(0, 0)
+ stmt = datetime.datetime.combine(stmt, time).timestamp()
+ dct[i] = float(stmt)
return dct
@staticmethod
def eval(dct, context):
+ if dct['s1'] is None or dct['s2'] is None:
+ return False
dct = Greater._convert(dct)
if dct['e']:
return dct['s1'] >= dct['s2']
@@ -359,6 +371,8 @@
@staticmethod
def eval(dct, context):
+ if dct['s1'] is None or dct['s2'] is None:
+ return False
dct = Less._convert(dct)
if dct['e']:
return dct['s1'] <= dct['s2']
diff -r 732b6463c641 -r 080a43fdf5d2 trytond/tests/test_pyson.py
--- a/trytond/tests/test_pyson.py Sat Aug 29 18:26:14 2020 +0200
+++ b/trytond/tests/test_pyson.py Sat Sep 05 22:59:38 2020 +0200
@@ -226,6 +226,10 @@
self.assertRaises(AssertionError, pyson.Greater, 1, 'test')
self.assertRaises(
AssertionError, pyson.Greater, pyson.Eval('foo'), 0)
+ self.assertRaises(AssertionError, pyson.Greater,
+ 'test', pyson.DateTime())
+ self.assertRaises(AssertionError, pyson.Greater,
+ pyson.DateTime(), 'test')
self.assertEqual(pyson.Greater(1, 0).types(), set([bool]))
@@ -251,9 +255,53 @@
self.assertFalse(pyson.PYSONDecoder().decode(eval))
eval = pyson.PYSONEncoder().encode(pyson.Greater(1, None))
+ self.assertFalse(pyson.PYSONDecoder().decode(eval))
+
+ self.assertEqual(repr(pyson.Greater(1, 0)), 'Greater(1, 0, False)')
+
+ eval = pyson.PYSONEncoder().encode(pyson.Greater(
+ pyson.DateTime(2020, 1, 1, 0, 0, 0, 0),
+ datetime.date(2020, 1, 2)))
+ self.assertFalse(pyson.PYSONDecoder().decode(eval))
+
+ eval = pyson.PYSONEncoder().encode(pyson.Greater(
+ pyson.DateTime(2020, 1, 1, 0, 0, 0, 1),
+ datetime.date(2020, 1, 1)))
+ self.assertTrue(pyson.PYSONDecoder().decode(eval))
+
+ eval = pyson.PYSONEncoder().encode(pyson.Greater(
+ pyson.DateTime(2020, 1, 1, 0, 0, 0, 0),
+ datetime.date(2020, 1, 1), True))
self.assertTrue(pyson.PYSONDecoder().decode(eval))
- self.assertEqual(repr(pyson.Greater(1, 0)), 'Greater(1, 0, False)')
+ eval = pyson.PYSONEncoder().encode(pyson.Greater(
+ pyson.DateTime(2020, 1, 1, 0, 0, 0, 0),
+ pyson.DateTime(2020, 1, 1, 0, 0, 0, 0)))
+ self.assertFalse(pyson.PYSONDecoder().decode(eval))
+
+ eval = pyson.PYSONEncoder().encode(pyson.Greater(
+ pyson.Date(2020, 1, 1),
+ datetime.date(2020, 1, 1)))
+ self.assertFalse(pyson.PYSONDecoder().decode(eval))
+
+ eval = pyson.PYSONEncoder().encode(pyson.Greater(
+ pyson.Date(2020, 1, 1),
+ pyson.DateTime(2020, 1, 1, 0, 0, 0, 1)))
+ self.assertFalse(pyson.PYSONDecoder().decode(eval))
+
+ eval = pyson.PYSONEncoder().encode(pyson.Greater(
+ pyson.DateTime(2020, 1, 1, 0, 0, 1),
+ pyson.Date(2020, 1, 1), True))
+ self.assertTrue(pyson.PYSONDecoder().decode(eval))
+
+ eval = pyson.PYSONEncoder().encode(pyson.Greater(
+ pyson.DateTime(2020, 1, 1, 0, 0, 0, 0),
+ pyson.Date(2020, 1, 1), True))
+ self.assertTrue(pyson.PYSONDecoder().decode(eval))
+
+ eval = pyson.PYSONEncoder().encode(pyson.Greater(
+ pyson.DateTime(2020, 1, 1, 0, 0, 0, 0), 90000))
+ self.assertTrue(pyson.PYSONDecoder().decode(eval))
eval = pyson.PYSONEncoder().encode(
pyson.Greater(pyson.Eval('i', 0), 0))
@@ -271,6 +319,10 @@
if not sys.flags.optimize:
self.assertRaises(AssertionError, pyson.Less, 'test', 1)
self.assertRaises(AssertionError, pyson.Less, 0, 'test')
+ self.assertRaises(AssertionError, pyson.Less,
+ 'test', pyson.DateTime())
+ self.assertRaises(AssertionError, pyson.Less,
+ pyson.DateTime(), 'test')
self.assertEqual(pyson.Less(0, 1).types(), set([bool]))
@@ -293,13 +345,47 @@
self.assertTrue(pyson.PYSONDecoder().decode(eval))
eval = pyson.PYSONEncoder().encode(pyson.Less(None, 1))
- self.assertTrue(pyson.PYSONDecoder().decode(eval))
+ self.assertFalse(pyson.PYSONDecoder().decode(eval))
eval = pyson.PYSONEncoder().encode(pyson.Less(1, None))
self.assertFalse(pyson.PYSONDecoder().decode(eval))
self.assertEqual(repr(pyson.Less(0, 1)), 'Less(0, 1, False)')
+ eval = pyson.PYSONEncoder().encode(pyson.Less(
+ pyson.DateTime(2020, 1, 1, 0, 0, 0, 0),
+ datetime.date(2020, 1, 1)))
+ self.assertFalse(pyson.PYSONDecoder().decode(eval))
+
+ eval = pyson.PYSONEncoder().encode(pyson.Less(
+ pyson.DateTime(2020, 1, 1, 0, 0, 0, 0),
+ datetime.date(2020, 1, 2), True))
+ self.assertTrue(pyson.PYSONDecoder().decode(eval))
+
+ eval = pyson.PYSONEncoder().encode(pyson.Less(
+ pyson.DateTime(2020, 1, 1, 0, 0, 0, 0),
+ pyson.DateTime(2020, 1, 1, 0, 0, 0, 0)))
+ self.assertFalse(pyson.PYSONDecoder().decode(eval))
+
+ eval = pyson.PYSONEncoder().encode(pyson.Less(
+ pyson.Date(2020, 1, 1),
+ datetime.date(2020, 1, 2)))
+ self.assertTrue(pyson.PYSONDecoder().decode(eval))
+
+ eval = pyson.PYSONEncoder().encode(pyson.Less(
+ pyson.Date(2020, 1, 1),
+ pyson.DateTime(2020, 1, 1, 0, 0, 0, 1)))
+ self.assertTrue(pyson.PYSONDecoder().decode(eval))
+
+ eval = pyson.PYSONEncoder().encode(pyson.Less(
+ pyson.DateTime(2020, 1, 1, 0, 0, 0, 0),
+ pyson.Date(2020, 1, 1), True))
+ self.assertTrue(pyson.PYSONDecoder().decode(eval))
+
+ eval = pyson.PYSONEncoder().encode(pyson.Less(
+ pyson.DateTime(2020, 1, 1, 0, 0, 0, 0), 90000))
+ self.assertFalse(pyson.PYSONDecoder().decode(eval))
+
def test_If(self):
'Test pyson.If'
self.assertEqual(pyson.If(True, 'foo', 'bar').pyson(), {