diff --git a/src/pretix/control/templates/pretixcontrol/orders/export.html b/src/pretix/control/templates/pretixcontrol/orders/export.html index c98c8bc7f3..ec2fd84371 100644 --- a/src/pretix/control/templates/pretixcontrol/orders/export.html +++ b/src/pretix/control/templates/pretixcontrol/orders/export.html @@ -22,7 +22,7 @@ {{ s.owner.fullname|default:s.owner.email }} -
+
{% if s.schedule_next_run %} {% trans "Next run:" %} @@ -53,7 +53,7 @@ {{ s.mail_subject }}
-
+ -
+
{% if s.schedule_next_run %} {% trans "Next run:" %} @@ -53,7 +53,7 @@ {{ s.mail_subject }}
-
+
@@ -73,6 +73,9 @@ + + + {% endif %} diff --git a/src/pretix/control/templates/pretixcontrol/organizers/export_form.html b/src/pretix/control/templates/pretixcontrol/organizers/export_form.html index 0611acfbfb..7e4de3be13 100644 --- a/src/pretix/control/templates/pretixcontrol/organizers/export_form.html +++ b/src/pretix/control/templates/pretixcontrol/organizers/export_form.html @@ -43,7 +43,11 @@
{% else %} diff --git a/src/pretix/control/views/orders.py b/src/pretix/control/views/orders.py index 39e515d89e..7f758d0dd0 100644 --- a/src/pretix/control/views/orders.py +++ b/src/pretix/control/views/orders.py @@ -33,6 +33,7 @@ # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations under the License. +import copy import json import logging import mimetypes @@ -2677,8 +2678,8 @@ class ExportMixin: if id != ex.identifier: continue - if self.scheduled: - initial = dict(self.scheduled.export_form_data) + if self.scheduled or self.scheduled_copy_from: + initial = dict((self.scheduled or self.scheduled_copy_from).export_form_data) test_form = ExporterForm(data=self.request.GET, prefix=ex.identifier) test_form.fields = ex.export_form_fields @@ -2721,6 +2722,11 @@ class ExportMixin: elif "scheduled" in self.request.GET: return get_object_or_404(self.get_scheduled_queryset(), pk=self.request.GET.get("scheduled")) + @cached_property + def scheduled_copy_from(self): + if "scheduled_copy_from" in self.request.GET: + return get_object_or_404(self.get_scheduled_queryset(), pk=self.request.GET.get("scheduled_copy_from")) + def get_context_data(self, **kwargs): ctx = super().get_context_data(**kwargs) ctx['exporters'] = self.exporters @@ -2838,6 +2844,8 @@ class ExportView(EventPermissionRequiredMixin, ExportMixin, ListView): def rrule_form(self): if self.scheduled: initial = RRuleForm.initial_from_rrule(self.scheduled.schedule_rrule) + elif self.scheduled_copy_from: + initial = RRuleForm.initial_from_rrule(self.scheduled_copy_from.schedule_rrule) else: initial = {} return RRuleForm( @@ -2848,11 +2856,15 @@ class ExportView(EventPermissionRequiredMixin, ExportMixin, ListView): @cached_property def schedule_form(self): - instance = self.scheduled or ScheduledEventExport( - event=self.request.event, - owner=self.request.user, - ) - if not self.scheduled: + if self.scheduled_copy_from: + instance = copy.copy(self.scheduled_copy_from) + instance.pk = None + else: + instance = self.scheduled or ScheduledEventExport( + event=self.request.event, + owner=self.request.user, + ) + if not self.scheduled and not self.scheduled_copy_from: initial = { "mail_subject": gettext("Export: {title}").format(title=self.exporter.verbose_name), "mail_template": gettext("Hello,\n\nattached to this email, you can find a new scheduled report for {name}.").format( @@ -2877,9 +2889,11 @@ class ExportView(EventPermissionRequiredMixin, ExportMixin, ListView): def get_context_data(self, **kwargs): ctx = super().get_context_data(**kwargs) - if "schedule" in self.request.POST or self.scheduled: + + if "schedule" in self.request.POST or self.scheduled or self.scheduled_copy_from: ctx['schedule_form'] = self.schedule_form ctx['rrule_form'] = self.rrule_form + ctx['scheduled_copy_from'] = self.scheduled_copy_from elif not self.exporter: for s in ctx['scheduled']: try: diff --git a/src/pretix/control/views/organizer.py b/src/pretix/control/views/organizer.py index 3c3c72c753..38e0755e32 100644 --- a/src/pretix/control/views/organizer.py +++ b/src/pretix/control/views/organizer.py @@ -32,6 +32,7 @@ # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations under the License. +import copy import json import logging import re @@ -1943,8 +1944,8 @@ class ExportMixin: for ex in self.exporters: if id != ex.identifier: continue - if self.scheduled: - initial = dict(self.scheduled.export_form_data) + if self.scheduled or self.scheduled_copy_from: + initial = dict((self.scheduled or self.scheduled_copy_from).export_form_data) test_form = ExporterForm(data=self.request.GET, prefix=ex.identifier) test_form.fields = ex.export_form_fields @@ -2047,6 +2048,11 @@ class ExportMixin: elif "scheduled" in self.request.GET: return get_object_or_404(self.get_scheduled_queryset(), pk=self.request.GET.get("scheduled")) + @cached_property + def scheduled_copy_from(self): + if "scheduled_copy_from" in self.request.GET: + return get_object_or_404(self.get_scheduled_queryset(), pk=self.request.GET.get("scheduled_copy_from")) + class ExportDoView(OrganizerPermissionRequiredMixin, ExportMixin, AsyncAction, TemplateView): known_errortypes = ['ExportError', 'ExportEmptyError'] @@ -2160,6 +2166,8 @@ class ExportView(OrganizerPermissionRequiredMixin, ExportMixin, ListView): def rrule_form(self): if self.scheduled: initial = RRuleForm.initial_from_rrule(self.scheduled.schedule_rrule) + elif self.scheduled_copy_from: + initial = RRuleForm.initial_from_rrule(self.scheduled_copy_from.schedule_rrule) else: initial = {} return RRuleForm( @@ -2171,11 +2179,15 @@ class ExportView(OrganizerPermissionRequiredMixin, ExportMixin, ListView): @cached_property def schedule_form(self): - instance = self.scheduled or ScheduledOrganizerExport( - organizer=self.request.organizer, - owner=self.request.user, - timezone=str(get_current_timezone()), - ) + if self.scheduled_copy_from: + instance = copy.copy(self.scheduled_copy_from) + instance.pk = None + else: + instance = self.scheduled or ScheduledOrganizerExport( + organizer=self.request.organizer, + owner=self.request.user, + timezone=str(get_current_timezone()), + ) if not self.scheduled: initial = { "mail_subject": gettext("Export: {title}").format(title=self.exporter.verbose_name), @@ -2208,9 +2220,10 @@ class ExportView(OrganizerPermissionRequiredMixin, ExportMixin, ListView): def get_context_data(self, **kwargs): ctx = super().get_context_data(**kwargs) - if "schedule" in self.request.POST or self.scheduled: + if "schedule" in self.request.POST or self.scheduled or self.scheduled_copy_from: ctx['schedule_form'] = self.schedule_form ctx['rrule_form'] = self.rrule_form + ctx['scheduled_copy_from'] = self.scheduled_copy_fr elif not self.exporter: for s in ctx['scheduled']: try: