Add datetime parsing function from MyService

This commit is contained in:
Daniel Egger 2023-05-31 17:17:04 +02:00
parent 9c1684bce3
commit 73d44478db
7 changed files with 288 additions and 1 deletions

View File

@ -407,6 +407,7 @@ pytest-sugar==0.9.4
# via -r requirements-dev.in
python-dateutil==2.8.2
# via
# -r requirements.in
# botocore
# faker
python-dotenv==0.20.0

View File

@ -37,6 +37,7 @@ sendgrid
structlog
python-json-logger
concurrent-log-handler
python-dateutil
wagtail>=4
wagtail-factories>=4

View File

@ -221,6 +221,7 @@ pyrsistent==0.18.1
# via jsonschema
python-dateutil==2.8.2
# via
# -r requirements.in
# botocore
# faker
python-dotenv==0.20.0

View File

@ -51,6 +51,7 @@ def create_or_update_course_session(course: Course, data: Dict[str, Any]):
import_id=import_id, course=course
)
cs.title = title
cs.generation = generation
cs.region = region
cs.group = group
@ -59,4 +60,15 @@ def create_or_update_course_session(course: Course, data: Dict[str, Any]):
cs.additional_json_data["import_data"] = data
cs.save()
"""
("Fahrzeug Start", "06.06.2023, 13:30"),
("Fahrzeug Ende", "06.06.2023, 15:00"),
(
"Fahrzeug Raum",
"https://teams.microsoft.com/l/meetup-join/19%3ameeting_N2I5YzViZTQtYTM2Ny00OTYwLTgzNzAtYWI4OTQzODcxNTlj%40thread.v2/0?context=%7b%22Tid%22%3a%22fedd03c8-a756-4803-8f27-0db8f7c488f2%22%2c%22Oid%22%3a%22f92e6382-3884-4e71-a2fd-b305a75d9812%22%7d",
),
("Fahrzeug Standort", None),
("Fahrzeug Adresse", None),
"""
return cs

View File

