mirror of
https://github.com/pretix/pretix.git
synced 2026-05-10 16:04:02 +00:00
Scheduled exports: Add copy button (Z#23221224) (#5823)
* Scheduled exports: Add copy button (Z#23221224) * Update button label
This commit is contained in:
@@ -22,7 +22,7 @@
|
|||||||
{{ s.owner.fullname|default:s.owner.email }}
|
{{ s.owner.fullname|default:s.owner.email }}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-lg-5 col-md-6 col-xs-12">
|
<div class="col-lg-4 col-md-5 col-xs-12">
|
||||||
{% if s.schedule_next_run %}
|
{% if s.schedule_next_run %}
|
||||||
<span class="fa fa-clock-o fa-fw"></span>
|
<span class="fa fa-clock-o fa-fw"></span>
|
||||||
{% trans "Next run:" %}
|
{% trans "Next run:" %}
|
||||||
@@ -53,7 +53,7 @@
|
|||||||
{{ s.mail_subject }}
|
{{ s.mail_subject }}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-lg-2 col-md-2 col-xs-12 text-right">
|
<div class="col-lg-3 col-md-3 col-xs-12 text-right">
|
||||||
<form action="{% url "control:event.orders.export.do" event=request.event.slug organizer=request.organizer.slug %}"
|
<form action="{% url "control:event.orders.export.do" event=request.event.slug organizer=request.organizer.slug %}"
|
||||||
method="post" class="form-horizontal" data-asynctask data-asynctask-download
|
method="post" class="form-horizontal" data-asynctask data-asynctask-download
|
||||||
data-asynctask-long>
|
data-asynctask-long>
|
||||||
@@ -73,6 +73,9 @@
|
|||||||
<a href="?identifier={{ s.export_identifier }}&scheduled={{ s.pk }}" class="btn btn-default" title="{% trans "Edit" %}" data-toggle="tooltip">
|
<a href="?identifier={{ s.export_identifier }}&scheduled={{ s.pk }}" class="btn btn-default" title="{% trans "Edit" %}" data-toggle="tooltip">
|
||||||
<span class="fa fa-edit"></span>
|
<span class="fa fa-edit"></span>
|
||||||
</a>
|
</a>
|
||||||
|
<a href="?identifier={{ s.export_identifier }}&scheduled_copy_from={{ s.pk }}" class="btn btn-default" title="{% trans "Copy" %}" data-toggle="tooltip">
|
||||||
|
<span class="fa fa-copy"></span>
|
||||||
|
</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<a href="{% url "control:event.orders.export.scheduled.delete" event=request.event.slug organizer=request.event.organizer.slug pk=s.pk %}" class="btn btn-danger" title="{% trans "Delete" %}" data-toggle="tooltip">
|
<a href="{% url "control:event.orders.export.scheduled.delete" event=request.event.slug organizer=request.event.organizer.slug pk=s.pk %}" class="btn btn-danger" title="{% trans "Delete" %}" data-toggle="tooltip">
|
||||||
<span class="fa fa-trash"></span>
|
<span class="fa fa-trash"></span>
|
||||||
|
|||||||
@@ -42,7 +42,11 @@
|
|||||||
<div class="form-group submit-group">
|
<div class="form-group submit-group">
|
||||||
<button formaction="{{ request.get_full_path }}" name="schedule" value="save" type="submit"
|
<button formaction="{{ request.get_full_path }}" name="schedule" value="save" type="submit"
|
||||||
class="btn btn-primary btn-save" data-no-asynctask>
|
class="btn btn-primary btn-save" data-no-asynctask>
|
||||||
{% trans "Save" %}
|
{% if scheduled_copy_from %}
|
||||||
|
{% trans "Save copy" %}
|
||||||
|
{% else %}
|
||||||
|
{% trans "Save" %}
|
||||||
|
{% endif %}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
{% else %}
|
{% else %}
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
{{ s.owner.fullname|default:s.owner.email }}
|
{{ s.owner.fullname|default:s.owner.email }}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-lg-5 col-md-6 col-xs-12">
|
<div class="col-lg-4 col-md-5 col-xs-12">
|
||||||
{% if s.schedule_next_run %}
|
{% if s.schedule_next_run %}
|
||||||
<span class="fa fa-clock-o fa-fw"></span>
|
<span class="fa fa-clock-o fa-fw"></span>
|
||||||
{% trans "Next run:" %}
|
{% trans "Next run:" %}
|
||||||
@@ -53,7 +53,7 @@
|
|||||||
{{ s.mail_subject }}
|
{{ s.mail_subject }}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-lg-2 col-md-2 col-xs-12 text-right">
|
<div class="col-lg-3 col-md-3 col-xs-12 text-right">
|
||||||
<form action="{% url "control:organizer.export.do" organizer=request.organizer.slug %}"
|
<form action="{% url "control:organizer.export.do" organizer=request.organizer.slug %}"
|
||||||
method="post" class="form-horizontal" data-asynctask data-asynctask-download
|
method="post" class="form-horizontal" data-asynctask data-asynctask-download
|
||||||
data-asynctask-long>
|
data-asynctask-long>
|
||||||
@@ -73,6 +73,9 @@
|
|||||||
<a href="?identifier={{ s.export_identifier }}&scheduled={{ s.pk }}" class="btn btn-default" title="{% trans "Edit" %}" data-toggle="tooltip">
|
<a href="?identifier={{ s.export_identifier }}&scheduled={{ s.pk }}" class="btn btn-default" title="{% trans "Edit" %}" data-toggle="tooltip">
|
||||||
<span class="fa fa-edit"></span>
|
<span class="fa fa-edit"></span>
|
||||||
</a>
|
</a>
|
||||||
|
<a href="?identifier={{ s.export_identifier }}&scheduled_copy_from={{ s.pk }}" class="btn btn-default" title="{% trans "Copy" %}" data-toggle="tooltip">
|
||||||
|
<span class="fa fa-copy"></span>
|
||||||
|
</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<a href="{% url "control:organizer.export.scheduled.delete" organizer=request.organizer.slug pk=s.pk %}" class="btn btn-danger" title="{% trans "Delete" %}" data-toggle="tooltip">
|
<a href="{% url "control:organizer.export.scheduled.delete" organizer=request.organizer.slug pk=s.pk %}" class="btn btn-danger" title="{% trans "Delete" %}" data-toggle="tooltip">
|
||||||
<span class="fa fa-trash"></span>
|
<span class="fa fa-trash"></span>
|
||||||
|
|||||||
@@ -43,7 +43,11 @@
|
|||||||
<div class="form-group submit-group">
|
<div class="form-group submit-group">
|
||||||
<button formaction="{{ request.get_full_path }}" name="schedule" value="save" type="submit"
|
<button formaction="{{ request.get_full_path }}" name="schedule" value="save" type="submit"
|
||||||
class="btn btn-primary btn-save" data-no-asynctask>
|
class="btn btn-primary btn-save" data-no-asynctask>
|
||||||
{% trans "Save" %}
|
{% if scheduled_copy_from %}
|
||||||
|
{% trans "Save copy" %}
|
||||||
|
{% else %}
|
||||||
|
{% trans "Save" %}
|
||||||
|
{% endif %}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
{% else %}
|
{% else %}
|
||||||
|
|||||||
@@ -33,6 +33,7 @@
|
|||||||
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
# 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.
|
# License for the specific language governing permissions and limitations under the License.
|
||||||
|
|
||||||
|
import copy
|
||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
import mimetypes
|
import mimetypes
|
||||||
@@ -2677,8 +2678,8 @@ class ExportMixin:
|
|||||||
if id != ex.identifier:
|
if id != ex.identifier:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if self.scheduled:
|
if self.scheduled or self.scheduled_copy_from:
|
||||||
initial = dict(self.scheduled.export_form_data)
|
initial = dict((self.scheduled or self.scheduled_copy_from).export_form_data)
|
||||||
|
|
||||||
test_form = ExporterForm(data=self.request.GET, prefix=ex.identifier)
|
test_form = ExporterForm(data=self.request.GET, prefix=ex.identifier)
|
||||||
test_form.fields = ex.export_form_fields
|
test_form.fields = ex.export_form_fields
|
||||||
@@ -2721,6 +2722,11 @@ class ExportMixin:
|
|||||||
elif "scheduled" in self.request.GET:
|
elif "scheduled" in self.request.GET:
|
||||||
return get_object_or_404(self.get_scheduled_queryset(), pk=self.request.GET.get("scheduled"))
|
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):
|
def get_context_data(self, **kwargs):
|
||||||
ctx = super().get_context_data(**kwargs)
|
ctx = super().get_context_data(**kwargs)
|
||||||
ctx['exporters'] = self.exporters
|
ctx['exporters'] = self.exporters
|
||||||
@@ -2838,6 +2844,8 @@ class ExportView(EventPermissionRequiredMixin, ExportMixin, ListView):
|
|||||||
def rrule_form(self):
|
def rrule_form(self):
|
||||||
if self.scheduled:
|
if self.scheduled:
|
||||||
initial = RRuleForm.initial_from_rrule(self.scheduled.schedule_rrule)
|
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:
|
else:
|
||||||
initial = {}
|
initial = {}
|
||||||
return RRuleForm(
|
return RRuleForm(
|
||||||
@@ -2848,11 +2856,15 @@ class ExportView(EventPermissionRequiredMixin, ExportMixin, ListView):
|
|||||||
|
|
||||||
@cached_property
|
@cached_property
|
||||||
def schedule_form(self):
|
def schedule_form(self):
|
||||||
instance = self.scheduled or ScheduledEventExport(
|
if self.scheduled_copy_from:
|
||||||
event=self.request.event,
|
instance = copy.copy(self.scheduled_copy_from)
|
||||||
owner=self.request.user,
|
instance.pk = None
|
||||||
)
|
else:
|
||||||
if not self.scheduled:
|
instance = self.scheduled or ScheduledEventExport(
|
||||||
|
event=self.request.event,
|
||||||
|
owner=self.request.user,
|
||||||
|
)
|
||||||
|
if not self.scheduled and not self.scheduled_copy_from:
|
||||||
initial = {
|
initial = {
|
||||||
"mail_subject": gettext("Export: {title}").format(title=self.exporter.verbose_name),
|
"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(
|
"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):
|
def get_context_data(self, **kwargs):
|
||||||
ctx = super().get_context_data(**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['schedule_form'] = self.schedule_form
|
||||||
ctx['rrule_form'] = self.rrule_form
|
ctx['rrule_form'] = self.rrule_form
|
||||||
|
ctx['scheduled_copy_from'] = self.scheduled_copy_from
|
||||||
elif not self.exporter:
|
elif not self.exporter:
|
||||||
for s in ctx['scheduled']:
|
for s in ctx['scheduled']:
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -32,6 +32,7 @@
|
|||||||
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
# 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.
|
# License for the specific language governing permissions and limitations under the License.
|
||||||
|
|
||||||
|
import copy
|
||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
import re
|
import re
|
||||||
@@ -1943,8 +1944,8 @@ class ExportMixin:
|
|||||||
for ex in self.exporters:
|
for ex in self.exporters:
|
||||||
if id != ex.identifier:
|
if id != ex.identifier:
|
||||||
continue
|
continue
|
||||||
if self.scheduled:
|
if self.scheduled or self.scheduled_copy_from:
|
||||||
initial = dict(self.scheduled.export_form_data)
|
initial = dict((self.scheduled or self.scheduled_copy_from).export_form_data)
|
||||||
|
|
||||||
test_form = ExporterForm(data=self.request.GET, prefix=ex.identifier)
|
test_form = ExporterForm(data=self.request.GET, prefix=ex.identifier)
|
||||||
test_form.fields = ex.export_form_fields
|
test_form.fields = ex.export_form_fields
|
||||||
@@ -2047,6 +2048,11 @@ class ExportMixin:
|
|||||||
elif "scheduled" in self.request.GET:
|
elif "scheduled" in self.request.GET:
|
||||||
return get_object_or_404(self.get_scheduled_queryset(), pk=self.request.GET.get("scheduled"))
|
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):
|
class ExportDoView(OrganizerPermissionRequiredMixin, ExportMixin, AsyncAction, TemplateView):
|
||||||
known_errortypes = ['ExportError', 'ExportEmptyError']
|
known_errortypes = ['ExportError', 'ExportEmptyError']
|
||||||
@@ -2160,6 +2166,8 @@ class ExportView(OrganizerPermissionRequiredMixin, ExportMixin, ListView):
|
|||||||
def rrule_form(self):
|
def rrule_form(self):
|
||||||
if self.scheduled:
|
if self.scheduled:
|
||||||
initial = RRuleForm.initial_from_rrule(self.scheduled.schedule_rrule)
|
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:
|
else:
|
||||||
initial = {}
|
initial = {}
|
||||||
return RRuleForm(
|
return RRuleForm(
|
||||||
@@ -2171,11 +2179,15 @@ class ExportView(OrganizerPermissionRequiredMixin, ExportMixin, ListView):
|
|||||||
|
|
||||||
@cached_property
|
@cached_property
|
||||||
def schedule_form(self):
|
def schedule_form(self):
|
||||||
instance = self.scheduled or ScheduledOrganizerExport(
|
if self.scheduled_copy_from:
|
||||||
organizer=self.request.organizer,
|
instance = copy.copy(self.scheduled_copy_from)
|
||||||
owner=self.request.user,
|
instance.pk = None
|
||||||
timezone=str(get_current_timezone()),
|
else:
|
||||||
)
|
instance = self.scheduled or ScheduledOrganizerExport(
|
||||||
|
organizer=self.request.organizer,
|
||||||
|
owner=self.request.user,
|
||||||
|
timezone=str(get_current_timezone()),
|
||||||
|
)
|
||||||
if not self.scheduled:
|
if not self.scheduled:
|
||||||
initial = {
|
initial = {
|
||||||
"mail_subject": gettext("Export: {title}").format(title=self.exporter.verbose_name),
|
"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):
|
def get_context_data(self, **kwargs):
|
||||||
ctx = super().get_context_data(**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['schedule_form'] = self.schedule_form
|
||||||
ctx['rrule_form'] = self.rrule_form
|
ctx['rrule_form'] = self.rrule_form
|
||||||
|
ctx['scheduled_copy_from'] = self.scheduled_copy_fr
|
||||||
elif not self.exporter:
|
elif not self.exporter:
|
||||||
for s in ctx['scheduled']:
|
for s in ctx['scheduled']:
|
||||||
try:
|
try:
|
||||||
|
|||||||
Reference in New Issue
Block a user