mirror of
https://github.com/pretix/pretix.git
synced 2026-10-24 22:59:52 +00:00
Compare commits
3
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b730e372f5 | ||
|
|
5a2e615983 | ||
|
|
2b7a988693 |
No files matched your search
@@ -153,7 +153,7 @@ class SubEventBulkEditForm(I18nModelForm):
|
||||
self.fields[k].widget.is_required = False
|
||||
self.fields[k].required = False
|
||||
|
||||
for k in ('date_from', 'date_to', 'date_admission', 'presale_start', 'presale_end'):
|
||||
for k in ('date_from', 'date_to', 'date_admission'):
|
||||
self.fields[k + '_day'] = forms.DateField(
|
||||
label=self._meta.model._meta.get_field(k).verbose_name,
|
||||
help_text=self._meta.model._meta.get_field(k).help_text,
|
||||
@@ -167,6 +167,17 @@ class SubEventBulkEditForm(I18nModelForm):
|
||||
required=False,
|
||||
)
|
||||
|
||||
for k in ('presale_start', 'presale_end'):
|
||||
self.fields[k + '_rel'] = RelativeDateTimeField(
|
||||
label=self._meta.model._meta.get_field(k).verbose_name,
|
||||
help_text=(
|
||||
self._meta.model._meta.get_field(k).help_text + " "
|
||||
+ _("If base your relative date on one that is not defined on the event, it will fall back to the event's start.")
|
||||
),
|
||||
required=False,
|
||||
limit_choices=('event__date_from', 'event__date_to'),
|
||||
)
|
||||
|
||||
class Meta:
|
||||
model = SubEvent
|
||||
localized_fields = '__all__'
|
||||
@@ -247,6 +258,18 @@ class SubEventBulkEditForm(I18nModelForm):
|
||||
)
|
||||
setattr(obj, k.replace('_time', ''), newval)
|
||||
fields.add(k.replace('_time', ''))
|
||||
elif k.endswith('_rel'):
|
||||
target_key = k[:-4]
|
||||
for obj in objs:
|
||||
cval = self.cleaned_data[k]
|
||||
if cval is None:
|
||||
newval = None
|
||||
if not self._meta.model._meta.get_field(target_key, '').null:
|
||||
continue
|
||||
else:
|
||||
newval = cval.datetime(obj)
|
||||
setattr(obj, target_key, newval)
|
||||
fields.add(target_key)
|
||||
else:
|
||||
fields.add(k)
|
||||
for obj in objs:
|
||||
|
||||
@@ -127,28 +127,8 @@
|
||||
{% bootstrap_field form.date_admission_time layout="bulkedit_inline" form_group_class="" %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-md-3 control-label" for="{{ form.presale_start_day.id_for_label }}">
|
||||
{{ form.presale_start_day.label }}
|
||||
</label>
|
||||
<div class="col-md-5">
|
||||
{% bootstrap_field form.presale_start_day layout="bulkedit_inline" form_group_class="" %}
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
{% bootstrap_field form.presale_start_time layout="bulkedit_inline" form_group_class="" %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-md-3 control-label" for="{{ form.presale_end_day.id_for_label }}">
|
||||
{{ form.presale_end_day.label }}
|
||||
</label>
|
||||
<div class="col-md-5">
|
||||
{% bootstrap_field form.presale_end_day layout="bulkedit_inline" form_group_class="" %}
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
{% bootstrap_field form.presale_end_time layout="bulkedit_inline" form_group_class="" %}
|
||||
</div>
|
||||
</div>
|
||||
{% bootstrap_field form.presale_start_rel layout="bulkedit" placeholder=datetime_sample %}
|
||||
{% bootstrap_field form.presale_end_rel layout="bulkedit" placeholder=datetime_sample %}
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<legend>{% trans "Item prices" %}</legend>
|
||||
|
||||
@@ -44,7 +44,7 @@ from django.db import transaction
|
||||
from django.db.models import (
|
||||
Count, Exists, F, OuterRef, Prefetch, ProtectedError, Subquery,
|
||||
)
|
||||
from django.db.models.functions import Coalesce, TruncDate, TruncTime
|
||||
from django.db.models.functions import Coalesce, TruncDate, TruncTime, Extract
|
||||
from django.forms import inlineformset_factory
|
||||
from django.http import Http404, HttpResponse, HttpResponseRedirect
|
||||
from django.shortcuts import redirect, render
|
||||
@@ -1590,12 +1590,20 @@ class SubEventBulkEdit(SubEventQueryMixin, EventPermissionRequiredMixin, FormVie
|
||||
# as well in all cases we are concerned about
|
||||
# See also: https://code.djangoproject.com/ticket/31948
|
||||
k + '_day': TruncDate(k)
|
||||
for k in ('date_from', 'date_to', 'date_admission', 'presale_start', 'presale_end')
|
||||
for k in ('date_from', 'date_to', 'date_admission')
|
||||
},
|
||||
**{
|
||||
k + '_time': TruncTime(k)
|
||||
for k in ('date_from', 'date_to', 'date_admission', 'presale_start', 'presale_end')
|
||||
for k in ('date_from', 'date_to', 'date_admission')
|
||||
},
|
||||
**{
|
||||
k + '_rel_min': Extract(F('date_from') - F(k), 'epoch') / 60
|
||||
for k in ['presale_start', "presale_end"]
|
||||
},
|
||||
**{
|
||||
k + '_rel_days': Extract(F('date_from__date') - F(f"{k}__date"), 'days')
|
||||
for k in ['presale_start', "presale_end"]
|
||||
}
|
||||
)
|
||||
|
||||
fields = {
|
||||
@@ -1613,10 +1621,6 @@ class SubEventBulkEdit(SubEventQueryMixin, EventPermissionRequiredMixin, FormVie
|
||||
'date_to_time',
|
||||
'date_admission_day',
|
||||
'date_admission_time',
|
||||
'presale_start_day',
|
||||
'presale_start_time',
|
||||
'presale_end_day',
|
||||
'presale_end_time',
|
||||
}
|
||||
for k in fields:
|
||||
existing_values = list(qs.order_by(k).values(k).annotate(c=Count('*')))
|
||||
@@ -1626,6 +1630,45 @@ class SubEventBulkEdit(SubEventQueryMixin, EventPermissionRequiredMixin, FormVie
|
||||
mixed_values.add(k)
|
||||
initial[k] = None
|
||||
|
||||
for k in ['presale_start', "presale_end"]:
|
||||
existing_fixed_values = list(qs.order_by(k).values(k).annotate(c=Count('*')))
|
||||
existing_rel_days_values = list(qs.order_by(f'{k}_rel_days').values(f'{k}_rel_days').annotate(c=Count("*")))
|
||||
existing_rel_min_values = list(qs.order_by(f'{k}_rel_min').values(f'{k}_rel_min').annotate(c=Count("*")))
|
||||
|
||||
if len(existing_fixed_values) == 1:
|
||||
if existing_fixed_values[0][k]:
|
||||
initial[f"{k}_rel"] = RelativeDateWrapper(existing_fixed_values[0][k])
|
||||
else:
|
||||
initial[f"{k}_rel"] = None
|
||||
|
||||
elif len(existing_rel_min_values) == 1:
|
||||
if rel_min := existing_rel_min_values[0][f'{k}_rel_min']:
|
||||
initial[f"{k}_rel"] = RelativeDateWrapper(RelativeDate(
|
||||
days=0,
|
||||
base_date_name='event__date_from',
|
||||
time=None,
|
||||
minutes=abs(rel_min),
|
||||
is_after=rel_min < 0,
|
||||
))
|
||||
else:
|
||||
initial[f"{k}_rel"] = None
|
||||
|
||||
elif len(existing_rel_days_values) == 1:
|
||||
if rel_days := existing_rel_days_values[0][f'{k}_rel_days']:
|
||||
initial[f"{k}_rel"] = RelativeDateWrapper(RelativeDate(
|
||||
days=abs(rel_days),
|
||||
base_date_name='event__date_from',
|
||||
time=None,
|
||||
minutes=None,
|
||||
is_after=rel_days < 0,
|
||||
))
|
||||
else:
|
||||
initial[f"{k}_rel"] = None
|
||||
|
||||
elif len(existing_fixed_values) > 1 or len(existing_rel_days_values) > 1 or len(existing_rel_min_values) > 1:
|
||||
mixed_values.add(k)
|
||||
initial[k] = None
|
||||
|
||||
kwargs = super().get_form_kwargs()
|
||||
kwargs['event'] = self.request.event
|
||||
kwargs['prefix'] = 'bulkedit'
|
||||
|
||||
Reference in new issue
Block a user