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