diff --git a/hl7apy/base_datatypes.py b/hl7apy/base_datatypes.py index 7bf4629..e1c4439 100644 --- a/hl7apy/base_datatypes.py +++ b/hl7apy/base_datatypes.py @@ -289,7 +289,7 @@ def __init__(self, value=None, out_format='%H%M%S.%f', offset='', microsec_preci raise InvalidDateOffset(offset) try: d = datetime.strptime(offset[1:], '%H%M') - if d.hour > 12: + if offset[0] == '+' and d.hour > 14 or offset[0] == '-' and d.hour > 12: raise ValueError except ValueError: if offset: diff --git a/hl7apy/factories.py b/hl7apy/factories.py index 70a3fa1..b60524f 100644 --- a/hl7apy/factories.py +++ b/hl7apy/factories.py @@ -99,6 +99,7 @@ def datatype_factory(datatype, value, version=None, validation_level=None): except KeyError: raise InvalidDataType(datatype) except ValueError as e: + print(e) if Validator.is_strict(validation_level): raise e # TODO: Do we really want this? In that case the parent's datatype must be changed accordingly diff --git a/hl7apy/utils.py b/hl7apy/utils.py index 357a064..2ef0c0c 100644 --- a/hl7apy/utils.py +++ b/hl7apy/utils.py @@ -113,7 +113,7 @@ def get_datetime_info(value): def _split_offset(value): - offset = re.search('\d*((-|\+)(1[0-2]|0[0-9])([0-5][0-9]))$', value) + offset = re.search('\d*((\+(1[0-4]|0[0-9])|(-(1[0-2]|0[0-9])))([0-5][0-9]))$', value) if offset: offset = offset.groups()[0] return value.replace(offset, ''), offset diff --git a/tests/test_datatypes.py b/tests/test_datatypes.py index 94618d9..91e561d 100644 --- a/tests/test_datatypes.py +++ b/tests/test_datatypes.py @@ -102,17 +102,21 @@ def test_create_timestamp_by_factory(self): self.assertEqual(dtm.classname, 'TM') self.assertEqual(dtm.to_er7(), '120252.059+0200') - dtm = datatype_factory('TM', '120252.05+0200') + dtm = datatype_factory('TM', '120252.05-0200') self.assertEqual(dtm.classname, 'TM') - self.assertEqual(dtm.to_er7(), '120252.05+0200') + self.assertEqual(dtm.to_er7(), '120252.05-0200') + + dtm = datatype_factory('TM', '120252.05+1400') + self.assertEqual(dtm.classname, 'TM') + self.assertEqual(dtm.to_er7(), '120252.05+1400') dtm = datatype_factory('TM', '120252.5+0200') self.assertEqual(dtm.classname, 'TM') self.assertEqual(dtm.to_er7(), '120252.5+0200') - dtm = datatype_factory('TM', '120252+0200') + dtm = datatype_factory('TM', '120252-1200') self.assertEqual(dtm.classname, 'TM') - self.assertEqual(dtm.to_er7(), '120252+0200') + self.assertEqual(dtm.to_er7(), '120252-1200') def test_create_nm_by_factory(self): nm = datatype_factory('NM', 100000) @@ -156,6 +160,7 @@ def test_DT_wrong_default_format_strict(self): class TestTM(unittest.TestCase): def test_TM(self): + time = datetime.strptime('01', '%H') time1 = datetime.strptime('0101', '%H%M') time2 = datetime.strptime('010111', '%H%M%S') @@ -199,7 +204,7 @@ def test_TM_invalid_offset(self): self.assertRaises(InvalidDateOffset, TM, datetime.strptime('0101', '%H%M'), offset='+00:00') self.assertRaises(InvalidDateOffset, TM, datetime.strptime('0101', '%H%M'), offset='&0100') self.assertRaises(InvalidDateOffset, TM, datetime.strptime('0101', '%H%M'), offset='+100') - self.assertRaises(InvalidDateOffset, TM, datetime.strptime('0101', '%H%M'), offset='+1300') + self.assertRaises(InvalidDateOffset, TM, datetime.strptime('0101', '%H%M'), offset='+1500') self.assertRaises(InvalidDateOffset, TM, datetime.strptime('0101', '%H%M'), offset='-1300') def test_TM_custom_microsec_precision(self):