~ubuntu-branches/ubuntu/saucy/python-django/saucy-updates

« back to all changes in this revision

Viewing changes to django/forms/widgets.py

  • Committer: Bazaar Package Importer
  • Author(s): Chris Lamb
  • Date: 2009-07-29 11:26:28 UTC
  • mfrom: (1.2.3 upstream)
  • mto: This revision was merged to the branch mainline in revision 22.
  • Revision ID: james.westby@ubuntu.com-20090729112628-9qrzwnl9x32jxhbg
Tags: upstream-1.1
ImportĀ upstreamĀ versionĀ 1.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
23
23
__all__ = (
24
24
    'Media', 'MediaDefiningClass', 'Widget', 'TextInput', 'PasswordInput',
25
25
    'HiddenInput', 'MultipleHiddenInput',
26
 
    'FileInput', 'DateTimeInput', 'TimeInput', 'Textarea', 'CheckboxInput',
 
26
    'FileInput', 'DateInput', 'DateTimeInput', 'TimeInput', 'Textarea', 'CheckboxInput',
27
27
    'Select', 'NullBooleanSelect', 'SelectMultiple', 'RadioSelect',
28
28
    'CheckboxSelectMultiple', 'MultiWidget',
29
29
    'SplitDateTimeWidget',
75
75
    def __getitem__(self, name):
76
76
        "Returns a Media object that only contains media of the given type"
77
77
        if name in MEDIA_TYPES:
78
 
            return Media(**{name: getattr(self, '_' + name)})
 
78
            return Media(**{str(name): getattr(self, '_' + name)})
79
79
        raise KeyError('Unknown media type "%s"' % name)
80
80
 
81
81
    def add_js(self, data):
281
281
 
282
282
    def render(self, name, value, attrs=None):
283
283
        if value is None: value = ''
284
 
        value = force_unicode(value)
285
284
        final_attrs = self.build_attrs(attrs, name=name)
286
285
        return mark_safe(u'<textarea%s>%s</textarea>' % (flatatt(final_attrs),
287
286
                conditional_escape(force_unicode(value))))
288
287
 
 
288
class DateInput(Input):
 
289
    input_type = 'text'
 
290
    format = '%Y-%m-%d'     # '2006-10-25'
 
291
 
 
292
    def __init__(self, attrs=None, format=None):
 
293
        super(DateInput, self).__init__(attrs)
 
294
        if format:
 
295
            self.format = format
 
296
 
 
297
    def _format_value(self, value):
 
298
        if value is None:
 
299
            return ''
 
300
        elif hasattr(value, 'strftime'):
 
301
            value = datetime_safe.new_date(value)
 
302
            return value.strftime(self.format)
 
303
        return value
 
304
 
 
305
    def render(self, name, value, attrs=None):
 
306
        value = self._format_value(value)
 
307
        return super(DateInput, self).render(name, value, attrs)
 
308
 
 
309
    def _has_changed(self, initial, data):
 
310
        return super(DateInput, self)._has_changed(self._format_value(initial), data)
 
311
 
289
312
class DateTimeInput(Input):
290
313
    input_type = 'text'
291
314
    format = '%Y-%m-%d %H:%M:%S'     # '2006-10-25 14:30:59'
295
318
        if format:
296
319
            self.format = format
297
320
 
298
 
    def render(self, name, value, attrs=None):
 
321
    def _format_value(self, value):
299
322
        if value is None:
300
 
            value = ''
 
323
            return ''
301
324
        elif hasattr(value, 'strftime'):
302
325
            value = datetime_safe.new_datetime(value)
303
 
            value = value.strftime(self.format)
 
326
            return value.strftime(self.format)
 
327
        return value
 
328
 
 
329
    def render(self, name, value, attrs=None):
 
330
        value = self._format_value(value)
304
331
        return super(DateTimeInput, self).render(name, value, attrs)
305
332
 
 
333
    def _has_changed(self, initial, data):
 
334
        return super(DateTimeInput, self)._has_changed(self._format_value(initial), data)
 
335
 
306
336
class TimeInput(Input):
307
337
    input_type = 'text'
 
338
    format = '%H:%M:%S'     # '14:30:59'
 
339
 
 
340
    def __init__(self, attrs=None, format=None):
 
341
        super(TimeInput, self).__init__(attrs)
 
342
        if format:
 
343
            self.format = format
 
344
 
 
345
    def _format_value(self, value):
 
346
        if value is None:
 
347
            return ''
 
348
        elif hasattr(value, 'strftime'):
 
349
            return value.strftime(self.format)
 
350
        return value
308
351
 
309
352
    def render(self, name, value, attrs=None):
310
 
        if value is None:
311
 
            value = ''
312
 
        elif isinstance(value, time):
313
 
            value = value.replace(microsecond=0)
 
353
        value = self._format_value(value)
314
354
        return super(TimeInput, self).render(name, value, attrs)
315
355
 
 
356
    def _has_changed(self, initial, data):
 
357
        return super(TimeInput, self)._has_changed(self._format_value(initial), data)
 
358
 
316
359
class CheckboxInput(Widget):
317
360
    def __init__(self, attrs=None, check_test=bool):
318
361
        super(CheckboxInput, self).__init__(attrs)
400
443
 
401
444
    def value_from_datadict(self, data, files, name):
402
445
        value = data.get(name, None)
403
 
        return {u'2': True, u'3': False, True: True, False: False}.get(value, None)
 
446
        return {u'2': True,
 
447
                True: True,
 
448
                'True': True,
 
449
                u'3': False,
 
450
                'False': False,
 
451
                False: False}.get(value, None)
404
452
 
405
453
    def _has_changed(self, initial, data):
406
454
        # Sometimes data or initial could be None or u'' which should be the
655
703
    """
656
704
    A Widget that splits datetime input into two <input type="text"> boxes.
657
705
    """
658
 
    def __init__(self, attrs=None):
659
 
        widgets = (TextInput(attrs=attrs), TextInput(attrs=attrs))
 
706
    date_format = DateInput.format
 
707
    time_format = TimeInput.format
 
708
 
 
709
    def __init__(self, attrs=None, date_format=None, time_format=None):
 
710
        if date_format:
 
711
            self.date_format = date_format
 
712
        if time_format:
 
713
            self.time_format = time_format
 
714
        widgets = (DateInput(attrs=attrs, format=self.date_format),
 
715
                   TimeInput(attrs=attrs, format=self.time_format))
660
716
        super(SplitDateTimeWidget, self).__init__(widgets, attrs)
661
717
 
662
718
    def decompress(self, value):
671
727
    def __init__(self, attrs=None):
672
728
        widgets = (HiddenInput(attrs=attrs), HiddenInput(attrs=attrs))
673
729
        super(SplitDateTimeWidget, self).__init__(widgets, attrs)
674