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']

Reply via email to