Commit bc21e9c0 authored by Claude Paroz's avatar Claude Paroz
Browse files

Fixed #13970 -- Made SelectDateWidget use the standard widget is_required attribute

Thanks mitar for the report and Tim Graham for the review.
parent b780d03d
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -53,9 +53,8 @@ class SelectDateWidget(Widget):
    day_field = '%s_day'
    year_field = '%s_year'

    def __init__(self, attrs=None, years=None, required=True, months=None):
    def __init__(self, attrs=None, years=None, months=None):
        self.attrs = attrs or {}
        self.required = required

        # Optional list or tuple of years to use in the "year" select box.
        if years:
@@ -139,7 +138,7 @@ class SelectDateWidget(Widget):
            id_ = self.attrs['id']
        else:
            id_ = 'id_%s' % name
        if not (self.required and val):
        if not self.is_required:
            choices.insert(0, self.none_value)
        local_attrs = self.build_attrs(id=field % id_)
        s = Select(choices=choices)
+5 −0
Original line number Diff line number Diff line
@@ -613,6 +613,11 @@ Miscellaneous
  you relied on the default field ordering while having fields defined on both
  the current class *and* on a parent ``Form``.

* The ``required`` argument of
  :class:`~django.forms.extras.widgets.SelectDateWidget` has been removed.
  This widget now respects the form field's ``is_required`` attribute like
  other widgets.

* :meth:`~django.db.models.query.QuerySet.select_related` now chains in the
  same way as other similar calls like ``prefetch_related``. That is,
  ``select_related('foo', 'bar')`` is equivalent to
+17 −139
Original line number Diff line number Diff line
@@ -26,10 +26,6 @@ class GetDate(Form):
    mydate = DateField(widget=SelectDateWidget)


class GetNotRequiredDate(Form):
    mydate = DateField(widget=SelectDateWidget, required=False)


class GetDateShowHiddenInitial(Form):
    mydate = DateField(widget=SelectDateWidget, show_hidden_initial=True)

@@ -41,6 +37,7 @@ class FormsExtraTestCase(TestCase, AssertFormErrorsMixin):

    # The forms library comes with some extra, higher-level Field and Widget
    def test_selectdate(self):
        self.maxDiff = None
        w = SelectDateWidget(years=('2007', '2008', '2009', '2010', '2011', '2012', '2013', '2014', '2015', '2016'))

        # Rendering the default state.
