diff --git a/django_jalali/forms/__init__.py b/django_jalali/forms/__init__.py index 838bc0f..340e806 100644 --- a/django_jalali/forms/__init__.py +++ b/django_jalali/forms/__init__.py @@ -19,10 +19,10 @@ def __init__(self, input_formats=None, *args, **kwargs): super().__init__(*args, **kwargs) self.input_formats = input_formats - def to_python(self, value): + def to_python(self, value) -> jdatetime.date | None: """ Validates that the input can be converted to a date. Returns a Python - datetime.date object. + jdatetime.date object. """ if value in validators.EMPTY_VALUES: return None @@ -31,6 +31,13 @@ def to_python(self, value): if isinstance(value, jdatetime.date): return value + if self.input_formats: + for input_format in self.input_formats: + try: + return jdatetime.datetime.strptime(value, input_format).date() + except ValueError: + pass + groups = re.search( r"(?P[\d]{1,4})-(?P[\d]{1,2})-(?P[\d]{1,2})", value, @@ -87,6 +94,13 @@ def to_python(self, value): return None value = "%s %s" % tuple(value) + if self.input_formats: + for input_format in self.input_formats: + try: + return jdatetime.datetime.strptime(value, input_format).date() + except ValueError: + pass + groups = re.search( r"(?P[\d]{1,4})-(?P[\d]{1,2})-(?P[\d]{1,2}) " r"(?P[\d]{1,2}):(?P[\d]{1,2})" diff --git a/tests/test_forms.py b/tests/test_forms.py index 84cf0ec..6db77f5 100644 --- a/tests/test_forms.py +++ b/tests/test_forms.py @@ -16,6 +16,33 @@ def test_field(self): f = jDateField() self.assertEqual(f.clean(value), jdatetime.date(1400, 11, 27)) + def test_field_with_one_input_format(self): + tests = ( + "1400/11/27", + jdatetime.date(1400, 11, 27), + jdatetime.datetime(1400, 11, 27), + ) + for value in tests: + with self.subTest(value=value): + f = jDateField( + input_formats=[ + "%Y/%m/%d", + ] + ) + self.assertEqual(f.clean(value), jdatetime.date(1400, 11, 27)) + + def test_field_with_multiple_input_formats(self): + tests = ( + "1400/11/27", + "1400, 11, 27", + jdatetime.date(1400, 11, 27), + jdatetime.datetime(1400, 11, 27), + ) + for value in tests: + with self.subTest(value=value): + f = jDateField(input_formats=["%Y, %m, %d", "%Y/%m/%d"]) + self.assertEqual(f.clean(value), jdatetime.date(1400, 11, 27)) + class JDateTimeFieldTest(TestCase): def test_field(self): @@ -29,3 +56,30 @@ def test_field(self): self.assertEqual( f.clean(value), jdatetime.datetime(1400, 11, 27, 12, 13, 20) ) + + def test_field_with_one_input_formats(self): + tests = ( + "1400/11/27 12:13", + jdatetime.datetime(1400, 11, 27, 12, 13, 20), + ) + for value in tests: + with self.subTest(value=value): + f = jDateTimeField( + input_formats=[ + "%Y/%m/%d %H:%M", + ] + ) + self.assertEqual( + f.clean(value), jdatetime.datetime(1400, 11, 27, 12, 13, 20) + ) + + def test_field_with_multiple_input_formats(self): + tests = ( + "1400/11/27 12-13", + "1400, 11, 27 12:13", + jdatetime.datetime(1400, 11, 27), + ) + for value in tests: + with self.subTest(value=value): + f = jDateTimeField(input_formats=["%Y, %m, %d %H:%M", "%Y/%m/%d %H-%M"]) + self.assertEqual(f.clean(value), jdatetime.date(1400, 11, 27))