diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2018-01-16 17:13:41 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2018-01-16 17:13:41 +0100 |
commit | 54708828098b5b67cd1f45af9f8659928d5ee143 (patch) | |
tree | 0713e5f40f8f417f75a4f338f84fb92967a8cc19 /bootstrap_datepicker | |
parent | 4cd4fedf3a937242f154eed47fc4efadb9cc2928 (diff) | |
download | Ishtar-54708828098b5b67cd1f45af9f8659928d5ee143.tar.bz2 Ishtar-54708828098b5b67cd1f45af9f8659928d5ee143.zip |
UI: manage localissation of date input fields
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 |