diff --git a/src/pretix/base/migrations/0044_auto_20161101_1610.py b/src/pretix/base/migrations/0044_auto_20161101_1610.py new file mode 100644 index 000000000..14da449fd --- /dev/null +++ b/src/pretix/base/migrations/0044_auto_20161101_1610.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.2 on 2016-11-01 16:10 +from __future__ import unicode_literals + +import django.db.models.deletion +from django.db import migrations, models + + +def forwards(apps, schema_editor): + CachedTicket = apps.get_model('pretixbase', 'CachedTicket') + CachedTicket.objects.all().delete() + + +class Migration(migrations.Migration): + + dependencies = [ + ('pretixbase', '0043_globalsetting'), + ] + + operations = [ + migrations.RunPython( + forwards, migrations.RunPython.noop + ), + migrations.RemoveField( + model_name='cachedticket', + name='order', + ), + migrations.AddField( + model_name='cachedticket', + name='order_position', + field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.CASCADE, to='pretixbase.OrderPosition'), + preserve_default=False, + ), + ] diff --git a/src/pretix/base/models/orders.py b/src/pretix/base/models/orders.py index fbd533a0d..e814bd033 100644 --- a/src/pretix/base/models/orders.py +++ b/src/pretix/base/models/orders.py @@ -309,12 +309,6 @@ class Order(LoggedModel): return True -class CachedTicket(models.Model): - order = models.ForeignKey(Order, on_delete=models.CASCADE) - cachedfile = models.ForeignKey(CachedFile, on_delete=models.CASCADE, null=True) - provider = models.CharField(max_length=255) - - class QuestionAnswer(models.Model): """ The answer to a Question, connected to an OrderPosition or CartPosition. @@ -554,3 +548,9 @@ class InvoiceAddress(models.Model): city = models.CharField(max_length=255, verbose_name=_('City'), blank=False) country = models.CharField(max_length=255, verbose_name=_('Country'), blank=False) vat_id = models.CharField(max_length=255, blank=True, verbose_name=_('VAT ID')) + + +class CachedTicket(models.Model): + order_position = models.ForeignKey(OrderPosition, on_delete=models.CASCADE) + cachedfile = models.ForeignKey(CachedFile, on_delete=models.CASCADE, null=True) + provider = models.CharField(max_length=255) diff --git a/src/pretix/base/services/tickets.py b/src/pretix/base/services/tickets.py index 68cc74f3b..758f3c25b 100644 --- a/src/pretix/base/services/tickets.py +++ b/src/pretix/base/services/tickets.py @@ -6,7 +6,7 @@ from django.utils.translation import ugettext as _ from pretix.base.i18n import language from pretix.base.models import ( - CachedFile, CachedTicket, Event, Order, cachedfile_name, + CachedFile, CachedTicket, Event, Order, OrderPosition, cachedfile_name, ) from pretix.base.signals import register_ticket_outputs from pretix.celery import app @@ -14,23 +14,23 @@ from pretix.helpers.database import rolledback_transaction @app.task -def generate(order: str, provider: str): - order = Order.objects.select_related('event').get(id=order) - ct = CachedTicket.objects.get_or_create(order=order, provider=provider)[0] +def generate(order_position: str, provider: str): + order_position = OrderPosition.objects.select_related('order', 'order__event').get(id=order_position) + ct = CachedTicket.objects.get_or_create(order_position=order_position, provider=provider)[0] if not ct.cachedfile: cf = CachedFile() cf.date = now() - cf.expires = order.event.date_from + timedelta(days=30) + cf.expires = order_position.order.event.date_from + timedelta(days=30) cf.save() ct.cachedfile = cf ct.save() - with language(order.locale): - responses = register_ticket_outputs.send(order.event) + with language(order_position.order.locale): + responses = register_ticket_outputs.send(order_position.order.event) for receiver, response in responses: - prov = response(order.event) + prov = response(order_position.order.event) if prov.identifier == provider: - ct.cachedfile.filename, ct.cachedfile.type, data = prov.generate(order) + ct.cachedfile.filename, ct.cachedfile.type, data = prov.generate(order_position) ct.cachedfile.file.save(cachedfile_name(ct.cachedfile, ct.cachedfile.filename), ContentFile(data)) ct.cachedfile.save() @@ -49,10 +49,10 @@ def preview(event: int, provider: str): email='sample@pretix.eu', expires=now(), code="PREVIEW1234", total=119) - order.positions.create(item=item, attendee_name=_("John Doe"), price=item.default_price) + p = order.positions.create(item=item, attendee_name=_("John Doe"), price=item.default_price) responses = register_ticket_outputs.send(event) for receiver, response in responses: prov = response(event) if prov.identifier == provider: - return prov.generate(order) + return prov.generate(p) diff --git a/src/pretix/base/ticketoutput.py b/src/pretix/base/ticketoutput.py index 19ecf8768..758b9c7a3 100644 --- a/src/pretix/base/ticketoutput.py +++ b/src/pretix/base/ticketoutput.py @@ -5,7 +5,7 @@ from django import forms from django.http import HttpRequest from django.utils.translation import ugettext_lazy as _ -from pretix.base.models import Event, Order +from pretix.base.models import Event, OrderPosition from pretix.base.settings import SettingsSandbox @@ -29,7 +29,7 @@ class BaseTicketOutput: """ return self.settings.get('_enabled', as_type=bool) - def generate(self, order: Order) -> Tuple[str, str, str]: + def generate(self, order: OrderPosition) -> Tuple[str, str, str]: """ This method should generate the download file and return a tuple consisting of a filename, a file type and file content. @@ -106,11 +106,3 @@ class BaseTicketOutput: The text on the download button in the frontend. """ return _('Download ticket') - - @property - def download_button_icon(self) -> str: - """ - The name of the FontAwesome icon on the download button in the frontend - (without the fa- prefix). - """ - return None diff --git a/src/pretix/control/templates/pretixcontrol/order/index.html b/src/pretix/control/templates/pretixcontrol/order/index.html index 397b206c7..ea5b1595b 100644 --- a/src/pretix/control/templates/pretixcontrol/order/index.html +++ b/src/pretix/control/templates/pretixcontrol/order/index.html @@ -38,14 +38,6 @@ {% endif %} - {% if can_download %} - {% for b in download_buttons %} - - {{ b.text }} - - {% endfor %} - {% endif %} {% trans "View order as user" %} diff --git a/src/pretix/control/urls.py b/src/pretix/control/urls.py index c15a35852..fff0f5053 100644 --- a/src/pretix/control/urls.py +++ b/src/pretix/control/urls.py @@ -110,8 +110,6 @@ urlpatterns = [ url(r'^orders/(?P[0-9A-Z]+)/change$', orders.OrderChange.as_view(), name='event.order.change'), url(r'^orders/(?P[0-9A-Z]+)/$', orders.OrderDetail.as_view(), name='event.order'), - url(r'^orders/(?P[0-9A-Z]+)/download/(?P[^/]+)$', orders.OrderDownload.as_view(), - name='event.order.download'), url(r'^invoice/(?P[^/]+)$', orders.InvoiceDownload.as_view(), name='event.invoice.download'), url(r'^orders/overview/$', orders.OverView.as_view(), name='event.orders.overview'), diff --git a/src/pretix/control/views/orders.py b/src/pretix/control/views/orders.py index 7a40357d4..5b9a5dffa 100644 --- a/src/pretix/control/views/orders.py +++ b/src/pretix/control/views/orders.py @@ -13,9 +13,8 @@ from django.views.generic import DetailView, ListView, TemplateView, View from pretix.base.i18n import language from pretix.base.models import ( - CachedFile, CachedTicket, Invoice, Item, ItemVariation, Order, Quota, + CachedFile, Invoice, Item, ItemVariation, Order, Quota, ) -from pretix.base.services import tickets from pretix.base.services.export import export from pretix.base.services.invoices import ( generate_cancellation, generate_invoice, invoice_pdf, invoice_qualified, @@ -29,7 +28,6 @@ from pretix.base.services.orders import ( from pretix.base.services.stats import order_overview from pretix.base.signals import ( register_data_exporters, register_payment_providers, - register_ticket_outputs, ) from pretix.control.forms.orders import ( CommentForm, ExporterForm, ExtendForm, OrderContactForm, @@ -144,30 +142,10 @@ class OrderDetail(OrderView): template_name = 'pretixcontrol/order/index.html' permission = 'can_view_orders' - @cached_property - def download_buttons(self): - buttons = [] - responses = register_ticket_outputs.send(self.request.event) - for receiver, response in responses: - provider = response(self.request.event) - if not provider.is_enabled: - continue - buttons.append({ - 'icon': provider.download_button_icon or 'fa-download', - 'text': provider.download_button_text or 'fa-download', - 'identifier': provider.identifier, - }) - return buttons - def get_context_data(self, **kwargs): ctx = super().get_context_data(**kwargs) ctx['items'] = self.get_items() ctx['event'] = self.request.event - ctx['download_buttons'] = self.download_buttons - ctx['can_download'] = ( - self.request.event.settings.ticket_download - and self.order.status == Order.STATUS_PAID - ) ctx['payment'] = self.payment_provider.order_control_render(self.request, self.object) ctx['invoices'] = list(self.order.invoices.all().select_related('event')) ctx['comment_form'] = CommentForm(initial={'comment': self.order.comment}) @@ -407,37 +385,6 @@ class InvoiceDownload(EventPermissionRequiredMixin, View): return resp -class OrderDownload(OrderView): - - @cached_property - def output(self): - responses = register_ticket_outputs.send(self.request.event) - for receiver, response in responses: - provider = response(self.request.event) - if provider.identifier == self.kwargs.get('output'): - return provider - - def get(self, request, *args, **kwargs): - if not self.output or not self.output.is_enabled: - messages.error(request, _('You requested an invalid ticket output type.')) - return redirect(self.get_order_url()) - if self.order.status != Order.STATUS_PAID: - messages.error(request, _('Order is not paid.')) - return redirect(self.get_order_url()) - - ct = CachedTicket.objects.get_or_create(order=self.order, provider=self.output.identifier)[0] - if not ct.cachedfile: - cf = CachedFile() - cf.date = now() - cf.expires = self.request.event.date_from + timedelta(days=30) - cf.save() - ct.cachedfile = cf - ct.save() - if not ct.cachedfile.file.name: - tickets.generate.apply_async(args=(self.order.id, self.output.identifier)) - return redirect(reverse('cachedfile.download', kwargs={'id': ct.cachedfile.id})) - - class OrderExtend(OrderView): permission = 'can_change_orders' diff --git a/src/pretix/locale/de/LC_MESSAGES/django.po b/src/pretix/locale/de/LC_MESSAGES/django.po index ebb493849..8d7cfacb9 100644 --- a/src/pretix/locale/de/LC_MESSAGES/django.po +++ b/src/pretix/locale/de/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: 1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-11-01 18:22+0000\n" -"PO-Revision-Date: 2016-11-01 19:28+0100\n" +"POT-Creation-Date: 2016-11-02 13:49+0000\n" +"PO-Revision-Date: 2016-11-02 14:50+0100\n" "Last-Translator: Raphael Michel \n" "Language-Team: Raphael Michel \n" "Language: de\n" @@ -41,7 +41,7 @@ msgstr "Nur bezahlte Bestellungen" #: pretix/base/exporters/orderlist.py:38 pretix/base/models/orders.py:97 #: pretix/base/services/invoices.py:243 -#: pretix/control/templates/pretixcontrol/order/index.html:80 +#: pretix/control/templates/pretixcontrol/order/index.html:72 #: pretix/control/templates/pretixcontrol/orders/index.html:32 #: pretix/control/templates/pretixcontrol/orders/index.html:76 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:32 @@ -67,53 +67,53 @@ msgid "Email" msgstr "E-Mail" #: pretix/base/exporters/orderlist.py:38 pretix/base/services/invoices.py:249 -#: pretix/control/templates/pretixcontrol/order/index.html:82 +#: pretix/control/templates/pretixcontrol/order/index.html:74 #: pretix/control/templates/pretixcontrol/orders/index.html:82 msgid "Order date" msgstr "Bestelldatum" #: pretix/base/exporters/orderlist.py:39 -#: pretix/control/templates/pretixcontrol/order/index.html:274 +#: pretix/control/templates/pretixcontrol/order/index.html:266 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:77 -#: pretix/presale/templates/pretixpresale/event/order.html:174 +#: pretix/presale/templates/pretixpresale/event/order.html:161 msgid "Company" msgstr "Firma" #: pretix/base/exporters/orderlist.py:39 pretix/base/models/event.py:55 #: pretix/base/models/items.py:499 pretix/base/models/organizer.py:26 -#: pretix/control/templates/pretixcontrol/order/index.html:276 +#: pretix/control/templates/pretixcontrol/order/index.html:268 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:79 -#: pretix/presale/templates/pretixpresale/event/order.html:176 +#: pretix/presale/templates/pretixpresale/event/order.html:163 #: pretix/presale/templates/pretixpresale/organizers/index.html:21 msgid "Name" msgstr "Name" -#: pretix/base/exporters/orderlist.py:39 pretix/base/models/orders.py:552 -#: pretix/control/templates/pretixcontrol/order/index.html:278 +#: pretix/base/exporters/orderlist.py:39 pretix/base/models/orders.py:546 +#: pretix/control/templates/pretixcontrol/order/index.html:270 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:81 -#: pretix/presale/templates/pretixpresale/event/order.html:178 +#: pretix/presale/templates/pretixpresale/event/order.html:165 msgid "Address" msgstr "Adresse" -#: pretix/base/exporters/orderlist.py:39 pretix/base/models/orders.py:553 +#: pretix/base/exporters/orderlist.py:39 pretix/base/models/orders.py:547 msgid "ZIP code" msgstr "Postleitzahl" -#: pretix/base/exporters/orderlist.py:39 pretix/base/models/orders.py:554 +#: pretix/base/exporters/orderlist.py:39 pretix/base/models/orders.py:548 msgid "City" msgstr "Ort" -#: pretix/base/exporters/orderlist.py:39 pretix/base/models/orders.py:555 -#: pretix/control/templates/pretixcontrol/order/index.html:282 +#: pretix/base/exporters/orderlist.py:39 pretix/base/models/orders.py:549 +#: pretix/control/templates/pretixcontrol/order/index.html:274 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:85 -#: pretix/presale/templates/pretixpresale/event/order.html:182 +#: pretix/presale/templates/pretixpresale/event/order.html:169 msgid "Country" msgstr "Land" -#: pretix/base/exporters/orderlist.py:39 pretix/base/models/orders.py:556 -#: pretix/control/templates/pretixcontrol/order/index.html:285 +#: pretix/base/exporters/orderlist.py:39 pretix/base/models/orders.py:550 +#: pretix/control/templates/pretixcontrol/order/index.html:277 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:88 -#: pretix/presale/templates/pretixpresale/event/order.html:185 +#: pretix/presale/templates/pretixpresale/event/order.html:172 msgid "VAT ID" msgstr "USt-ID" @@ -249,7 +249,7 @@ msgstr "Zeitzone" #: pretix/base/models/auth.py:89 #: pretix/control/templates/pretixcontrol/event/permissions.html:15 -#: pretix/control/templates/pretixcontrol/order/index.html:91 +#: pretix/control/templates/pretixcontrol/order/index.html:83 #: pretix/control/templates/pretixcontrol/orders/index.html:78 #: pretix/control/views/event.py:503 tests/base/test_mail.py:68 msgid "User" @@ -339,7 +339,7 @@ msgstr "Erweiterungen" #: pretix/base/models/event.py:99 pretix/base/models/items.py:118 #: pretix/base/models/items.py:495 pretix/base/models/orders.py:108 -#: pretix/base/models/orders.py:513 pretix/base/models/vouchers.py:64 +#: pretix/base/models/orders.py:507 pretix/base/models/vouchers.py:64 #: pretix/base/services/invoices.py:257 msgid "Event" msgstr "Veranstaltung" @@ -643,7 +643,7 @@ msgstr "Gesamtanzahl" msgid "Leave empty for an unlimited number of tickets." msgstr "Leer lassen für unbegrenzt viele Tickets." -#: pretix/base/models/items.py:508 pretix/base/models/orders.py:384 +#: pretix/base/models/items.py:508 pretix/base/models/orders.py:378 msgid "Item" msgstr "Produkt" @@ -689,20 +689,20 @@ msgstr "erstattet" msgid "Locale" msgstr "Sprache" -#: pretix/base/models/orders.py:121 pretix/base/models/orders.py:520 +#: pretix/base/models/orders.py:121 pretix/base/models/orders.py:514 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_assign.html:17 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:9 #: pretix/presale/templates/pretixpresale/organizers/index.html:22 msgid "Date" msgstr "Datum" -#: pretix/base/models/orders.py:124 pretix/base/models/orders.py:524 +#: pretix/base/models/orders.py:124 pretix/base/models/orders.py:518 #: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form.html:23 msgid "Expiration date" msgstr "Ablaufdatum" #: pretix/base/models/orders.py:127 -#: pretix/control/templates/pretixcontrol/order/index.html:85 +#: pretix/control/templates/pretixcontrol/order/index.html:77 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/control.html:11 msgid "Payment date" msgstr "Zahlungsdatum" @@ -712,8 +712,8 @@ msgid "Payment provider" msgstr "Zahlungsmethode" #: pretix/base/models/orders.py:137 -#: pretix/control/templates/pretixcontrol/order/index.html:216 -#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:84 +#: pretix/control/templates/pretixcontrol/order/index.html:208 +#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:108 msgid "Payment method fee" msgstr "Gebühr für gewählte Zahlungsmethode" @@ -726,7 +726,7 @@ msgid "Payment method fee tax" msgstr "Steuerbetrag auf Gebühr für gewählte Zahlungsmethode" #: pretix/base/models/orders.py:148 -#: pretix/control/templates/pretixcontrol/order/index.html:246 +#: pretix/control/templates/pretixcontrol/order/index.html:238 msgid "Payment information" msgstr "Zahlungsinformationen" @@ -750,7 +750,7 @@ msgstr "" "Der hier eingegebene Text wird dem Kunden nicht angezeigt und dient dazu, " "Ihnen zu helfen, den Überblick zu behalten." -#: pretix/base/models/orders.py:169 pretix/base/models/orders.py:442 +#: pretix/base/models/orders.py:169 pretix/base/models/orders.py:436 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:13 msgid "Order" msgstr "Bestellung" @@ -771,7 +771,7 @@ msgstr "Die Zahlung kommt zu spät, um akzeptiert werden zu können." msgid "Some of the ordered products are no longer available." msgstr "Einige der ausgewählten Produkte sind nicht mehr verfügbar." -#: pretix/base/models/orders.py:351 +#: pretix/base/models/orders.py:345 #: pretix/control/templates/pretixcontrol/vouchers/index.html:71 #: pretix/control/views/item.py:418 pretix/control/views/vouchers.py:78 #: pretix/control/views/vouchers.py:79 pretix/control/views/vouchers.py:82 @@ -779,7 +779,7 @@ msgstr "Einige der ausgewählten Produkte sind nicht mehr verfügbar." msgid "Yes" msgstr "Ja" -#: pretix/base/models/orders.py:353 pretix/control/forms/event.py:289 +#: pretix/base/models/orders.py:347 pretix/control/forms/event.py:289 #: pretix/control/templates/pretixcontrol/vouchers/index.html:71 #: pretix/control/views/item.py:418 pretix/control/views/vouchers.py:78 #: pretix/control/views/vouchers.py:79 pretix/control/views/vouchers.py:82 @@ -787,61 +787,61 @@ msgstr "Ja" msgid "No" msgstr "Nein" -#: pretix/base/models/orders.py:390 +#: pretix/base/models/orders.py:384 msgid "Variation" msgstr "Variante" -#: pretix/base/models/orders.py:395 pretix/control/views/vouchers.py:62 +#: pretix/base/models/orders.py:389 pretix/control/views/vouchers.py:62 #: pretix/plugins/checkinlists/exporters.py:81 msgid "Price" msgstr "Preis" -#: pretix/base/models/orders.py:399 -#: pretix/control/templates/pretixcontrol/order/index.html:183 +#: pretix/base/models/orders.py:393 +#: pretix/control/templates/pretixcontrol/order/index.html:175 #: pretix/plugins/checkinlists/exporters.py:48 #: pretix/plugins/checkinlists/exporters.py:81 #: pretix/presale/forms/checkout.py:67 -#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:16 +#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:18 msgid "Attendee name" msgstr "Name des Teilnehmers" -#: pretix/base/models/orders.py:401 +#: pretix/base/models/orders.py:395 msgid "Empty, if this product is not an admission ticket" msgstr "Leer, wenn dies kein Eintrittsticket ist" -#: pretix/base/models/orders.py:448 +#: pretix/base/models/orders.py:442 msgid "Tax rate" msgstr "Steuersatz" -#: pretix/base/models/orders.py:452 +#: pretix/base/models/orders.py:446 msgid "Tax value" msgstr "Steuer" -#: pretix/base/models/orders.py:457 +#: pretix/base/models/orders.py:451 msgid "Order position" msgstr "Bestelltes Produkt" -#: pretix/base/models/orders.py:458 +#: pretix/base/models/orders.py:452 msgid "Order positions" msgstr "Bestellzeile" -#: pretix/base/models/orders.py:517 +#: pretix/base/models/orders.py:511 msgid "Cart ID (e.g. session key)" msgstr "Warenkorb-ID (z.B. Session-ID)" -#: pretix/base/models/orders.py:528 +#: pretix/base/models/orders.py:522 msgid "Cart position" msgstr "Produkt im Warenkorb" -#: pretix/base/models/orders.py:529 +#: pretix/base/models/orders.py:523 msgid "Cart positions" msgstr "Produkte im Warenkorb" -#: pretix/base/models/orders.py:550 +#: pretix/base/models/orders.py:544 msgid "Company name" msgstr "Firmenname" -#: pretix/base/models/orders.py:551 +#: pretix/base/models/orders.py:545 msgid "Full name" msgstr "Voller Name" @@ -1396,12 +1396,12 @@ msgstr "" msgid "Payment received for your order: %(code)s" msgstr "Zahlung erhalten für die Bestellung: %(code)s" -#: pretix/base/services/orders.py:153 pretix/presale/views/order.py:434 -#: pretix/presale/views/order.py:460 +#: pretix/base/services/orders.py:153 pretix/presale/views/order.py:433 +#: pretix/presale/views/order.py:459 msgid "You cannot cancel this order." msgstr "Sie können diese Bestellung nicht stornieren." -#: pretix/base/services/orders.py:354 pretix/control/views/orders.py:353 +#: pretix/base/services/orders.py:354 pretix/control/views/orders.py:331 #: pretix/presale/templates/pretixpresale/event/order.html:33 #, python-format msgid "Your order: %(code)s" @@ -1786,7 +1786,7 @@ msgstr "" "Wenn Sie Cookies in Ihrem Browser deaktiviert haben, aktivieren Sie diese " "bitte zumindest für diese Website." -#: pretix/control/forms/__init__.py:73 +#: pretix/control/forms/__init__.py:89 msgid "Filetype not allowed!" msgstr "Dateityp nicht erlaubt" @@ -2417,11 +2417,11 @@ msgstr "" msgid "The order's expiry date has been changed." msgstr "Die Zahlungsfrist wurde geändert." -#: pretix/control/logdisplay.py:53 pretix/control/views/orders.py:256 +#: pretix/control/logdisplay.py:53 pretix/control/views/orders.py:234 msgid "The order has been marked as expired." msgstr "Die Bestellung wurde als abgelaufen markiert." -#: pretix/control/logdisplay.py:54 pretix/control/views/orders.py:242 +#: pretix/control/logdisplay.py:54 pretix/control/views/orders.py:220 msgid "The order has been marked as paid." msgstr "Die Bestellung wurde als bezahlt markiert." @@ -2429,8 +2429,8 @@ msgstr "Die Bestellung wurde als bezahlt markiert." msgid "The order has been refunded." msgstr "Die Bestellung wurde zurückerstattet." -#: pretix/control/logdisplay.py:56 pretix/control/views/orders.py:245 -#: pretix/presale/views/order.py:470 +#: pretix/control/logdisplay.py:56 pretix/control/views/orders.py:223 +#: pretix/presale/views/order.py:469 msgid "The order has been canceled." msgstr "Die Bestellung wurde storniert." @@ -2438,16 +2438,16 @@ msgstr "Die Bestellung wurde storniert." msgid "The order has been created." msgstr "Die Bestellung wurde erstellt." -#: pretix/control/logdisplay.py:58 pretix/control/views/orders.py:292 -#: pretix/presale/views/order.py:360 +#: pretix/control/logdisplay.py:58 pretix/control/views/orders.py:270 +#: pretix/presale/views/order.py:359 msgid "The invoice has been generated." msgstr "Die Rechnung wurde erstellt." -#: pretix/control/logdisplay.py:59 pretix/control/views/orders.py:315 +#: pretix/control/logdisplay.py:59 pretix/control/views/orders.py:293 msgid "The invoice has been regenerated." msgstr "Die Rechnung wurde neu generiert." -#: pretix/control/logdisplay.py:60 pretix/control/views/orders.py:339 +#: pretix/control/logdisplay.py:60 pretix/control/views/orders.py:317 msgid "The invoice has been reissued." msgstr "Die Rechnung wurde neu ausgestellt." @@ -2856,7 +2856,7 @@ msgid "Free order" msgstr "Kostenlose Bestellung" #: pretix/control/templates/pretixcontrol/event/mail.html:62 -#: pretix/control/templates/pretixcontrol/order/index.html:102 +#: pretix/control/templates/pretixcontrol/order/index.html:94 msgid "Resend link" msgstr "Link erneut senden" @@ -2903,7 +2903,7 @@ msgid "Change settings" msgstr "Kann Einstellungen ändern" #: pretix/control/templates/pretixcontrol/event/permissions.html:17 -#: pretix/control/templates/pretixcontrol/order/index.html:158 +#: pretix/control/templates/pretixcontrol/order/index.html:150 msgid "Change products" msgstr "Produkte bearbeiten" @@ -3014,7 +3014,7 @@ msgstr "Allgemeines" #: pretix/control/templates/pretixcontrol/event/settings_base.html:16 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:53 #: pretix/presale/templates/pretixpresale/event/order.html:51 -#: pretix/presale/templates/pretixpresale/event/order.html:212 +#: pretix/presale/templates/pretixpresale/event/order.html:199 msgid "Payment" msgstr "Zahlung" @@ -3027,7 +3027,6 @@ msgid "Tickets" msgstr "Tickets" #: pretix/control/templates/pretixcontrol/event/tickets.html:8 -#: pretix/presale/templates/pretixpresale/event/order.html:72 msgid "Ticket download" msgstr "Ticket-Download" @@ -3536,7 +3535,7 @@ msgstr "Verbleibende Kapazität" #: pretix/control/templates/pretixcontrol/order/cancel.html:4 #: pretix/control/templates/pretixcontrol/order/cancel.html:8 #: pretix/control/templates/pretixcontrol/order/index.html:32 -#: pretix/presale/templates/pretixpresale/event/order.html:202 +#: pretix/presale/templates/pretixpresale/event/order.html:189 #: pretix/presale/templates/pretixpresale/event/order_cancel.html:4 msgid "Cancel order" msgstr "Stornieren" @@ -3658,15 +3657,15 @@ msgstr "Als nicht bezahlt markieren" msgid "Refund order" msgstr "Bestellung erstatten" -#: pretix/control/templates/pretixcontrol/order/index.html:51 +#: pretix/control/templates/pretixcontrol/order/index.html:43 msgid "View order as user" msgstr "Als Kunde ansehen" -#: pretix/control/templates/pretixcontrol/order/index.html:63 +#: pretix/control/templates/pretixcontrol/order/index.html:55 msgid "Expire order" msgstr "Als abgelaufen markieren" -#: pretix/control/templates/pretixcontrol/order/index.html:64 +#: pretix/control/templates/pretixcontrol/order/index.html:56 msgid "" "The payment for this order is overdue, but you have configured not to expire " "orders automatically. To free quota capacity, you can mark it as expired " @@ -3677,66 +3676,66 @@ msgstr "" "Kontingent zu schaffen, können Sie die Bestellung manuell als abgelaufen " "markieren." -#: pretix/control/templates/pretixcontrol/order/index.html:75 +#: pretix/control/templates/pretixcontrol/order/index.html:67 #: pretix/presale/templates/pretixpresale/event/order.html:6 msgid "Order details" msgstr "Bestellung" -#: pretix/control/templates/pretixcontrol/order/index.html:88 +#: pretix/control/templates/pretixcontrol/order/index.html:80 msgid "Expiry date" msgstr "Ablaufdatum" -#: pretix/control/templates/pretixcontrol/order/index.html:108 -#: pretix/control/templates/pretixcontrol/order/index.html:138 -#: pretix/presale/templates/pretixpresale/event/order.html:120 -#: pretix/presale/templates/pretixpresale/event/order.html:141 +#: pretix/control/templates/pretixcontrol/order/index.html:100 +#: pretix/control/templates/pretixcontrol/order/index.html:130 +#: pretix/presale/templates/pretixpresale/event/order.html:107 +#: pretix/presale/templates/pretixpresale/event/order.html:128 msgid "Invoices" msgstr "Rechnungen" -#: pretix/control/templates/pretixcontrol/order/index.html:112 -#: pretix/presale/templates/pretixpresale/event/order.html:128 +#: pretix/control/templates/pretixcontrol/order/index.html:104 +#: pretix/presale/templates/pretixpresale/event/order.html:115 msgid "Cancellation" msgstr "Rechnungskorrektur" -#: pretix/control/templates/pretixcontrol/order/index.html:112 -#: pretix/presale/templates/pretixpresale/event/order.html:128 +#: pretix/control/templates/pretixcontrol/order/index.html:104 +#: pretix/presale/templates/pretixpresale/event/order.html:115 msgid "Invoice" msgstr "Rechnung" -#: pretix/control/templates/pretixcontrol/order/index.html:119 +#: pretix/control/templates/pretixcontrol/order/index.html:111 #: pretix/control/templates/pretixcontrol/user/2fa_regenemergency.html:20 msgid "Regenerate" msgstr "Neu generieren" -#: pretix/control/templates/pretixcontrol/order/index.html:127 +#: pretix/control/templates/pretixcontrol/order/index.html:119 msgid "Cancel and reissue" msgstr "Stornieren und neu ausstellen" -#: pretix/control/templates/pretixcontrol/order/index.html:144 +#: pretix/control/templates/pretixcontrol/order/index.html:136 msgid "Generate invoice" msgstr "Rechnungen ausstellen" -#: pretix/control/templates/pretixcontrol/order/index.html:163 -#: pretix/presale/templates/pretixpresale/event/order.html:106 +#: pretix/control/templates/pretixcontrol/order/index.html:155 +#: pretix/presale/templates/pretixpresale/event/order.html:93 msgid "Ordered items" msgstr "Bestellte Produkte" -#: pretix/control/templates/pretixcontrol/order/index.html:175 +#: pretix/control/templates/pretixcontrol/order/index.html:167 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:11 msgid "Voucher code used:" msgstr "Verwendeter Gutscheincode:" -#: pretix/control/templates/pretixcontrol/order/index.html:185 -#: pretix/control/templates/pretixcontrol/order/index.html:190 -#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:17 -#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:21 +#: pretix/control/templates/pretixcontrol/order/index.html:177 +#: pretix/control/templates/pretixcontrol/order/index.html:182 +#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:19 +#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:23 msgid "not answered" msgstr "nicht beantwortet" -#: pretix/control/templates/pretixcontrol/order/index.html:205 -#: pretix/control/templates/pretixcontrol/order/index.html:222 -#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:72 -#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:90 +#: pretix/control/templates/pretixcontrol/order/index.html:197 +#: pretix/control/templates/pretixcontrol/order/index.html:214 +#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:86 +#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:114 #: pretix/presale/templates/pretixpresale/event/index.html:132 #: pretix/presale/templates/pretixpresale/event/index.html:182 #: pretix/presale/templates/pretixpresale/event/voucher.html:74 @@ -3745,45 +3744,45 @@ msgstr "nicht beantwortet" msgid "incl. %(rate)s%% taxes" msgstr "inkl. %(rate)s%% MwSt." -#: pretix/control/templates/pretixcontrol/order/index.html:232 +#: pretix/control/templates/pretixcontrol/order/index.html:224 #: pretix/control/templates/pretixcontrol/orders/overview.html:85 #: pretix/plugins/reports/exporters.py:199 -#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:100 +#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:124 msgid "Total" msgstr "Gesamt" -#: pretix/control/templates/pretixcontrol/order/index.html:252 +#: pretix/control/templates/pretixcontrol/order/index.html:244 msgid "The payment state of this order was manually modified." msgstr "Der Status dieser Bestellung wurde manuell verändert." -#: pretix/control/templates/pretixcontrol/order/index.html:257 +#: pretix/control/templates/pretixcontrol/order/index.html:249 #, python-format msgid "The payment has to be completed before %(date)s." msgstr "Die Zahlung muss bis zum %(date)s abgeschlossen sein." -#: pretix/control/templates/pretixcontrol/order/index.html:269 +#: pretix/control/templates/pretixcontrol/order/index.html:261 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:72 #: pretix/presale/templates/pretixpresale/event/checkout_questions.html:30 -#: pretix/presale/templates/pretixpresale/event/order.html:169 +#: pretix/presale/templates/pretixpresale/event/order.html:156 #: pretix/presale/templates/pretixpresale/event/order_modify.html:25 msgid "Invoice information" msgstr "Rechnungsinformationen" -#: pretix/control/templates/pretixcontrol/order/index.html:280 +#: pretix/control/templates/pretixcontrol/order/index.html:272 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:83 -#: pretix/presale/templates/pretixpresale/event/order.html:180 +#: pretix/presale/templates/pretixpresale/event/order.html:167 msgid "ZIP code and city" msgstr "PLZ und Ort" -#: pretix/control/templates/pretixcontrol/order/index.html:297 +#: pretix/control/templates/pretixcontrol/order/index.html:289 msgid "Internal comment" msgstr "Interner Kommentar" -#: pretix/control/templates/pretixcontrol/order/index.html:308 +#: pretix/control/templates/pretixcontrol/order/index.html:300 msgid "Update comment" msgstr "Kommentar speichern" -#: pretix/control/templates/pretixcontrol/order/index.html:319 +#: pretix/control/templates/pretixcontrol/order/index.html:311 msgid "Order history" msgstr "Bestellverlauf" @@ -4263,7 +4262,7 @@ msgid "We already sent you an email in the last 24 hours." msgstr "" "Wir haben Ihnen in den letzten 24 Stunden bereits eine E-Mail geschickt." -#: pretix/control/views/auth.py:140 pretix/control/views/orders.py:365 +#: pretix/control/views/auth.py:140 pretix/control/views/orders.py:343 msgid "There was an error sending the mail. Please try again later." msgstr "" "Es gab ein Fehler beim Senden der E-Mail. Bitte probieren Sie es später " @@ -4417,8 +4416,7 @@ msgstr "" "\"Eigenen SMTP-Server verwenden\" zu setzen, damit der Server auch benutzt " "wird." -#: pretix/control/views/event.py:395 pretix/control/views/orders.py:422 -#: pretix/presale/views/order.py:491 +#: pretix/control/views/event.py:395 pretix/presale/views/order.py:498 msgid "You requested an invalid ticket output type." msgstr "Sie haben einen ungültigen Ausgabetyp gewählt." @@ -4540,15 +4538,15 @@ msgstr "Das ausgewählte Produkt wurde deaktiviert." msgid "The new event has been created." msgstr "Eine neue Veranstaltung wurde erstellt." -#: pretix/control/views/orders.py:223 +#: pretix/control/views/orders.py:201 msgid "The comment has been updated." msgstr "Der Kommentar wurde aktualisiert." -#: pretix/control/views/orders.py:225 +#: pretix/control/views/orders.py:203 msgid "Could not update the comment." msgstr "Kommentar konnte nicht gespeichert werden." -#: pretix/control/views/orders.py:240 +#: pretix/control/views/orders.py:218 msgid "" "The order has been marked as paid, but we were unable to send a confirmation " "mail." @@ -4556,35 +4554,35 @@ msgstr "" "Die Bestellung wurde als bezahlt markiert, aber die Bestätigungsmail konnte " "nicht verschickt werden." -#: pretix/control/views/orders.py:251 +#: pretix/control/views/orders.py:229 msgid "The order has been marked as not paid." msgstr "Die Bestellung wurde als nicht bezahlt markiert." -#: pretix/control/views/orders.py:284 pretix/presale/views/order.py:352 +#: pretix/control/views/orders.py:262 pretix/presale/views/order.py:351 msgid "You cannot generate an invoice for this order." msgstr "Sie können für diese Bestellung keine Rechnung erzeugen." -#: pretix/control/views/orders.py:286 pretix/presale/views/order.py:354 +#: pretix/control/views/orders.py:264 pretix/presale/views/order.py:353 msgid "An invoice for this order already exists." msgstr "Zu dieser Bestellung gibt es bereits eine Rechnung." -#: pretix/control/views/orders.py:306 pretix/control/views/orders.py:329 +#: pretix/control/views/orders.py:284 pretix/control/views/orders.py:307 msgid "Unknown invoice." msgstr "Unbekannte Rechnung" -#: pretix/control/views/orders.py:309 pretix/control/views/orders.py:332 +#: pretix/control/views/orders.py:287 pretix/control/views/orders.py:310 msgid "The invoice has already been canceled." msgstr "Die Rechnung wurde bereits storniert." -#: pretix/control/views/orders.py:368 +#: pretix/control/views/orders.py:346 msgid "The email has been queued to be sent." msgstr "Die E-Mail wurde zum Versenden gespeichert." -#: pretix/control/views/orders.py:393 pretix/presale/views/order.py:529 +#: pretix/control/views/orders.py:371 pretix/presale/views/order.py:538 msgid "This invoice has not been found" msgstr "Diese Rechnung wurde nicht gefunden" -#: pretix/control/views/orders.py:401 pretix/presale/views/order.py:537 +#: pretix/control/views/orders.py:379 pretix/presale/views/order.py:546 msgid "" "The invoice file has not yet been generated, we will generate it for you " "now. Please try again in a few seconds." @@ -4592,15 +4590,11 @@ msgstr "" "Diese Rechnung wurde bisher noch nicht fertig erstellt, wir werden die PDF-" "Datei jetzt erstellen. Bitte probieren Sie es in wenigen Sekunden erneut." -#: pretix/control/views/orders.py:425 pretix/presale/views/order.py:496 -msgid "Order is not paid." -msgstr "Die Bestellung ist nicht bezahlt." - -#: pretix/control/views/orders.py:447 pretix/control/views/orders.py:465 +#: pretix/control/views/orders.py:394 pretix/control/views/orders.py:412 msgid "The payment term has been changed." msgstr "Die Zahlungsfrist wurde geändert." -#: pretix/control/views/orders.py:469 +#: pretix/control/views/orders.py:416 msgid "" "We were not able to process the request completely as the server was too " "busy." @@ -4608,32 +4602,32 @@ msgstr "" "Wir konnten Ihre Bestellung nicht durchführen, da der Server zu beschäftigt " "war." -#: pretix/control/views/orders.py:477 pretix/control/views/orders.py:499 +#: pretix/control/views/orders.py:424 pretix/control/views/orders.py:446 msgid "This action is only allowed for pending orders." msgstr "Diese Aktion ist nur für unbezahlte Bestellungen möglich." -#: pretix/control/views/orders.py:548 +#: pretix/control/views/orders.py:495 msgid "An error occured. Please see the details below." msgstr "" "Ein Fehler ist aufgetreten, bitte schauen Sie weiter unten für Details." -#: pretix/control/views/orders.py:555 +#: pretix/control/views/orders.py:502 msgid "The order has been changed and the user has been notified." msgstr "Die Bestellung wurde geändert und der Kunde benachrichtigt." -#: pretix/control/views/orders.py:584 +#: pretix/control/views/orders.py:531 msgid "The order has been changed." msgstr "Die Bestellung wurde geändert." -#: pretix/control/views/orders.py:619 +#: pretix/control/views/orders.py:566 msgid "There is no order with the given order code." msgstr "Es existiert keine Bestellung mit der eingegebenen Bestellnummer." -#: pretix/control/views/orders.py:653 +#: pretix/control/views/orders.py:600 msgid "The selected exporter was not found." msgstr "Das ausgewählte Exportformat wurde nicht gefunden." -#: pretix/control/views/orders.py:659 +#: pretix/control/views/orders.py:606 msgid "There was a problem processing your input. See below for error details." msgstr "Die Eingabe konnte nicht verarbeitet werden." @@ -5628,8 +5622,8 @@ msgid "PDF output" msgstr "PDF-Ausgabe" #: pretix/plugins/ticketoutputpdf/ticketoutput.py:21 -msgid "Download PDF" -msgstr "PDF herunterladen" +msgid "PDF" +msgstr "PDF" #: pretix/plugins/ticketoutputpdf/ticketoutput.py:57 #, python-brace-format @@ -5752,7 +5746,7 @@ msgstr "Teilnehmername-Größe (mm)" msgid "Invisible by default, set this to a number greater than 0 to show." msgstr "Standardmäßig unsichtbar, eine positive Größe zeigt das Element an." -#: pretix/presale/checkoutflow.py:167 pretix/presale/views/order.py:394 +#: pretix/presale/checkoutflow.py:167 pretix/presale/views/order.py:393 msgid "" "We had difficulties processing your input. Please review the errors below." msgstr "Wir hatten Schwierigkeiten, Ihre Eingabe zu verarbeiten." @@ -5765,12 +5759,12 @@ msgstr "Bitte geben Sie eine gültige E-Mail-Adresse ein." msgid "Please fill in answers to all required questions." msgstr "Bitte füllen Sie Antworten zu allen benötigten Fragen ein." -#: pretix/presale/checkoutflow.py:255 pretix/presale/views/order.py:326 +#: pretix/presale/checkoutflow.py:255 pretix/presale/views/order.py:325 msgid "Please select a payment method." msgstr "Bitte wählen Sie eine Zahlungsmethode aus." #: pretix/presale/checkoutflow.py:276 pretix/presale/checkoutflow.py:282 -#: pretix/presale/views/order.py:196 pretix/presale/views/order.py:232 +#: pretix/presale/views/order.py:195 pretix/presale/views/order.py:231 msgid "The payment information you entered was incomplete." msgstr "Die eingegebenen Zahlungsinformationen sind unvollständig." @@ -6032,25 +6026,25 @@ msgstr "Zahlung abschließen" msgid "Please complete your payment before %(date)s" msgstr "Bitte schließen Sie Ihre Zahlung bis zum %(date)s ab." -#: pretix/presale/templates/pretixpresale/event/order.html:77 +#: pretix/presale/templates/pretixpresale/event/order.html:72 msgid "" -"Please obtain your ticket below. Please have your ticket ready when entering " -"the event." +"You can download your tickets using the buttons below. Please have your " +"ticket ready when entering the event." msgstr "" -"Bitte laden Sie Ihr Ticket hier herunter. Bitte halten Sie das Ticket am " -"Einlass bereit." +"Bitte laden Sie Ihr Ticket mit Hilfe der Buttons weiter unten herunter. " +"Bitte halten Sie das Ticket am Einlass bereit." -#: pretix/presale/templates/pretixpresale/event/order.html:88 +#: pretix/presale/templates/pretixpresale/event/order.html:76 #, python-format msgid "You will be able to download your tickets here starting on %(date)s." msgstr "Sie können Ihre Tickets hier ab %(date)s herunterladen." -#: pretix/presale/templates/pretixpresale/event/order.html:101 -#: pretix/presale/templates/pretixpresale/event/order.html:164 +#: pretix/presale/templates/pretixpresale/event/order.html:88 +#: pretix/presale/templates/pretixpresale/event/order.html:151 msgid "Change details" msgstr "Details bearbeiten" -#: pretix/presale/templates/pretixpresale/event/order.html:149 +#: pretix/presale/templates/pretixpresale/event/order.html:136 msgid "Request invoice" msgstr "Rechnung anfragen" @@ -6232,29 +6226,33 @@ msgstr "Die gewählten Produkte wurden Ihrem Warenkorb hinzugefügt." msgid "Your cart is empty" msgstr "Ihr Warenkorb ist leer." -#: pretix/presale/views/order.py:70 pretix/presale/views/order.py:142 -#: pretix/presale/views/order.py:189 pretix/presale/views/order.py:229 -#: pretix/presale/views/order.py:256 pretix/presale/views/order.py:347 -#: pretix/presale/views/order.py:411 pretix/presale/views/order.py:432 -#: pretix/presale/views/order.py:458 pretix/presale/views/order.py:494 -#: pretix/presale/views/order.py:520 +#: pretix/presale/views/order.py:70 pretix/presale/views/order.py:141 +#: pretix/presale/views/order.py:188 pretix/presale/views/order.py:228 +#: pretix/presale/views/order.py:255 pretix/presale/views/order.py:346 +#: pretix/presale/views/order.py:410 pretix/presale/views/order.py:431 +#: pretix/presale/views/order.py:457 pretix/presale/views/order.py:501 +#: pretix/presale/views/order.py:529 msgid "Unknown order code or not authorized to access this order." msgstr "" "Unbekannte Bestellnummer oder Bestellung gehört einem anderen Benutzer." -#: pretix/presale/views/order.py:146 pretix/presale/views/order.py:192 +#: pretix/presale/views/order.py:145 pretix/presale/views/order.py:191 msgid "The payment for this order cannot be continued." msgstr "Diese Bestellung kann nicht mehr bezahlt werden." -#: pretix/presale/views/order.py:258 +#: pretix/presale/views/order.py:257 msgid "The payment method for this order cannot be changed." msgstr "Die Zahlungsmethode für diese Bestellung kann nicht geändert werden." -#: pretix/presale/views/order.py:413 +#: pretix/presale/views/order.py:412 msgid "You cannot modify this order" msgstr "Sie können diese Bestellung nicht bearbeiten" -#: pretix/presale/views/order.py:501 +#: pretix/presale/views/order.py:503 +msgid "Order is not paid." +msgstr "Die Bestellung ist nicht bezahlt." + +#: pretix/presale/views/order.py:508 msgid "Ticket download is not (yet) enabled." msgstr "Der Ticket-Download ist (noch) nicht freigeschaltet." @@ -6292,6 +6290,9 @@ msgstr "Deutsch" msgid "German (informal)" msgstr "Deutsch (Du)" +#~ msgid "Download PDF" +#~ msgstr "PDF herunterladen" + #~ msgid "A voucher you tried to use already has been used." #~ msgstr "" #~ "Ein Gutscheincode, den Sie verwenden wollten, wurde zwischenzeitlich " diff --git a/src/pretix/locale/de_Informal/LC_MESSAGES/django.po b/src/pretix/locale/de_Informal/LC_MESSAGES/django.po index 6bbfd2961..28eeeae74 100644 --- a/src/pretix/locale/de_Informal/LC_MESSAGES/django.po +++ b/src/pretix/locale/de_Informal/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: 1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-11-01 18:22+0000\n" -"PO-Revision-Date: 2016-11-01 19:28+0100\n" +"POT-Creation-Date: 2016-11-02 13:49+0000\n" +"PO-Revision-Date: 2016-11-02 14:50+0100\n" "Last-Translator: Raphael Michel \n" "Language-Team: Raphael Michel \n" "Language: de\n" @@ -41,7 +41,7 @@ msgstr "Nur bezahlte Bestellungen" #: pretix/base/exporters/orderlist.py:38 pretix/base/models/orders.py:97 #: pretix/base/services/invoices.py:243 -#: pretix/control/templates/pretixcontrol/order/index.html:80 +#: pretix/control/templates/pretixcontrol/order/index.html:72 #: pretix/control/templates/pretixcontrol/orders/index.html:32 #: pretix/control/templates/pretixcontrol/orders/index.html:76 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:32 @@ -67,53 +67,53 @@ msgid "Email" msgstr "E-Mail" #: pretix/base/exporters/orderlist.py:38 pretix/base/services/invoices.py:249 -#: pretix/control/templates/pretixcontrol/order/index.html:82 +#: pretix/control/templates/pretixcontrol/order/index.html:74 #: pretix/control/templates/pretixcontrol/orders/index.html:82 msgid "Order date" msgstr "Bestelldatum" #: pretix/base/exporters/orderlist.py:39 -#: pretix/control/templates/pretixcontrol/order/index.html:274 +#: pretix/control/templates/pretixcontrol/order/index.html:266 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:77 -#: pretix/presale/templates/pretixpresale/event/order.html:174 +#: pretix/presale/templates/pretixpresale/event/order.html:161 msgid "Company" msgstr "Firma" #: pretix/base/exporters/orderlist.py:39 pretix/base/models/event.py:55 #: pretix/base/models/items.py:499 pretix/base/models/organizer.py:26 -#: pretix/control/templates/pretixcontrol/order/index.html:276 +#: pretix/control/templates/pretixcontrol/order/index.html:268 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:79 -#: pretix/presale/templates/pretixpresale/event/order.html:176 +#: pretix/presale/templates/pretixpresale/event/order.html:163 #: pretix/presale/templates/pretixpresale/organizers/index.html:21 msgid "Name" msgstr "Name" -#: pretix/base/exporters/orderlist.py:39 pretix/base/models/orders.py:552 -#: pretix/control/templates/pretixcontrol/order/index.html:278 +#: pretix/base/exporters/orderlist.py:39 pretix/base/models/orders.py:546 +#: pretix/control/templates/pretixcontrol/order/index.html:270 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:81 -#: pretix/presale/templates/pretixpresale/event/order.html:178 +#: pretix/presale/templates/pretixpresale/event/order.html:165 msgid "Address" msgstr "Adresse" -#: pretix/base/exporters/orderlist.py:39 pretix/base/models/orders.py:553 +#: pretix/base/exporters/orderlist.py:39 pretix/base/models/orders.py:547 msgid "ZIP code" msgstr "Postleitzahl" -#: pretix/base/exporters/orderlist.py:39 pretix/base/models/orders.py:554 +#: pretix/base/exporters/orderlist.py:39 pretix/base/models/orders.py:548 msgid "City" msgstr "Ort" -#: pretix/base/exporters/orderlist.py:39 pretix/base/models/orders.py:555 -#: pretix/control/templates/pretixcontrol/order/index.html:282 +#: pretix/base/exporters/orderlist.py:39 pretix/base/models/orders.py:549 +#: pretix/control/templates/pretixcontrol/order/index.html:274 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:85 -#: pretix/presale/templates/pretixpresale/event/order.html:182 +#: pretix/presale/templates/pretixpresale/event/order.html:169 msgid "Country" msgstr "Land" -#: pretix/base/exporters/orderlist.py:39 pretix/base/models/orders.py:556 -#: pretix/control/templates/pretixcontrol/order/index.html:285 +#: pretix/base/exporters/orderlist.py:39 pretix/base/models/orders.py:550 +#: pretix/control/templates/pretixcontrol/order/index.html:277 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:88 -#: pretix/presale/templates/pretixpresale/event/order.html:185 +#: pretix/presale/templates/pretixpresale/event/order.html:172 msgid "VAT ID" msgstr "USt-ID" @@ -249,7 +249,7 @@ msgstr "Zeitzone" #: pretix/base/models/auth.py:89 #: pretix/control/templates/pretixcontrol/event/permissions.html:15 -#: pretix/control/templates/pretixcontrol/order/index.html:91 +#: pretix/control/templates/pretixcontrol/order/index.html:83 #: pretix/control/templates/pretixcontrol/orders/index.html:78 #: pretix/control/views/event.py:503 tests/base/test_mail.py:68 msgid "User" @@ -339,7 +339,7 @@ msgstr "Erweiterungen" #: pretix/base/models/event.py:99 pretix/base/models/items.py:118 #: pretix/base/models/items.py:495 pretix/base/models/orders.py:108 -#: pretix/base/models/orders.py:513 pretix/base/models/vouchers.py:64 +#: pretix/base/models/orders.py:507 pretix/base/models/vouchers.py:64 #: pretix/base/services/invoices.py:257 msgid "Event" msgstr "Veranstaltung" @@ -643,7 +643,7 @@ msgstr "Gesamtanzahl" msgid "Leave empty for an unlimited number of tickets." msgstr "Leer lassen für unbegrenzt viele Tickets." -#: pretix/base/models/items.py:508 pretix/base/models/orders.py:384 +#: pretix/base/models/items.py:508 pretix/base/models/orders.py:378 msgid "Item" msgstr "Produkt" @@ -689,20 +689,20 @@ msgstr "erstattet" msgid "Locale" msgstr "Sprache" -#: pretix/base/models/orders.py:121 pretix/base/models/orders.py:520 +#: pretix/base/models/orders.py:121 pretix/base/models/orders.py:514 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_assign.html:17 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:9 #: pretix/presale/templates/pretixpresale/organizers/index.html:22 msgid "Date" msgstr "Datum" -#: pretix/base/models/orders.py:124 pretix/base/models/orders.py:524 +#: pretix/base/models/orders.py:124 pretix/base/models/orders.py:518 #: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form.html:23 msgid "Expiration date" msgstr "Ablaufdatum" #: pretix/base/models/orders.py:127 -#: pretix/control/templates/pretixcontrol/order/index.html:85 +#: pretix/control/templates/pretixcontrol/order/index.html:77 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/control.html:11 msgid "Payment date" msgstr "Zahlungsdatum" @@ -712,8 +712,8 @@ msgid "Payment provider" msgstr "Zahlungsmethode" #: pretix/base/models/orders.py:137 -#: pretix/control/templates/pretixcontrol/order/index.html:216 -#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:84 +#: pretix/control/templates/pretixcontrol/order/index.html:208 +#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:108 msgid "Payment method fee" msgstr "Gebühr für gewählte Zahlungsmethode" @@ -726,7 +726,7 @@ msgid "Payment method fee tax" msgstr "Steuerbetrag auf Gebühr für gewählte Zahlungsmethode" #: pretix/base/models/orders.py:148 -#: pretix/control/templates/pretixcontrol/order/index.html:246 +#: pretix/control/templates/pretixcontrol/order/index.html:238 msgid "Payment information" msgstr "Zahlungsinformationen" @@ -750,7 +750,7 @@ msgstr "" "Der hier eingegebene Text wird dem Kunden nicht angezeigt und dient dazu, " "dir zu helfen, den Überblick zu behalten." -#: pretix/base/models/orders.py:169 pretix/base/models/orders.py:442 +#: pretix/base/models/orders.py:169 pretix/base/models/orders.py:436 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:13 msgid "Order" msgstr "Bestellung" @@ -771,7 +771,7 @@ msgstr "Die Zahlung kommt zu spät, um akzeptiert werden zu können." msgid "Some of the ordered products are no longer available." msgstr "Einige der ausgewählten Produkte sind nicht mehr verfügbar." -#: pretix/base/models/orders.py:351 +#: pretix/base/models/orders.py:345 #: pretix/control/templates/pretixcontrol/vouchers/index.html:71 #: pretix/control/views/item.py:418 pretix/control/views/vouchers.py:78 #: pretix/control/views/vouchers.py:79 pretix/control/views/vouchers.py:82 @@ -779,7 +779,7 @@ msgstr "Einige der ausgewählten Produkte sind nicht mehr verfügbar." msgid "Yes" msgstr "Ja" -#: pretix/base/models/orders.py:353 pretix/control/forms/event.py:289 +#: pretix/base/models/orders.py:347 pretix/control/forms/event.py:289 #: pretix/control/templates/pretixcontrol/vouchers/index.html:71 #: pretix/control/views/item.py:418 pretix/control/views/vouchers.py:78 #: pretix/control/views/vouchers.py:79 pretix/control/views/vouchers.py:82 @@ -787,61 +787,61 @@ msgstr "Ja" msgid "No" msgstr "Nein" -#: pretix/base/models/orders.py:390 +#: pretix/base/models/orders.py:384 msgid "Variation" msgstr "Variante" -#: pretix/base/models/orders.py:395 pretix/control/views/vouchers.py:62 +#: pretix/base/models/orders.py:389 pretix/control/views/vouchers.py:62 #: pretix/plugins/checkinlists/exporters.py:81 msgid "Price" msgstr "Preis" -#: pretix/base/models/orders.py:399 -#: pretix/control/templates/pretixcontrol/order/index.html:183 +#: pretix/base/models/orders.py:393 +#: pretix/control/templates/pretixcontrol/order/index.html:175 #: pretix/plugins/checkinlists/exporters.py:48 #: pretix/plugins/checkinlists/exporters.py:81 #: pretix/presale/forms/checkout.py:67 -#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:16 +#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:18 msgid "Attendee name" msgstr "Name des Teilnehmers" -#: pretix/base/models/orders.py:401 +#: pretix/base/models/orders.py:395 msgid "Empty, if this product is not an admission ticket" msgstr "Leer, wenn dies kein Eintrittsticket ist" -#: pretix/base/models/orders.py:448 +#: pretix/base/models/orders.py:442 msgid "Tax rate" msgstr "Steuersatz" -#: pretix/base/models/orders.py:452 +#: pretix/base/models/orders.py:446 msgid "Tax value" msgstr "Steuer" -#: pretix/base/models/orders.py:457 +#: pretix/base/models/orders.py:451 msgid "Order position" msgstr "Bestelltes Produkt" -#: pretix/base/models/orders.py:458 +#: pretix/base/models/orders.py:452 msgid "Order positions" msgstr "Bestellzeile" -#: pretix/base/models/orders.py:517 +#: pretix/base/models/orders.py:511 msgid "Cart ID (e.g. session key)" msgstr "Warenkorb-ID (z.B. Session-ID)" -#: pretix/base/models/orders.py:528 +#: pretix/base/models/orders.py:522 msgid "Cart position" msgstr "Produkt im Warenkorb" -#: pretix/base/models/orders.py:529 +#: pretix/base/models/orders.py:523 msgid "Cart positions" msgstr "Produkte im Warenkorb" -#: pretix/base/models/orders.py:550 +#: pretix/base/models/orders.py:544 msgid "Company name" msgstr "Firmenname" -#: pretix/base/models/orders.py:551 +#: pretix/base/models/orders.py:545 msgid "Full name" msgstr "Voller Name" @@ -1394,12 +1394,12 @@ msgstr "" msgid "Payment received for your order: %(code)s" msgstr "Zahlung erhalten für die Bestellung: %(code)s" -#: pretix/base/services/orders.py:153 pretix/presale/views/order.py:434 -#: pretix/presale/views/order.py:460 +#: pretix/base/services/orders.py:153 pretix/presale/views/order.py:433 +#: pretix/presale/views/order.py:459 msgid "You cannot cancel this order." msgstr "Du kannst diese Bestellung nicht stornieren." -#: pretix/base/services/orders.py:354 pretix/control/views/orders.py:353 +#: pretix/base/services/orders.py:354 pretix/control/views/orders.py:331 #: pretix/presale/templates/pretixpresale/event/order.html:33 #, python-format msgid "Your order: %(code)s" @@ -1782,7 +1782,7 @@ msgstr "" "Wenn du Cookies in deinem Browser deaktiviert hast, aktiviere diese bitte " "zumindest für diese Website." -#: pretix/control/forms/__init__.py:73 +#: pretix/control/forms/__init__.py:89 msgid "Filetype not allowed!" msgstr "Dateityp nicht erlaubt!" @@ -2411,11 +2411,11 @@ msgstr "" msgid "The order's expiry date has been changed." msgstr "Die Zahlungsfrist wurde geändert." -#: pretix/control/logdisplay.py:53 pretix/control/views/orders.py:256 +#: pretix/control/logdisplay.py:53 pretix/control/views/orders.py:234 msgid "The order has been marked as expired." msgstr "Die Bestellung wurde als abgelaufen markiert." -#: pretix/control/logdisplay.py:54 pretix/control/views/orders.py:242 +#: pretix/control/logdisplay.py:54 pretix/control/views/orders.py:220 msgid "The order has been marked as paid." msgstr "Die Bestellung wurde als bezahlt markiert." @@ -2423,8 +2423,8 @@ msgstr "Die Bestellung wurde als bezahlt markiert." msgid "The order has been refunded." msgstr "Die Bestellung wurde zurückerstattet." -#: pretix/control/logdisplay.py:56 pretix/control/views/orders.py:245 -#: pretix/presale/views/order.py:470 +#: pretix/control/logdisplay.py:56 pretix/control/views/orders.py:223 +#: pretix/presale/views/order.py:469 msgid "The order has been canceled." msgstr "Die Bestellung wurde storniert." @@ -2432,16 +2432,16 @@ msgstr "Die Bestellung wurde storniert." msgid "The order has been created." msgstr "Die Bestellung wurde erstellt." -#: pretix/control/logdisplay.py:58 pretix/control/views/orders.py:292 -#: pretix/presale/views/order.py:360 +#: pretix/control/logdisplay.py:58 pretix/control/views/orders.py:270 +#: pretix/presale/views/order.py:359 msgid "The invoice has been generated." msgstr "Die Rechnung wurde erstellt." -#: pretix/control/logdisplay.py:59 pretix/control/views/orders.py:315 +#: pretix/control/logdisplay.py:59 pretix/control/views/orders.py:293 msgid "The invoice has been regenerated." msgstr "Die Rechnung wurde neu generiert." -#: pretix/control/logdisplay.py:60 pretix/control/views/orders.py:339 +#: pretix/control/logdisplay.py:60 pretix/control/views/orders.py:317 msgid "The invoice has been reissued." msgstr "Die Rechnung wurde neu ausgestellt." @@ -2847,7 +2847,7 @@ msgid "Free order" msgstr "Kostenlose Bestellung" #: pretix/control/templates/pretixcontrol/event/mail.html:62 -#: pretix/control/templates/pretixcontrol/order/index.html:102 +#: pretix/control/templates/pretixcontrol/order/index.html:94 msgid "Resend link" msgstr "Link erneut senden" @@ -2893,7 +2893,7 @@ msgid "Change settings" msgstr "Kann Einstellungen ändern" #: pretix/control/templates/pretixcontrol/event/permissions.html:17 -#: pretix/control/templates/pretixcontrol/order/index.html:158 +#: pretix/control/templates/pretixcontrol/order/index.html:150 msgid "Change products" msgstr "Produkte bearbeiten" @@ -3004,7 +3004,7 @@ msgstr "Allgemeines" #: pretix/control/templates/pretixcontrol/event/settings_base.html:16 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:53 #: pretix/presale/templates/pretixpresale/event/order.html:51 -#: pretix/presale/templates/pretixpresale/event/order.html:212 +#: pretix/presale/templates/pretixpresale/event/order.html:199 msgid "Payment" msgstr "Zahlung" @@ -3017,7 +3017,6 @@ msgid "Tickets" msgstr "Tickets" #: pretix/control/templates/pretixcontrol/event/tickets.html:8 -#: pretix/presale/templates/pretixpresale/event/order.html:72 msgid "Ticket download" msgstr "Ticket-Download" @@ -3524,7 +3523,7 @@ msgstr "Verbleibende Kapazität" #: pretix/control/templates/pretixcontrol/order/cancel.html:4 #: pretix/control/templates/pretixcontrol/order/cancel.html:8 #: pretix/control/templates/pretixcontrol/order/index.html:32 -#: pretix/presale/templates/pretixpresale/event/order.html:202 +#: pretix/presale/templates/pretixpresale/event/order.html:189 #: pretix/presale/templates/pretixpresale/event/order_cancel.html:4 msgid "Cancel order" msgstr "Stornieren" @@ -3646,15 +3645,15 @@ msgstr "Als nicht bezahlt markieren" msgid "Refund order" msgstr "Bestellung erstatten" -#: pretix/control/templates/pretixcontrol/order/index.html:51 +#: pretix/control/templates/pretixcontrol/order/index.html:43 msgid "View order as user" msgstr "Als Kunde ansehen" -#: pretix/control/templates/pretixcontrol/order/index.html:63 +#: pretix/control/templates/pretixcontrol/order/index.html:55 msgid "Expire order" msgstr "Als abgelaufen markieren" -#: pretix/control/templates/pretixcontrol/order/index.html:64 +#: pretix/control/templates/pretixcontrol/order/index.html:56 msgid "" "The payment for this order is overdue, but you have configured not to expire " "orders automatically. To free quota capacity, you can mark it as expired " @@ -3664,66 +3663,66 @@ msgstr "" "dass Bestellungen nicht automatisch ablaufen. Um freies Kontingent zu " "schaffen, kannst du die Bestellung manuell als abgelaufen markieren." -#: pretix/control/templates/pretixcontrol/order/index.html:75 +#: pretix/control/templates/pretixcontrol/order/index.html:67 #: pretix/presale/templates/pretixpresale/event/order.html:6 msgid "Order details" msgstr "Bestellung" -#: pretix/control/templates/pretixcontrol/order/index.html:88 +#: pretix/control/templates/pretixcontrol/order/index.html:80 msgid "Expiry date" msgstr "Ablaufdatum" -#: pretix/control/templates/pretixcontrol/order/index.html:108 -#: pretix/control/templates/pretixcontrol/order/index.html:138 -#: pretix/presale/templates/pretixpresale/event/order.html:120 -#: pretix/presale/templates/pretixpresale/event/order.html:141 +#: pretix/control/templates/pretixcontrol/order/index.html:100 +#: pretix/control/templates/pretixcontrol/order/index.html:130 +#: pretix/presale/templates/pretixpresale/event/order.html:107 +#: pretix/presale/templates/pretixpresale/event/order.html:128 msgid "Invoices" msgstr "Rechnungen" -#: pretix/control/templates/pretixcontrol/order/index.html:112 -#: pretix/presale/templates/pretixpresale/event/order.html:128 +#: pretix/control/templates/pretixcontrol/order/index.html:104 +#: pretix/presale/templates/pretixpresale/event/order.html:115 msgid "Cancellation" msgstr "Rechnungskorrektur" -#: pretix/control/templates/pretixcontrol/order/index.html:112 -#: pretix/presale/templates/pretixpresale/event/order.html:128 +#: pretix/control/templates/pretixcontrol/order/index.html:104 +#: pretix/presale/templates/pretixpresale/event/order.html:115 msgid "Invoice" msgstr "Rechnung" -#: pretix/control/templates/pretixcontrol/order/index.html:119 +#: pretix/control/templates/pretixcontrol/order/index.html:111 #: pretix/control/templates/pretixcontrol/user/2fa_regenemergency.html:20 msgid "Regenerate" msgstr "Neu generieren" -#: pretix/control/templates/pretixcontrol/order/index.html:127 +#: pretix/control/templates/pretixcontrol/order/index.html:119 msgid "Cancel and reissue" msgstr "Stornieren und neu ausstellen" -#: pretix/control/templates/pretixcontrol/order/index.html:144 +#: pretix/control/templates/pretixcontrol/order/index.html:136 msgid "Generate invoice" msgstr "Rechnungen ausstellen" -#: pretix/control/templates/pretixcontrol/order/index.html:163 -#: pretix/presale/templates/pretixpresale/event/order.html:106 +#: pretix/control/templates/pretixcontrol/order/index.html:155 +#: pretix/presale/templates/pretixpresale/event/order.html:93 msgid "Ordered items" msgstr "Bestellte Produkte" -#: pretix/control/templates/pretixcontrol/order/index.html:175 +#: pretix/control/templates/pretixcontrol/order/index.html:167 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:11 msgid "Voucher code used:" msgstr "Verwendeter Gutscheincode:" -#: pretix/control/templates/pretixcontrol/order/index.html:185 -#: pretix/control/templates/pretixcontrol/order/index.html:190 -#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:17 -#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:21 +#: pretix/control/templates/pretixcontrol/order/index.html:177 +#: pretix/control/templates/pretixcontrol/order/index.html:182 +#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:19 +#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:23 msgid "not answered" msgstr "nicht beantwortet" -#: pretix/control/templates/pretixcontrol/order/index.html:205 -#: pretix/control/templates/pretixcontrol/order/index.html:222 -#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:72 -#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:90 +#: pretix/control/templates/pretixcontrol/order/index.html:197 +#: pretix/control/templates/pretixcontrol/order/index.html:214 +#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:86 +#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:114 #: pretix/presale/templates/pretixpresale/event/index.html:132 #: pretix/presale/templates/pretixpresale/event/index.html:182 #: pretix/presale/templates/pretixpresale/event/voucher.html:74 @@ -3732,45 +3731,45 @@ msgstr "nicht beantwortet" msgid "incl. %(rate)s%% taxes" msgstr "inkl. %(rate)s%% MwSt." -#: pretix/control/templates/pretixcontrol/order/index.html:232 +#: pretix/control/templates/pretixcontrol/order/index.html:224 #: pretix/control/templates/pretixcontrol/orders/overview.html:85 #: pretix/plugins/reports/exporters.py:199 -#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:100 +#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:124 msgid "Total" msgstr "Gesamt" -#: pretix/control/templates/pretixcontrol/order/index.html:252 +#: pretix/control/templates/pretixcontrol/order/index.html:244 msgid "The payment state of this order was manually modified." msgstr "Der Status dieser Bestellung wurde manuell verändert." -#: pretix/control/templates/pretixcontrol/order/index.html:257 +#: pretix/control/templates/pretixcontrol/order/index.html:249 #, python-format msgid "The payment has to be completed before %(date)s." msgstr "Die Zahlung muss bis zum %(date)s abgeschlossen sein." -#: pretix/control/templates/pretixcontrol/order/index.html:269 +#: pretix/control/templates/pretixcontrol/order/index.html:261 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:72 #: pretix/presale/templates/pretixpresale/event/checkout_questions.html:30 -#: pretix/presale/templates/pretixpresale/event/order.html:169 +#: pretix/presale/templates/pretixpresale/event/order.html:156 #: pretix/presale/templates/pretixpresale/event/order_modify.html:25 msgid "Invoice information" msgstr "Rechnungsinformationen" -#: pretix/control/templates/pretixcontrol/order/index.html:280 +#: pretix/control/templates/pretixcontrol/order/index.html:272 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:83 -#: pretix/presale/templates/pretixpresale/event/order.html:180 +#: pretix/presale/templates/pretixpresale/event/order.html:167 msgid "ZIP code and city" msgstr "PLZ und Ort" -#: pretix/control/templates/pretixcontrol/order/index.html:297 +#: pretix/control/templates/pretixcontrol/order/index.html:289 msgid "Internal comment" msgstr "Interner Kommentar" -#: pretix/control/templates/pretixcontrol/order/index.html:308 +#: pretix/control/templates/pretixcontrol/order/index.html:300 msgid "Update comment" msgstr "Kommentar speichern" -#: pretix/control/templates/pretixcontrol/order/index.html:319 +#: pretix/control/templates/pretixcontrol/order/index.html:311 msgid "Order history" msgstr "Bestellhistorie" @@ -4247,7 +4246,7 @@ msgstr "Eingelöste Gutscheine" msgid "We already sent you an email in the last 24 hours." msgstr "Wir haben dir in den letzten 24 Stunden bereits eine E-Mail geschickt." -#: pretix/control/views/auth.py:140 pretix/control/views/orders.py:365 +#: pretix/control/views/auth.py:140 pretix/control/views/orders.py:343 msgid "There was an error sending the mail. Please try again later." msgstr "" "Es gab ein Fehler beim Senden der E-Mail. Bitte probiere es später erneut." @@ -4401,8 +4400,7 @@ msgstr "" "\"Eigenen SMTP-Server verwenden\" zu setzen, damit der Server auch benutzt " "wird." -#: pretix/control/views/event.py:395 pretix/control/views/orders.py:422 -#: pretix/presale/views/order.py:491 +#: pretix/control/views/event.py:395 pretix/presale/views/order.py:498 msgid "You requested an invalid ticket output type." msgstr "Du hast einen ungültigen Ausgabetyp gewählt." @@ -4524,15 +4522,15 @@ msgstr "Das ausgewählte Produkt wurde deaktiviert." msgid "The new event has been created." msgstr "Eine neue Veranstaltung wurde erstellt." -#: pretix/control/views/orders.py:223 +#: pretix/control/views/orders.py:201 msgid "The comment has been updated." msgstr "Der Kommentar wurde aktualisiert." -#: pretix/control/views/orders.py:225 +#: pretix/control/views/orders.py:203 msgid "Could not update the comment." msgstr "Kommentar konnte nicht gespeichert werden." -#: pretix/control/views/orders.py:240 +#: pretix/control/views/orders.py:218 msgid "" "The order has been marked as paid, but we were unable to send a confirmation " "mail." @@ -4540,35 +4538,35 @@ msgstr "" "Die Bestellung wurde als bezahlt markiert, aber die Bestätigungsmail konnte " "nicht verschickt werden." -#: pretix/control/views/orders.py:251 +#: pretix/control/views/orders.py:229 msgid "The order has been marked as not paid." msgstr "Die Bestellung wurde als unbezahlt markiert." -#: pretix/control/views/orders.py:284 pretix/presale/views/order.py:352 +#: pretix/control/views/orders.py:262 pretix/presale/views/order.py:351 msgid "You cannot generate an invoice for this order." msgstr "Du kannst für diese Bestellung keine Rechnung erzeugen." -#: pretix/control/views/orders.py:286 pretix/presale/views/order.py:354 +#: pretix/control/views/orders.py:264 pretix/presale/views/order.py:353 msgid "An invoice for this order already exists." msgstr "Zu dieser Bestellung gibt es bereits eine Rechnung." -#: pretix/control/views/orders.py:306 pretix/control/views/orders.py:329 +#: pretix/control/views/orders.py:284 pretix/control/views/orders.py:307 msgid "Unknown invoice." msgstr "Unbekannte Rechnung" -#: pretix/control/views/orders.py:309 pretix/control/views/orders.py:332 +#: pretix/control/views/orders.py:287 pretix/control/views/orders.py:310 msgid "The invoice has already been canceled." msgstr "Die Rechnung wurde bereits storniert." -#: pretix/control/views/orders.py:368 +#: pretix/control/views/orders.py:346 msgid "The email has been queued to be sent." msgstr "Die E-Mail wurde zum Versenden gespeichert." -#: pretix/control/views/orders.py:393 pretix/presale/views/order.py:529 +#: pretix/control/views/orders.py:371 pretix/presale/views/order.py:538 msgid "This invoice has not been found" msgstr "Diese Rechnung wurde nicht gefunden" -#: pretix/control/views/orders.py:401 pretix/presale/views/order.py:537 +#: pretix/control/views/orders.py:379 pretix/presale/views/order.py:546 msgid "" "The invoice file has not yet been generated, we will generate it for you " "now. Please try again in a few seconds." @@ -4576,15 +4574,11 @@ msgstr "" "Diese Rechnung wurde bisher noch nicht fertig erstellt, wir werden die PDF-" "Datei jetzt erstellen. Bitte probiere es in wenigen Sekunden erneut." -#: pretix/control/views/orders.py:425 pretix/presale/views/order.py:496 -msgid "Order is not paid." -msgstr "Die Bestellung ist nicht bezahlt." - -#: pretix/control/views/orders.py:447 pretix/control/views/orders.py:465 +#: pretix/control/views/orders.py:394 pretix/control/views/orders.py:412 msgid "The payment term has been changed." msgstr "Die Zahlungsfrist wurde geändert." -#: pretix/control/views/orders.py:469 +#: pretix/control/views/orders.py:416 msgid "" "We were not able to process the request completely as the server was too " "busy." @@ -4592,31 +4586,31 @@ msgstr "" "Wir konnten deine Bestellung nicht durchführen, da der Server zu beschäftigt " "war." -#: pretix/control/views/orders.py:477 pretix/control/views/orders.py:499 +#: pretix/control/views/orders.py:424 pretix/control/views/orders.py:446 msgid "This action is only allowed for pending orders." msgstr "Diese Aktion ist nur für unbezahlte Bestellungen möglich." -#: pretix/control/views/orders.py:548 +#: pretix/control/views/orders.py:495 msgid "An error occured. Please see the details below." msgstr "Ein Fehler ist aufgetreten, bitte schaue weiter unten für Details." -#: pretix/control/views/orders.py:555 +#: pretix/control/views/orders.py:502 msgid "The order has been changed and the user has been notified." msgstr "Die Bestellung wurde geändert und der Kunde benachrichtigt." -#: pretix/control/views/orders.py:584 +#: pretix/control/views/orders.py:531 msgid "The order has been changed." msgstr "Die Bestellung wurde geändert." -#: pretix/control/views/orders.py:619 +#: pretix/control/views/orders.py:566 msgid "There is no order with the given order code." msgstr "Es existiert keine Bestellung mit der eingegebenen Bestellnummer." -#: pretix/control/views/orders.py:653 +#: pretix/control/views/orders.py:600 msgid "The selected exporter was not found." msgstr "Das ausgewählte Exportformat wurde nicht gefunden." -#: pretix/control/views/orders.py:659 +#: pretix/control/views/orders.py:606 msgid "There was a problem processing your input. See below for error details." msgstr "Die Eingabe konnte nicht verarbeitet werden." @@ -5608,8 +5602,8 @@ msgid "PDF output" msgstr "PDF-Ausgabe" #: pretix/plugins/ticketoutputpdf/ticketoutput.py:21 -msgid "Download PDF" -msgstr "PDF herunterladen" +msgid "PDF" +msgstr "PDF" #: pretix/plugins/ticketoutputpdf/ticketoutput.py:57 #, python-brace-format @@ -5732,7 +5726,7 @@ msgstr "Teilnehmername-Größe (mm)" msgid "Invisible by default, set this to a number greater than 0 to show." msgstr "Standardmäßig unsichtbar, eine positive Größe zeigt das Element an." -#: pretix/presale/checkoutflow.py:167 pretix/presale/views/order.py:394 +#: pretix/presale/checkoutflow.py:167 pretix/presale/views/order.py:393 msgid "" "We had difficulties processing your input. Please review the errors below." msgstr "Wir hatten Schwierigkeiten, deine Eingabe zu verarbeiten." @@ -5745,12 +5739,12 @@ msgstr "Bitte gib eine gültige E-Mail-Adresse ein." msgid "Please fill in answers to all required questions." msgstr "Bitte fülle Antworten zu allen benötigten Fragen ein." -#: pretix/presale/checkoutflow.py:255 pretix/presale/views/order.py:326 +#: pretix/presale/checkoutflow.py:255 pretix/presale/views/order.py:325 msgid "Please select a payment method." msgstr "Bitte wähle eine Zahlungsmethode aus." #: pretix/presale/checkoutflow.py:276 pretix/presale/checkoutflow.py:282 -#: pretix/presale/views/order.py:196 pretix/presale/views/order.py:232 +#: pretix/presale/views/order.py:195 pretix/presale/views/order.py:231 msgid "The payment information you entered was incomplete." msgstr "Die eingegebenen Zahlungsinformationen sind unvollständig." @@ -6010,25 +6004,25 @@ msgstr "Zahlung abschließen" msgid "Please complete your payment before %(date)s" msgstr "Bitte schließe deine Zahlung bis zum %(date)s ab." -#: pretix/presale/templates/pretixpresale/event/order.html:77 +#: pretix/presale/templates/pretixpresale/event/order.html:72 msgid "" -"Please obtain your ticket below. Please have your ticket ready when entering " -"the event." +"You can download your tickets using the buttons below. Please have your " +"ticket ready when entering the event." msgstr "" -"Bitte lade dein Ticket hier herunter und halte es am Einlass der " -"Veranstaltung bereit." +"Bitte lade dein Ticket mit den Buttons weiter unten herunter und halte es am " +"Einlass der Veranstaltung bereit." -#: pretix/presale/templates/pretixpresale/event/order.html:88 +#: pretix/presale/templates/pretixpresale/event/order.html:76 #, python-format msgid "You will be able to download your tickets here starting on %(date)s." msgstr "Du kannst deine Tickets hier ab %(date)s herunterladen." -#: pretix/presale/templates/pretixpresale/event/order.html:101 -#: pretix/presale/templates/pretixpresale/event/order.html:164 +#: pretix/presale/templates/pretixpresale/event/order.html:88 +#: pretix/presale/templates/pretixpresale/event/order.html:151 msgid "Change details" msgstr "Details bearbeiten" -#: pretix/presale/templates/pretixpresale/event/order.html:149 +#: pretix/presale/templates/pretixpresale/event/order.html:136 msgid "Request invoice" msgstr "Rechnung anfragen" @@ -6209,29 +6203,33 @@ msgstr "Die gewählten Produkte wurden deinem Warenkorb hinzugefügt." msgid "Your cart is empty" msgstr "Dein Warenkorb ist leer." -#: pretix/presale/views/order.py:70 pretix/presale/views/order.py:142 -#: pretix/presale/views/order.py:189 pretix/presale/views/order.py:229 -#: pretix/presale/views/order.py:256 pretix/presale/views/order.py:347 -#: pretix/presale/views/order.py:411 pretix/presale/views/order.py:432 -#: pretix/presale/views/order.py:458 pretix/presale/views/order.py:494 -#: pretix/presale/views/order.py:520 +#: pretix/presale/views/order.py:70 pretix/presale/views/order.py:141 +#: pretix/presale/views/order.py:188 pretix/presale/views/order.py:228 +#: pretix/presale/views/order.py:255 pretix/presale/views/order.py:346 +#: pretix/presale/views/order.py:410 pretix/presale/views/order.py:431 +#: pretix/presale/views/order.py:457 pretix/presale/views/order.py:501 +#: pretix/presale/views/order.py:529 msgid "Unknown order code or not authorized to access this order." msgstr "" "Unbekannte Bestellnummer oder Bestellung gehört einem anderen Benutzer." -#: pretix/presale/views/order.py:146 pretix/presale/views/order.py:192 +#: pretix/presale/views/order.py:145 pretix/presale/views/order.py:191 msgid "The payment for this order cannot be continued." msgstr "Diese Bestellung kann nicht mehr bezahlt werden." -#: pretix/presale/views/order.py:258 +#: pretix/presale/views/order.py:257 msgid "The payment method for this order cannot be changed." msgstr "Die Zahlungsmethode für diese Bestellung kann nicht geändert werden." -#: pretix/presale/views/order.py:413 +#: pretix/presale/views/order.py:412 msgid "You cannot modify this order" msgstr "Du kannst diese Bestellung nicht bearbeiten" -#: pretix/presale/views/order.py:501 +#: pretix/presale/views/order.py:503 +msgid "Order is not paid." +msgstr "Die Bestellung ist nicht bezahlt." + +#: pretix/presale/views/order.py:508 msgid "Ticket download is not (yet) enabled." msgstr "Der Ticket-Download ist (noch) nicht freigeschaltet." @@ -6268,6 +6266,9 @@ msgstr "Deutsch" msgid "German (informal)" msgstr "Deutsch (Du)" +#~ msgid "Download PDF" +#~ msgstr "PDF herunterladen" + #~ msgid "A voucher you tried to use already has been used." #~ msgstr "" #~ "Ein Gutscheincode, den du verwenden wolltest, wurde zwischenzeitlich " diff --git a/src/pretix/plugins/ticketoutputpdf/ticketoutput.py b/src/pretix/plugins/ticketoutputpdf/ticketoutput.py index 4430db56e..99bfccf24 100644 --- a/src/pretix/plugins/ticketoutputpdf/ticketoutput.py +++ b/src/pretix/plugins/ticketoutputpdf/ticketoutput.py @@ -18,10 +18,9 @@ logger = logging.getLogger('pretix.plugins.ticketoutputpdf') class PdfTicketOutput(BaseTicketOutput): identifier = 'pdf' verbose_name = _('PDF output') - download_button_text = _('Download PDF') - download_button_icon = 'fa-print' + download_button_text = _('PDF') - def generate(self, order): + def generate(self, op): from reportlab.graphics.shapes import Drawing from reportlab.pdfgen import canvas from reportlab.lib import pagesizes, units @@ -29,6 +28,8 @@ class PdfTicketOutput(BaseTicketOutput): from reportlab.graphics import renderPDF from PyPDF2 import PdfFileWriter, PdfFileReader + order = op.order + pagesize = self.settings.get('pagesize', default='A4') if hasattr(pagesizes, pagesize): pagesize = getattr(pagesizes, pagesize) @@ -41,66 +42,65 @@ class PdfTicketOutput(BaseTicketOutput): buffer = BytesIO() p = canvas.Canvas(buffer, pagesize=pagesize) - for op in order.positions.all().select_related('item', 'variation'): - event_s = self.settings.get('event_s', default=22, as_type=float) - if event_s: - p.setFont("Helvetica", event_s) - event_x = self.settings.get('event_x', default=15, as_type=float) - event_y = self.settings.get('event_y', default=235, as_type=float) - p.drawString(event_x * units.mm, event_y * units.mm, str(self.event.name)) + event_s = self.settings.get('event_s', default=22, as_type=float) + if event_s: + p.setFont("Helvetica", event_s) + event_x = self.settings.get('event_x', default=15, as_type=float) + event_y = self.settings.get('event_y', default=235, as_type=float) + p.drawString(event_x * units.mm, event_y * units.mm, str(self.event.name)) - order_s = self.settings.get('order_s', default=17, as_type=float) - if order_s: - p.setFont("Helvetica", order_s) - order_x = self.settings.get('order_x', default=15, as_type=float) - order_y = self.settings.get('order_y', default=220, as_type=float) - p.drawString(order_x * units.mm, order_y * units.mm, _('Order code: {code}').format(code=order.code)) + order_s = self.settings.get('order_s', default=17, as_type=float) + if order_s: + p.setFont("Helvetica", order_s) + order_x = self.settings.get('order_x', default=15, as_type=float) + order_y = self.settings.get('order_y', default=220, as_type=float) + p.drawString(order_x * units.mm, order_y * units.mm, _('Order code: {code}').format(code=order.code)) - name_s = self.settings.get('name_s', default=17, as_type=float) - if name_s: - p.setFont("Helvetica", name_s) - name_x = self.settings.get('name_x', default=15, as_type=float) - name_y = self.settings.get('name_y', default=210, as_type=float) - item = str(op.item.name) - if op.variation: - item += " – " + str(op.variation) - p.drawString(name_x * units.mm, name_y * units.mm, item) + name_s = self.settings.get('name_s', default=17, as_type=float) + if name_s: + p.setFont("Helvetica", name_s) + name_x = self.settings.get('name_x', default=15, as_type=float) + name_y = self.settings.get('name_y', default=210, as_type=float) + item = str(op.item.name) + if op.variation: + item += " – " + str(op.variation) + p.drawString(name_x * units.mm, name_y * units.mm, item) - price_s = self.settings.get('price_s', default=17, as_type=float) - if price_s: - p.setFont("Helvetica", price_s) - price_x = self.settings.get('price_x', default=15, as_type=float) - price_y = self.settings.get('price_y', default=200, as_type=float) - p.drawString(price_x * units.mm, price_y * units.mm, "%s %s" % (str(op.price), self.event.currency)) + price_s = self.settings.get('price_s', default=17, as_type=float) + if price_s: + p.setFont("Helvetica", price_s) + price_x = self.settings.get('price_x', default=15, as_type=float) + price_y = self.settings.get('price_y', default=200, as_type=float) + p.drawString(price_x * units.mm, price_y * units.mm, "%s %s" % (str(op.price), self.event.currency)) - qr_s = self.settings.get('qr_s', default=80, as_type=float) - if qr_s: - reqs = qr_s * units.mm - qrw = QrCodeWidget(op.secret, barLevel='H') - b = qrw.getBounds() - w = b[2] - b[0] - h = b[3] - b[1] - d = Drawing(reqs, reqs, transform=[reqs / w, 0, 0, reqs / h, 0, 0]) - d.add(qrw) - qr_x = self.settings.get('qr_x', default=10, as_type=float) - qr_y = self.settings.get('qr_y', default=120, as_type=float) - renderPDF.draw(d, p, qr_x * units.mm, qr_y * units.mm) + qr_s = self.settings.get('qr_s', default=80, as_type=float) + if qr_s: + reqs = qr_s * units.mm + qrw = QrCodeWidget(op.secret, barLevel='H') + b = qrw.getBounds() + w = b[2] - b[0] + h = b[3] - b[1] + d = Drawing(reqs, reqs, transform=[reqs / w, 0, 0, reqs / h, 0, 0]) + d.add(qrw) + qr_x = self.settings.get('qr_x', default=10, as_type=float) + qr_y = self.settings.get('qr_y', default=120, as_type=float) + renderPDF.draw(d, p, qr_x * units.mm, qr_y * units.mm) - code_s = self.settings.get('code_s', default=11, as_type=float) - if code_s: - p.setFont("Helvetica", code_s) - code_x = self.settings.get('code_x', default=15, as_type=float) - code_y = self.settings.get('code_y', default=120, as_type=float) - p.drawString(code_x * units.mm, code_y * units.mm, op.secret) + code_s = self.settings.get('code_s', default=11, as_type=float) + if code_s: + p.setFont("Helvetica", code_s) + code_x = self.settings.get('code_x', default=15, as_type=float) + code_y = self.settings.get('code_y', default=120, as_type=float) + p.drawString(code_x * units.mm, code_y * units.mm, op.secret) - attendee_s = self.settings.get('attendee_s', default=0, as_type=float) - if code_s and op.attendee_name: - p.setFont("Helvetica", attendee_s) - attendee_x = self.settings.get('attendee_x', default=15, as_type=float) - attendee_y = self.settings.get('attendee_y', default=90, as_type=float) - p.drawString(attendee_x * units.mm, attendee_y * units.mm, op.attendee_name) + attendee_s = self.settings.get('attendee_s', default=0, as_type=float) + if code_s and op.attendee_name: + p.setFont("Helvetica", attendee_s) + attendee_x = self.settings.get('attendee_x', default=15, as_type=float) + attendee_y = self.settings.get('attendee_y', default=90, as_type=float) + p.drawString(attendee_x * units.mm, attendee_y * units.mm, op.attendee_name) - p.showPage() + p.showPage() p.save() diff --git a/src/pretix/presale/templates/pretixpresale/event/checkout_confirm.html b/src/pretix/presale/templates/pretixpresale/event/checkout_confirm.html index 77002fe50..d54d8ed81 100644 --- a/src/pretix/presale/templates/pretixpresale/event/checkout_confirm.html +++ b/src/pretix/presale/templates/pretixpresale/event/checkout_confirm.html @@ -23,7 +23,7 @@
{% include "pretixpresale/event/fragment_cart.html" with cart=cart event=request.event editable=False %} -
+
{% if cart.minutes_left > 0 %} diff --git a/src/pretix/presale/templates/pretixpresale/event/fragment_cart.html b/src/pretix/presale/templates/pretixpresale/event/fragment_cart.html index 4f05b0d16..b3cde68e0 100644 --- a/src/pretix/presale/templates/pretixpresale/event/fragment_cart.html +++ b/src/pretix/presale/templates/pretixpresale/event/fragment_cart.html @@ -1,8 +1,8 @@ {% load i18n %} {% load eventurl %} {% for line in cart.positions %} -
-
+
+
{{ line.item.name }} {% if line.variation %} – {{ line.variation }} @@ -10,63 +10,77 @@ {% if line.voucher %}
{% trans "Voucher code used:" %} {{ line.voucher.code }} {% endif %} - {% if line.has_questions %} -
- {% if line.item.admission and event.settings.attendee_names_asked%} -
{% trans "Attendee name" %}
-
{% if line.attendee_name %}{{ line.attendee_name }}{% else %}{% trans "not answered" %}{% endif %}
- {% endif %} - {% for q in line.questions %} -
{{ q.question }}
-
{% if q.answer %}{{ q.answer|linebreaksbr }}{% else %}{% trans "not answered" %}{% endif %}
- {% endfor %} -
- {% endif %} -
-
- {% if editable %} -
- {% csrf_token %} - {% if line.variation %} - - - {% else %} - - - {% endif %} - -
- {% endif %} - {{ line.count }} - {% if editable %} -
- {% csrf_token %} - {% if line.variation %} - - - {% else %} - - - {% endif %} - -
+ + {% if line.has_questions %} +
+ {% if line.item.admission and event.settings.attendee_names_asked%} +
{% trans "Attendee name" %}
+
{% if line.attendee_name %}{{ line.attendee_name }}{% else %}{% trans "not answered" %}{% endif %}
+ {% endif %} + {% for q in line.questions %} +
{{ q.question }}
+
{% if q.answer %}{{ q.answer|linebreaksbr }}{% else %}{% trans "not answered" %}{% endif %}
+ {% endfor %} +
{% endif %}
-
- {{ event.currency }} {{ line.price|floatformat:2 }} -
-
{% endfor %} {% if cart.payment_fee %} {# TODO: Tax rate? #} -
+
{% trans "Payment method fee" %}
@@ -95,7 +119,7 @@
{% endif %} -
+
{% trans "Total" %}
diff --git a/src/pretix/presale/templates/pretixpresale/event/index.html b/src/pretix/presale/templates/pretixpresale/event/index.html index da3b0a608..32620e05d 100644 --- a/src/pretix/presale/templates/pretixpresale/event/index.html +++ b/src/pretix/presale/templates/pretixpresale/event/index.html @@ -15,7 +15,7 @@
{% include "pretixpresale/event/fragment_cart.html" with cart=cart event=request.event editable=True %} -
+
{% if cart.minutes_left > 0 %} diff --git a/src/pretix/presale/templates/pretixpresale/event/order.html b/src/pretix/presale/templates/pretixpresale/event/order.html index 9dfade6c5..de7ee5cad 100644 --- a/src/pretix/presale/templates/pretixpresale/event/order.html +++ b/src/pretix/presale/templates/pretixpresale/event/order.html @@ -67,29 +67,16 @@
{% endif %} {% if order.status == 'p' and event.settings.ticket_download %} -
-
-

{% trans "Ticket download" %}

-
-
- {% if can_download %} -

- {% blocktrans trimmed %} - Please obtain your ticket below. Please have your ticket ready when entering the event. - {% endblocktrans %} -

- {% for b in download_buttons %} - - {{ b.text }} - - {% endfor %} - {% else %} - {% blocktrans trimmed with date=event.settings.ticket_download_date|date:"SHORT_DATE_FORMAT" %} - You will be able to download your tickets here starting on {{ date }}. - {% endblocktrans %} - {% endif %} -
+
+ {% if can_download %} + {% blocktrans trimmed %} + You can download your tickets using the buttons below. Please have your ticket ready when entering the event. + {% endblocktrans %} + {% else %} + {% blocktrans trimmed with date=event.settings.ticket_download_date|date:"SHORT_DATE_FORMAT" %} + You will be able to download your tickets here starting on {{ date }}. + {% endblocktrans %} + {% endif %}
{% endif %}
@@ -107,7 +94,7 @@
- {% include "pretixpresale/event/fragment_cart.html" with cart=cart event=request.event editable=False %} + {% include "pretixpresale/event/fragment_cart.html" with cart=cart event=request.event download=can_download editable=False %}
{% eventsignal event "pretix.presale.signals.order_info" order=order %} diff --git a/src/pretix/presale/urls.py b/src/pretix/presale/urls.py index 9b3888243..1a7f3cfad 100644 --- a/src/pretix/presale/urls.py +++ b/src/pretix/presale/urls.py @@ -45,7 +45,7 @@ event_patterns = [ url(r'^order/(?P[^/]+)/(?P[A-Za-z0-9]+)/pay/change', pretix.presale.views.order.OrderPayChangeMethod.as_view(), name='event.order.pay.change'), - url(r'^order/(?P[^/]+)/(?P[A-Za-z0-9]+)/download/(?P[^/]+)$', + url(r'^order/(?P[^/]+)/(?P[A-Za-z0-9]+)/download/(?P[0-9]+)/(?P[^/]+)$', pretix.presale.views.order.OrderDownload.as_view(), name='event.order.download'), url(r'^order/(?P[^/]+)/(?P[A-Za-z0-9]+)/invoice/(?P[^/]+)$', diff --git a/src/pretix/presale/views/__init__.py b/src/pretix/presale/views/__init__.py index 6aeb03e1b..9c9f86834 100644 --- a/src/pretix/presale/views/__init__.py +++ b/src/pretix/presale/views/__init__.py @@ -25,7 +25,7 @@ class CartMixin: 'item__questions', 'answers' )) - def get_cart(self, answers=False, queryset=None, payment_fee=None, payment_fee_tax_rate=None): + def get_cart(self, answers=False, queryset=None, payment_fee=None, payment_fee_tax_rate=None, downloads=False): queryset = queryset or CartPosition.objects.filter( cart_id=self.request.session.session_key, event=self.request.event ) @@ -47,6 +47,8 @@ class CartMixin: # We do this by list manipulations instead of a GROUP BY query, as # Django is unable to join related models in a .values() query def keyfunc(pos): + if downloads: + return pos.id, 0, 0, 0, 0 if answers and ((pos.item.admission and self.request.event.settings.attendee_names_asked) or pos.item.questions.all()): return pos.id, 0, 0, 0, 0 diff --git a/src/pretix/presale/views/order.py b/src/pretix/presale/views/order.py index a2163df12..c5086dd24 100644 --- a/src/pretix/presale/views/order.py +++ b/src/pretix/presale/views/order.py @@ -79,8 +79,7 @@ class OrderDetails(EventViewMixin, OrderDetailMixin, CartMixin, TemplateView): if not provider.is_enabled: continue buttons.append({ - 'icon': provider.download_button_icon or 'fa-download', - 'text': provider.download_button_text or 'fa-download', + 'text': provider.download_button_text or 'Download', 'identifier': provider.identifier, }) return buttons @@ -97,7 +96,7 @@ class OrderDetails(EventViewMixin, OrderDetailMixin, CartMixin, TemplateView): ) ctx['download_buttons'] = self.download_buttons ctx['cart'] = self.get_cart( - answers=True, + answers=True, downloads=ctx['can_download'], queryset=OrderPosition.objects.filter(order=self.order), payment_fee=self.order.payment_fee, payment_fee_tax_rate=self.order.payment_fee_tax_rate ) @@ -478,6 +477,7 @@ class OrderCancelDo(EventViewMixin, OrderDetailMixin, AsyncAction, View): class OrderDownload(EventViewMixin, OrderDetailMixin, View): + @cached_property def output(self): responses = register_ticket_outputs.send(self.request.event) @@ -486,11 +486,18 @@ class OrderDownload(EventViewMixin, OrderDetailMixin, View): if provider.identifier == self.kwargs.get('output'): return provider + @cached_property + def order_position(self): + try: + return self.order.positions.get(pk=self.kwargs.get('position')) + except OrderPosition.DoesNotExist: + return None + def get(self, request, *args, **kwargs): if not self.output or not self.output.is_enabled: messages.error(request, _('You requested an invalid ticket output type.')) return redirect(self.get_order_url()) - if not self.order: + if not self.order or not self.order_position: raise Http404(_('Unknown order code or not authorized to access this order.')) if self.order.status != Order.STATUS_PAID: messages.error(request, _('Order is not paid.')) @@ -501,7 +508,9 @@ class OrderDownload(EventViewMixin, OrderDetailMixin, View): messages.error(request, _('Ticket download is not (yet) enabled.')) return redirect(self.get_order_url()) - ct = CachedTicket.objects.get_or_create(order=self.order, provider=self.output.identifier)[0] + ct = CachedTicket.objects.get_or_create( + order_position=self.order_position, provider=self.output.identifier + )[0] if not ct.cachedfile: cf = CachedFile() cf.date = now() @@ -509,7 +518,7 @@ class OrderDownload(EventViewMixin, OrderDetailMixin, View): cf.save() ct.cachedfile = cf ct.save() - generate.apply_async(args=(self.order.id, self.output.identifier)) + generate.apply_async(args=(self.order_position.id, self.output.identifier)) return redirect(reverse('cachedfile.download', kwargs={'id': ct.cachedfile.id})) diff --git a/src/static/pretixpresale/scss/_cart.scss b/src/static/pretixpresale/scss/_cart.scss new file mode 100644 index 000000000..3c3ff2250 --- /dev/null +++ b/src/static/pretixpresale/scss/_cart.scss @@ -0,0 +1,78 @@ +.cart-row { + /* Cart grid */ + padding: 10px 0; + + .count form { + display: inline; + } + .price, .count, .download-desktop { + text-align: right; + } + .price small, + .availability-box small { + display: block; + line-height: 1; + } + + &.total { + border-top: 1px solid $table-border-color; + } + + dl { + padding-left: 20px; + margin-bottom: 0; + + dd { + padding-left: 20px; + } + } + + margin-left: 0; + margin-right: 0; + + &>div { + position: relative; + min-height: 1px; + padding-left: ceil(($grid-gutter-width / 2)); + padding-right: floor(($grid-gutter-width / 2)); + float: left; + } + .download-mobile { + display: none; + width: 100%; + clear: both; + } + .download-desktop { + display: block; + width: percentage((4 / $grid-columns)); + } + .product { + width: percentage((4 / $grid-columns)); + } + .count { + width: percentage((2 / $grid-columns)); + } + .singleprice, .totalprice { + width: percentage((3 / $grid-columns)); + } + &.has-downloads .product { + width: percentage((5 / $grid-columns)); + } +} + +@media(max-width: $screen-sm-max) { + .cart-row { + .download-mobile { + display: block; + } + .download-desktop { + display: none; + } + &.has-downloads .product, .product, .count, .singleprice, .totalprice { + width: 50%; + } + .singleprice { + clear: both; + } + } +} \ No newline at end of file diff --git a/src/static/pretixpresale/scss/_event.scss b/src/static/pretixpresale/scss/_event.scss index 02752a46d..e7da75a57 100644 --- a/src/static/pretixpresale/scss/_event.scss +++ b/src/static/pretixpresale/scss/_event.scss @@ -61,7 +61,7 @@ margin-bottom: 0; } -.cart-row, .product-row { +.product-row { padding: 10px 0; .count form { @@ -79,15 +79,6 @@ &.total { border-top: 1px solid $table-border-color; } - - dl { - padding-left: 20px; - margin-bottom: 0; - - dd { - padding-left: 20px; - } - } } .panel-contact dl { margin-bottom: 0; diff --git a/src/static/pretixpresale/scss/main.scss b/src/static/pretixpresale/scss/main.scss index 971bc0096..55cf132c6 100644 --- a/src/static/pretixpresale/scss/main.scss +++ b/src/static/pretixpresale/scss/main.scss @@ -4,6 +4,7 @@ $fa-font-path: static("fontawesome/fonts"); @import "../../fontawesome/scss/font-awesome.scss"; @import "_event.scss"; +@import "_cart.scss"; @import "_forms.scss"; footer { diff --git a/src/tests/control/test_orders.py b/src/tests/control/test_orders.py index 97da226c9..c50427ec7 100644 --- a/src/tests/control/test_orders.py +++ b/src/tests/control/test_orders.py @@ -3,13 +3,12 @@ from decimal import Decimal import pytest from django.core import mail -from django.core.files.uploadedfile import SimpleUploadedFile from django.utils.timezone import now from tests.base import SoupTest from pretix.base.models import ( - CachedTicket, Event, EventPermission, InvoiceAddress, Item, Order, - OrderPosition, Organizer, Quota, User, + Event, EventPermission, InvoiceAddress, Item, Order, OrderPosition, + Organizer, Quota, User, ) from pretix.base.services.invoices import ( generate_cancellation, generate_invoice, @@ -196,135 +195,6 @@ def test_order_transition(client, env, process): assert o.status == process[0] -@pytest.mark.django_db -def test_order_detail_download_buttons_hidden_if_not_paid(client, env): - o = Order.objects.get(id=env[2].id) - o.status = Order.STATUS_PENDING - o.save() - env[0].settings.set('ticket_download', True) - del env[0].settings['ticket_download_date'] - env[0].settings.set('ticketoutput_testdummy__enabled', True) - client.login(email='dummy@dummy.dummy', password='dummy') - response = client.get('/control/event/dummy/dummy/orders/FOO/') - assert '/control/event/dummy/dummy/orders/FOO/download/testdummy' not in response.rendered_content - - -@pytest.mark.django_db -def test_order_detail_download_buttons_visible(client, env): - o = Order.objects.get(id=env[2].id) - o.status = Order.STATUS_PAID - o.save() - env[0].settings.set('ticket_download', True) - del env[0].settings['ticket_download_date'] - env[0].settings.set('ticketoutput_testdummy__enabled', True) - client.login(email='dummy@dummy.dummy', password='dummy') - response = client.get('/control/event/dummy/dummy/orders/FOO/') - assert '/control/event/dummy/dummy/orders/FOO/download/testdummy' in response.rendered_content - - -@pytest.mark.django_db -def test_order_detail_download_buttons_hidden_of(client, env): - o = Order.objects.get(id=env[2].id) - o.status = Order.STATUS_PAID - o.save() - env[0].settings.set('ticket_download', False) - del env[0].settings['ticket_download_date'] - env[0].settings.set('ticketoutput_testdummy__enabled', True) - client.login(email='dummy@dummy.dummy', password='dummy') - response = client.get('/control/event/dummy/dummy/orders/FOO/') - assert '/control/event/dummy/dummy/orders/FOO/download/testdummy' not in response.rendered_content - - -@pytest.mark.django_db -def test_order_detail_download_buttons_visible_before_date(client, env): - o = Order.objects.get(id=env[2].id) - o.status = Order.STATUS_PAID - o.save() - env[0].settings.set('ticket_download', True) - env[0].settings.set('ticketoutput_testdummy__enabled', True) - env[0].settings['ticket_download_date'] = now() + timedelta(days=30) - client.login(email='dummy@dummy.dummy', password='dummy') - response = client.get('/control/event/dummy/dummy/orders/FOO/') - assert '/control/event/dummy/dummy/orders/FOO/download/testdummy' in response.rendered_content - - -@pytest.mark.django_db -def test_order_detail_download_buttons_hidden_if_provider_disabled(client, env): - o = Order.objects.get(id=env[2].id) - o.status = Order.STATUS_PAID - o.save() - env[0].settings.set('ticket_download', True) - del env[0].settings['ticket_download_date'] - env[0].settings.set('ticketoutput_testdummy__enabled', False) - client.login(email='dummy@dummy.dummy', password='dummy') - response = client.get('/control/event/dummy/dummy/orders/FOO/') - assert '/control/event/dummy/dummy/orders/FOO/download/testdummy' not in response.rendered_content - - -@pytest.mark.django_db -def test_order_download_unpaid(client, env): - env[0].settings.set('ticket_download', True) - del env[0].settings['ticket_download_date'] - env[0].settings.set('ticketoutput_testdummy__enabled', True) - client.login(email='dummy@dummy.dummy', password='dummy') - response = client.get('/control/event/dummy/dummy/orders/FOO/download/testdummy', follow=True) - assert 'alert-danger' in response.rendered_content - - -@pytest.mark.django_db -def test_order_download_unknown_provider(client, env): - o = Order.objects.get(id=env[2].id) - o.status = Order.STATUS_PAID - o.save() - env[0].settings.set('ticket_download', True) - del env[0].settings['ticket_download_date'] - client.login(email='dummy@dummy.dummy', password='dummy') - response = client.get('/control/event/dummy/dummy/orders/FOO/download/foobar', follow=True) - assert 'alert-danger' in response.rendered_content - - -@pytest.mark.django_db -def test_order_download_disabled_provider(client, env): - o = Order.objects.get(id=env[2].id) - o.status = Order.STATUS_PAID - o.save() - env[0].settings.set('ticket_download', True) - del env[0].settings['ticket_download_date'] - env[0].settings.set('ticketoutput_testdummy__enabled', False) - client.login(email='dummy@dummy.dummy', password='dummy') - response = client.get('/control/event/dummy/dummy/orders/FOO/download/testdummy', follow=True) - assert 'alert-danger' in response.rendered_content - - -@pytest.mark.django_db -def test_order_download_success(client, env, mocker): - from pretix.base.services import tickets - mocker.patch('pretix.base.services.tickets.generate.apply_async') - o = Order.objects.get(id=env[2].id) - o.status = Order.STATUS_PAID - o.save() - env[0].settings.set('ticket_download', True) - del env[0].settings['ticket_download_date'] - env[0].settings.set('ticketoutput_testdummy__enabled', True) - client.login(email='dummy@dummy.dummy', password='dummy') - response = client.get('/control/event/dummy/dummy/orders/FOO/download/testdummy') - assert response.status_code == 302 - tickets.generate.apply_async.assert_any_call(args=(o.id, 'testdummy')) - assert 'download' in response['Location'] - dl = response['Location'] - - # test caching - mocker.resetall() - ct = CachedTicket.objects.get(order=o, provider='testdummy') - ct.cachedfile.file.save('foo.jpg', SimpleUploadedFile("sample_invalid_image.jpg", b"file_content", - content_type="image/jpeg")) - ct.cachedfile.save() - response = client.get('/control/event/dummy/dummy/orders/FOO/download/testdummy') - assert response.status_code == 302 - tickets.generate.apply_async.assert_not_called() - assert dl == response['Location'] - - @pytest.mark.django_db def test_order_invoice_create_forbidden(client, env): client.login(email='dummy@dummy.dummy', password='dummy') diff --git a/src/tests/control/test_permissions.py b/src/tests/control/test_permissions.py index f43816473..ff5ee8814 100644 --- a/src/tests/control/test_permissions.py +++ b/src/tests/control/test_permissions.py @@ -67,7 +67,6 @@ event_urls = [ "orders/ABC/extend", "orders/ABC/change", "orders/ABC/contact", - "orders/ABC/download/pdf", "orders/ABC/", "orders/", "invoice/1", diff --git a/src/tests/plugins/test_ticketoutputpdf.py b/src/tests/plugins/test_ticketoutputpdf.py index 088a5ac54..8fd0e1edd 100644 --- a/src/tests/plugins/test_ticketoutputpdf.py +++ b/src/tests/plugins/test_ticketoutputpdf.py @@ -46,8 +46,8 @@ def test_generate_pdf(env, mocker): event.settings.set('ticketoutput_pdf_code_y', 50) event.settings.set('ticketoutput_pdf_code_s', 2) o = PdfTicketOutput(event) - fname, ftype, buf = o.generate(order) + fname, ftype, buf = o.generate(order.positions.first()) assert ftype == 'application/pdf' pdf = PdfFileReader(BytesIO(buf)) - assert pdf.numPages == 2 + assert pdf.numPages == 1 assert mocked.called diff --git a/src/tests/presale/test_orders.py b/src/tests/presale/test_orders.py index 3ab626720..a675fac53 100644 --- a/src/tests/presale/test_orders.py +++ b/src/tests/presale/test_orders.py @@ -307,7 +307,8 @@ class OrdersTest(TestCase): self.event.settings.set('ticket_download', True) del self.event.settings['ticket_download_date'] response = self.client.get( - '/%s/%s/order/%s/%s/download/pdf' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret), + '/%s/%s/order/%s/%s/download/%d/pdf' % (self.orga.slug, self.event.slug, self.order.code, + self.order.secret, self.ticket_pos.pk), follow=True) self.assertRedirects(response, '/%s/%s/order/%s/%s/' % (self.orga.slug, self.event.slug, self.order.code, @@ -315,13 +316,14 @@ class OrdersTest(TestCase): target_status_code=200) response = self.client.get( - '/%s/%s/order/ABC/123/download/testdummy' % (self.orga.slug, self.event.slug) + '/%s/%s/order/ABC/123/download/%d/testdummy' % (self.orga.slug, self.event.slug, + self.ticket_pos.pk) ) assert response.status_code == 404 response = self.client.get( - '/%s/%s/order/%s/%s/download/testdummy' % (self.orga.slug, self.event.slug, self.order.code, - self.order.secret), + '/%s/%s/order/%s/%s/download/%d/testdummy' % (self.orga.slug, self.event.slug, self.order.code, + self.order.secret, self.ticket_pos.pk), follow=True ) self.assertRedirects(response, @@ -332,15 +334,15 @@ class OrdersTest(TestCase): self.order.status = Order.STATUS_PAID self.order.save() response = self.client.get( - '/%s/%s/order/%s/%s/download/testdummy' % (self.orga.slug, self.event.slug, self.order.code, - self.order.secret), + '/%s/%s/order/%s/%s/download/%d/testdummy' % (self.orga.slug, self.event.slug, self.order.code, + self.order.secret, self.ticket_pos.pk), ) assert response.status_code == 302 self.event.settings.set('ticket_download_date', now() + datetime.timedelta(days=1)) response = self.client.get( - '/%s/%s/order/%s/%s/download/testdummy' % (self.orga.slug, self.event.slug, self.order.code, - self.order.secret), + '/%s/%s/order/%s/%s/download/%d/testdummy' % (self.orga.slug, self.event.slug, self.order.code, + self.order.secret, self.ticket_pos.pk), follow=True ) self.assertRedirects(response, @@ -350,15 +352,15 @@ class OrdersTest(TestCase): del self.event.settings['ticket_download_date'] response = self.client.get( - '/%s/%s/order/%s/%s/download/testdummy' % (self.orga.slug, self.event.slug, self.order.code, - self.order.secret), + '/%s/%s/order/%s/%s/download/%d/testdummy' % (self.orga.slug, self.event.slug, self.order.code, + self.order.secret, self.ticket_pos.pk), ) assert response.status_code == 302 self.event.settings.set('ticket_download', False) response = self.client.get( - '/%s/%s/order/%s/%s/download/testdummy' % (self.orga.slug, self.event.slug, self.order.code, - self.order.secret), + '/%s/%s/order/%s/%s/download/%d/testdummy' % (self.orga.slug, self.event.slug, self.order.code, + self.order.secret, self.ticket_pos.pk), follow=True ) self.assertRedirects(response, '/%s/%s/order/%s/%s/' % (self.orga.slug, self.event.slug, self.order.code, diff --git a/src/tests/testdummy/ticketoutput.py b/src/tests/testdummy/ticketoutput.py index 50c083ada..f794eda76 100644 --- a/src/tests/testdummy/ticketoutput.py +++ b/src/tests/testdummy/ticketoutput.py @@ -9,7 +9,6 @@ class DummyTicketOutput(BaseTicketOutput): identifier = 'testdummy' verbose_name = 'Test dummy' download_button_text = 'Download test file' - download_button_icon = 'fa-print' - def generate(self, order): - return 'test.txt', 'text/plain', str(order.id) + def generate(self, op): + return 'test.txt', 'text/plain', str(op.order.id)