diff options
| -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) | 
