From d22209cb428ecb083548fd21cae714a60c7fd5f7 Mon Sep 17 00:00:00 2001 From: Jure Slak <jure.slak@gmail.com> Date: Mon, 20 Mar 2023 22:42:18 +0100 Subject: [PATCH] Fixed #34424 -- Fixed SelectDateWidget crash for inputs raising OverflowError. --- django/forms/widgets.py | 2 ++ tests/forms_tests/field_tests/test_datefield.py | 12 ++++++++++++ .../widget_tests/test_selectdatewidget.py | 2 ++ 3 files changed, 16 insertions(+) diff --git a/django/forms/widgets.py b/django/forms/widgets.py index 842b73e95c..3d6091c250 100644 --- a/django/forms/widgets.py +++ b/django/forms/widgets.py @@ -1161,6 +1161,8 @@ class SelectDateWidget(Widget): # Return pseudo-ISO dates with zeros for any unselected values, # e.g. '2017-0-23'. return "%s-%s-%s" % (y or 0, m or 0, d or 0) + except OverflowError: + return "0-0-0" return date_value.strftime(input_format) return data.get(name) diff --git a/tests/forms_tests/field_tests/test_datefield.py b/tests/forms_tests/field_tests/test_datefield.py index 60c8043be3..65ac76319d 100644 --- a/tests/forms_tests/field_tests/test_datefield.py +++ b/tests/forms_tests/field_tests/test_datefield.py @@ -1,3 +1,4 @@ +import sys from datetime import date, datetime from django.core.exceptions import ValidationError @@ -36,6 +37,17 @@ class DateFieldTest(SimpleTestCase): d = GetDate({"mydate_month": "1", "mydate_day": "1", "mydate_year": "2010"}) self.assertIn('<label for="id_mydate_month">', d.as_p()) + # Inputs raising an OverflowError. + e = GetDate( + { + "mydate_month": str(sys.maxsize + 1), + "mydate_day": "31", + "mydate_year": "2010", + } + ) + self.assertIs(e.is_valid(), False) + self.assertEqual(e.errors, {"mydate": ["Enter a valid date."]}) + @translation.override("nl") def test_l10n_date_changed(self): """ diff --git a/tests/forms_tests/widget_tests/test_selectdatewidget.py b/tests/forms_tests/widget_tests/test_selectdatewidget.py index cfcd037987..215c41a809 100644 --- a/tests/forms_tests/widget_tests/test_selectdatewidget.py +++ b/tests/forms_tests/widget_tests/test_selectdatewidget.py @@ -1,3 +1,4 @@ +import sys from datetime import date from django.forms import DateField, Form, SelectDateWidget @@ -610,6 +611,7 @@ class SelectDateWidgetTest(WidgetTest): ((None, "12", "1"), None), (("2000", None, "1"), None), (("2000", "12", None), None), + ((str(sys.maxsize + 1), "12", "1"), "0-0-0"), ] for values, expected in tests: with self.subTest(values=values):