From f79e1adf25ea401b381bbfb44fb7bea82af2d203 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Sat, 17 Sep 2016 22:33:39 +0200 Subject: [PATCH] Fix #55 -- Datetime picker for input fields --- .gitattributes | 1 + src/pretix/control/context.py | 5 + src/pretix/control/forms/event.py | 15 +- src/pretix/control/forms/item.py | 4 + src/pretix/control/forms/orders.py | 3 + src/pretix/control/forms/vouchers.py | 6 + .../control/templates/pretixcontrol/base.html | 4 +- src/pretix/control/utils/__init__.py | 0 src/pretix/control/utils/i18n.py | 65 + .../_bootstrap-datetimepicker.scss | 344 +++ .../bootstrap-datetimepicker.js | 2623 +++++++++++++++++ src/static/pretixcontrol/js/ui/main.js | 20 + src/static/pretixcontrol/scss/main.scss | 1 + 13 files changed, 3087 insertions(+), 4 deletions(-) create mode 100644 src/pretix/control/utils/__init__.py create mode 100644 src/pretix/control/utils/i18n.py create mode 100644 src/static/datetimepicker/_bootstrap-datetimepicker.scss create mode 100644 src/static/datetimepicker/bootstrap-datetimepicker.js diff --git a/.gitattributes b/.gitattributes index 04dbbd556d..185b40aefd 100644 --- a/.gitattributes +++ b/.gitattributes @@ -2,3 +2,4 @@ src/static/fontawesome/* linguist-vendored src/static/lightbox/* linguist-vendored src/static/typeahead/* linguist-vendored src/static/moment/* linguist-vendored +src/static/datetimepicker/* linguist-vendored diff --git a/src/pretix/control/context.py b/src/pretix/control/context.py index f9547e5a5b..fd9ca71747 100644 --- a/src/pretix/control/context.py +++ b/src/pretix/control/context.py @@ -2,6 +2,7 @@ from django.conf import settings from django.core.urlresolvers import Resolver404, get_script_prefix, resolve from .signals import html_head, nav_event +from .utils.i18n import get_javascript_format, get_moment_locale def contextprocessor(request): @@ -30,4 +31,8 @@ def contextprocessor(request): for receiver, response in nav_event.send(request.event, request=request): _nav_event += response ctx['nav_event'] = _nav_event + + ctx['js_datetime_format'] = get_javascript_format('DATETIME_INPUT_FORMATS') + ctx['js_locale'] = get_moment_locale() + return ctx diff --git a/src/pretix/control/forms/event.py b/src/pretix/control/forms/event.py index 4dea0a7fa4..c90d831b14 100644 --- a/src/pretix/control/forms/event.py +++ b/src/pretix/control/forms/event.py @@ -86,6 +86,12 @@ class EventUpdateForm(I18nModelForm): 'presale_start', 'presale_end', ] + widgets = { + 'date_from': forms.DateTimeInput(attrs={'class': 'datetimepicker'}), + 'date_to': forms.DateTimeInput(attrs={'class': 'datetimepicker'}), + 'presale_start': forms.DateTimeInput(attrs={'class': 'datetimepicker'}), + 'presale_end': forms.DateTimeInput(attrs={'class': 'datetimepicker'}), + } class EventSettingsForm(SettingsForm): @@ -113,7 +119,8 @@ class EventSettingsForm(SettingsForm): label=_('Last date of modifications'), help_text=_("The last date users can modify details of their orders, such as attendee names or " "answers to questions."), - required=False + required=False, + widget=forms.DateTimeInput(attrs={'class': 'datetimepicker'}), ) timezone = forms.ChoiceField( choices=((a, a) for a in common_timezones), @@ -188,7 +195,8 @@ class PaymentSettingsForm(SettingsForm): label=_('Last date of payments'), help_text=_("The last date any payments are accepted. This has precedence over the number of " "days configured above."), - required=False + required=False, + widget=forms.DateTimeInput(attrs={'class': 'datetimepicker'}) ) payment_term_expire_automatically = forms.BooleanField( label=_('Automatically expire unpaid orders'), @@ -439,7 +447,8 @@ class TicketSettingsForm(SettingsForm): ticket_download_date = forms.DateTimeField( label=_("Download date"), help_text=_("Ticket download will be offered after this date."), - required=True + required=True, + widget=forms.DateTimeInput(attrs={'class': 'datetimepicker'}) ) def prepare_fields(self): diff --git a/src/pretix/control/forms/item.py b/src/pretix/control/forms/item.py index 3eaea40822..65d0b02400 100644 --- a/src/pretix/control/forms/item.py +++ b/src/pretix/control/forms/item.py @@ -147,6 +147,10 @@ class ItemUpdateForm(I18nModelForm): 'hide_without_voucher', 'allow_cancel' ] + widgets = { + 'available_from': forms.DateTimeInput(attrs={'class': 'datetimepicker'}), + 'available_until': forms.DateTimeInput(attrs={'class': 'datetimepicker'}), + } class ItemVariationForm(I18nModelForm): diff --git a/src/pretix/control/forms/orders.py b/src/pretix/control/forms/orders.py index 4b27e427e1..053941c2ff 100644 --- a/src/pretix/control/forms/orders.py +++ b/src/pretix/control/forms/orders.py @@ -11,6 +11,9 @@ class ExtendForm(I18nModelForm): class Meta: model = Order fields = ['expires'] + widgets = { + 'expires': forms.DateTimeInput(attrs={'class': 'datetimepicker'}), + } class ExporterForm(forms.Form): diff --git a/src/pretix/control/forms/vouchers.py b/src/pretix/control/forms/vouchers.py index 65d0c3ec85..38f8b8f51f 100644 --- a/src/pretix/control/forms/vouchers.py +++ b/src/pretix/control/forms/vouchers.py @@ -25,6 +25,9 @@ class VoucherForm(I18nModelForm): 'code', 'valid_until', 'block_quota', 'allow_ignore_quota', 'price', 'tag', 'comment' ] + widgets = { + 'valid_until': forms.DateTimeInput(attrs={'class': 'datetimepicker'}), + } def __init__(self, *args, **kwargs): instance = kwargs.get('instance') @@ -177,6 +180,9 @@ class VoucherBulkForm(VoucherForm): fields = [ 'valid_until', 'block_quota', 'allow_ignore_quota', 'price', 'tag', 'comment' ] + widgets = { + 'valid_until': forms.DateTimeInput(attrs={'class': 'datetimepicker'}), + } def clean(self): data = super().clean() diff --git a/src/pretix/control/templates/pretixcontrol/base.html b/src/pretix/control/templates/pretixcontrol/base.html index 42ba451fd1..310ec9ce18 100644 --- a/src/pretix/control/templates/pretixcontrol/base.html +++ b/src/pretix/control/templates/pretixcontrol/base.html @@ -15,6 +15,8 @@ + + @@ -23,7 +25,7 @@ - +