diff options
Diffstat (limited to 'bootstrap_datepicker')
| -rw-r--r-- | bootstrap_datepicker/widgets.py | 45 | 
1 files changed, 41 insertions, 4 deletions
| diff --git a/bootstrap_datepicker/widgets.py b/bootstrap_datepicker/widgets.py index 85a651efc..7baa44e66 100644 --- a/bootstrap_datepicker/widgets.py +++ b/bootstrap_datepicker/widgets.py @@ -1,6 +1,11 @@  # -*- coding: utf-8 -*- +from __future__ import unicode_literals + +import datetime  from json import dumps as json_dumps +import logging +from django import forms  from django.forms.utils import flatatt  from django.forms.widgets import DateTimeInput  from django.utils.safestring import mark_safe @@ -8,6 +13,16 @@ from django.utils import translation  from django.utils.html import conditional_escape  from django.utils.encoding import force_text +logger = logging.getLogger(__name__) + + +DATE_FORMAT = { +    'fr': "dd/mm/yyyy", +    'en': "yyyy/mm/dd", +} + +DATE_INPUT_FORMATS = ['%d/%m/%Y', '%Y/%m/%d', '%Y-%m-%d'] +  class DatePicker(DateTimeInput):      class Media: @@ -17,7 +32,7 @@ class DatePicker(DateTimeInput):                  lang = translation.get_language()                  if lang:                      lang = lang.lower() -                    # There is language name that length>2 or contains uppercase. +                    # language name with length > 2 or containing uppercase                      lang_map = {                          'en-au': 'en-AU',                          'en-gb': 'en-GB', @@ -34,7 +49,8 @@ class DatePicker(DateTimeInput):                      if len(lang) > 2:                          lang = lang_map.get(lang, 'en-us')                      if lang not in ('en', 'en-us'): -                        yield 'js/locales/bootstrap-datepicker.%s.min.js' % (lang) +                        yield 'js/locales/bootstrap-datepicker.%s.min.js' % ( +                            lang)          js = JSFiles()          css = {'all': ('css/bootstrap-datepicker3.standalone.min.css',), } @@ -105,6 +121,21 @@ class DatePicker(DateTimeInput):                  'date-format'):              self.options['format'] = self.conv_datetime_format_py2js(format) +    def format_value(self, value): +        if not self.options.get('format'): +            logger.debug('datepicker: format not defined') +            return str(value) +        py_format = self.conv_datetime_format_js2py(self.options['format']) +        if not hasattr(value, 'strftime'): +            value = str(value) +            try: +                value = datetime.datetime.strptime(value, '%Y-%m-%d') +            except ValueError: +                logger.debug('datepicker: cannot extract date from %s' % value) +                return str(value) +        value = value.strftime(py_format) +        return value +      def render(self, name, value, attrs=None):          if value is None:              value = '' @@ -114,11 +145,12 @@ class DatePicker(DateTimeInput):          input_attrs = self.build_attrs(attrs, extra_attrs)          if value != '':              # Only add the 'value' attribute if a value is non-empty. -            input_attrs['value'] = force_text(self._format_value(value)) +            input_attrs['value'] = force_text(self.format_value(value))          input_attrs = {key: conditional_escape(val)                         for key, val in input_attrs.items()}          if not self.picker_id: -            self.picker_id = (input_attrs.get('id', '') + '_pickers' +            self.picker_id = ( +                input_attrs.get('id', '') + '_pickers'              ).replace(' ', '_')          self.div_attrs['id'] = self.picker_id          picker_id = conditional_escape(self.picker_id) @@ -132,3 +164,8 @@ class DatePicker(DateTimeInput):          js = self.js_template % dict(picker_id=picker_id,                                       options=json_dumps(self.options or {}))          return mark_safe(force_text(html + js)) + + +class DateField(forms.DateField): +    widget = DatePicker +    input_formats = DATE_INPUT_FORMATS | 