@ -47,7 +47,7 @@ class CreateOrUpdateCourseSessionTestCase(TestCase):
def setUp(self):
self.course = CourseFactory(title="myVBV Training")
def test_create(self):
def test_create_course_session(self):
row = [
("ID", "DE 2023"),
("Generation", 2023),

View File

@ -0,0 +1,182 @@
from datetime import date, datetime
from unittest import TestCase
from vbv_lernwelt.importer.utils import (
try_parse_date,
try_parse_int,
try_parse_datetime,
)
class TryParseDateTestCase(TestCase):
def test_wrongData_returnsFalseAndValue(self):
flag, value = try_parse_date("nonsense")
self.assertFalse(flag)
self.assertEqual("nonsense", value)
def test_isoDate_returnsCorrectDate(self):
flag, value = try_parse_date("2015-01-20")
self.assertTrue(flag)
self.assertEqual(date(2015, 1, 20), value)
def test_isoDateWithTime_returnsCorrectDate(self):
flag, value = try_parse_date("2015-01-20T15:21")
self.assertTrue(flag)
self.assertEqual(date(2015, 1, 20), value)
def test_isoDateWithTime2_returnsCorrectDate(self):
flag, value = try_parse_date("2018-05-03T00:00:00")
self.assertTrue(flag)
self.assertEqual(date(2018, 5, 3), value)
def test_swissDate_returnsCorrectDate(self):
flag, value = try_parse_date("01.05.2018")
self.assertTrue(flag)
self.assertEqual(date(2018, 5, 1), value)
def test_wrongIsoDate_returnsFalseAndValue(self):
flag, value = try_parse_date("2015-14-40")
self.assertFalse(flag)
self.assertEqual("2015-14-40", value)
def test_inputIsDate_returnsDate(self):
flag, value = try_parse_date(date(2016, 5, 1))
self.assertTrue(flag)
self.assertEqual(date(2016, 5, 1), value)
def test_inputIsNumber_returnsFalseAndNumber(self):
flag, value = try_parse_date(123)
self.assertFalse(flag)
self.assertEqual(123, value)
def test_inputIsNumberString_returnsFalseAndString(self):
flag, value = try_parse_date("56")
self.assertFalse(flag)
self.assertEqual("56", value)
def test_inputIsFloatString_returnsFalseAndString(self):
flag, value = try_parse_date("3.14")
self.assertFalse(flag)
self.assertEqual("3.14", value)
def test_inputIsShortDateWithoutYear_returnsFalseAndString(self):
flag, value = try_parse_date("11-01")
self.assertFalse(flag)
self.assertEqual("11-01", value)
class TryParseInt(TestCase):
def test_int_works(self):
flag, value = try_parse_int(123)
self.assertTrue(flag)
self.assertEqual(123, value)
def test_valid_string_works(self):
flag, value = try_parse_int("123")
self.assertTrue(flag)
self.assertEqual(123, value)
def test_invalid_string_breaks(self):
flag, value = try_parse_int("123qwer")
self.assertFalse(flag)
self.assertEqual("123qwer", value)
def test_invalid_string_returns_default(self):
flag, value = try_parse_int("123qwer", 0)
self.assertFalse(flag)
self.assertEqual(0, value)
class TryParseDateTimeTestCase(TestCase):
def test_isoDateTime_returnsCorrectDateTime(self):
flag, value = try_parse_datetime("2016-05-31T10:00:00.000000")
self.assertTrue(flag)
self.assertEqual(datetime(2016, 5, 31, 10, 0, 0), value)
def test_isoDateTimeWithoutSeconds_returnsCorrectDateTime(self):
flag, value = try_parse_datetime("2016-05-02T10:00")
self.assertTrue(flag)
self.assertEqual(datetime(2016, 5, 2, 10, 0, 0), value)
def test_isoDateWithoutTime_returnTrueAndDatetimeWithZeroHour(self):
flag, value = try_parse_datetime("2016-05-31")
self.assertTrue(flag)
self.assertEqual(datetime(2016, 5, 31), value)
def test_isoDateWithSpaceBeforeTime_returnTrueAndDatetimeWithZeroHour(self):
flag, value = try_parse_datetime("2016-05-03 14:12")
self.assertTrue(flag)
self.assertEqual(datetime(2016, 5, 3, 14, 12), value)
def test_swissDateWithTime_returnTrueAndDatetime(self):
flag, value = try_parse_datetime("01.05.2018 15:20")
self.assertTrue(flag)
self.assertEqual(datetime(2018, 5, 1, 15, 20), value)
def test_swissDateWithTimeWithMultipleSpaces_returnTrueAndDatetime(self):
flag, value = try_parse_datetime("01 .05. 2018 15:20")
self.assertTrue(flag)
self.assertEqual(datetime(2018, 5, 1, 15, 20), value)
def test_withDateTimeInput_returnsTrueAndDateTime(self):
flag, value = try_parse_datetime(datetime(2016, 5, 31, 10, 0))
self.assertTrue(flag)
self.assertEqual(datetime(2016, 5, 31, 10, 0, 0), value)
def test_inputIsNumber_returnsFalseAndNumber(self):
flag, value = try_parse_datetime(123)
self.assertFalse(flag)
self.assertEqual(123, value)
def test_inputIsNumberString_returnsFalseAndString(self):
flag, value = try_parse_datetime("56")
self.assertFalse(flag)
self.assertEqual("56", value)
def test_inputIsFloatString_returnsFalseAndString(self):
flag, value = try_parse_datetime("3.14")
self.assertFalse(flag)
self.assertEqual("3.14", value)
def test_inputIsShortDateWithoutYear_returnsFalseAndString(self):
flag, value = try_parse_date("11-01")
self.assertFalse(flag)
self.assertEqual("11-01", value)
def test_inputIsTimeString_returnsCurrentDateWithGivenTime(self):
flag, value = try_parse_datetime(" 15:00")
self.assertFalse(flag)
self.assertEqual(" 15:00", value)
def test_inputFromVbvExcel_returnsCurrentDateWithGivenTime(self):
flag, value = try_parse_datetime("09.06.2023, 13:30")
self.assertTrue(flag)
self.assertEqual(datetime(2023, 6, 9, 13, 30, 0), value)

View File

@ -0,0 +1,90 @@
import datetime
import re
from typing import Any, Tuple, Union, Optional
from dateutil.parser import parse
from six import string_types
def parse_formats(dt_str, fmt_strs, **parser_kwargs):
for fmt in fmt_strs:
try:
return datetime.datetime.strptime(dt_str, fmt)
except ValueError:
pass
return parse(dt_str, **parser_kwargs)
def try_parse_int(x: Any, default: Optional[Any] = None) -> Tuple[bool, Any]:
try:
return True, int(x)
# pylint: disable=broad-except
except Exception:
if default is None:
return False, x
return False, default
def try_parse_date(
value: Union[str, datetime.date]
) -> Tuple[bool, Union[str, datetime.date]]:
if isinstance(value, datetime.date):
return True, value
elif isinstance(value, datetime.datetime):
return True, value.date()
elif isinstance(value, string_types):
if value.strip().replace(".", "", 1).isdigit():
return False, value
# date needs at least 3 parts
if len(re.split(r"[.-]", value)) < 3:
return False, value
try:
date_with_time = parse_formats(
value,
[
"%Y-%m-%dT%H:%M:%S",
"%Y-%m-%d",
"%d.%m.%Y",
],
dayfirst=True,
)
return True, date_with_time.date()
except ValueError:
return False, value
else:
return False, value
def try_parse_datetime(
value: Union[str, datetime.datetime]
) -> Tuple[bool, Union[str, datetime.datetime]]:
if isinstance(value, datetime.datetime):
return True, value
elif isinstance(value, string_types):
if value.strip().replace(".", "", 1).isdigit():
return False, value
# date needs at least 3 parts
if len(re.split(r"[.-]", value)) < 3:
return False, value
try:
date_with_time = parse_formats(
value,
[
"%Y-%m-%dT%H:%M:%S",
"%Y-%m-%dT%H:%M",
"%Y-%m-%d %H:%M:%S",
"%Y-%m-%d %H:%M",
"%d.%m.%Y, %H:%M",
],
dayfirst=True,
)
return True, date_with_time
except ValueError:
return False, value
else:
return False, value