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 | dffa74ac6437924e2484a32396bf8338af2735d0 (patch) | |
tree | 0713e5f40f8f417f75a4f338f84fb92967a8cc19 | |
parent | e372d23a9e49b61799ee158e1a74ef288e440982 (diff) | |
download | Ishtar-dffa74ac6437924e2484a32396bf8338af2735d0.tar.bz2 Ishtar-dffa74ac6437924e2484a32396bf8338af2735d0.zip |
UI: manage localissation of date input fields
-rw-r--r-- | archaeological_operations/forms.py | 64 | ||||
-rw-r--r-- | bootstrap_datepicker/widgets.py | 45 | ||||
-rw-r--r-- | ishtar_common/forms.py | 8 |
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) |