summaryrefslogtreecommitdiff
path: root/bootstrap_datepicker
diff options
context:
space:
mode:
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
commit54708828098b5b67cd1f45af9f8659928d5ee143 (patch)
tree0713e5f40f8f417f75a4f338f84fb92967a8cc19 /bootstrap_datepicker
parent4cd4fedf3a937242f154eed47fc4efadb9cc2928 (diff)
downloadIshtar-54708828098b5b67cd1f45af9f8659928d5ee143.tar.bz2
Ishtar-54708828098b5b67cd1f45af9f8659928d5ee143.zip
UI: manage localissation of date input fields
Diffstat (limited to 'bootstrap_datepicker')
-rw-r--r--bootstrap_datepicker/widgets.py45
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