From 6ea4315beb2a1486a41fd142e70ef0dba185588c Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Wed, 20 Jan 2021 17:13:15 +0100 Subject: [PATCH] Subevent bulk creation: Allow to auto-generate time slots --- .../pretixcontrol/subevents/bulk.html | 44 +++++++++++++++++- src/pretix/control/views/subevents.py | 7 ++- src/pretix/static/pretixcontrol/js/ui/main.js | 2 + .../static/pretixcontrol/js/ui/subevent.js | 45 +++++++++++++++++++ 4 files changed, 96 insertions(+), 2 deletions(-) diff --git a/src/pretix/control/templates/pretixcontrol/subevents/bulk.html b/src/pretix/control/templates/pretixcontrol/subevents/bulk.html index aff935c3da..d7adc21f90 100644 --- a/src/pretix/control/templates/pretixcontrol/subevents/bulk.html +++ b/src/pretix/control/templates/pretixcontrol/subevents/bulk.html @@ -332,9 +332,51 @@ {% endescapescript %} +

+ {% trans "Add a single time slot" %} +

diff --git a/src/pretix/control/views/subevents.py b/src/pretix/control/views/subevents.py index 0a500292be..929124405f 100644 --- a/src/pretix/control/views/subevents.py +++ b/src/pretix/control/views/subevents.py @@ -1,5 +1,5 @@ import copy -from datetime import datetime, timedelta +from datetime import datetime, timedelta, time from dateutil.rrule import DAILY, MONTHLY, WEEKLY, YEARLY, rrule, rruleset from django.contrib import messages @@ -11,6 +11,7 @@ from django.forms import inlineformset_factory from django.http import Http404, HttpResponseRedirect from django.shortcuts import redirect, render from django.urls import reverse +from django.utils.formats import get_format from django.utils.functional import cached_property from django.utils.timezone import make_aware from django.utils.translation import gettext_lazy as _, pgettext_lazy @@ -622,6 +623,10 @@ class SubEventBulkCreate(SubEventEditorMixin, EventPermissionRequiredMixin, Crea ctx = super().get_context_data(**kwargs) ctx['rrule_formset'] = self.rrule_formset ctx['time_formset'] = self.time_formset + + tf = get_format('TIME_INPUT_FORMATS')[0] + ctx['time_begin_sample'] = time(9, 0, 0).strftime(tf) + ctx['time_end_sample'] = time(18, 0, 0).strftime(tf) return ctx @cached_property diff --git a/src/pretix/static/pretixcontrol/js/ui/main.js b/src/pretix/static/pretixcontrol/js/ui/main.js index e0ce8e34d2..77a03215a5 100644 --- a/src/pretix/static/pretixcontrol/js/ui/main.js +++ b/src/pretix/static/pretixcontrol/js/ui/main.js @@ -101,6 +101,7 @@ var form_handlers = function (el) { locale: $("body").attr("data-datetimelocale"), useCurrent: false, showClear: !$(this).prop("required"), + viewMode: 'years', icons: { time: 'fa fa-clock-o', date: 'fa fa-calendar', @@ -563,6 +564,7 @@ $(function () { } ); $("[data-formset]").on("formAdded", "div", function (event) { + console.log("formAdded") form_handlers($(event.target)); }); $(document).on("click", ".variations .variations-select-all", function (e) { diff --git a/src/pretix/static/pretixcontrol/js/ui/subevent.js b/src/pretix/static/pretixcontrol/js/ui/subevent.js index a4868f7a85..b35df37be3 100644 --- a/src/pretix/static/pretixcontrol/js/ui/subevent.js +++ b/src/pretix/static/pretixcontrol/js/ui/subevent.js @@ -136,6 +136,51 @@ $(function () { rrule_form_toggles($form); } + $("#subevent_add_many_slots_go").on("click", function () { + $("#time-formset [data-formset-form]").each(function () { + var tf = $(this).find("[name$=time_from]").val() + if (!tf) { + $(this).remove(); + } + }) + + var first = $("#subevent_add_many_slots_first").data('DateTimePicker').date(); + var end = $("#subevent_add_many_slots_end").data('DateTimePicker').date(); + var length_m = parseFloat($("#subevent_add_many_slots_length").val()) || 0; + var break_m = parseFloat($("#subevent_add_many_slots_break").val()) || 0; + if (!first || !end || !length_m) { + console.log("invalid", first, end, length_m) + return + } + + function closure($form, time) { + return function () { + console.log("setting value", time) + $form.find("[name$=time_from]").data('DateTimePicker').date(time); + time.add(length_m, 'minutes'); + $form.find("[name$=time_to]").data('DateTimePicker').date(time); + } + } + + var pointer = first.clone(); + while (pointer.isBefore(end)) { + var $form = $("#time-formset").formset("getOrCreate").addForm(); + $form.attr("data-formset-created-at-runtime", "false"); // prevents animation + var time = pointer.clone(); + window.setTimeout(closure($form, time), 1); + // jquery.formset.js only calls trigger("formAdded") after a setTimeout of 0, + // but we need to run after that to make sure the date pickers are initialized + pointer.add(break_m + length_m, 'minutes'); + } + $("#subevent_add_many_slots").addClass("hidden"); + $("#subevent_add_many_slots_start").removeClass("hidden"); + + }); + $("#subevent_add_many_slots_start").on("click", function () { + $("#subevent_add_many_slots").removeClass("hidden"); + $(this).addClass("hidden"); + }); + $("#rrule-formset").on("change keydown keyup keypress dp.change", "input, select", function () { rrule_preview(); });