@@ -114,6 +111,7 @@ class FormsExtraTestCase(TestCase, AssertFormErrorsMixin):

        # Rendering a string value.
        self.assertHTMLEqual(w.render('mydate', '2010-04-15'), """<select name="mydate_month" id="id_mydate_month">
<option value="0">---</option>
<option value="1">January</option>
<option value="2">February</option>
<option value="3">March</option>
@@ -128,6 +126,7 @@ class FormsExtraTestCase(TestCase, AssertFormErrorsMixin):
<option value="12">December</option>
</select>
<select name="mydate_day" id="id_mydate_day">
<option value="0">---</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
@@ -161,6 +160,7 @@ class FormsExtraTestCase(TestCase, AssertFormErrorsMixin):
<option value="31">31</option>
</select>
<select name="mydate_year" id="id_mydate_year">
<option value="0">---</option>
<option value="2007">2007</option>
<option value="2008">2008</option>
<option value="2009">2009</option>
@@ -178,6 +178,7 @@ class FormsExtraTestCase(TestCase, AssertFormErrorsMixin):

        # Invalid dates should still render the failed date.
        self.assertHTMLEqual(w.render('mydate', '2010-02-31'), """<select name="mydate_month" id="id_mydate_month">
<option value="0">---</option>
<option value="1">January</option>
<option value="2" selected="selected">February</option>
<option value="3">March</option>
@@ -192,6 +193,7 @@ class FormsExtraTestCase(TestCase, AssertFormErrorsMixin):
<option value="12">December</option>
</select>
<select name="mydate_day" id="id_mydate_day">
<option value="0">---</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
@@ -225,6 +227,7 @@ class FormsExtraTestCase(TestCase, AssertFormErrorsMixin):
<option value="31" selected="selected">31</option>
</select>
<select name="mydate_year" id="id_mydate_year">
<option value="0">---</option>
<option value="2007">2007</option>
<option value="2008">2008</option>
<option value="2009">2009</option>
@@ -293,133 +296,6 @@ class FormsExtraTestCase(TestCase, AssertFormErrorsMixin):
<select name="mydate_year" id="id_mydate_year">
<option value="0">---</option>
<option value="2013">2013</option>
</select>""")

        # Using a SelectDateWidget in a form.
        w = SelectDateWidget(years=('2007', '2008', '2009', '2010', '2011', '2012', '2013', '2014', '2015', '2016'), required=False)
        self.assertHTMLEqual(w.render('mydate', ''), """<select name="mydate_month" id="id_mydate_month">
<option value="0">---</option>
<option value="1">January</option>
<option value="2">February</option>
<option value="3">March</option>
<option value="4">April</option>
<option value="5">May</option>
<option value="6">June</option>
<option value="7">July</option>
<option value="8">August</option>
<option value="9">September</option>
<option value="10">October</option>
<option value="11">November</option>
<option value="12">December</option>
</select>
<select name="mydate_day" id="id_mydate_day">
<option value="0">---</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
<option value="13">13</option>
<option value="14">14</option>
<option value="15">15</option>
<option value="16">16</option>
<option value="17">17</option>
<option value="18">18</option>
<option value="19">19</option>
<option value="20">20</option>
<option value="21">21</option>
<option value="22">22</option>
<option value="23">23</option>
<option value="24">24</option>
<option value="25">25</option>
<option value="26">26</option>
<option value="27">27</option>
<option value="28">28</option>
<option value="29">29</option>
<option value="30">30</option>
<option value="31">31</option>
</select>
<select name="mydate_year" id="id_mydate_year">
<option value="0">---</option>
<option value="2007">2007</option>
<option value="2008">2008</option>
<option value="2009">2009</option>
<option value="2010">2010</option>
<option value="2011">2011</option>
<option value="2012">2012</option>
<option value="2013">2013</option>
<option value="2014">2014</option>
<option value="2015">2015</option>
<option value="2016">2016</option>
</select>""")
        self.assertHTMLEqual(w.render('mydate', '2010-04-15'), """<select name="mydate_month" id="id_mydate_month">
<option value="0">---</option>
<option value="1">January</option>
<option value="2">February</option>
<option value="3">March</option>
<option value="4" selected="selected">April</option>
<option value="5">May</option>
<option value="6">June</option>
<option value="7">July</option>
<option value="8">August</option>
<option value="9">September</option>
<option value="10">October</option>
<option value="11">November</option>
<option value="12">December</option>
</select>
<select name="mydate_day" id="id_mydate_day">
<option value="0">---</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
<option value="13">13</option>
<option value="14">14</option>
<option value="15" selected="selected">15</option>
<option value="16">16</option>
<option value="17">17</option>
<option value="18">18</option>
<option value="19">19</option>
<option value="20">20</option>
<option value="21">21</option>
<option value="22">22</option>
<option value="23">23</option>
<option value="24">24</option>
<option value="25">25</option>
<option value="26">26</option>
<option value="27">27</option>
<option value="28">28</option>
<option value="29">29</option>
<option value="30">30</option>
<option value="31">31</option>
</select>
<select name="mydate_year" id="id_mydate_year">
<option value="0">---</option>
<option value="2007">2007</option>
<option value="2008">2008</option>
<option value="2009">2009</option>
<option value="2010" selected="selected">2010</option>
<option value="2011">2011</option>
<option value="2012">2012</option>
<option value="2013">2013</option>
<option value="2014">2014</option>
<option value="2015">2015</option>
<option value="2016">2016</option>
</select>""")

        a = GetDate({'mydate_month': '4', 'mydate_day': '1', 'mydate_year': '2008'})
@@ -768,13 +644,15 @@ class FormsExtraTestCase(TestCase, AssertFormErrorsMixin):
        self.assertTrue(FormWithFile().is_multipart())
        self.assertTrue(FormWithImage().is_multipart())

    def test_field_not_required(self):
        b = GetNotRequiredDate({
            'mydate_year': '',
            'mydate_month': '',
            'mydate_day': ''
        })
        self.assertFalse(b.has_changed())
    def test_selectdatewidget_required(self):
        class GetNotRequiredDate(Form):
            mydate = DateField(widget=SelectDateWidget, required=False)

        class GetRequiredDate(Form):
            mydate = DateField(widget=SelectDateWidget, required=True)

        self.assertFalse(GetNotRequiredDate().fields['mydate'].widget.is_required)
        self.assertTrue(GetRequiredDate().fields['mydate'].widget.is_required)


@override_settings(USE_L10N=True)
@@ -788,7 +666,7 @@ class FormsExtraL10NTestCase(TestCase):
        super(FormsExtraL10NTestCase, self).tearDown()

    def test_l10n(self):
        w = SelectDateWidget(years=('2007', '2008', '2009', '2010', '2011', '2012', '2013', '2014', '2015', '2016'), required=False)
        w = SelectDateWidget(years=('2007', '2008', '2009', '2010', '2011', '2012', '2013', '2014', '2015', '2016'))
        self.assertEqual(w.value_from_datadict({'date_year': '2010', 'date_month': '8', 'date_day': '13'}, {}, 'date'), '13-08-2010')

        self.assertHTMLEqual(w.render('date', '13-08-2010'), """<select name="date_day" id="id_date_day">
+6 −4

File changed.

Preview size limit exceeded, changes collapsed.