mirror of
https://github.com/pretix/pretix.git
synced 2026-05-09 15:54:03 +00:00
Subevent bulk creation: Allow to auto-generate time slots
This commit is contained in:
@@ -332,9 +332,51 @@
|
|||||||
</div>
|
</div>
|
||||||
{% endescapescript %}
|
{% endescapescript %}
|
||||||
</script>
|
</script>
|
||||||
|
<div class="panel panel-default hidden" id="subevent_add_many_slots">
|
||||||
|
<div class="panel-body row">
|
||||||
|
<div class="col-md-2 col-sm-12">
|
||||||
|
<label for="subevent_add_many_slots_first">
|
||||||
|
<strong>{% trans "Start of first slot" %}</strong>
|
||||||
|
</label>
|
||||||
|
<input class="form-control timepickerfield" id="subevent_add_many_slots_first" value="{{ time_begin_sample }}">
|
||||||
|
</div>
|
||||||
|
<div class="col-md-2 col-sm-12">
|
||||||
|
<label for="subevent_add_many_slots_end">
|
||||||
|
<strong>{% trans "End of time slots" %}</strong>
|
||||||
|
</label>
|
||||||
|
<input class="form-control timepickerfield" id="subevent_add_many_slots_end" value="{{ time_end_sample }}">
|
||||||
|
</div>
|
||||||
|
<div class="col-md-3 col-sm-12">
|
||||||
|
<label for="subevent_add_many_slots_length">
|
||||||
|
<strong>{% trans "Length of slots" %}</strong>
|
||||||
|
</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<input type="text" class="form-control" id="subevent_add_many_slots_length" value="15">
|
||||||
|
<span class="input-group-addon">{% trans "minutes" %}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-3 col-sm-12">
|
||||||
|
<label for="subevent_add_many_slots_break">
|
||||||
|
<strong>{% trans "Break between slots" %}</strong>
|
||||||
|
</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<input type="number" class="form-control" id="subevent_add_many_slots_break" value="0">
|
||||||
|
<span class="input-group-addon">{% trans "minutes" %}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-2 col-sm-12">
|
||||||
|
<label> </label>
|
||||||
|
<button class="btn-block btn btn-primary" id="subevent_add_many_slots_go" type="button">
|
||||||
|
<span class="fa fa-check"></span> {% trans "Create" %}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<p>
|
<p>
|
||||||
<button type="button" class="btn btn-default" data-formset-add>
|
<button type="button" class="btn btn-default" data-formset-add>
|
||||||
<i class="fa fa-plus"></i> {% trans "Add a new time slot" %}</button>
|
<i class="fa fa-plus"></i> {% trans "Add a single time slot" %}</button>
|
||||||
|
<button type="button" class="btn btn-default" id="subevent_add_many_slots_start">
|
||||||
|
<i class="fa fa-calendar"></i> {% trans "Add many time slots" %}</button>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import copy
|
import copy
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta, time
|
||||||
|
|
||||||
from dateutil.rrule import DAILY, MONTHLY, WEEKLY, YEARLY, rrule, rruleset
|
from dateutil.rrule import DAILY, MONTHLY, WEEKLY, YEARLY, rrule, rruleset
|
||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
@@ -11,6 +11,7 @@ from django.forms import inlineformset_factory
|
|||||||
from django.http import Http404, HttpResponseRedirect
|
from django.http import Http404, HttpResponseRedirect
|
||||||
from django.shortcuts import redirect, render
|
from django.shortcuts import redirect, render
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
|
from django.utils.formats import get_format
|
||||||
from django.utils.functional import cached_property
|
from django.utils.functional import cached_property
|
||||||
from django.utils.timezone import make_aware
|
from django.utils.timezone import make_aware
|
||||||
from django.utils.translation import gettext_lazy as _, pgettext_lazy
|
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 = super().get_context_data(**kwargs)
|
||||||
ctx['rrule_formset'] = self.rrule_formset
|
ctx['rrule_formset'] = self.rrule_formset
|
||||||
ctx['time_formset'] = self.time_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
|
return ctx
|
||||||
|
|
||||||
@cached_property
|
@cached_property
|
||||||
|
|||||||
@@ -101,6 +101,7 @@ var form_handlers = function (el) {
|
|||||||
locale: $("body").attr("data-datetimelocale"),
|
locale: $("body").attr("data-datetimelocale"),
|
||||||
useCurrent: false,
|
useCurrent: false,
|
||||||
showClear: !$(this).prop("required"),
|
showClear: !$(this).prop("required"),
|
||||||
|
viewMode: 'years',
|
||||||
icons: {
|
icons: {
|
||||||
time: 'fa fa-clock-o',
|
time: 'fa fa-clock-o',
|
||||||
date: 'fa fa-calendar',
|
date: 'fa fa-calendar',
|
||||||
@@ -563,6 +564,7 @@ $(function () {
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
$("[data-formset]").on("formAdded", "div", function (event) {
|
$("[data-formset]").on("formAdded", "div", function (event) {
|
||||||
|
console.log("formAdded")
|
||||||
form_handlers($(event.target));
|
form_handlers($(event.target));
|
||||||
});
|
});
|
||||||
$(document).on("click", ".variations .variations-select-all", function (e) {
|
$(document).on("click", ".variations .variations-select-all", function (e) {
|
||||||
|
|||||||
@@ -136,6 +136,51 @@ $(function () {
|
|||||||
rrule_form_toggles($form);
|
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-formset").on("change keydown keyup keypress dp.change", "input, select", function () {
|
||||||
rrule_preview();
|
rrule_preview();
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user