From db249589480cef015c5942235febddfd04f3342e Mon Sep 17 00:00:00 2001
From: Florian Spreckelsen <florian.spreckelsen@gmx.net>
Date: Fri, 21 Aug 2020 12:46:21 +0000
Subject: [PATCH] assure_has_property with datetime objects

---
 .../test_base_table_exporter_integration.py   |  2 +-
 src/caosadvancedtools/cfood.py                | 12 +++++++++-
 src/caosadvancedtools/table_export.py         |  3 ++-
 unittests/test_cfood.py                       | 23 +++++++++++++++++++
 4 files changed, 37 insertions(+), 3 deletions(-)

diff --git a/integrationtests/test_base_table_exporter_integration.py b/integrationtests/test_base_table_exporter_integration.py
index b3dad7a8..1c9158bd 100644
--- a/integrationtests/test_base_table_exporter_integration.py
+++ b/integrationtests/test_base_table_exporter_integration.py
@@ -124,7 +124,7 @@ def test_find_functions():
 
 def test_queries():
     rec1, rec2, _, _ = insert_entities()
-    # no explicit functions since only `query` key is used, 
+    # no explicit functions since only `query` key is used,
     # so works with BaseTableExporter
     export_dict = {
         "Test_Property_1": {},
diff --git a/src/caosadvancedtools/cfood.py b/src/caosadvancedtools/cfood.py
index 1bb842de..b61982c6 100644
--- a/src/caosadvancedtools/cfood.py
+++ b/src/caosadvancedtools/cfood.py
@@ -45,6 +45,7 @@ from abc import ABCMeta, abstractmethod
 import caosdb as db
 from caosdb.exceptions import AmbiguityException, EntityDoesNotExistError
 
+from datetime import datetime
 from .datamodel_problems import DataModelProblems
 from .guard import global_guard as guard
 
@@ -85,7 +86,7 @@ def get_property(name):
         try:
             prop = db.execute_query("FIND Property with name='{}'".format(
                 name),
-                                    unique=True)
+                unique=True)
         except (EntityDoesNotExistError, AmbiguityException):
             # Property might actually be a RecordTypes
             prop = get_recordtype(name)
@@ -586,6 +587,15 @@ def assure_has_property(entity, name, value, to_be_updated=None,
 
             break
 
+        # cover special case of datetimes that are returned as strings
+        # by pylib.
+        if isinstance(value, datetime):
+
+            if datetime.fromisoformat(el.value) == value:
+                contained = True
+
+                break
+
     if contained:
         logger.debug("entity {} has property  {} with value {}".format(
             entity.id, name, value))
diff --git a/src/caosadvancedtools/table_export.py b/src/caosadvancedtools/table_export.py
index 64a2b7ed..bed0edc9 100644
--- a/src/caosadvancedtools/table_export.py
+++ b/src/caosadvancedtools/table_export.py
@@ -154,7 +154,8 @@ class BaseTableExporter(object):
                 except Exception as exc:
                     # invalid query
                     logger.debug(exc)
-                    errmssg = "Empty or invalid query '{}' for entry {}".format(q, e)
+                    errmssg = "Empty or invalid query '{}' for entry {}".format(
+                        q, e)
                     raise TableExportError(errmssg)
 
                 if val is not None:
diff --git a/unittests/test_cfood.py b/unittests/test_cfood.py
index 0545a447..f340bfb8 100644
--- a/unittests/test_cfood.py
+++ b/unittests/test_cfood.py
@@ -32,6 +32,9 @@ from caosadvancedtools.cfood import (AbstractCFood, AbstractFileCFood, CMeal,
                                      get_entity_for_path)
 from caosadvancedtools.crawler import FileCrawler
 from caosadvancedtools.example_cfood import ExampleCFood
+from caosdb.common.models import _parse_single_xml_element
+from lxml import etree
+from datetime import datetime
 
 PATTERN = "h.*"
 
@@ -215,6 +218,26 @@ class InsertionTest(unittest.TestCase):
         assert "parent" not in ps
         assert "other_parent" not in ps
 
+    def test_assure_datetime(self):
+        entity_xml = '<Record id="1234" name="Test_Record"><Property id="1233" name="TestDate" datatype="DATETIME">{}</Property></Record>'
+        to_be_updated = []
+        rec = _parse_single_xml_element(
+            etree.fromstring(entity_xml.format("2020-01-01")))
+        assure_has_property(entity=rec, name="TestDate", value=datetime(
+            2020, 1, 1), to_be_updated=to_be_updated)
+        assert not to_be_updated
+        assure_has_property(entity=rec, name="TestDate", value=datetime(
+            2020, 1, 1, 0, 0), to_be_updated=to_be_updated)
+        assert not to_be_updated
+        assure_has_property(entity=rec, name="TestDate", value=datetime(
+            2020, 1, 1, 15, 0), to_be_updated=to_be_updated)
+        assert len(to_be_updated) == 1
+        rec = _parse_single_xml_element(etree.fromstring(
+            entity_xml.format("2020-01-01T00:00:00.000")))
+        assure_has_property(entity=rec, name="TestDate", value=datetime(
+            2020, 1, 1), to_be_updated=to_be_updated)
+        assert len(to_be_updated) == 1
+
 
 class DependendTest(unittest.TestCase):
     def test(self):
-- 
GitLab