changeset 8e60d41aa412 in proteus:default
details: https://hg.tryton.org/proteus?cmd=changeset;node=8e60d41aa412
description:
Support PYSON comparison of date and datetime
issue4879
review270061002
diffstat:
CHANGELOG | 2 ++
proteus/pyson.py | 24 +++++++++++++++++++-----
2 files changed, 21 insertions(+), 5 deletions(-)
diffs (62 lines):
diff -r 0f42a751c918 -r 8e60d41aa412 CHANGELOG
--- a/CHANGELOG Thu Jul 09 10:33:42 2020 +0100
+++ b/CHANGELOG Sat Sep 05 22:59:38 2020 +0200
@@ -1,3 +1,5 @@
+* Support PYSON comparison of date and datetime
+
Version 5.6.0 - 2020-05-04
* Bug fixes (see mercurial logs for details)
* Add support for Python 3.8
diff -r 0f42a751c918 -r 8e60d41aa412 proteus/pyson.py
--- a/proteus/pyson.py Thu Jul 09 10:33:42 2020 +0100
+++ b/proteus/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']