summaryrefslogtreecommitdiff
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
parent4cd4fedf3a937242f154eed47fc4efadb9cc2928 (diff)
downloadIshtar-54708828098b5b67cd1f45af9f8659928d5ee143.tar.bz2
Ishtar-54708828098b5b67cd1f45af9f8659928d5ee143.zip
UI: manage localissation of date input fields
-rw-r--r--archaeological_operations/forms.py64
-rw-r--r--bootstrap_datepicker/widgets.py45
-rw-r--r--ishtar_common/forms.py8
3 files changed, 69 insertions, 48 deletions
diff --git a/archaeological_operations/forms.py b/archaeological_operations/forms.py
index ce87685a2..4f37bfc2d 100644
--- a/archaeological_operations/forms.py
+++ b/archaeological_operations/forms.py
@@ -40,7 +40,7 @@ from ishtar_common.models import valid_id, Person, Town, \
organization_type_pk_lazy
from ishtar_common.wizards import MultiValueDict
-from bootstrap_datepicker.widgets import DatePicker
+from bootstrap_datepicker.widgets import DateField
from archaeological_files.models import File
import models
@@ -526,14 +526,10 @@ class OperationSelect(TableSelect):
# max_length=20)
remains = forms.ChoiceField(label=_(u"Remains"), choices=[])
periods = forms.ChoiceField(label=_(u"Periods"), choices=[])
- start_before = forms.DateField(label=_(u"Started before"),
- widget=DatePicker)
- start_after = forms.DateField(label=_(u"Started after"),
- widget=DatePicker)
- end_before = forms.DateField(label=_(u"Ended before"),
- widget=DatePicker)
- end_after = forms.DateField(label=_(u"Ended after"),
- widget=DatePicker)
+ start_before = DateField(label=_(u"Started before"))
+ start_after = DateField(label=_(u"Started after"))
+ end_before = DateField(label=_(u"Ended before"))
+ end_after = DateField(label=_(u"Ended after"))
relation_types = forms.MultipleChoiceField(
label=_(u"Search within relations"), choices=[],
widget=forms.CheckboxSelectMultiple)
@@ -564,16 +560,16 @@ class OperationSelect(TableSelect):
args=['0', 'user']),
associated_model=Person),
validators=[valid_id(Person)])
- documentation_deadline_before = forms.DateField(
- label=_(u"Documentation deadline before"), widget=DatePicker)
- documentation_deadline_after = forms.DateField(
- label=_(u"Documentation deadline after"), widget=DatePicker)
+ documentation_deadline_before = DateField(
+ label=_(u"Documentation deadline before"))
+ documentation_deadline_after = DateField(
+ label=_(u"Documentation deadline after"))
documentation_received = forms.NullBooleanField(
label=_(u"Documentation received"))
- finds_deadline_before = forms.DateField(
- label=_(u"Finds deadline before"), widget=DatePicker)
- finds_deadline_after = forms.DateField(
- label=_(u"Finds deadline after"), widget=DatePicker)
+ finds_deadline_before = DateField(
+ label=_(u"Finds deadline before"))
+ finds_deadline_after = DateField(
+ label=_(u"Finds deadline after"))
finds_received = forms.NullBooleanField(
label=_(u"Finds received"))
@@ -708,10 +704,8 @@ class DashboardForm(IshtarForm):
required=False)
operator = forms.ChoiceField(label=_("Operator"), choices=[],
required=False)
- after = forms.DateField(label=_(u"Date after"),
- widget=DatePicker, required=False)
- before = forms.DateField(label=_(u"Date before"),
- widget=DatePicker, required=False)
+ after = DateField(label=_(u"Date after"), required=False)
+ before = DateField(label=_(u"Date before"), required=False)
with_report = forms.BooleanField(label=_("With reports"), required=False)
with_finds = forms.BooleanField(label=_("With finds"), required=False)
@@ -833,19 +827,15 @@ class OperationFormGeneral(CustomForm, ManageOldType):
label=_(u"Total surface (m2)"),
validators=[validators.MinValueValidator(0),
validators.MaxValueValidator(999999999)])
- start_date = forms.DateField(
- label=_(u"Start date"), required=False, widget=DatePicker)
- excavation_end_date = forms.DateField(
- label=_(u"Excavation end date"), required=False,
- widget=DatePicker)
- report_delivery_date = forms.DateField(
- label=_(u"Report delivery date"), required=False,
- widget=DatePicker)
+ start_date = DateField(label=_(u"Start date"), required=False)
+ excavation_end_date = DateField(label=_(u"Excavation end date"),
+ required=False)
+ report_delivery_date = DateField(label=_(u"Report delivery date"),
+ required=False)
report_processing = forms.ChoiceField(label=_(u"Report processing"),
choices=[], required=False)
if settings.COUNTRY == 'fr':
- cira_date = forms.DateField(label=u"Date avis CIRA", required=False,
- widget=DatePicker)
+ cira_date = DateField(label=u"Date avis CIRA", required=False)
negative_result = forms.NullBooleanField(
required=False, label=u"Résultat considéré comme négatif")
cira_rapporteur = forms.IntegerField(
@@ -860,14 +850,14 @@ class OperationFormGeneral(CustomForm, ManageOldType):
person_type_pk_lazy('head_scientist')]},
associated_model=Person, new=True),
validators=[valid_id(Person)], required=False)
- documentation_deadline = forms.DateField(
+ documentation_deadline = DateField(
label=_(u"Deadline for submission of the documentation"),
- required=False, widget=DatePicker)
+ required=False)
documentation_received = forms.NullBooleanField(
required=False, label=_(u"Documentation received"))
- finds_deadline = forms.DateField(
+ finds_deadline = DateField(
label=_(u"Deadline for submission of the finds"), required=False,
- widget=DatePicker)
+ )
finds_received = forms.NullBooleanField(
required=False, label=_(u"Finds received"))
@@ -1422,8 +1412,8 @@ class AdministrativeActOpeForm(CustomForm, ManageOldType):
# validators=[valid_id(Person)], required=False)
act_object = forms.CharField(label=_(u"Object"), max_length=300,
widget=forms.Textarea, required=False)
- signature_date = forms.DateField(
- label=_(u"Signature date"), initial=get_now, widget=DatePicker)
+ signature_date = DateField(
+ label=_(u"Signature date"), initial=get_now)
if settings.COUNTRY == 'fr':
ref_sra = forms.CharField(label=u"Autre référence", max_length=15,
required=False)
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
diff --git a/ishtar_common/forms.py b/ishtar_common/forms.py
index 41cebbeb5..5b8b43bf4 100644
--- a/ishtar_common/forms.py
+++ b/ishtar_common/forms.py
@@ -32,7 +32,7 @@ from django.utils import formats, translation
from django.utils.functional import lazy
from django.utils.translation import ugettext_lazy as _
-from bootstrap_datepicker.widgets import DatePicker
+from bootstrap_datepicker.widgets import DatePicker, DATE_FORMAT
import models
import widgets
from ishtar_common.utils import MultiValueDict
@@ -242,12 +242,6 @@ class FormSet(CustomForm, BaseFormSet):
form.fields[DELETION_FIELD_NAME].widget = widgets.DeleteWidget()
-DATE_FORMAT = {
- 'fr': "dd/mm/yyyy",
- 'en': "yyyy/mm/dd",
-}
-
-
class IshtarForm(forms.Form):
def __init__(self, *args, **kwargs):
super(IshtarForm, self).__init__(*args, **kwargs)