diff --git a/mayan/apps/checkouts/forms.py b/mayan/apps/checkouts/forms.py
index cda92dbee5..0b14a198c9 100644
--- a/mayan/apps/checkouts/forms.py
+++ b/mayan/apps/checkouts/forms.py
@@ -3,12 +3,13 @@ from __future__ import unicode_literals
from django import forms
from .models import DocumentCheckout
-from .widgets import SplitTimeDeltaField
+from .widgets import SplitTimeDeltaWidget
class DocumentCheckoutForm(forms.ModelForm):
- expiration_datetime = SplitTimeDeltaField()
-
class Meta:
model = DocumentCheckout
exclude = ('document', 'checkout_datetime', 'user')
+ widgets = {
+ 'expiration_datetime': SplitTimeDeltaWidget()
+ }
diff --git a/mayan/apps/checkouts/widgets.py b/mayan/apps/checkouts/widgets.py
index 37d14db1ad..b8e01fe753 100644
--- a/mayan/apps/checkouts/widgets.py
+++ b/mayan/apps/checkouts/widgets.py
@@ -7,91 +7,33 @@ from django.core import validators
from django.utils.timezone import now
from django.utils.translation import ugettext_lazy as _
+from common.literals import TIME_DELTA_UNIT_CHOICES
-class SplitDeltaWidget(forms.widgets.MultiWidget):
+
+class SplitTimeDeltaWidget(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': _('Days')}),
- forms.widgets.TextInput(attrs={'maxlength': 4, 'style': 'width: 5em;', 'placeholder': _('Hours')}),
- forms.widgets.TextInput(attrs={'maxlength': 5, 'style': 'width: 5em;', 'placeholder': _('Minutes')}),
+ forms.widgets.NumberInput(attrs={'maxlength': 4, 'style': 'width: 8em;', 'placeholder': _('Period')}),
+ forms.widgets.Select(attrs={'style': 'width: 8em;'}, choices=TIME_DELTA_UNIT_CHOICES),
+
)
- super(SplitDeltaWidget, self).__init__(widgets, attrs)
+ super(SplitTimeDeltaWidget, self).__init__(widgets, attrs)
def decompress(self, value):
- if value:
- return [value.days, value.seconds / 3600, (value.seconds / 60) % 60]
- return [None, None, None]
+ return (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]
+ def value_from_datadict(self, querydict, files, name):
+ unit = querydict.get('{}_1'.format(name))
+ period = querydict.get('{}_0'.format(name))
+ if not unit or not period:
+ return now()
-class SplitHiddenDeltaWidget(forms.widgets.SplitDateTimeWidget):
- """
- A Widget that splits a timedelta input into three inputs.
- """
- is_hidden = True
+ period = int(period)
- def __init__(self, *args, **kwargs):
- super(SplitHiddenDeltaWidget, self).__init__(*args, **kwargs)
- 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': _('Enter a valid number of days.'),
- 'invalid_hours': _('Enter a valid number of hours.'),
- 'invalid_minutes': _('Enter a valid number of minutes.'),
- 'invalid_timedelta': _('Enter a valid time difference.'),
- }
-
- 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 = _('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 == [0, 0, 0]:
- raise forms.ValidationError(self.error_messages['invalid_timedelta'])
-
- 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 forms.ValidationError(self.error_messages['invalid_days'])
- if data_list[1] in validators.EMPTY_VALUES:
- raise forms.ValidationError(self.error_messages['invalid_hours'])
- if data_list[2] in validators.EMPTY_VALUES:
- raise forms.ValidationError(self.error_messages['invalid_minutes'])
-
- timedelta = datetime.timedelta(days=data_list[0], hours=data_list[1], minutes=data_list[2])
- return now() + timedelta
- return None
+ timedelta = datetime.timedelta(**{unit: period})
+ return now() + timedelta