Commit 7be9e520 authored by Ramiro Morales's avatar Ramiro Morales
Browse files

[1.2.X] Fixed #15226 - Made SelectDateWidget render the label tag associated...

[1.2.X] Fixed #15226 - Made SelectDateWidget render the label tag associated with the correct dropdown sub-widget when USE_L10N is active and non-English locale is in use.

Backport of [15427] from trunk.

git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.2.X@15428 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent ebd0a6a0
Loading
Loading
Loading
Loading
+32 −12
Original line number Diff line number Diff line
@@ -17,6 +17,26 @@ __all__ = ('SelectDateWidget',)

RE_DATE = re.compile(r'(\d{4})-(\d\d?)-(\d\d?)$')

def _parse_date_fmt():
    fmt = get_format('DATE_FORMAT')
    escaped = False
    output = []
    for char in fmt:
        if escaped:
            escaped = False
        elif char == '\\':
            escaped = True
        elif char in 'Yy':
            output.append('year')
            #if not self.first_select: self.first_select = 'year'
        elif char in 'bFMmNn':
            output.append('month')
            #if not self.first_select: self.first_select = 'month'
        elif char in 'dj':
            output.append('day')
            #if not self.first_select: self.first_select = 'day'
    return output

class SelectDateWidget(Widget):
    """
    A Widget that splits date input into three <select> boxes.
@@ -67,23 +87,24 @@ class SelectDateWidget(Widget):
        choices = [(i, i) for i in range(1, 32)]
        day_html = self.create_select(name, self.day_field, value, day_val,  choices)

        format = get_format('DATE_FORMAT')
        escaped = False
        output = []
        for char in format:
            if escaped:
                escaped = False
            elif char == '\\':
                escaped = True
            elif char in 'Yy':
        for field in _parse_date_fmt():
            if field == 'year':
                output.append(year_html)
            elif char in 'bFMmNn':
            elif field == 'month':
                output.append(month_html)
            elif char in 'dj':
            elif field == 'day':
                output.append(day_html)
        return mark_safe(u'\n'.join(output))

    def id_for_label(self, id_):
        first_select = None
        field_list = _parse_date_fmt()
        if field_list:
            first_select = field_list[0]
        if first_select is not None:
            return '%s_%s' % (id_, first_select)
        else:
            return '%s_month' % id_
    id_for_label = classmethod(id_for_label)

@@ -118,4 +139,3 @@ class SelectDateWidget(Widget):
        s = Select(choices=choices)
        select_html = s.render(field % name, val, local_attrs)
        return select_html
+9 −0
Original line number Diff line number Diff line
@@ -356,6 +356,10 @@ class FormsExtraTestCase(unittest.TestCase, AssertFormErrorsMixin):
        self.assertFalse(c.is_valid())
        self.assertEqual(c.errors, {'mydate': [u'Enter a valid date.']})

        # label tag is correctly associated with month dropdown
        d = GetDate({'mydate_month':'1', 'mydate_day':'1', 'mydate_year':'2010'})
        self.assertTrue('<label for="id_mydate_month">' in d.as_p())

    def test_multiwidget(self):
        # MultiWidget and MultiValueField #############################################
        # MultiWidgets are widgets composed of other widgets. They are usually
@@ -616,3 +620,8 @@ class FormsExtraL10NTestCase(unittest.TestCase):
        self.assertFalse(a.is_valid())
        # 'Geef een geldige datum op.' = 'Enter a valid date.'
        self.assertEqual(a.errors, {'mydate': [u'Geef een geldige datum op.']})

    def test_form_label_association(self):
        # label tag is correctly associated with first rendered dropdown
        a = GetDate({'mydate_month':'1', 'mydate_day':'1', 'mydate_year':'2010'})
        self.assertTrue('<label for="id_mydate_day">' in a.as_p())