Add datetime parsing function from MyService
This commit is contained in:
parent
9c1684bce3
commit
73d44478db
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@ sendgrid
|
|||
structlog
|
||||
python-json-logger
|
||||
concurrent-log-handler
|
||||
python-dateutil
|
||||
|
||||
wagtail>=4
|
||||
wagtail-factories>=4
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
@ -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
|
||||
Loading…
Reference in New Issue