From f1fc13f739504464b241cccd0693c8ba9de7b064 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Sat, 16 Jun 2012 02:07:13 -0400 Subject: [PATCH] Move widgets code from forms.py to widgets.py --- apps/checkouts/forms.py | 86 +-------------------------------------- apps/checkouts/widgets.py | 86 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+), 85 deletions(-) diff --git a/apps/checkouts/forms.py b/apps/checkouts/forms.py index cfdecee26e..255a52fe55 100644 --- a/apps/checkouts/forms.py +++ b/apps/checkouts/forms.py @@ -1,95 +1,11 @@ from __future__ import absolute_import -import datetime - from django import forms from django.utils.translation import ugettext_lazy as _ -from django.core import validators from .models import DocumentCheckout from .exceptions import DocumentAlreadyCheckedOut - - -class SplitDeltaWidget(forms.widgets.MultiWidget): - """ - A Widget that splits a timedelta input into three boxes. - """ - def __init__(self, attrs=None): - widgets = ( - forms.widgets.TextInput(attrs={'maxlength': 3, 'style':'width: 5em;', 'placeholder': _(u'Days')}), - forms.widgets.TextInput(attrs={'maxlength': 4, 'style':'width: 5em;', 'placeholder': _(u'Hours')}), - forms.widgets.TextInput(attrs={'maxlength': 5, 'style':'width: 5em;', 'placeholder': _(u'Minutes')}), - ) - super(SplitDeltaWidget, self).__init__(widgets, attrs) - - def decompress(self, value): - if value: - return [value.days, value.seconds / 3600, (value.seconds / 60) % 60] - return [None, None, None] - - def value_from_datadict(self, data, files, name): - return [data.get('expiration_datetime_0', 0) or 0, data.get('expiration_datetime_1', 0) or 0, data.get('expiration_datetime_2', 0) or 0] - - -class SplitHiddenDeltaWidget(forms.widgets.SplitDateTimeWidget): - """ - A Widget that splits a timedelta input into three inputs. - """ - is_hidden = True - - def __init__(self, attrs=None): - super(SplitHiddenDeltaWidget, self).__init__(attrs, date_format, time_format) - for widget in self.widgets: - widget.input_type = 'hidden' - widget.is_hidden = True - - -class SplitTimeDeltaField(forms.MultiValueField): - widget = SplitDeltaWidget - hidden_widget = SplitHiddenDeltaWidget - default_error_messages = { - 'invalid_days': _(u'Enter a valid number of days.'), - 'invalid_hours': _(u'Enter a valid number of hours.'), - 'invalid_minutes': _(u'Enter a valid number of minutes.'), - } - - def __init__(self, *args, **kwargs): - errors = self.default_error_messages.copy() - if 'error_messages' in kwargs: - errors.update(kwargs['error_messages']) - localize = kwargs.get('localize', False) - fields = ( - forms.IntegerField(min_value=0, - error_messages={'invalid': errors['invalid_days']}, - localize=localize - ), - forms.IntegerField(min_value=0, - error_messages={'invalid': errors['invalid_hours']}, - localize=localize - ), - forms.IntegerField(min_value=0, - error_messages={'invalid': errors['invalid_minutes']}, - localize=localize - ), - ) - super(SplitTimeDeltaField, self).__init__(fields, *args, **kwargs) - self.help_text = _(u'Amount of time to hold the document in the checked out state in days, hours and/or minutes.') - self.label = _('Check out expiration date and time') - - def compress(self, data_list): - if data_list: - # Raise a validation error if time or date is empty - # (possible if SplitDateTimeField has required=False). - if data_list[0] in validators.EMPTY_VALUES: - raise ValidationError(self.error_messages['invalid_days']) - if data_list[1] in validators.EMPTY_VALUES: - raise ValidationError(self.error_messages['invalid_hours']) - if data_list[2] in validators.EMPTY_VALUES: - raise ValidationError(self.error_messages['invalid_minutes']) - - timedelta = datetime.timedelta(days=data_list[0], hours=data_list[1], minutes=data_list[2]) - return datetime.datetime.now() + timedelta - return None +from .widgets import SplitTimeDeltaField class DocumentCheckoutForm(forms.ModelForm): diff --git a/apps/checkouts/widgets.py b/apps/checkouts/widgets.py index e1a0d38302..bc44211f4c 100644 --- a/apps/checkouts/widgets.py +++ b/apps/checkouts/widgets.py @@ -1,8 +1,12 @@ from __future__ import absolute_import +import datetime + +from django import forms from django.utils.translation import ugettext_lazy as _ from django.utils.safestring import mark_safe from django.conf import settings +from django.core import validators from .literals import STATE_CHECKED_OUT, STATE_CHECKED_IN, STATE_ICONS, STATE_LABELS @@ -15,3 +19,85 @@ def checkout_widget(document): 'widget': mark_safe(widget), 'text': STATE_LABELS[checkout_state] } + + +class SplitDeltaWidget(forms.widgets.MultiWidget): + """ + A Widget that splits a timedelta input into three boxes. + """ + def __init__(self, attrs=None): + widgets = ( + forms.widgets.TextInput(attrs={'maxlength': 3, 'style':'width: 5em;', 'placeholder': _(u'Days')}), + forms.widgets.TextInput(attrs={'maxlength': 4, 'style':'width: 5em;', 'placeholder': _(u'Hours')}), + forms.widgets.TextInput(attrs={'maxlength': 5, 'style':'width: 5em;', 'placeholder': _(u'Minutes')}), + ) + super(SplitDeltaWidget, self).__init__(widgets, attrs) + + def decompress(self, value): + if value: + return [value.days, value.seconds / 3600, (value.seconds / 60) % 60] + return [None, None, None] + + def value_from_datadict(self, data, files, name): + return [data.get('expiration_datetime_0', 0) or 0, data.get('expiration_datetime_1', 0) or 0, data.get('expiration_datetime_2', 0) or 0] + + +class SplitHiddenDeltaWidget(forms.widgets.SplitDateTimeWidget): + """ + A Widget that splits a timedelta input into three inputs. + """ + is_hidden = True + + def __init__(self, attrs=None): + super(SplitHiddenDeltaWidget, self).__init__(attrs, date_format, time_format) + for widget in self.widgets: + widget.input_type = 'hidden' + widget.is_hidden = True + + +class SplitTimeDeltaField(forms.MultiValueField): + widget = SplitDeltaWidget + hidden_widget = SplitHiddenDeltaWidget + default_error_messages = { + 'invalid_days': _(u'Enter a valid number of days.'), + 'invalid_hours': _(u'Enter a valid number of hours.'), + 'invalid_minutes': _(u'Enter a valid number of minutes.'), + } + + def __init__(self, *args, **kwargs): + errors = self.default_error_messages.copy() + if 'error_messages' in kwargs: + errors.update(kwargs['error_messages']) + localize = kwargs.get('localize', False) + fields = ( + forms.IntegerField(min_value=0, + error_messages={'invalid': errors['invalid_days']}, + localize=localize + ), + forms.IntegerField(min_value=0, + error_messages={'invalid': errors['invalid_hours']}, + localize=localize + ), + forms.IntegerField(min_value=0, + error_messages={'invalid': errors['invalid_minutes']}, + localize=localize + ), + ) + super(SplitTimeDeltaField, self).__init__(fields, *args, **kwargs) + self.help_text = _(u'Amount of time to hold the document in the checked out state in days, hours and/or minutes.') + self.label = _('Check out expiration date and time') + + def compress(self, data_list): + if data_list: + # Raise a validation error if time or date is empty + # (possible if SplitDateTimeField has required=False). + if data_list[0] in validators.EMPTY_VALUES: + raise ValidationError(self.error_messages['invalid_days']) + if data_list[1] in validators.EMPTY_VALUES: + raise ValidationError(self.error_messages['invalid_hours']) + if data_list[2] in validators.EMPTY_VALUES: + raise ValidationError(self.error_messages['invalid_minutes']) + + timedelta = datetime.timedelta(days=data_list[0], hours=data_list[1], minutes=data_list[2]) + return datetime.datetime.now() + timedelta + return None