diff --git a/src/locale/de/LC_MESSAGES/django.po b/src/locale/de/LC_MESSAGES/django.po index 6db1a641a..73652cb1d 100644 --- a/src/locale/de/LC_MESSAGES/django.po +++ b/src/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: 2015-05-27 21:27+0000\n" -"PO-Revision-Date: 2015-05-28 21:40+0100\n" +"POT-Creation-Date: 2015-06-15 22:42+0000\n" +"PO-Revision-Date: 2015-06-16 00:43+0100\n" "Last-Translator: Raphael Michel \n" "Language-Team: Raphael Michel \n" "Language: de\n" @@ -18,101 +18,73 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.7.5\n" -#: pretix/base/admin.py:19 -msgid "The two password fields didn't match." -msgstr "Die beiden eingegebenen Passwörter stimmen nicht überein." - -#: pretix/base/admin.py:21 pretix/control/views/auth.py:16 -#: pretix/presale/views/event.py:83 pretix/presale/views/event.py:129 -#: pretix/presale/views/event.py:182 pretix/presale/views/event.py:309 -msgid "Password" -msgstr "Passwort" - -#: pretix/base/admin.py:23 -msgid "Password confirmation" -msgstr "Passwort bestätigen" - -#: pretix/base/admin.py:25 -msgid "Enter the same password as above, for verification." -msgstr "Geben Sie zur Bestätigung das selbe Passwort wie oben ein" - -#: pretix/base/admin.py:53 -msgid "Personal info" -msgstr "Persönliche Daten" - -#: pretix/base/admin.py:54 -msgid "Locale" -msgstr "Sprache" - -#: pretix/base/admin.py:55 -msgid "Permissions" -msgstr "Berechtigungen" - #: pretix/base/forms.py:78 -msgid "enabled" -msgstr "aktiviert" - -#: pretix/base/forms.py:79 msgid "disabled" msgstr "deaktiviert" -#: pretix/base/models.py:185 +#: pretix/base/forms.py:79 +msgid "enabled" +msgstr "aktiviert" + +#: pretix/base/models.py:183 msgid "Letters, digits and ./+/-/_ only." msgstr "Nur Buchstaben, Zahlen und ./+/-/_" -#: pretix/base/models.py:191 +#: pretix/base/models.py:189 msgid "E-mail" msgstr "E-Mail" -#: pretix/base/models.py:194 +#: pretix/base/models.py:192 msgid "Given name" msgstr "Vorname" -#: pretix/base/models.py:197 +#: pretix/base/models.py:195 msgid "Family name" msgstr "Nachname" -#: pretix/base/models.py:199 +#: pretix/base/models.py:197 msgid "Is active" msgstr "Ist aktiviert" -#: pretix/base/models.py:201 +#: pretix/base/models.py:199 msgid "Is site admin" msgstr "Ist Systemadministrator" -#: pretix/base/models.py:203 +#: pretix/base/models.py:201 msgid "Date joined" msgstr "Registrierungsdatum" -#: pretix/base/models.py:207 +#: pretix/base/models.py:205 msgid "Language" msgstr "Sprache" -#: pretix/base/models.py:210 +#: pretix/base/models.py:208 msgid "Timezone" msgstr "Zeitzone" -#: pretix/base/models.py:215 pretix/base/models.py:1502 -#: pretix/base/models.py:1857 +#: pretix/base/models.py:213 pretix/base/models.py:1509 +#: pretix/base/models.py:1812 +#: pretix/control/templates/pretixcontrol/event/permissions.html:13 #: pretix/control/templates/pretixcontrol/orders/index.html:10 +#: pretix/control/views/event.py:271 tests/base/test_mail.py:58 msgid "User" msgstr "Benutzer" -#: pretix/base/models.py:216 +#: pretix/base/models.py:214 msgid "Users" msgstr "Benutzer" -#: pretix/base/models.py:267 +#: pretix/base/models.py:265 #, python-format msgid "%(family)s, %(given)s" msgstr "%(family)s, %(given)s" -#: pretix/base/models.py:299 pretix/base/models.py:395 -#: pretix/base/models.py:1295 +#: pretix/base/models.py:297 pretix/base/models.py:393 +#: pretix/base/models.py:1301 msgid "Name" msgstr "Name" -#: pretix/base/models.py:303 pretix/base/models.py:400 +#: pretix/base/models.py:301 pretix/base/models.py:398 msgid "" "Should be short, only contain lowercase letters and numbers, and must be " "unique among your events. This is being used in addresses and bank transfer " @@ -122,240 +94,244 @@ msgstr "" "unter Ihren Veranstaltungen einmalig sein. Wird in URLs und " "Verwendungszwecken für Banküberweisungen benutzt." -#: pretix/base/models.py:308 pretix/base/models.py:405 +#: pretix/base/models.py:306 pretix/base/models.py:403 msgid "The slug may only contain letters, numbers, dots and dashes." msgstr "" "Der Kurzname darf nur Buchstaben, Zahlen, Punkte und Bindestriche enthalten" -#: pretix/base/models.py:311 pretix/base/models.py:408 +#: pretix/base/models.py:309 pretix/base/models.py:406 msgid "Slug" msgstr "Kurzform" -#: pretix/base/models.py:317 -#: pretix/control/templates/pretixcontrol/events/index.html:15 +#: pretix/base/models.py:315 +#: pretix/control/templates/pretixcontrol/events/index.html:20 #: pretix/control/templates/pretixcontrol/organizers/detail.html:4 #: pretix/control/templates/pretixcontrol/organizers/detail.html:6 msgid "Organizer" msgstr "Veranstalter" -#: pretix/base/models.py:318 +#: pretix/base/models.py:316 #: pretix/control/templates/pretixcontrol/base.html:82 #: pretix/control/templates/pretixcontrol/organizers/index.html:3 #: pretix/control/templates/pretixcontrol/organizers/index.html:5 msgid "Organizers" msgstr "Veranstalter" -#: pretix/base/models.py:350 +#: pretix/base/models.py:348 msgid "Can create events" msgstr "Kann Veranstaltungen erstellen" -#: pretix/base/models.py:354 +#: pretix/base/models.py:352 msgid "Organizer permission" msgstr "Veranstalter-Berechtigung" -#: pretix/base/models.py:355 +#: pretix/base/models.py:353 msgid "Organizer permissions" msgstr "Veranstalter-Berechtigungen" -#: pretix/base/models.py:358 pretix/base/models.py:553 +#: pretix/base/models.py:356 pretix/base/models.py:555 #, python-format msgid "%(name)s on %(object)s" msgstr "%(name)s für %(object)s" -#: pretix/base/models.py:413 +#: pretix/base/models.py:411 msgid "Default currency" msgstr "Standardwährung" -#: pretix/base/models.py:415 +#: pretix/base/models.py:413 msgid "Event start time" msgstr "Veranstaltungsbeginn" -#: pretix/base/models.py:417 +#: pretix/base/models.py:415 msgid "Event end time" msgstr "Veranstaltungsende" -#: pretix/base/models.py:420 +#: pretix/base/models.py:418 msgid "End of presale" msgstr "Ende des Vorverkaufs" -#: pretix/base/models.py:421 +#: pretix/base/models.py:419 msgid "No products will be sold after this date." msgstr "Es werden nach diesem Termin keine Produkte mehr verkauft." -#: pretix/base/models.py:425 +#: pretix/base/models.py:423 msgid "Start of presale" msgstr "Beginn des Vorverkaufs" -#: pretix/base/models.py:426 +#: pretix/base/models.py:424 msgid "No products will be sold before this date." msgstr "Es werden vor diesem Termin keine Produkte verkauft." -#: pretix/base/models.py:430 -#: pretix/control/templates/pretixcontrol/event/base.html:34 +#: pretix/base/models.py:428 +#: pretix/control/templates/pretixcontrol/event/base.html:40 msgid "Plugins" msgstr "Erweiterungen" -#: pretix/base/models.py:434 pretix/base/models.py:798 -#: pretix/base/models.py:1205 pretix/base/models.py:1291 -#: pretix/base/models.py:1497 pretix/base/models.py:1853 +#: pretix/base/models.py:432 pretix/base/models.py:800 +#: pretix/base/models.py:1211 pretix/base/models.py:1297 +#: pretix/base/models.py:1504 pretix/base/models.py:1808 msgid "Event" msgstr "Veranstaltung" -#: pretix/base/models.py:435 +#: pretix/base/models.py:433 #: pretix/control/templates/pretixcontrol/base.html:76 #: pretix/control/templates/pretixcontrol/events/index.html:3 #: pretix/control/templates/pretixcontrol/events/index.html:5 msgid "Events" msgstr "Veranstaltungen" -#: pretix/base/models.py:533 +#: pretix/base/models.py:531 msgid "Can change event settings" msgstr "Kann Veranstaltungseinstellungen ändern" -#: pretix/base/models.py:537 +#: pretix/base/models.py:535 msgid "Can change product settings" msgstr "Kann Produkte ändern" -#: pretix/base/models.py:541 +#: pretix/base/models.py:539 msgid "Can view orders" msgstr "Kann Bestellungen einsehen" -#: pretix/base/models.py:545 +#: pretix/base/models.py:543 +msgid "Can change permissions" +msgstr "Kann Berechtigungen verändern" + +#: pretix/base/models.py:547 msgid "Can change orders" msgstr "Kann Bestellungen verändern" -#: pretix/base/models.py:549 +#: pretix/base/models.py:551 msgid "Event permission" msgstr "Veranstaltungs-Berechtigung" -#: pretix/base/models.py:550 +#: pretix/base/models.py:552 msgid "Event permissions" msgstr "Veranstaltungs-Berechtigungen" -#: pretix/base/models.py:577 +#: pretix/base/models.py:579 msgid "Category name" msgstr "Bezeichnung" -#: pretix/base/models.py:584 +#: pretix/base/models.py:586 #: pretix/control/templates/pretixcontrol/items/category.html:4 #: pretix/control/templates/pretixcontrol/items/category.html:6 msgid "Product category" msgstr "Produktkategorie" -#: pretix/base/models.py:585 +#: pretix/base/models.py:587 #: pretix/control/templates/pretixcontrol/items/categories.html:3 #: pretix/control/templates/pretixcontrol/items/categories.html:5 #: pretix/control/templates/pretixcontrol/items/categories.html:12 msgid "Product categories" msgstr "Produktkategorien" -#: pretix/base/models.py:626 +#: pretix/base/models.py:628 msgid "Property name" msgstr "Bezeichnung" -#: pretix/base/models.py:630 +#: pretix/base/models.py:632 #: pretix/control/templates/pretixcontrol/items/property.html:5 #: pretix/control/templates/pretixcontrol/items/property.html:7 msgid "Product property" msgstr "Eigenschaft" -#: pretix/base/models.py:631 +#: pretix/base/models.py:633 #: pretix/control/templates/pretixcontrol/items/properties.html:3 #: pretix/control/templates/pretixcontrol/items/properties.html:5 #: pretix/control/templates/pretixcontrol/items/properties.html:12 msgid "Product properties" msgstr "Eigenschaften" -#: pretix/base/models.py:667 +#: pretix/base/models.py:669 msgid "Value" msgstr "Wert" -#: pretix/base/models.py:674 +#: pretix/base/models.py:676 msgid "Property value" msgstr "Wert" -#: pretix/base/models.py:675 +#: pretix/base/models.py:677 msgid "Property values" msgstr "Werte" -#: pretix/base/models.py:724 +#: pretix/base/models.py:726 msgid "Number" msgstr "Zahl" -#: pretix/base/models.py:725 +#: pretix/base/models.py:727 msgid "Text (one line)" msgstr "Text (einzeilig)" -#: pretix/base/models.py:726 +#: pretix/base/models.py:728 msgid "Multiline text" msgstr "Text (mehrzeilig)" -#: pretix/base/models.py:727 +#: pretix/base/models.py:729 msgid "Yes/No" msgstr "Ja/Nein" -#: pretix/base/models.py:735 pretix/base/models.py:748 +#: pretix/base/models.py:737 pretix/base/models.py:750 #: pretix/control/templates/pretixcontrol/items/question.html:4 #: pretix/control/templates/pretixcontrol/items/question.html:6 #: pretix/control/templates/pretixcontrol/items/questions.html:12 msgid "Question" msgstr "Frage" -#: pretix/base/models.py:740 +#: pretix/base/models.py:742 msgid "Question type" msgstr "Art der Antwort" -#: pretix/base/models.py:744 +#: pretix/base/models.py:746 msgid "Required question" msgstr "Antwort erforderlich" -#: pretix/base/models.py:749 pretix/base/models.py:848 -#: pretix/control/templates/pretixcontrol/event/base.html:78 +#: pretix/base/models.py:751 pretix/base/models.py:850 +#: pretix/control/templates/pretixcontrol/event/base.html:84 #: pretix/control/templates/pretixcontrol/items/questions.html:3 #: pretix/control/templates/pretixcontrol/items/questions.html:5 msgid "Questions" msgstr "Fragen" -#: pretix/base/models.py:805 -#: pretix/control/templates/pretixcontrol/items/index.html:14 +#: pretix/base/models.py:807 +#: pretix/control/templates/pretixcontrol/items/index.html:21 msgid "Category" msgstr "Kategorie" -#: pretix/base/models.py:809 +#: pretix/base/models.py:811 msgid "Item name" msgstr "Produktbezeichnung" -#: pretix/base/models.py:813 pretix/base/models.py:1086 +#: pretix/base/models.py:815 pretix/base/models.py:1092 #: pretix/control/templates/pretixcontrol/item/variations_1d.html:11 msgid "Active" msgstr "aktiviert" -#: pretix/base/models.py:816 +#: pretix/base/models.py:818 msgid "Short description" msgstr "Kurze Beschreibung" -#: pretix/base/models.py:817 +#: pretix/base/models.py:819 msgid "This is shown below the product name in lists." msgstr "Wird in Listen unter dem Name angezeigt." -#: pretix/base/models.py:821 +#: pretix/base/models.py:823 msgid "Long description" msgstr "Lange Beschreibung" -#: pretix/base/models.py:826 pretix/base/models.py:1091 +#: pretix/base/models.py:828 pretix/base/models.py:1097 msgid "Default price" msgstr "Basispreis" -#: pretix/base/models.py:831 +#: pretix/base/models.py:833 msgid "Taxes included in percent" msgstr "Steuern inklusive in Prozent" -#: pretix/base/models.py:837 -#: pretix/control/templates/pretixcontrol/event/base.html:72 +#: pretix/base/models.py:839 +#: pretix/control/templates/pretixcontrol/event/base.html:78 msgid "Properties" msgstr "Eigenschaften" -#: pretix/base/models.py:840 +#: pretix/base/models.py:842 msgid "" "The selected properties will be available for the user to select. After " "saving this field, move to the 'Variations' tab to configure the details." @@ -363,30 +339,30 @@ msgstr "" "Die hier ausgewählten Eigenschaften stehen für dieses Produkt zur Verfügung. " "Nach der Auswahl können Sie im Tab 'Varianten' die Details konfigurieren:" -#: pretix/base/models.py:851 +#: pretix/base/models.py:853 msgid "The user will be asked to fill in answers for the selected questions" msgstr "" "Der Käuft wird beim Kauf gebeten, die ausgewählten Fragen zu beantworten" -#: pretix/base/models.py:856 +#: pretix/base/models.py:858 msgid "Is an admission ticket" msgstr "Berechtigt zum Eintritt" -#: pretix/base/models.py:858 +#: pretix/base/models.py:860 msgid "Whether or not buying this product allows a person to enter your event" msgstr "" "Aktivieren, wenn dieses Produkt den Käufer zum Eintritt auf der " "Veranstaltung berechtigt." -#: pretix/base/models.py:865 +#: pretix/base/models.py:870 #: pretix/control/templates/pretixcontrol/item/base.html:3 #: pretix/control/templates/pretixcontrol/orders/overview.html:9 msgid "Product" msgstr "Produkt" -#: pretix/base/models.py:866 -#: pretix/control/templates/pretixcontrol/event/base.html:48 -#: pretix/control/templates/pretixcontrol/event/base.html:55 +#: pretix/base/models.py:871 +#: pretix/control/templates/pretixcontrol/event/base.html:54 +#: pretix/control/templates/pretixcontrol/event/base.html:61 #: pretix/control/templates/pretixcontrol/items/base.html:3 #: pretix/control/templates/pretixcontrol/items/index.html:3 #: pretix/control/templates/pretixcontrol/items/index.html:5 @@ -394,78 +370,78 @@ msgstr "Produkt" msgid "Products" msgstr "Produkte" -#: pretix/base/models.py:1095 +#: pretix/base/models.py:1101 msgid "Product variation" msgstr "Variante" -#: pretix/base/models.py:1096 +#: pretix/base/models.py:1102 msgid "Product variations" msgstr "Varianten" -#: pretix/base/models.py:1210 pretix/base/models.py:1302 -#: pretix/base/models.py:1785 pretix/base/models.py:1861 +#: pretix/base/models.py:1216 pretix/base/models.py:1308 +#: pretix/base/models.py:1740 pretix/base/models.py:1816 msgid "Item" msgstr "Produkt" -#: pretix/base/models.py:1216 pretix/base/models.py:1310 +#: pretix/base/models.py:1222 pretix/base/models.py:1316 #: pretix/control/templates/pretixcontrol/item/base.html:9 msgid "Variations" msgstr "Varianten" -#: pretix/base/models.py:1222 +#: pretix/base/models.py:1228 msgid "Restriction" msgstr "Beschränkung" -#: pretix/base/models.py:1223 +#: pretix/base/models.py:1229 #: pretix/control/templates/pretixcontrol/item/base.html:10 msgid "Restrictions" msgstr "Beschränkungen" -#: pretix/base/models.py:1298 +#: pretix/base/models.py:1304 #: pretix/control/templates/pretixcontrol/items/quotas.html:14 msgid "Total capacity" msgstr "Gesamtanzahl" -#: pretix/base/models.py:1318 +#: pretix/base/models.py:1324 #: pretix/control/templates/pretixcontrol/items/quota.html:4 #: pretix/control/templates/pretixcontrol/items/quota.html:6 msgid "Quota" msgstr "Kontingent" -#: pretix/base/models.py:1319 -#: pretix/control/templates/pretixcontrol/event/base.html:60 +#: pretix/base/models.py:1325 +#: pretix/control/templates/pretixcontrol/event/base.html:66 #: pretix/control/templates/pretixcontrol/items/quotas.html:3 #: pretix/control/templates/pretixcontrol/items/quotas.html:5 msgid "Quotas" msgstr "Kontingente" -#: pretix/base/models.py:1479 +#: pretix/base/models.py:1486 msgid "pending" msgstr "ausstehend" -#: pretix/base/models.py:1480 +#: pretix/base/models.py:1487 msgid "paid" msgstr "bezahlt" -#: pretix/base/models.py:1481 +#: pretix/base/models.py:1488 msgid "expired" msgstr "abgelaufen" -#: pretix/base/models.py:1482 +#: pretix/base/models.py:1489 msgid "cancelled" msgstr "storniert" -#: pretix/base/models.py:1483 +#: pretix/base/models.py:1490 msgid "refunded" msgstr "erstattet" -#: pretix/base/models.py:1488 +#: pretix/base/models.py:1495 #: pretix/control/templates/pretixcontrol/orders/index.html:9 #: pretix/presale/templates/pretixpresale/event/orders.html:14 msgid "Order code" msgstr "Bestellnummer" -#: pretix/base/models.py:1493 +#: pretix/base/models.py:1500 #: pretix/control/templates/pretixcontrol/orders/index.html:13 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_confirm.html:18 #: pretix/plugins/stripe/templates/pretixplugins/stripe/control.html:30 @@ -473,67 +449,67 @@ msgstr "Bestellnummer" msgid "Status" msgstr "Status" -#: pretix/base/models.py:1506 pretix/base/models.py:1873 +#: pretix/base/models.py:1513 pretix/base/models.py:1828 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_assign.html:17 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_confirm.html:13 #: pretix/presale/templates/pretixpresale/event/orders.html:15 msgid "Date" msgstr "Datum" -#: pretix/base/models.py:1509 pretix/base/models.py:1877 +#: pretix/base/models.py:1516 pretix/base/models.py:1832 #: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form.html:18 msgid "Expiration date" msgstr "Ablaufdatum" -#: pretix/base/models.py:1512 +#: pretix/base/models.py:1519 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/control.html:15 msgid "Payment date" msgstr "Zahlungsdatum" -#: pretix/base/models.py:1518 +#: pretix/base/models.py:1525 msgid "Payment provider" msgstr "Zahlungsmethode" -#: pretix/base/models.py:1522 +#: pretix/base/models.py:1529 #: pretix/control/templates/pretixcontrol/order/index.html:87 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:71 msgid "Payment method fee" msgstr "Gebühr für gewählte Zahlungsmethode" -#: pretix/base/models.py:1525 +#: pretix/base/models.py:1532 #: pretix/control/templates/pretixcontrol/order/index.html:109 msgid "Payment information" msgstr "Zahlungsinformationen" -#: pretix/base/models.py:1529 +#: pretix/base/models.py:1536 msgid "Payment state was manually modified" msgstr "Der Bestellungsstatus wurde manuell verändert" -#: pretix/base/models.py:1534 +#: pretix/base/models.py:1541 msgid "Total amount" msgstr "Gesamtbetrag" -#: pretix/base/models.py:1538 pretix/base/models.py:1780 +#: pretix/base/models.py:1545 pretix/base/models.py:1735 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_confirm.html:17 msgid "Order" msgstr "Bestellung" -#: pretix/base/models.py:1539 -#: pretix/control/templates/pretixcontrol/event/base.html:86 +#: pretix/base/models.py:1546 +#: pretix/control/templates/pretixcontrol/event/base.html:92 #: pretix/control/templates/pretixcontrol/orders/index.html:3 #: pretix/control/templates/pretixcontrol/orders/index.html:5 msgid "Orders" msgstr "Bestellungen" -#: pretix/base/models.py:1597 +#: pretix/base/models.py:1604 msgid "The payment is too late to be accepted." msgstr "Die Zahlung kommt zu spät, um akzeptiert werden zu können." -#: pretix/base/models.py:1612 +#: pretix/base/models.py:1619 msgid "Some of the ordered products were no longer available." msgstr "Einige der ausgewählten Produkte sind nicht mehr verfügbar." -#: pretix/base/models.py:1613 +#: pretix/base/models.py:1620 msgid "" "We were not able to process the request completely as the server was too " "busy. Please try again." @@ -541,44 +517,39 @@ msgstr "" "Wir konnten Ihre Bestellung nicht durchführen, da der Server zu beschäftigt " "war. Bitte versuchen Sie es erneut." -#: pretix/base/models.py:1695 -#, python-format -msgid "Payment received for your order: %(code)s" -msgstr "Zahlung erhalten für die Bestellung: %(code)s" - -#: pretix/base/models.py:1790 pretix/base/models.py:1866 +#: pretix/base/models.py:1745 pretix/base/models.py:1821 msgid "Variation" msgstr "Variante" -#: pretix/base/models.py:1794 pretix/base/models.py:1870 +#: pretix/base/models.py:1749 pretix/base/models.py:1825 #: pretix/control/templates/pretixcontrol/item/variations_1d.html:12 msgid "Price" msgstr "Preis" -#: pretix/base/models.py:1798 pretix/base/models.py:1881 +#: pretix/base/models.py:1753 pretix/base/models.py:1836 #: pretix/control/templates/pretixcontrol/order/index.html:56 +#: pretix/presale/forms/checkout.py:31 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:12 -#: pretix/presale/views/checkout.py:45 msgid "Attendee name" msgstr "Name des Teilnehmers" -#: pretix/base/models.py:1800 pretix/base/models.py:1883 +#: pretix/base/models.py:1755 pretix/base/models.py:1838 msgid "Empty, if this product is not an admission ticket" msgstr "Leer, wenn dies kein Eintrittsticket ist" -#: pretix/base/models.py:1804 +#: pretix/base/models.py:1759 msgid "Order position" msgstr "Bestelltes Produkt" -#: pretix/base/models.py:1805 +#: pretix/base/models.py:1760 msgid "Order positions" msgstr "Bestellzeile" -#: pretix/base/models.py:1887 +#: pretix/base/models.py:1842 msgid "Cart position" msgstr "Produkt im Warenkorb" -#: pretix/base/models.py:1888 +#: pretix/base/models.py:1843 msgid "Cart positions" msgstr "Produkte im Warenkorb" @@ -586,24 +557,24 @@ msgstr "Produkte im Warenkorb" msgid "Enable payment method" msgstr "Aktiviere Zahlungsmethode" -#: pretix/base/payment.py:108 pretix/base/payment.py:114 +#: pretix/base/payment.py:107 pretix/base/payment.py:113 msgid "Additional fee" msgstr "Zusätzliche Gebühr" -#: pretix/base/payment.py:109 +#: pretix/base/payment.py:108 msgid "Absolute value" msgstr "Fester Betrag" -#: pretix/base/payment.py:115 +#: pretix/base/payment.py:114 msgid "Percentage" msgstr "Prozentsatz" -#: pretix/base/payment.py:313 +#: pretix/base/payment.py:312 #, python-format msgid "Payment provider: %s" msgstr "Zahlungsanbieter: %s" -#: pretix/base/payment.py:326 +#: pretix/base/payment.py:325 msgid "" "The money can not be automatically refunded, please transfer the money back " "manually." @@ -611,7 +582,7 @@ msgstr "" "Das Geld konnte nicht automatisch erstattet werden, bitte überweisen Sie es " "manuell zurück." -#: pretix/base/payment.py:347 +#: pretix/base/payment.py:346 msgid "" "The order has been marked as refunded. Please transfer the money back to the " "buyer manually." @@ -619,15 +590,306 @@ msgstr "" "Die Bestellung wurde als erstattet markiert. Bitte überweisen Sie den Betrag " "manuell an den Käufer zurück." +#: pretix/base/services/orders.py:44 +#, python-format +msgid "Payment received for your order: %(code)s" +msgstr "Zahlung erhalten für die Bestellung: %(code)s" + #: pretix/base/ticketoutput.py:90 msgid "Enable output" msgstr "Aktivieren" -#: pretix/base/ticketoutput.py:109 +#: pretix/base/ticketoutput.py:108 msgid "Download ticket" msgstr "Ticket herunterladen" -#: pretix/control/middleware.py:58 +#: pretix/control/forms/__init__.py:176 +msgid "not applicable" +msgstr "nicht anwendbar" + +#: pretix/control/forms/__init__.py:184 +msgid "Select all" +msgstr "Alle auswählen" + +#: pretix/control/forms/__init__.py:185 +msgid "Deselect all" +msgstr "Keine auswählen" + +#: pretix/control/forms/auth.py:13 pretix/control/forms/auth.py:51 +#: pretix/presale/forms/auth.py:63 +msgid "Email address" +msgstr "E-Mail-Adresse" + +#: pretix/control/forms/auth.py:14 pretix/control/forms/auth.py:55 +#: pretix/presale/forms/auth.py:21 pretix/presale/forms/auth.py:67 +#: pretix/presale/forms/auth.py:120 pretix/presale/forms/auth.py:161 +msgid "Password" +msgstr "Passwort" + +#: pretix/control/forms/auth.py:18 +msgid "Please enter a correct e-mail address and password." +msgstr "" +"Bitte geben Sie eine gültige Kombination aus E-Mail-Adresse und Passwort ein." + +#: pretix/control/forms/auth.py:19 pretix/presale/forms/auth.py:27 +msgid "This account is inactive." +msgstr "Dieses Konto ist deaktiviert." + +#: pretix/control/forms/auth.py:47 pretix/presale/forms/auth.py:59 +msgid "" +"You already registered with that e-mail address, please use the login form." +msgstr "" +"Sie haben sich bereits mit dieser E-Mail-Adresse registriert, bitte " +"verwenden Sie das Login-Formular." + +#: pretix/control/forms/auth.py:48 pretix/control/forms/user.py:17 +#: pretix/presale/forms/auth.py:60 pretix/presale/forms/auth.py:102 +#: pretix/presale/forms/auth.py:158 +msgid "Please enter the same password twice" +msgstr "Bitte geben Sie zweimal das selbe Passwort ein." + +#: pretix/control/forms/auth.py:60 pretix/presale/forms/auth.py:72 +#: pretix/presale/forms/auth.py:125 pretix/presale/forms/auth.py:166 +msgid "Repeat password" +msgstr "Passwort wiederholen" + +#: pretix/control/forms/event.py:13 +msgid "" +"You already used this slug for a different event. Please choose a new one." +msgstr "" +"Sie haben diese Kurzform bereits für eine andere Veranstaltung benutzt. " +"Bitte wählen Sie eine andere." + +#: pretix/control/forms/event.py:66 +msgid "Show event end date" +msgstr "Zeige Veranstaltungsende" + +#: pretix/control/forms/event.py:67 +msgid "If disabled, only event's start date will be displayed to the public." +msgstr "" +"Wenn diese Einstellung deaktiviert ist, wird nur der Beginn der " +"Veranstaltung öffentlich angezeigt." + +#: pretix/control/forms/event.py:71 +msgid "Show dates with time" +msgstr "Zeige Uhrzeiten" + +#: pretix/control/forms/event.py:72 +msgid "" +"If disabled, the event's start and end date will be displayed without the " +"time of day." +msgstr "" +"Wenn diese Einstellung deaktiviert ist, werden Veranstaltungsbeginn und -" +"ende ohne Uhrzeit angezeigt" + +#: pretix/control/forms/event.py:76 +msgid "Payment term in days" +msgstr "Zahlungsziel in Tagen" + +#: pretix/control/forms/event.py:77 +msgid "" +"The number of days after placing an order the user has to pay to preserve " +"his reservation." +msgstr "Die Anzahl an Tagen die ein Käufer zum Bezahlen seiner Bestellung hat." + +#: pretix/control/forms/event.py:80 +msgid "Show items outside presale period" +msgstr "Zeige Produkte außerhalb des Vorverkaufszeitraums" + +#: pretix/control/forms/event.py:81 +msgid "" +"Show item details before presale has started and after presale has ended" +msgstr "" +"Zeige Produktdetails bevor der Vorverkauf startet und nachdem er beendet ist." + +#: pretix/control/forms/event.py:85 +msgid "Show start date" +msgstr "Beginn des Vorverkaufszeitraums anzeigen" + +#: pretix/control/forms/event.py:86 +msgid "Show the presale start date before presale has started" +msgstr "" +"Zeige das Startdatum des Vorverkaufes bevor der Verkaufszeitraum beginnt" + +#: pretix/control/forms/event.py:90 +msgid "Last date of payments" +msgstr "Datum des letzten möglichen Zahlungseingangs" + +#: pretix/control/forms/event.py:91 +msgid "" +"The last date any payments are accepted. This has precedence over the number " +"of days configured above." +msgstr "" +"Das Datum, bis zu dem Zahlungseingänge akzeptiert werden. Diese Einstellung " +"hat Vorrang über der oben eingestellten Anzahl an Tagen" + +#: pretix/control/forms/event.py:96 +msgid "Accept late payments" +msgstr "Späte Zahlungen akzeptieren" + +#: pretix/control/forms/event.py:97 +msgid "" +"Accept payments that come after the end of the order's payment term. " +"Payments will only be accepted if the regarding quotas have remaining " +"capacity. No payments will be accepted after the 'Last date of payments' " +"configured above." +msgstr "" +"Akzeptiere Zahlungen, die nach Ablauf der Zahlungsfrist eingehen. Zahlungen " +"werden nur akzeptiert, wenn die betreffenden Kontingente noch nicht leer " +"sind. Keine Bezahlungen werden nach dem oben angegebenen „letzten " +"Zahlungsdatum“ akzeptiert." + +#: pretix/control/forms/event.py:104 +msgid "Last date of modifications" +msgstr "Letzes Änderungsdatum" + +#: pretix/control/forms/event.py:105 +msgid "" +"The last date users can modify details of their orders, such as attendee " +"names or answers to questions." +msgstr "" +"Das späteste Datum, zu dem Benutzer die Details ihrer Bestellung (z.B. Namen " +"oder Antworten zu Fragen) verändern können." + +#: pretix/control/forms/event.py:111 pretix/control/forms/user.py:34 +msgid "Default timezone" +msgstr "Standardzeitzone" + +#: pretix/control/forms/event.py:115 +msgid "Available langauges" +msgstr "Verfügbare Sprachen" + +#: pretix/control/forms/event.py:119 +msgid "Default language" +msgstr "Standardsprache" + +#: pretix/control/forms/event.py:122 +msgid "Require e-mail adresses" +msgstr "E-Mail-Adresse erfordern" + +#: pretix/control/forms/event.py:123 +msgid "Require all customers to provide an e-mail address." +msgstr "Erfordere eine E-Mail-Adresse von allen Käufern." + +#: pretix/control/forms/event.py:127 +msgid "Ask for attendee names" +msgstr "Namen der Teilnehmer erfragen" + +#: pretix/control/forms/event.py:128 +msgid "Ask for a name for all tickets which include admission to the event." +msgstr "Frage für alle Eintritts-Tickets nach dem Namen des Teilnehmers." + +#: pretix/control/forms/event.py:132 +msgid "Require attendee names" +msgstr "Namen des Teilnehmer erfordern" + +#: pretix/control/forms/event.py:133 +msgid "Require customers to fill in the names of all attendees." +msgstr "Erfordere die Eingabe aller Teilnehmer-Namen." + +#: pretix/control/forms/event.py:138 +msgid "Maximum number of items per order" +msgstr "Maximale Anzahl Produkte pro Bestellung" + +#: pretix/control/forms/event.py:142 +msgid "Reservation period" +msgstr "Reservierungszeitraum" + +#: pretix/control/forms/event.py:143 +msgid "" +"The number of minutes the items in a user's card are reserved for this user." +msgstr "" +"Die Dauer in Minuten, die Produkte im Warenkorb eines Benutzers reserviert " +"werden." + +#: pretix/control/forms/event.py:146 +msgid "Imprint URL" +msgstr "Impressum (URL)" + +#: pretix/control/forms/event.py:150 +msgid "Contact address" +msgstr "Kontakt-E-Mail" + +#: pretix/control/forms/event.py:152 +msgid "Public email address for contacting the organizer" +msgstr "Öffentliche E-Mail-Adresse zur Kontaktierung des Veranstalters" + +#: pretix/control/forms/event.py:155 +msgid "Sender address" +msgstr "Absender-Adresse" + +#: pretix/control/forms/event.py:156 +msgid "Sender address for outgoing e-mails" +msgstr "Absender-Adresse für ausgehende E-Mails" + +#: pretix/control/forms/event.py:185 pretix/control/forms/event.py:217 +msgid "This field is required." +msgstr "Dieses Feld ist erforderlich." + +#: pretix/control/forms/event.py:190 +msgid "Use feature" +msgstr "Funktion benutzen" + +#: pretix/control/forms/event.py:191 +msgid "Use pretix to generate tickets for the user to download and print out." +msgstr "" +"Wenn diese Funktion aktiviert ist, generiert pretix Tickets, die der " +"Benutzer herunterladen und ausdrucken kann." + +#: pretix/control/forms/event.py:195 +msgid "Download date" +msgstr "Download-Datum" + +#: pretix/control/forms/event.py:196 +msgid "Ticket download will be offered after this date." +msgstr "Der Ticket-Download wird zu diesem Zeitpunkt freigeschaltet." + +#: pretix/control/forms/item.py:64 +msgid "Activate for" +msgstr "aktiviert für" + +#: pretix/control/forms/item.py:71 +msgid "Activate" +msgstr "aktiviert" + +#: pretix/control/forms/organizer.py:10 +msgid "This slug is already in use. Please choose a different one." +msgstr "" +"Diese Kurzform ist bereits in Verwendung, bitte wählen Sie eine andere." + +#: pretix/control/forms/user.py:12 +msgid "" +"There already is an account associated with this e-mail address. Please " +"choose a different one." +msgstr "" +"Diese E-Mail-Adresse ist bereits mit einem anderen Benutzer verknüpft. Bitte " +"wählen Sie eine andere." + +#: pretix/control/forms/user.py:14 +msgid "" +"Please enter your current password if you want to change your e-mail address " +"or password." +msgstr "" +"Bitte geben Sie Ihr aktuelles Passwort ein, um Ihre E-Mail-Adresse oder Ihr " +"Passwort zu ändern." + +#: pretix/control/forms/user.py:16 +msgid "The current password you entered was not correct." +msgstr "Das eingegebene aktuelle Passwort war nicht korrekt." + +#: pretix/control/forms/user.py:22 +msgid "Your current password" +msgstr "Aktuelles Passwort" + +#: pretix/control/forms/user.py:26 +msgid "New password" +msgstr "Neues Passwort" + +#: pretix/control/forms/user.py:30 +msgid "Repeat new password" +msgstr "Neues Passwort wiederholen" + +#: pretix/control/middleware.py:59 msgid "" "The selected event was not found or you have no permission to administrate " "it." @@ -635,7 +897,7 @@ msgstr "" "Sie haben keine Berechtigung, die ausgewählte Veranstaltung zu " "administrieren." -#: pretix/control/middleware.py:67 +#: pretix/control/middleware.py:68 msgid "" "The selected organizer was not found or you have no permission to " "administrate it." @@ -649,15 +911,34 @@ msgstr "Sie haben keine Berechtigung, diese Inhalte aufzurufen." #: pretix/control/templates/pretixcontrol/auth/base.html:18 #: pretix/control/templates/pretixcontrol/base.html:104 -#: pretix/presale/templates/pretixpresale/event/base.html:61 +#: pretix/presale/templates/pretixpresale/event/base.html:72 #, python-format msgid "powered by pretix" msgstr "powered by pretix" #: pretix/control/templates/pretixcontrol/auth/login.html:12 +#: pretix/control/templates/pretixcontrol/auth/register.html:18 +#: pretix/presale/templates/pretixpresale/event/login.html:65 +#: pretix/presale/templates/pretixpresale/event/login.html:95 +msgid "Register" +msgstr "Registrieren" + +#: pretix/control/templates/pretixcontrol/auth/login.html:16 msgid "Log in" msgstr "Anmelden" +#: pretix/control/templates/pretixcontrol/auth/register.html:6 +msgid "Create a new account" +msgstr "Neuen Benutzer erstellen" + +#: pretix/control/templates/pretixcontrol/auth/register.html:14 +#: pretix/presale/templates/pretixpresale/event/base.html:48 +#: pretix/presale/templates/pretixpresale/event/login.html:4 +#: pretix/presale/templates/pretixpresale/event/login.html:6 +#: pretix/presale/templates/pretixpresale/event/login.html:31 +msgid "Login" +msgstr "Login" + #: pretix/control/templates/pretixcontrol/base.html:27 msgid "Toggle navigation" msgstr "Navigation umschalten" @@ -672,6 +953,8 @@ msgid "Log out" msgstr "Abmelden" #: pretix/control/templates/pretixcontrol/base.html:70 +#: pretix/control/templates/pretixcontrol/dashboard.html:3 +#: pretix/control/templates/pretixcontrol/dashboard.html:5 #: pretix/control/templates/pretixcontrol/event/base.html:9 msgid "Dashboard" msgstr "Übersicht" @@ -686,45 +969,68 @@ msgid "General" msgstr "Allgemeines" #: pretix/control/templates/pretixcontrol/event/base.html:28 +#: pretix/control/templates/pretixcontrol/event/permissions.html:8 +msgid "Permissions" +msgstr "Berechtigungen" + +#: pretix/control/templates/pretixcontrol/event/base.html:34 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:49 #: pretix/presale/templates/pretixpresale/event/order.html:16 #: pretix/presale/templates/pretixpresale/event/order.html:89 msgid "Payment" msgstr "Zahlung" -#: pretix/control/templates/pretixcontrol/event/base.html:40 +#: pretix/control/templates/pretixcontrol/event/base.html:46 msgid "Tickets" msgstr "Tickets" -#: pretix/control/templates/pretixcontrol/event/base.html:66 +#: pretix/control/templates/pretixcontrol/event/base.html:72 msgid "Categories" msgstr "Kategorien" -#: pretix/control/templates/pretixcontrol/event/base.html:93 +#: pretix/control/templates/pretixcontrol/event/base.html:99 msgid "All orders" msgstr "Alle Bestellungen" -#: pretix/control/templates/pretixcontrol/event/base.html:99 +#: pretix/control/templates/pretixcontrol/event/base.html:105 msgid "Overview" msgstr "Überblick" +#: pretix/control/templates/pretixcontrol/event/index.html:16 +msgid "Tickets sold" +msgstr "Tickets verkauft" + +#: pretix/control/templates/pretixcontrol/event/index.html:22 +#: pretix/control/templates/pretixcontrol/event/index.html:66 +msgid "Orders overview" +msgstr "Bestellübersicht" + +#: pretix/control/templates/pretixcontrol/event/index.html:38 +msgid "Total items ordered" +msgstr "Produkte bestellt" + +#: pretix/control/templates/pretixcontrol/event/index.html:44 +msgid "View all orders" +msgstr "Alle Bestellungen" + +#: pretix/control/templates/pretixcontrol/event/index.html:60 +msgid "Total Revenue" +msgstr "Gesamtumsatz" + +#: pretix/control/templates/pretixcontrol/event/index.html:82 +msgid "Active Products" +msgstr "Aktive Produkte" + +#: pretix/control/templates/pretixcontrol/event/index.html:88 +#: pretix/presale/templates/pretixpresale/event/orders.html:28 +msgid "View details" +msgstr "Details anzeigen" + #: pretix/control/templates/pretixcontrol/event/payment.html:8 msgid "Payment settings" msgstr "Zahlungseinstellungen" -#: pretix/control/templates/pretixcontrol/event/payment.html:11 -#: pretix/control/templates/pretixcontrol/event/plugins.html:11 -#: pretix/control/templates/pretixcontrol/event/tickets.html:8 -#: pretix/control/views/event.py:160 pretix/control/views/item.py:93 -#: pretix/control/views/item.py:250 pretix/control/views/item.py:419 -#: pretix/control/views/item.py:582 pretix/control/views/item.py:673 -#: pretix/control/views/item.py:699 pretix/control/views/item.py:852 -#: pretix/control/views/item.py:922 pretix/control/views/organizer.py:68 -#: pretix/control/views/user.py:112 -msgid "Your changes have been saved." -msgstr "Die Änderungen wurden gespeichert." - -#: pretix/control/templates/pretixcontrol/event/payment.html:31 +#: pretix/control/templates/pretixcontrol/event/payment.html:26 msgid "" "There are no payment providers available. Please go to the plugin settings " "and activate one or more payment plugins." @@ -732,9 +1038,10 @@ msgstr "" "Es sind keine Zahlungsmethoden verfügbar. Bitte gehen Sie in die Plugin-" "Einstellungen und aktivieren Sie eins oder mehrere Zahlungsplugins." -#: pretix/control/templates/pretixcontrol/event/payment.html:36 -#: pretix/control/templates/pretixcontrol/event/settings.html:48 -#: pretix/control/templates/pretixcontrol/event/tickets.html:40 +#: pretix/control/templates/pretixcontrol/event/payment.html:31 +#: pretix/control/templates/pretixcontrol/event/permissions.html:53 +#: pretix/control/templates/pretixcontrol/event/settings.html:50 +#: pretix/control/templates/pretixcontrol/event/tickets.html:35 #: pretix/control/templates/pretixcontrol/events/create.html:29 #: pretix/control/templates/pretixcontrol/item/index.html:28 #: pretix/control/templates/pretixcontrol/item/restrictions.html:66 @@ -751,10 +1058,50 @@ msgstr "" msgid "Save" msgstr "Speichern" +#: pretix/control/templates/pretixcontrol/event/permissions.html:14 +msgid "Change settings" +msgstr "Kann Einstellungen ändern" + +#: pretix/control/templates/pretixcontrol/event/permissions.html:15 +msgid "Change products" +msgstr "Produkte bearbeiten" + +#: pretix/control/templates/pretixcontrol/event/permissions.html:16 +msgid "View orders" +msgstr "Bestellungen ansehen" + +#: pretix/control/templates/pretixcontrol/event/permissions.html:17 +msgid "Change orders" +msgstr "Bestellungen verändern" + +#: pretix/control/templates/pretixcontrol/event/permissions.html:18 +msgid "Change permissions" +msgstr "Berechtigungen verändern" + +#: pretix/control/templates/pretixcontrol/event/permissions.html:19 +#: pretix/control/templates/pretixcontrol/items/category_delete.html:17 +#: pretix/control/templates/pretixcontrol/items/property_delete.html:23 +#: pretix/control/templates/pretixcontrol/items/question_delete.html:21 +#: pretix/control/templates/pretixcontrol/items/quota_delete.html:21 +msgid "Delete" +msgstr "Löschen" + #: pretix/control/templates/pretixcontrol/event/plugins.html:8 msgid "Installed plugins" msgstr "Installierte Erweiterungen" +#: pretix/control/templates/pretixcontrol/event/plugins.html:11 +#: pretix/control/views/event.py:50 pretix/control/views/event.py:101 +#: pretix/control/views/event.py:161 pretix/control/views/event.py:210 +#: pretix/control/views/event.py:326 pretix/control/views/item.py:133 +#: pretix/control/views/item.py:279 pretix/control/views/item.py:445 +#: pretix/control/views/item.py:566 pretix/control/views/item.py:638 +#: pretix/control/views/item.py:664 pretix/control/views/item.py:805 +#: pretix/control/views/item.py:874 pretix/control/views/organizer.py:38 +#: pretix/control/views/user.py:25 +msgid "Your changes have been saved." +msgstr "Die Änderungen wurden gespeichert." + #: pretix/control/templates/pretixcontrol/event/plugins.html:23 msgid "Incompatible" msgstr "Nicht kompatibel" @@ -797,25 +1144,25 @@ msgstr "Allgemeine Informationen" msgid "Display settings" msgstr "Anzeigeeinstellungen" -#: pretix/control/templates/pretixcontrol/event/settings.html:24 +#: pretix/control/templates/pretixcontrol/event/settings.html:26 #: pretix/control/templates/pretixcontrol/events/create.html:18 msgid "Timeline" msgstr "Ablauf" -#: pretix/control/templates/pretixcontrol/event/settings.html:35 +#: pretix/control/templates/pretixcontrol/event/settings.html:37 msgid "Order process settings" msgstr "Bestellzeile" -#: pretix/control/templates/pretixcontrol/event/settings.html:43 +#: pretix/control/templates/pretixcontrol/event/settings.html:45 msgid "E-Mail settings" msgstr "E-Mail-Einstellungen" -#: pretix/control/templates/pretixcontrol/event/tickets.html:13 +#: pretix/control/templates/pretixcontrol/event/tickets.html:8 #: pretix/presale/templates/pretixpresale/event/order.html:30 msgid "Ticket download" msgstr "Ticket-Download" -#: pretix/control/templates/pretixcontrol/event/tickets.html:34 +#: pretix/control/templates/pretixcontrol/event/tickets.html:29 msgid "" "There are no ticket outputs available. Please go to the plugin settings and " "activate one or more ticket output plugins." @@ -845,15 +1192,19 @@ msgstr "" "administrativen Zugriff haben. Klicken Sie auf einen Veranstaltungstitel um " "Details aufzurufen" -#: pretix/control/templates/pretixcontrol/events/index.html:14 +#: pretix/control/templates/pretixcontrol/events/index.html:13 +msgid "You currently do not have access to any events." +msgstr "Sie haben zur Zeit auf keine Veranstaltungen Zugriff." + +#: pretix/control/templates/pretixcontrol/events/index.html:19 msgid "Event name" msgstr "Veranstaltungstitel" -#: pretix/control/templates/pretixcontrol/events/index.html:16 +#: pretix/control/templates/pretixcontrol/events/index.html:21 msgid "Start date" msgstr "Beginn" -#: pretix/control/templates/pretixcontrol/events/index.html:17 +#: pretix/control/templates/pretixcontrol/events/index.html:22 msgid "End date" msgstr "Ende" @@ -942,18 +1293,22 @@ msgstr "Möchten Sie die Kategorie %(name)s wirklich löschen?" msgid "Cancel" msgstr "Abbrechen" -#: pretix/control/templates/pretixcontrol/items/category_delete.html:17 -#: pretix/control/templates/pretixcontrol/items/property_delete.html:23 -#: pretix/control/templates/pretixcontrol/items/question_delete.html:21 -#: pretix/control/templates/pretixcontrol/items/quota_delete.html:21 -msgid "Delete" -msgstr "Löschen" +#: pretix/control/templates/pretixcontrol/items/index.html:7 +msgid "" +"Below, you find a list of all available products. You can click on a product " +"name to inspect and change product details. You can also use the buttons on " +"the right to change the order of products within a give category." +msgstr "" +"Hier finden Sie eine Liste aller verfügbaren Produkte. Sie können auf eine " +"Produktbezeichnung klicken um die Produktdetails anzusehen und zu ändern " +"oder die Knöpfe rechts verwenden, um die Reihenfolge der Produkte innerhalb " +"einer Kategorie zu ändern." -#: pretix/control/templates/pretixcontrol/items/index.html:8 +#: pretix/control/templates/pretixcontrol/items/index.html:15 msgid "Create new product" msgstr "Neues Produkt hinzufügen" -#: pretix/control/templates/pretixcontrol/items/index.html:13 +#: pretix/control/templates/pretixcontrol/items/index.html:20 msgid "Product name" msgstr "Produktbezeichnung" @@ -1132,8 +1487,8 @@ msgstr "nicht beantwortet" #: pretix/control/templates/pretixcontrol/order/index.html:75 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:59 -#: pretix/presale/templates/pretixpresale/event/index.html:88 -#: pretix/presale/templates/pretixpresale/event/index.html:116 +#: pretix/presale/templates/pretixpresale/event/index.html:89 +#: pretix/presale/templates/pretixpresale/event/index.html:117 #, python-format msgid "incl. %(rate)s%% taxes" msgstr "inkl. %(rate)s%% MwSt." @@ -1239,320 +1594,120 @@ msgstr "Allgemeine Einstellungen" msgid "Login settings" msgstr "Login-Einstellungen" -#: pretix/control/views/auth.py:15 pretix/presale/views/event.py:178 -msgid "E-mail address" -msgstr "E-Mail-Adresse" - -#: pretix/control/views/auth.py:20 -msgid "Please enter a correct e-mail address and password." -msgstr "" -"Bitte geben Sie eine gültige Kombination aus E-Mail-Adresse und Passwort ein." - -#: pretix/control/views/auth.py:21 pretix/presale/views/event.py:89 -msgid "This account is inactive." -msgstr "Dieses Konto ist deaktiviert." - -#: pretix/control/views/event.py:47 -msgid "Show event end date" -msgstr "Zeige Veranstaltungsende" - -#: pretix/control/views/event.py:48 -msgid "If disabled, only event's start date will be displayed to the public." -msgstr "" -"Wenn diese Einstellung deaktiviert ist, wird nur der Beginn der " -"Veranstaltung öffentlich angezeigt." - -#: pretix/control/views/event.py:52 -msgid "Show dates with time" -msgstr "Zeige Uhrzeiten" - -#: pretix/control/views/event.py:53 -msgid "" -"If disabled, the event's start and end date will be displayed without the " -"time of day." -msgstr "" -"Wenn diese Einstellung deaktiviert ist, werden Veranstaltungsbeginn und -" -"ende ohne Uhrzeit angezeigt" - -#: pretix/control/views/event.py:57 -msgid "Payment term in days" -msgstr "Zahlungsziel in Tagen" - -#: pretix/control/views/event.py:58 -msgid "" -"The number of days after placing an order the user has to pay to preserve " -"his reservation." -msgstr "Die Anzahl an Tagen die ein Käufer zum Bezahlen seiner Bestellung hat." - -#: pretix/control/views/event.py:61 -msgid "Show items outside presale period" -msgstr "Zeige Produkte außerhalb des Vorverkaufszeitraums" - -#: pretix/control/views/event.py:62 -msgid "" -"Show item details before presale has started and after presale has ended" -msgstr "" -"Zeige Produktdetails bevor der Vorverkauf startet und nachdem er beendet ist." - -#: pretix/control/views/event.py:66 -msgid "Show start date" -msgstr "Beginn des Vorverkaufszeitraums anzeigen" - -#: pretix/control/views/event.py:67 -msgid "Show the presale start date before presale has started" -msgstr "" -"Zeige das Startdatum des Vorverkaufes bevor der Verkaufszeitraum beginnt" - -#: pretix/control/views/event.py:71 -msgid "Last date of payments" -msgstr "Datum des letzten möglichen Zahlungseingangs" - -#: pretix/control/views/event.py:72 -msgid "" -"The last date any payments are accepted. This has precedence over the number " -"of days configured above." -msgstr "" -"Das Datum, bis zu dem Zahlungseingänge akzeptiert werden. Diese Einstellung " -"hat Vorrang über der oben eingestellten Anzahl an Tagen" - -#: pretix/control/views/event.py:77 -msgid "Accept late payments" -msgstr "Späte Zahlungen akzeptieren" - -#: pretix/control/views/event.py:78 -msgid "" -"Accept payments that come after the end of the order's payment term. " -"Payments will only be accepted if the regarding quotas have remaining " -"capacity. No payments will be accepted after the 'Last date of payments' " -"configured above." -msgstr "" -"Akzeptiere Zahlungen, die nach Ablauf der Zahlungsfrist eingehen. Zahlungen " -"werden nur akzeptiert, wenn die betreffenden Kontingente noch nicht leer " -"sind. Keine Bezahlungen werden nach dem oben angegebenen „letzten " -"Zahlungsdatum“ akzeptiert." - -#: pretix/control/views/event.py:85 -msgid "Last date of modifications" -msgstr "Letzes Änderungsdatum" - -#: pretix/control/views/event.py:86 -msgid "" -"The last date users can modify details of their orders, such as attendee " -"names or answers to questions." -msgstr "" -"Das späteste Datum, zu dem Benutzer die Details ihrer Bestellung (z.B. Namen " -"oder Antworten zu Fragen) verändern können." - -#: pretix/control/views/event.py:92 pretix/control/views/user.py:38 -msgid "Default timezone" -msgstr "Standardzeitzone" - -#: pretix/control/views/event.py:96 -msgid "Available langauges" -msgstr "Verfügbare Sprachen" - -#: pretix/control/views/event.py:100 -msgid "Default language" -msgstr "Standardsprache" - -#: pretix/control/views/event.py:103 -msgid "Require e-mail adresses" -msgstr "E-Mail-Adresse erfordern" - -#: pretix/control/views/event.py:104 -msgid "Require all customers to provide an e-mail address." -msgstr "Erfordere eine E-Mail-Adresse von allen Käufern." - -#: pretix/control/views/event.py:108 -msgid "Ask for attendee names" -msgstr "Namen der Teilnehmer erfragen" - -#: pretix/control/views/event.py:109 -msgid "Ask for a name for all tickets which include admission to the event." -msgstr "Frage für alle Eintritts-Tickets nach dem Namen des Teilnehmers." - -#: pretix/control/views/event.py:113 -msgid "Require attendee names" -msgstr "Namen des Teilnehmer erfordern" - -#: pretix/control/views/event.py:114 -msgid "Require customers to fill in the names of all attendees." -msgstr "Erfordere die Eingabe aller Teilnehmer-Namen." - -#: pretix/control/views/event.py:119 -msgid "Maximum number of items per order" -msgstr "Maximale Anzahl Produkte pro Bestellung" - -#: pretix/control/views/event.py:123 -msgid "Reservation period" -msgstr "Reservierungszeitraum" - -#: pretix/control/views/event.py:124 -msgid "" -"The number of minutes the items in a user's card are reserved for this user." -msgstr "" -"Die Dauer in Minuten, die Produkte im Warenkorb eines Benutzers reserviert " -"werden." - -#: pretix/control/views/event.py:127 -msgid "Sender address" -msgstr "Absender-Adresse" - -#: pretix/control/views/event.py:128 -msgid "Sender address for outgoing e-mails" -msgstr "Absender-Adresse für ausgehende E-Mails" - -#: pretix/control/views/event.py:245 pretix/control/views/event.py:338 -msgid "This field is required." -msgstr "Dieses Feld ist erforderlich." - #: pretix/control/views/event.py:311 -msgid "Use feature" -msgstr "Funktion benutzen" - -#: pretix/control/views/event.py:312 -msgid "Use pretix to generate tickets for the user to download and print out." +msgid "There is no user with the email address you entered." msgstr "" -"Wenn diese Funktion aktiviert ist, generiert pretix Tickets, die der " -"Benutzer herunterladen und ausdrucken kann." +"Es existiert kein Benutzer mit der E-Mail-Adresse, die Sie eingegeben haben." #: pretix/control/views/event.py:316 -msgid "Download date" -msgstr "Download-Datum" +msgid "This user already has permissions for this event." +msgstr "Dieser Benutzer hat bereits Zugriff auf diese Veranstaltung." -#: pretix/control/views/event.py:317 -msgid "Ticket download will be offered after this date." -msgstr "Der Ticket-Download wird zu diesem Zeitpunkt freigeschaltet." +#: pretix/control/views/event.py:322 +msgid "You cannot remove your own permission to view this page." +msgstr "Sie können Ihre eigene Berechtigung nicht entfernen." -#: pretix/control/views/forms.py:176 -msgid "not applicable" -msgstr "nicht anwendbar" +#: pretix/control/views/event.py:329 +msgid "Your changes could not be saved." +msgstr "Die Änderungen konnten nicht gespeichert werden." -#: pretix/control/views/forms.py:184 -msgid "Select all" -msgstr "Alle auswählen" +#: pretix/control/views/item.py:51 +msgid "The requested product does not exist." +msgstr "Das ausgewählte Produkt existiert nicht." -#: pretix/control/views/forms.py:185 -msgid "Deselect all" -msgstr "Keine auswählen" +#: pretix/control/views/item.py:64 +msgid "The order of items as been updated." +msgstr "Die Reihenfolge der Produkte wurde gespeichert." -#: pretix/control/views/item.py:69 +#: pretix/control/views/item.py:96 pretix/control/views/item.py:130 +#: pretix/control/views/item.py:183 +msgid "The requested product category does not exist." +msgstr "Die ausgewählte Kategorie existiert nicht." + +#: pretix/control/views/item.py:106 msgid "The selected category has been deleted." msgstr "Die ausgewählte Kategorie wurde gelöscht." -#: pretix/control/views/item.py:118 +#: pretix/control/views/item.py:158 msgid "The new category has been created." msgstr "Eine neue Kategorie wurde erstellt." -#: pretix/control/views/item.py:302 +#: pretix/control/views/item.py:196 +msgid "The order of categories as been updated." +msgstr "Die Reihenfolge der Kategorien wurde gespeichert." + +#: pretix/control/views/item.py:240 pretix/control/views/item.py:367 +msgid "The requested property does not exist." +msgstr "Die ausgewählte Eigenschaft existiert nicht." + +#: pretix/control/views/item.py:331 msgid "The new property has been created." msgstr "Eine neue Eigenschaft wurde erstellt." -#: pretix/control/views/item.py:342 +#: pretix/control/views/item.py:374 msgid "The selected property has been deleted." msgstr "Die ausgewählte Eigenschaft wurde gelöscht." -#: pretix/control/views/item.py:396 +#: pretix/control/views/item.py:408 pretix/control/views/item.py:442 +msgid "The requested question does not exist." +msgstr "Die ausgewählte Frage existiert nicht." + +#: pretix/control/views/item.py:419 msgid "The selected question has been deleted." msgstr "Die ausgewählte Frage wurde gelöscht." -#: pretix/control/views/item.py:444 +#: pretix/control/views/item.py:470 msgid "The new question has been created." msgstr "Eine neue Frage wurde erstellt." -#: pretix/control/views/item.py:477 -msgid "Activate for" -msgstr "aktiviert für" - -#: pretix/control/views/item.py:484 -msgid "Activate" -msgstr "aktiviert" - -#: pretix/control/views/item.py:565 +#: pretix/control/views/item.py:546 msgid "The new quota has been created." msgstr "Ein neues Kontingent wurde erstellt." -#: pretix/control/views/item.py:612 +#: pretix/control/views/item.py:563 pretix/control/views/item.py:588 +msgid "The requested quota does not exist." +msgstr "Das ausgewählte Kontingent existiert nicht." + +#: pretix/control/views/item.py:599 msgid "The selected quota has been deleted." msgstr "Das ausgewählte Kontingent wurde gelöscht." -#: pretix/control/views/main.py:33 -msgid "" -"You already used this slug for a different event. Please choose a new one." -msgstr "" -"Sie haben diese Kurzform bereits für eine andere Veranstaltung benutzt. " -"Bitte wählen Sie eine andere." +#: pretix/control/views/item.py:622 +msgid "The requested item does not exist." +msgstr "Das ausgewählte Produkt existiert nicht." -#: pretix/control/views/main.py:91 +#: pretix/control/views/main.py:59 msgid "The new event has been created." msgstr "Eine neue Veranstaltung wurde erstellt." -#: pretix/control/views/orders.py:121 +#: pretix/control/views/orders.py:115 msgid "The order has been marked as paid." msgstr "Die Bestellung wurde als bezahlt markiert." -#: pretix/control/views/orders.py:126 +#: pretix/control/views/orders.py:120 msgid "The order has been cancelled." msgstr "Die Bestellung wurde storniert." -#: pretix/control/views/orders.py:132 +#: pretix/control/views/orders.py:126 msgid "The order has been marked as not paid." msgstr "Die Bestellung wurde als unbezahlt markiert." -#: pretix/control/views/orders.py:162 pretix/control/views/orders.py:188 +#: pretix/control/views/orders.py:156 pretix/control/views/orders.py:182 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:173 +#: pretix/control/views/orders.py:167 msgid "The payment term has been changed." msgstr "Die Zahlungsfrist wurde geändert." -#: pretix/control/views/organizer.py:30 -msgid "This slug is already in use. Please choose a different one." -msgstr "" -"Diese Kurzform ist bereits in Verwendung, bitte wählen Sie eine andere." +#: pretix/control/views/orders.py:261 +msgid "Uncategorized" +msgstr "Unkategorisiert" -#: pretix/control/views/organizer.py:89 +#: pretix/control/views/organizer.py:59 msgid "The new organizer has been created." msgstr "Ein neuer Veranstalter wurde erstellt." -#: pretix/control/views/user.py:16 -msgid "" -"There already is an account associated with this e-mail address. Please " -"choose a different one." -msgstr "" -"Diese E-Mail-Adresse ist bereits mit einem anderen Benutzer verknüpft. Bitte " -"wählen Sie eine andere." - -#: pretix/control/views/user.py:18 -msgid "" -"Please enter your current password if you want to change your e-mail address " -"or password." -msgstr "" -"Bitte geben Sie Ihr aktuelles Passwort ein, um Ihre E-Mail-Adresse oder Ihr " -"Passwort zu ändern." - -#: pretix/control/views/user.py:20 -msgid "The current password you entered was not correct." -msgstr "Das eingegebene aktuelle Passwort war nicht korrekt." - -#: pretix/control/views/user.py:21 pretix/presale/views/event.py:122 -#: pretix/presale/views/event.py:164 pretix/presale/views/event.py:306 -msgid "Please enter the same password twice" -msgstr "Bitte geben Sie zweimal das selbe Passwort ein." - -#: pretix/control/views/user.py:26 -msgid "Your current password" -msgstr "Aktuelles Passwort" - -#: pretix/control/views/user.py:30 -msgid "New password" -msgstr "Neues Passwort" - -#: pretix/control/views/user.py:34 -msgid "Repeat new password" -msgstr "Neues Passwort wiederholen" - #: pretix/plugins/banktransfer/__init__.py:9 #: pretix/plugins/banktransfer/__init__.py:13 #: pretix/plugins/banktransfer/payment.py:12 @@ -1719,11 +1874,11 @@ msgstr "Bitte überweisen Sie den vollen Betrag auf das folgende Bankkonto:" msgid "Reference code (important):" msgstr "Verwendungszweck (wichtig):" -#: pretix/plugins/banktransfer/views.py:49 +#: pretix/plugins/banktransfer/views.py:50 msgid "The selected orders have been marked as paid." msgstr "Die ausgewählten Bestellungen wurden als bezahlt markiert." -#: pretix/plugins/banktransfer/views.py:51 +#: pretix/plugins/banktransfer/views.py:52 msgid "" "Not all of the selected orders could be marked as paid as some of them have " "expired and the selected items are sold out." @@ -1732,7 +1887,7 @@ msgstr "" "weil manche von Ihnen nach Ablauf der Zahlungsfrist kamen und die " "betreffenden Produkte ausverkauft sind." -#: pretix/plugins/banktransfer/views.py:57 +#: pretix/plugins/banktransfer/views.py:58 msgid "" "We were unable to detect the file type of this import. Please contact " "support for help." @@ -1740,7 +1895,7 @@ msgstr "" "Wir waren nicht in der Lage, den Dateityp dieser Datei zu erkennen. Bitte " "kontaktieren Sie den pretix-Support." -#: pretix/plugins/banktransfer/views.py:71 +#: pretix/plugins/banktransfer/views.py:72 msgid "" "I'm sorry, but we were unable to import this CSV file. Please contact " "support for help." @@ -1748,46 +1903,46 @@ msgstr "" "Der Import dieser CSV-Datei ist fehlgeschlagen. Bitte wenden Sie sich an den " "pretix-Support." -#: pretix/plugins/banktransfer/views.py:76 +#: pretix/plugins/banktransfer/views.py:77 msgid "" "I'm sorry, but we detected this file as empty. Please contact support for " "help." msgstr "Diese Datei war leer. Bitte wenden Sie sich an den pretix-Support." -#: pretix/plugins/banktransfer/views.py:98 +#: pretix/plugins/banktransfer/views.py:99 msgid "You need to select the column containing the payment reference." msgstr "Sie müssen die Spalte auswählen, die den Verwendungszweck enthält." -#: pretix/plugins/banktransfer/views.py:104 +#: pretix/plugins/banktransfer/views.py:105 msgid "We were unable to process your input." msgstr "Wir waren nicht in der Lage, Ihre Eingaben zu verarbeiten." -#: pretix/plugins/banktransfer/views.py:140 +#: pretix/plugins/banktransfer/views.py:141 msgid "No order code detected" msgstr "Keine Bestellnummer erkannt" -#: pretix/plugins/banktransfer/views.py:149 +#: pretix/plugins/banktransfer/views.py:150 msgid "Unknown order code detected" msgstr "Unbekannte Bestellnummer erkannt" -#: pretix/plugins/banktransfer/views.py:156 +#: pretix/plugins/banktransfer/views.py:157 #, python-format msgid "Found wrong amount. Expected: %s" msgstr "Falscher Betrag. Erwartet: %s" -#: pretix/plugins/banktransfer/views.py:159 +#: pretix/plugins/banktransfer/views.py:160 msgid "Valid payment" msgstr "Gültige Zahlung" -#: pretix/plugins/banktransfer/views.py:163 +#: pretix/plugins/banktransfer/views.py:164 msgid "Order has been cancelled" msgstr "Bestellung wurde storniert" -#: pretix/plugins/banktransfer/views.py:167 +#: pretix/plugins/banktransfer/views.py:168 msgid "Order already has been paid" msgstr "Bestellung ist bereits bezahlt" -#: pretix/plugins/banktransfer/views.py:170 +#: pretix/plugins/banktransfer/views.py:171 msgid "Order has been refunded" msgstr "Bestellung wurde zurückerstattet." @@ -1837,16 +1992,16 @@ msgstr "" "PayPal hat die Bezahlung noch nicht bestätigt. Wir informieren Sie, sobald " "die Bezahlung abgeschlossen ist." -#: pretix/plugins/paypal/payment.py:181 pretix/plugins/stripe/payment.py:103 +#: pretix/plugins/paypal/payment.py:181 pretix/plugins/stripe/payment.py:105 msgid "We successfully received your payment. Thank you!" msgstr "Wir haben Ihre Zahlung erfolgreich erhalten. Vielen Dank!" -#: pretix/plugins/paypal/payment.py:209 pretix/plugins/stripe/payment.py:131 +#: pretix/plugins/paypal/payment.py:209 pretix/plugins/stripe/payment.py:133 msgid "The money will be automatically refunded." msgstr "Der Geldbetrag wird automatisch zurückerstattet." #: pretix/plugins/paypal/payment.py:221 pretix/plugins/paypal/payment.py:234 -#: pretix/plugins/stripe/payment.py:143 pretix/plugins/stripe/payment.py:159 +#: pretix/plugins/stripe/payment.py:145 pretix/plugins/stripe/payment.py:161 msgid "" "We were unable to transfer the money back automatically. Please get in touch " "with the customer and transfer it back manually." @@ -1934,19 +2089,19 @@ msgstr "Die PayPal-Bezahlung wurde abgebrochen" msgid "This plugin allows you to receive credit card payments via Stripe" msgstr "Dieses Plugin erlaubt, Kreditkartenzahlungen über Stripe anzunehmen" -#: pretix/plugins/stripe/payment.py:19 +#: pretix/plugins/stripe/payment.py:21 msgid "Credit Card via Stripe" msgstr "Kreditkarte über Stripe" -#: pretix/plugins/stripe/payment.py:27 +#: pretix/plugins/stripe/payment.py:29 msgid "Secret key" msgstr "Geheimer Schlüssel" -#: pretix/plugins/stripe/payment.py:31 +#: pretix/plugins/stripe/payment.py:33 msgid "Publishable key" msgstr "Veröffentlichbarer Schlüssel" -#: pretix/plugins/stripe/payment.py:38 +#: pretix/plugins/stripe/payment.py:40 msgid "" "Please configure a Stripe Webhook to the following endpoint in order to automatically " @@ -1957,16 +2112,16 @@ msgstr "" "automatisch als storniert markiert werden, wenn die Zahlung zurückerstattet " "wird." -#: pretix/plugins/stripe/payment.py:52 +#: pretix/plugins/stripe/payment.py:54 msgid "You may need to enable JavaScript for Stripe payments." msgstr "Sie müssen JavaScript aktivieren, um mit Stripe zu bezahlen." -#: pretix/plugins/stripe/payment.py:86 +#: pretix/plugins/stripe/payment.py:88 #, python-format msgid "Stripe reported an error with your card: %s" msgstr "Stripe meldete einen Fehler: %s" -#: pretix/plugins/stripe/payment.py:91 +#: pretix/plugins/stripe/payment.py:93 msgid "" "We had trouble communicating with Stripe. Please try again and get in touch " "with us if this problem persists." @@ -1975,18 +2130,18 @@ msgstr "" "versuchen Sie es erneut und setzen Sie sich mit uns in Verbindung, wenn das " "Problem fortbesteht." -#: pretix/plugins/stripe/payment.py:96 +#: pretix/plugins/stripe/payment.py:98 msgid "" "We had trouble processing the payment. Please try again and get in touch " "with us if this problem persists." msgstr "Wir konnten die Zahlung nicht verarbeiten." -#: pretix/plugins/stripe/payment.py:107 +#: pretix/plugins/stripe/payment.py:109 #, python-format msgid "Stripe reported an error: %s" msgstr "Stripe meldete einen Fehler: %s" -#: pretix/plugins/stripe/payment.py:154 +#: pretix/plugins/stripe/payment.py:156 msgid "" "We had trouble communicating with Stripe. Please try again and contact " "support if the problem persists." @@ -2086,11 +2241,11 @@ msgstr "PDF-Ticketausgabe" msgid "This plugin allows you to print out tickets as PDF files" msgstr "Dieses Plugin erlaubt, Tickets als PDF-Dateien herunterzuladen" -#: pretix/plugins/ticketoutputpdf/ticketoutput.py:20 +#: pretix/plugins/ticketoutputpdf/ticketoutput.py:15 msgid "PDF output" msgstr "PDF-Ausgabe" -#: pretix/plugins/ticketoutputpdf/ticketoutput.py:21 +#: pretix/plugins/ticketoutputpdf/ticketoutput.py:16 msgid "Download PDF" msgstr "PDF herunterladen" @@ -2124,6 +2279,47 @@ msgstr "Ende des Zeitraums" msgid "Price in time frame" msgstr "Preis im Zeitraum" +#: pretix/presale/forms/auth.py:13 pretix/presale/forms/auth.py:105 +msgid "Username" +msgstr "Benutzername" + +#: pretix/presale/forms/auth.py:15 +msgid "" +"If you registered for multiple events, your username is your email address." +msgstr "" +"Wenn Sie sich dauerhaft registriert haben, ist Ihre E-Mail-Adresse Ihr " +"Benutzername." + +#: pretix/presale/forms/auth.py:26 +msgid "Please enter a correct username and password." +msgstr "" +"Bitte geben Sie eine gültige Kombination aus Benutzername und Passwort ein." + +#: pretix/presale/forms/auth.py:100 +msgid "Please only use characters, numbers or ./+/-/_ in your username." +msgstr "" +"Bitte verwenden Sie nur Buchstaben, Zahlen oder ./+/-/_ in Ihrem " +"Benutzernamen." + +#: pretix/presale/forms/auth.py:101 +msgid "This username is already taken. Please choose a different one." +msgstr "" +"Dieser Benutzername ist bereits in Verwendung, bitte wählen Sie einen " +"anderen." + +#: pretix/presale/forms/auth.py:116 +msgid "E-mail address" +msgstr "E-Mail-Adresse" + +#: pretix/presale/forms/auth.py:188 +msgid "Username or E-mail" +msgstr "Benutzername oder E-Mail" + +#: pretix/presale/forms/auth.py:218 +msgid "We are unable to find a user matching the data you provided." +msgstr "" +"Wir konnten keinen Benutzer finden, der zu den eingegebenen Daten passt." + #: pretix/presale/templates/pretixpresale/email/forgot.txt:1 #, python-format msgid "" @@ -2222,25 +2418,26 @@ msgstr "" "Viele Grüße,\n" "Das %(event)s Team\n" -#: pretix/presale/templates/pretixpresale/event/base.html:35 +#: pretix/presale/templates/pretixpresale/event/base.html:39 #, python-format msgid "Hello, %(name)s!" msgstr "Hallo %(name)s!" -#: pretix/presale/templates/pretixpresale/event/base.html:39 +#: pretix/presale/templates/pretixpresale/event/base.html:43 msgid "My orders" msgstr "Meine Bestellungen" -#: pretix/presale/templates/pretixpresale/event/base.html:41 +#: pretix/presale/templates/pretixpresale/event/base.html:45 msgid "Logout" msgstr "Abmelden" -#: pretix/presale/templates/pretixpresale/event/base.html:44 -#: pretix/presale/templates/pretixpresale/event/login.html:4 -#: pretix/presale/templates/pretixpresale/event/login.html:6 -#: pretix/presale/templates/pretixpresale/event/login.html:31 -msgid "Login" -msgstr "Login" +#: pretix/presale/templates/pretixpresale/event/base.html:65 +msgid "Contact event organizer" +msgstr "Veranstalter kontaktieren" + +#: pretix/presale/templates/pretixpresale/event/base.html:68 +msgid "Imprint" +msgstr "Impressum" #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:4 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:6 @@ -2259,12 +2456,12 @@ msgid "Modify" msgstr "Bearbeiten" #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:19 -#: pretix/presale/templates/pretixpresale/event/index.html:8 +#: pretix/presale/templates/pretixpresale/event/index.html:9 msgid "Your cart" msgstr "Ihr Warenkorb" #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:27 -#: pretix/presale/templates/pretixpresale/event/index.html:15 +#: pretix/presale/templates/pretixpresale/event/index.html:16 #, python-format msgid "The items in your cart are reserved for you for %(minutes)s minutes." msgstr "" @@ -2272,7 +2469,7 @@ msgstr "" "reserviert." #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:31 -#: pretix/presale/templates/pretixpresale/event/index.html:19 +#: pretix/presale/templates/pretixpresale/event/index.html:20 msgid "The items in your cart are no longer reserved for you." msgstr "Die Produkte in Ihrem Warenkorb sind nicht mehr für Sie reserviert." @@ -2307,7 +2504,7 @@ msgstr "" #: pretix/presale/templates/pretixpresale/event/forgot.html:6 #: pretix/presale/templates/pretixpresale/event/recover.html:4 #: pretix/presale/templates/pretixpresale/event/recover.html:6 -#: pretix/presale/views/event.py:393 +#: pretix/presale/views/event.py:184 msgid "Password recovery" msgstr "Passwortwiederherstellung" @@ -2329,35 +2526,39 @@ msgstr "" "Dieses Produkt ist zur Zeit nicht verfügbar, wird es aber evtl. wieder " "werden." -#: pretix/presale/templates/pretixpresale/event/index.html:25 +#: pretix/presale/templates/pretixpresale/event/index.html:3 +msgid "Presale" +msgstr "Vorverkauf" + +#: pretix/presale/templates/pretixpresale/event/index.html:26 msgid "Proceed with checkout" msgstr "Zur Kasse" -#: pretix/presale/templates/pretixpresale/event/index.html:36 +#: pretix/presale/templates/pretixpresale/event/index.html:37 msgid "The presale period for this event is over." msgstr "Der Vorverkaufszeitraum für diese Veranstaltung ist vorüber." -#: pretix/presale/templates/pretixpresale/event/index.html:40 +#: pretix/presale/templates/pretixpresale/event/index.html:41 #, python-format msgid "The presale for this event will start on %(date)s at %(time)s." msgstr "" "Der Vorverkauf für diese Veranstaltung wird am %(date)s um %(time)s Uhr " "beginnen." -#: pretix/presale/templates/pretixpresale/event/index.html:44 +#: pretix/presale/templates/pretixpresale/event/index.html:45 msgid "The presale for this event has not yet started." msgstr "Der Vorverkauf für diese Veranstaltung hat noch nicht begonnen." -#: pretix/presale/templates/pretixpresale/event/index.html:68 +#: pretix/presale/templates/pretixpresale/event/index.html:69 #, python-format msgid "from %(currency)s %(minprice)s" msgstr "ab %(currency)s %(minprice)s" -#: pretix/presale/templates/pretixpresale/event/index.html:74 +#: pretix/presale/templates/pretixpresale/event/index.html:75 msgid "Show variants" msgstr "Varianten zeigen" -#: pretix/presale/templates/pretixpresale/event/index.html:139 +#: pretix/presale/templates/pretixpresale/event/index.html:140 msgid "Add to cart" msgstr "Zum Warenkorb hinzufügen" @@ -2381,11 +2582,6 @@ msgstr "Ich möchte mich nur für diese Veranstaltung registrieren" msgid "I want to create a new account" msgstr "Ich benötige ein neues Konto" -#: pretix/presale/templates/pretixpresale/event/login.html:65 -#: pretix/presale/templates/pretixpresale/event/login.html:95 -msgid "Register" -msgstr "Registrieren" - #: pretix/presale/templates/pretixpresale/event/login.html:79 msgid "I want to create a permanent account" msgstr "Ich möchte mich dauerhaft registrieren" @@ -2395,7 +2591,7 @@ msgid "Order details" msgstr "Bestellung" #: pretix/presale/templates/pretixpresale/event/order.html:7 -#: pretix/presale/views/checkout.py:369 +#: pretix/presale/views/checkout.py:302 #, python-format msgid "Your order: %(code)s" msgstr "Ihre Bestellung: %(code)s" @@ -2453,10 +2649,6 @@ msgstr "Ihre Bestellungen" msgid "Welcome back!" msgstr "Willkommen zurück!" -#: pretix/presale/templates/pretixpresale/event/orders.html:28 -msgid "View details" -msgstr "Details anzeigen" - #: pretix/presale/templates/pretixpresale/event/orders.html:34 msgid "You did not yet place any orders." msgstr "Sie haben noch keine Bestellungen getätigt." @@ -2481,7 +2673,7 @@ msgstr "Sie haben keine Produkte ausgewählt." msgid "Your cart has been updated." msgstr "Ihr Warenkorb wurde aktualisiert." -#: pretix/presale/views/cart.py:87 pretix/presale/views/checkout.py:259 +#: pretix/presale/views/cart.py:87 pretix/presale/views/checkout.py:191 msgid "" "Some of the products you selected were no longer available. Please see below " "for details." @@ -2489,7 +2681,7 @@ msgstr "" "Einige der ausgewählten Produkte waren zwischenzeitlich nicht mehr " "verfügbar, bitte überprüfen Sie Ihren Warenkorb." -#: pretix/presale/views/cart.py:89 pretix/presale/views/checkout.py:261 +#: pretix/presale/views/cart.py:89 pretix/presale/views/checkout.py:193 msgid "" "Some of the products you selected were no longer available in the quantity " "you selected. Please see below for details." @@ -2497,7 +2689,7 @@ msgstr "" "Einige der ausgewählten Produkte waren zwischenzeitlich nicht mehr in der " "gewünschten Anzahl verfügbar, bitte überprüfen Sie Ihren Warenkorb." -#: pretix/presale/views/cart.py:91 pretix/presale/views/checkout.py:265 +#: pretix/presale/views/cart.py:91 pretix/presale/views/checkout.py:197 msgid "" "We were not able to process your request completely as the server was too " "busy. Please try again." @@ -2509,7 +2701,7 @@ msgstr "" msgid "You selected a product which is not available for sale." msgstr "Sie haben ein Produkt ausgewählt, das nicht zum Verkauf steht." -#: pretix/presale/views/cart.py:94 pretix/presale/views/checkout.py:267 +#: pretix/presale/views/cart.py:94 pretix/presale/views/checkout.py:199 #, python-format msgid "You cannot select more than %s items per order" msgstr "Sie können nicht mehr als %s Produkte pro Bestellung auswählen" @@ -2526,16 +2718,20 @@ msgstr "Der Vorverkaufszeitraum ist vorüber." msgid "The products have been successfully added to your cart." msgstr "Die gewählten Produkte wurden Ihrem Warenkorb hinzugefügt." -#: pretix/presale/views/checkout.py:188 pretix/presale/views/order.py:109 +#: pretix/presale/views/checkout.py:118 pretix/presale/views/order.py:108 msgid "" "We had difficulties processing your input. Please review the errors below." msgstr "Wir hatten Schwierigkeiten, Ihre Eingabe zu verarbeiten." -#: pretix/presale/views/checkout.py:195 +#: pretix/presale/views/checkout.py:125 msgid "Your cart is empty" msgstr "Ihr Warenkorb ist leer." -#: pretix/presale/views/checkout.py:263 +#: pretix/presale/views/checkout.py:177 +msgid "Please select a payment method." +msgstr "Bitte wählen Sie eine Zahlungsmethode aus." + +#: pretix/presale/views/checkout.py:195 msgid "" "The price of some of the items in your cart has changed in the meantime. " "Please see below for details." @@ -2543,80 +2739,27 @@ msgstr "" "Der Preis einiger Produkte in Ihrem Warenkorb hat sich zwischenzeitlich " "geändert." -#: pretix/presale/views/checkout.py:290 +#: pretix/presale/views/checkout.py:222 msgid "Your cart is empty." msgstr "Ihr Warenkorb ist leer." -#: pretix/presale/views/checkout.py:293 pretix/presale/views/checkout.py:296 +#: pretix/presale/views/checkout.py:225 pretix/presale/views/checkout.py:228 msgid "The payment information you entered was incomplete." msgstr "Die eingegebenen Zahlungsinformationen sind unvollständig." -#: pretix/presale/views/checkout.py:304 pretix/presale/views/checkout.py:308 +#: pretix/presale/views/checkout.py:236 pretix/presale/views/checkout.py:240 msgid "Please fill in answers to all required questions." msgstr "Bitte füllen Sie Antworten zu allen benötigten Fragen ein." -#: pretix/presale/views/checkout.py:367 +#: pretix/presale/views/checkout.py:300 msgid "Your order has been placed." msgstr "Ihre Bestellung wurde erfolgreich entgegengenommen." -#: pretix/presale/views/event.py:75 pretix/presale/views/event.py:167 -msgid "Username" -msgstr "Benutzername" - -#: pretix/presale/views/event.py:77 -msgid "" -"If you registered for multiple events, your username is your email address." -msgstr "" -"Wenn Sie sich dauerhaft registriert haben, ist Ihre E-Mail-Adresse Ihr " -"Benutzername." - -#: pretix/presale/views/event.py:88 -msgid "Please enter a correct username and password." -msgstr "" -"Bitte geben Sie eine gültige Kombination aus Benutzername und Passwort ein." - -#: pretix/presale/views/event.py:121 -msgid "" -"You already registered with that e-mail address, please use the login form." -msgstr "" -"Sie haben sich bereits mit dieser E-Mail-Adresse registriert, bitte " -"verwenden Sie das Login-Formular." - -#: pretix/presale/views/event.py:125 -msgid "Email address" -msgstr "E-Mail-Adresse" - -#: pretix/presale/views/event.py:134 pretix/presale/views/event.py:187 -#: pretix/presale/views/event.py:314 -msgid "Repeat password" -msgstr "Passwort wiederholen" - -#: pretix/presale/views/event.py:162 -msgid "Please only use characters, numbers or ./+/-/_ in your username." -msgstr "" -"Bitte verwenden Sie nur Buchstaben, Zahlen oder ./+/-/_ in Ihrem " -"Benutzernamen." - -#: pretix/presale/views/event.py:163 -msgid "This username is already taken. Please choose a different one." -msgstr "" -"Dieser Benutzername ist bereits in Verwendung, bitte wählen Sie einen " -"anderen." - -#: pretix/presale/views/event.py:336 -msgid "Username or E-mail" -msgstr "Benutzername oder E-Mail" - -#: pretix/presale/views/event.py:366 -msgid "We are unable to find a user matching the data you provided." -msgstr "" -"Wir konnten keinen Benutzer finden, der zu den eingegebenen Daten passt." - -#: pretix/presale/views/event.py:405 +#: pretix/presale/views/event.py:196 msgid "We sent you an e-mail containing further instructions." msgstr "Wir haben Ihnen eine E-Mail mit weiteren Instruktionen geschickt." -#: pretix/presale/views/event.py:407 +#: pretix/presale/views/event.py:198 msgid "" "We are unable to send you a new password, as you did not enter an e-mail " "address at your registration." @@ -2624,7 +2767,7 @@ msgstr "" "Wir können kein neues Passwort zusenden, da Sie bei der Registrierung keine " "E-Mail-Adresse angegeben haben." -#: pretix/presale/views/event.py:432 +#: pretix/presale/views/event.py:223 msgid "" "You clicked on an invalid link. Please check that you copied the full web " "address into your address bar." @@ -2632,7 +2775,7 @@ msgstr "" "Sie haben auf einen ungültigen Link geklickt. Bitte prüfen Sie nach, dass " "Sie die volle Adresse in Ihre Adresszeile kopiert haben." -#: pretix/presale/views/event.py:434 +#: pretix/presale/views/event.py:225 msgid "" "This password recovery link has expired. Please request a new e-mail and use " "the recovery link within 24 hours." @@ -2640,36 +2783,36 @@ msgstr "" "Dieser Passwort-Wiederherstellungs-Link ist abgelaufen. Bitte fordern Sie " "einen neuen an und benutzen Sie ihn innerhalb von 24 Stunden." -#: pretix/presale/views/event.py:436 +#: pretix/presale/views/event.py:227 msgid "We were unable to find the user you requested a new password for." msgstr "" "Wir konnten den Benutzer, zu dem ein neues Passwort angefordert wurde, nicht " "finden." -#: pretix/presale/views/event.py:480 +#: pretix/presale/views/event.py:271 msgid "You can now login using your new password." msgstr "Sie können sich nun mit Ihrem neuen Passwort anmelden." -#: pretix/presale/views/order.py:38 pretix/presale/views/order.py:103 -#: pretix/presale/views/order.py:120 pretix/presale/views/order.py:139 -#: pretix/presale/views/order.py:153 +#: pretix/presale/views/order.py:35 pretix/presale/views/order.py:102 +#: pretix/presale/views/order.py:119 pretix/presale/views/order.py:138 +#: pretix/presale/views/order.py:152 msgid "Unknown order code or order does belong to another user." msgstr "" "Unbekannte Bestellnummer oder Bestellung gehört einem anderen Benutzer." -#: pretix/presale/views/order.py:105 pretix/presale/views/order.py:122 +#: pretix/presale/views/order.py:104 pretix/presale/views/order.py:121 msgid "You cannot modify this order" msgstr "Sie können diese Bestellung nicht bearbeiten" -#: pretix/presale/views/order.py:141 pretix/presale/views/order.py:155 +#: pretix/presale/views/order.py:140 pretix/presale/views/order.py:154 msgid "You cannot cancel this order" msgstr "Sie können diese Bestellung nicht stornieren" -#: pretix/presale/views/order.py:184 +#: pretix/presale/views/order.py:182 msgid "You requested an invalid ticket output type." msgstr "Sie haben einen ungültigen Ausgabetyp gewählt." -#: pretix/presale/views/order.py:187 +#: pretix/presale/views/order.py:185 msgid "Order is not paid." msgstr "Bestellung ist nicht bezahlt." @@ -2677,16 +2820,28 @@ msgstr "Bestellung ist nicht bezahlt." msgid "Ticket download is not (yet) enabled." msgstr "Der Ticket-Download ist (noch) nicht freigeschaltet." -#: pretix/settings.py:125 +#: pretix/settings.py:133 msgid "English" msgstr "Englisch" -#: pretix/settings.py:126 +#: pretix/settings.py:134 msgid "German" msgstr "Deutsch" -#~ msgid "The presale period not yet started." -#~ msgstr "Der Vorverkaufszeitraum hat noch nicht begonnen." +#~ msgid "The two password fields didn't match." +#~ msgstr "Die beiden eingegebenen Passwörter stimmen nicht überein." + +#~ msgid "Password confirmation" +#~ msgstr "Passwort bestätigen" + +#~ msgid "Enter the same password as above, for verification." +#~ msgstr "Geben Sie zur Bestätigung das selbe Passwort wie oben ein" + +#~ msgid "Personal info" +#~ msgstr "Persönliche Daten" + +#~ msgid "Locale" +#~ msgstr "Sprache" #~ msgid "Create item" #~ msgstr "Produkt erstellen" diff --git a/src/pretix/base/forms.py b/src/pretix/base/forms.py index e6ba80653..a24e89fc7 100644 --- a/src/pretix/base/forms.py +++ b/src/pretix/base/forms.py @@ -75,8 +75,8 @@ class SettingsForm(forms.Form): This form is meant to be used for modifying Event- or OrganizerSettings """ BOOL_CHOICES = ( - ('True', _('enabled')), ('False', _('disabled')), + ('True', _('enabled')), ) def __init__(self, *args, **kwargs): diff --git a/src/pretix/base/migrations/0004_eventpermission_can_change_permissions.py b/src/pretix/base/migrations/0004_eventpermission_can_change_permissions.py new file mode 100644 index 000000000..fbfec7b01 --- /dev/null +++ b/src/pretix/base/migrations/0004_eventpermission_can_change_permissions.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('pretixbase', '0003_auto_20150602_2232'), + ] + + operations = [ + migrations.AddField( + model_name='eventpermission', + name='can_change_permissions', + field=models.BooleanField(default=True, verbose_name='Can change permissions'), + ), + ] diff --git a/src/pretix/base/models.py b/src/pretix/base/models.py index 9f95267c0..8c8731b2b 100644 --- a/src/pretix/base/models.py +++ b/src/pretix/base/models.py @@ -1,4 +1,4 @@ -from datetime import datetime +from datetime import datetime, timedelta from itertools import product import copy import uuid @@ -538,6 +538,10 @@ class EventPermission(Versionable): default=True, verbose_name=_("Can view orders") ) + can_change_permissions = models.BooleanField( + default=True, + verbose_name=_("Can change permissions") + ) can_change_orders = models.BooleanField( default=True, verbose_name=_("Can change orders") @@ -1399,8 +1403,9 @@ class Quota(Versionable): for i in range(retries): dt = now() updated = Quota.objects.current.filter( - identity=self.identity, locked__isnull=True, - version_end_date__isnull=True + Q(identity=self.identity) + & Q(Q(locked__lt=dt - timedelta(seconds=120)) | Q(locked__isnull=True)) + & Q(version_end_date__isnull=True) ).update( locked=dt ) diff --git a/src/pretix/base/payment.py b/src/pretix/base/payment.py index aa3ff5dbb..d26dc61ed 100644 --- a/src/pretix/base/payment.py +++ b/src/pretix/base/payment.py @@ -98,10 +98,9 @@ class BasePaymentProvider: """ return OrderedDict([ ('_enabled', - forms.ChoiceField( + forms.BooleanField( label=_('Enable payment method'), required=False, - choices=SettingsForm.BOOL_CHOICES, )), ('_fee_abs', forms.DecimalField( diff --git a/src/pretix/base/settings.py b/src/pretix/base/settings.py index 55aa70ace..3fc3b6a05 100644 --- a/src/pretix/base/settings.py +++ b/src/pretix/base/settings.py @@ -81,6 +81,14 @@ DEFAULTS = { 'default': None, 'type': datetime }, + 'contact_mail': { + 'default': None, + 'type': str + }, + 'imprint_url': { + 'default': None, + 'type': str + }, 'mail_from': { 'default': settings.MAIL_FROM, 'type': str @@ -113,7 +121,7 @@ class SettingsProxy: self._cached_obj = None def _unserialize(self, value, as_type): - if isinstance(value, as_type): + if as_type is not None and isinstance(value, as_type): return value elif value is None: return None @@ -121,7 +129,7 @@ class SettingsProxy: return as_type(value) elif as_type == dict or as_type == list: return json.loads(value) - elif as_type == bool: + elif as_type == bool or value in ('True', 'False'): return value == 'True' elif as_type == datetime: return dateutil.parser.parse(value) @@ -129,9 +137,9 @@ class SettingsProxy: return dateutil.parser.parse(value).date() elif as_type == time: return dateutil.parser.parse(value).time() - elif issubclass(as_type, Versionable): + elif as_type is not None and issubclass(as_type, Versionable): return as_type.objects.current.get(identity=value) - elif issubclass(as_type, Model): + elif as_type is not None and issubclass(as_type, Model): return as_type.objects.get(pk=value) return value @@ -160,8 +168,6 @@ class SettingsProxy: """ if as_type is None and key in DEFAULTS: as_type = DEFAULTS[key]['type'] - elif as_type is None: - as_type = str if key in self._cache(): return self._unserialize(self._cache()[key].value, as_type) diff --git a/src/pretix/base/ticketoutput.py b/src/pretix/base/ticketoutput.py index 752675a10..f12001d6f 100644 --- a/src/pretix/base/ticketoutput.py +++ b/src/pretix/base/ticketoutput.py @@ -86,10 +86,9 @@ class BaseTicketOutput: """ return OrderedDict([ ('_enabled', - forms.ChoiceField( + forms.BooleanField( label=_('Enable output'), required=False, - choices=SettingsForm.BOOL_CHOICES, )), ]) diff --git a/src/pretix/control/forms/auth.py b/src/pretix/control/forms/auth.py new file mode 100644 index 000000000..0b397c1e0 --- /dev/null +++ b/src/pretix/control/forms/auth.py @@ -0,0 +1,83 @@ +from django.contrib.auth.forms import AuthenticationForm as BaseAuthenticationForm +from django import forms +from django.utils.translation import ugettext as _ +from django.contrib.auth import authenticate +from pretix.base.models import User + + +class AuthenticationForm(BaseAuthenticationForm): + """ + The login form, providing an email and password field. The form already implements + validation for correct user data. + """ + email = forms.EmailField(label=_("Email address"), max_length=254) + password = forms.CharField(label=_("Password"), widget=forms.PasswordInput) + username = None + + error_messages = { + 'invalid_login': _("Please enter a correct e-mail address and password."), + 'inactive': _("This account is inactive.") + } + + def __init__(self, request=None, *args, **kwargs): + self.request = request + self.user_cache = None + super(forms.Form, self).__init__(*args, **kwargs) + + def clean(self): + email = self.cleaned_data.get('email') + password = self.cleaned_data.get('password') + + if email and password: + self.user_cache = authenticate(identifier=email.lower(), + password=password) + if self.user_cache is None: + raise forms.ValidationError( + self.error_messages['invalid_login'], + code='invalid_login' + ) + else: + self.confirm_login_allowed(self.user_cache) + + return self.cleaned_data + + +class GlobalRegistrationForm(forms.Form): + error_messages = { + 'duplicate_email': _("You already registered with that e-mail address, please use the login form."), + 'pw_mismatch': _("Please enter the same password twice") + } + email = forms.EmailField( + label=_('Email address'), + required=True + ) + password = forms.CharField( + label=_('Password'), + widget=forms.PasswordInput, + required=True + ) + password_repeat = forms.CharField( + label=_('Repeat password'), + widget=forms.PasswordInput + ) + + def clean(self): + password1 = self.cleaned_data.get('password') + password2 = self.cleaned_data.get('password_repeat') + + if password1 and password1 != password2: + raise forms.ValidationError( + self.error_messages['pw_mismatch'], + code='pw_mismatch', + ) + + return self.cleaned_data + + def clean_email(self): + email = self.cleaned_data['email'] + if User.objects.filter(identifier=email).exists(): + raise forms.ValidationError( + self.error_messages['duplicate_email'], + code='duplicate_email', + ) + return email diff --git a/src/pretix/control/forms/event.py b/src/pretix/control/forms/event.py index 4a699b1f8..bcc428250 100644 --- a/src/pretix/control/forms/event.py +++ b/src/pretix/control/forms/event.py @@ -142,6 +142,15 @@ class EventSettingsForm(SettingsForm): label=_("Reservation period"), help_text=_("The number of minutes the items in a user's card are reserved for this user."), ) + imprint_url = forms.URLField( + label=_("Imprint URL"), + required=False, + ) + contact_mail = forms.EmailField( + label=_("Contact address"), + required=False, + help_text=_("Public email address for contacting the organizer") + ) mail_from = forms.EmailField( label=_("Sender address"), help_text=_("Sender address for outgoing e-mails") diff --git a/src/pretix/control/middleware.py b/src/pretix/control/middleware.py index 2509466b1..34d966899 100644 --- a/src/pretix/control/middleware.py +++ b/src/pretix/control/middleware.py @@ -19,7 +19,8 @@ class PermissionMiddleware: """ EXCEPTIONS = ( - "auth.login" + "auth.login", + "auth.register" ) def process_request(self, request): diff --git a/src/pretix/control/permissions.py b/src/pretix/control/permissions.py index a7918ce2b..ca9fb639d 100644 --- a/src/pretix/control/permissions.py +++ b/src/pretix/control/permissions.py @@ -15,7 +15,7 @@ def event_permission_required(permission): # just a double check, should not ever happen return HttpResponseForbidden() try: - perm = EventPermission.objects.get( + perm = EventPermission.objects.current.get( event=request.event, user=request.user ) @@ -59,7 +59,7 @@ def organizer_permission_required(permission): # just a double check, should not ever happen return HttpResponseForbidden() try: - perm = OrganizerPermission.objects.get( + perm = OrganizerPermission.objects.current.get( organizer=request.organizer, user=request.user ) diff --git a/src/pretix/control/static/pretixcontrol/less/auth.less b/src/pretix/control/static/pretixcontrol/less/auth.less index adfc5e2ac..a91fa5b8f 100644 --- a/src/pretix/control/static/pretixcontrol/less/auth.less +++ b/src/pretix/control/static/pretixcontrol/less/auth.less @@ -25,4 +25,8 @@ footer { .buttons { text-align: right; } + + h3 { + margin-top: 0; + } } diff --git a/src/pretix/control/templates/pretixcontrol/auth/login.html b/src/pretix/control/templates/pretixcontrol/auth/login.html index 386023087..5c54d2777 100644 --- a/src/pretix/control/templates/pretixcontrol/auth/login.html +++ b/src/pretix/control/templates/pretixcontrol/auth/login.html @@ -8,6 +8,10 @@ {% bootstrap_field form.email %} {% bootstrap_field form.password %}
+ + {% trans "Register" %} + + diff --git a/src/pretix/control/templates/pretixcontrol/auth/register.html b/src/pretix/control/templates/pretixcontrol/auth/register.html new file mode 100644 index 000000000..84cc8afa0 --- /dev/null +++ b/src/pretix/control/templates/pretixcontrol/auth/register.html @@ -0,0 +1,22 @@ +{% extends "pretixcontrol/auth/base.html" %} +{% load bootstrap3 %} +{% load i18n %} +{% block content %} + +{% endblock %} diff --git a/src/pretix/control/templates/pretixcontrol/dashboard.html b/src/pretix/control/templates/pretixcontrol/dashboard.html new file mode 100644 index 000000000..879b72ca8 --- /dev/null +++ b/src/pretix/control/templates/pretixcontrol/dashboard.html @@ -0,0 +1,13 @@ +{% extends "pretixcontrol/base.html" %} +{% load i18n %} +{% block title %}{% trans "Dashboard" %}{% endblock %} +{% block content %} +

{% trans "Dashboard" %}

+

+ There is nothing yet to see on this dashboard. If you have any ideas what to put here, just tell us! +

+

+ Probably, you are looking for your events. +

+{% endblock %} diff --git a/src/pretix/control/templates/pretixcontrol/event/base.html b/src/pretix/control/templates/pretixcontrol/event/base.html index 93021e2a4..83b7e5ec2 100644 --- a/src/pretix/control/templates/pretixcontrol/event/base.html +++ b/src/pretix/control/templates/pretixcontrol/event/base.html @@ -22,6 +22,12 @@ {% trans "General" %} +
  • + + {% trans "Permissions" %} + +
  • diff --git a/src/pretix/control/templates/pretixcontrol/event/index.html b/src/pretix/control/templates/pretixcontrol/event/index.html index 6991961f7..1f157c444 100644 --- a/src/pretix/control/templates/pretixcontrol/event/index.html +++ b/src/pretix/control/templates/pretixcontrol/event/index.html @@ -3,4 +3,94 @@ {% block title %}{{ request.event.name }}{% endblock %} {% block content %}

    {{ request.event.name }}

    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    {{ tickets_total }}
    +
    {% trans "Total items ordered" %}
    +
    +
    +
    + + + +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    {{ tickets_revenue }}
    +
    {% trans "Total Revenue" %}
    +
    +
    +
    + + + +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    {{ products_active }}
    +
    {% trans "Active Products" %}
    +
    +
    +
    + + + +
    +
    +
    {% endblock %} diff --git a/src/pretix/control/templates/pretixcontrol/event/payment.html b/src/pretix/control/templates/pretixcontrol/event/payment.html index aafdfa932..638b06a10 100644 --- a/src/pretix/control/templates/pretixcontrol/event/payment.html +++ b/src/pretix/control/templates/pretixcontrol/event/payment.html @@ -6,11 +6,6 @@ {% csrf_token %}
    {% trans "Payment settings" %} - {% if "success" in request.GET %} -
    - {% trans "Your changes have been saved." %} -
    - {% endif %} {% for provider in providers %}
    diff --git a/src/pretix/control/templates/pretixcontrol/event/permissions.html b/src/pretix/control/templates/pretixcontrol/event/permissions.html new file mode 100644 index 000000000..79770a5e8 --- /dev/null +++ b/src/pretix/control/templates/pretixcontrol/event/permissions.html @@ -0,0 +1,57 @@ +{% extends "pretixcontrol/event/settings_base.html" %} +{% load i18n %} +{% load bootstrap3 %} +{% block inside %} +
    + {% csrf_token %} +
    + {% trans "Permissions" %} + {{ formset.management_form }} + + + + + + + + + + + + + + {% for form in formset %} + + + + + + + + + + {% endfor %} + + + + + + + + + +
    {% trans "User" %}{% trans "Change settings" %}{% trans "Change products" %}{% trans "View orders" %}{% trans "Change orders" %}{% trans "Change permissions" %}{% trans "Delete" %}
    {{ form.id }}{{ form.instance.user }}{{ form.can_change_settings }}{{ form.can_change_items }}{{ form.can_view_orders }}{{ form.can_change_orders }}{{ form.can_change_permissions }}{{ form.DELETE }}
    +
    +
    + {% bootstrap_field add_form.user layout='inline' %} +
    +
    +
    {{ add_form.can_change_settings }}{{ add_form.can_change_items }}{{ add_form.can_view_orders }}{{ add_form.can_change_orders }}{{ add_form.can_change_permissions }}
    +
    +
    + +
    +
    +{% endblock %} diff --git a/src/pretix/control/templates/pretixcontrol/event/settings.html b/src/pretix/control/templates/pretixcontrol/event/settings.html index 04e1724e3..f79a7427b 100644 --- a/src/pretix/control/templates/pretixcontrol/event/settings.html +++ b/src/pretix/control/templates/pretixcontrol/event/settings.html @@ -19,6 +19,8 @@ {% bootstrap_field sform.timezone layout="horizontal" %} {% bootstrap_field sform.show_date_to layout="horizontal" %} {% bootstrap_field sform.show_times layout="horizontal" %} + {% bootstrap_field sform.contact_mail layout="horizontal" %} + {% bootstrap_field sform.imprint_url layout="horizontal" %}
    {% trans "Timeline" %} diff --git a/src/pretix/control/templates/pretixcontrol/event/tickets.html b/src/pretix/control/templates/pretixcontrol/event/tickets.html index 91a4d511f..d2c978578 100644 --- a/src/pretix/control/templates/pretixcontrol/event/tickets.html +++ b/src/pretix/control/templates/pretixcontrol/event/tickets.html @@ -3,11 +3,6 @@ {% load bootstrap3 %} {% block inside %}
    - {% if "success" in request.GET %} -
    - {% trans "Your changes have been saved." %} -
    - {% endif %} {% csrf_token %}
    {% trans "Ticket download" %} diff --git a/src/pretix/control/templates/pretixcontrol/events/index.html b/src/pretix/control/templates/pretixcontrol/events/index.html index 48e6a688c..d9af35ee0 100644 --- a/src/pretix/control/templates/pretixcontrol/events/index.html +++ b/src/pretix/control/templates/pretixcontrol/events/index.html @@ -8,25 +8,31 @@ {% trans "Create a new event" %} - - - - - - - - - - - {% for e in events %} - - - - - - - {% endfor %} - -
    {% trans "Event name" %}{% trans "Organizer" %}{% trans "Start date" %}{% trans "End date" %}
    {{ e.name }}{{ e.organizer }}{{ e.get_date_from_display }}{{ e.get_date_to_display }}
    + {% if events|length == 0 %} +

    + {% trans "You currently do not have access to any events." %} +

    + {% else %} + + + + + + + + + + + {% for e in events %} + + + + + + + {% endfor %} + +
    {% trans "Event name" %}{% trans "Organizer" %}{% trans "Start date" %}{% trans "End date" %}
    {{ e.name }}{{ e.organizer }}{{ e.get_date_from_display }}{{ e.get_date_to_display }}
    + {% endif %} {% include "pretixcontrol/pagination.html" %} {% endblock %} diff --git a/src/pretix/control/urls.py b/src/pretix/control/urls.py index 633ef415d..859b0fa96 100644 --- a/src/pretix/control/urls.py +++ b/src/pretix/control/urls.py @@ -6,6 +6,7 @@ from pretix.control.views import main, event, item, auth, orders, user, organize urlpatterns = [ url(r'^logout$', auth.logout, name='auth.logout'), url(r'^login$', auth.login, name='auth.login'), + url(r'^register$', auth.register, name='auth.register'), url(r'^$', main.index, name='index'), url(r'^settings$', user.UserSettings.as_view(), name='user.settings'), url(r'^organizers/$', organizer.OrganizerList.as_view(), name='organizers'), @@ -18,6 +19,7 @@ urlpatterns = [ url(r'^$', event.index, name='event.index'), url(r'^settings/$', event.EventUpdate.as_view(), name='event.settings'), url(r'^settings/plugins$', event.EventPlugins.as_view(), name='event.settings.plugins'), + url(r'^settings/permissions$', event.EventPermissions.as_view(), name='event.settings.permissions'), url(r'^settings/payment$', event.PaymentSettings.as_view(), name='event.settings.payment'), url(r'^settings/tickets$', event.TicketSettings.as_view(), name='event.settings.tickets'), url(r'^items/$', item.ItemList.as_view(), name='event.items'), diff --git a/src/pretix/control/views/auth.py b/src/pretix/control/views/auth.py index 480a396ad..9e3a763fe 100644 --- a/src/pretix/control/views/auth.py +++ b/src/pretix/control/views/auth.py @@ -1,47 +1,9 @@ +from django.conf import settings from django.shortcuts import render, redirect -from django.contrib.auth.forms import AuthenticationForm as BaseAuthenticationForm -from django import forms -from django.utils.translation import ugettext as _ -from django.contrib.auth import authenticate -from django.contrib.auth import login as auth_login +from django.contrib.auth import login as auth_login, authenticate from django.contrib.auth import logout as auth_logout - - -class AuthenticationForm(BaseAuthenticationForm): - """ - The login form, providing an email and password field. The form already implements - validation for correct user data. - """ - email = forms.EmailField(label=_("E-mail address"), max_length=254) - password = forms.CharField(label=_("Password"), widget=forms.PasswordInput) - username = None - - error_messages = { - 'invalid_login': _("Please enter a correct e-mail address and password."), - 'inactive': _("This account is inactive."), - } - - def __init__(self, request=None, *args, **kwargs): - self.request = request - self.user_cache = None - super(forms.Form, self).__init__(*args, **kwargs) - - def clean(self): - email = self.cleaned_data.get('email') - password = self.cleaned_data.get('password') - - if email and password: - self.user_cache = authenticate(identifier=email.lower(), - password=password) - if self.user_cache is None: - raise forms.ValidationError( - self.error_messages['invalid_login'], - code='invalid_login', - ) - else: - self.confirm_login_allowed(self.user_cache) - - return self.cleaned_data +from pretix.base.models import User +from pretix.control.forms.auth import AuthenticationForm, GlobalRegistrationForm def login(request): @@ -73,3 +35,29 @@ def logout(request): """ auth_logout(request) return redirect('control:auth.login') + + +def register(request): + """ + Render and process a basic registration form. + """ + ctx = {} + if request.user.is_authenticated(): + if "next" in request.GET: + return redirect(request.GET.get("next", 'control:index')) + return redirect('control:index') + if request.method == 'POST': + form = GlobalRegistrationForm(data=request.POST) + if form.is_valid(): + user = User.objects.create_global_user( + form.cleaned_data['email'], form.cleaned_data['password'], + locale=request.LANGUAGE_CODE, + timezone=request.timezone if hasattr(request, 'timezone') else settings.TIME_ZONE + ) + user = authenticate(identifier=user.identifier, password=form.cleaned_data['password']) + auth_login(request, user) + return redirect('control:index') + else: + form = GlobalRegistrationForm() + ctx['form'] = form + return render(request, 'pretixcontrol/auth/register.html', ctx) diff --git a/src/pretix/control/views/event.py b/src/pretix/control/views/event.py index c65055333..571d6bd98 100644 --- a/src/pretix/control/views/event.py +++ b/src/pretix/control/views/event.py @@ -1,6 +1,9 @@ from collections import OrderedDict +from django import forms from django.contrib import messages +from django.db.models import Sum +from django.forms import inlineformset_factory, formset_factory, modelformset_factory, BaseInlineFormSet from django.shortcuts import render, redirect from django.utils.functional import cached_property from django.views.generic import FormView @@ -8,8 +11,9 @@ from django.views.generic.base import TemplateView from django.views.generic.detail import SingleObjectMixin from django.utils.translation import ugettext_lazy as _ from django.core.urlresolvers import reverse +from pretix.base.forms import VersionedModelForm from pretix.control.forms.event import ProviderForm, TicketSettingsForm, EventSettingsForm, EventUpdateForm -from pretix.base.models import Event +from pretix.base.models import Event, OrderPosition, Order, Item, EventPermission, User from pretix.base.signals import register_payment_providers, register_ticket_outputs from pretix.control.permissions import EventPermissionRequiredMixin from . import UpdateView @@ -94,13 +98,14 @@ class EventPlugins(EventPermissionRequiredMixin, TemplateView, SingleObjectMixin plugins_active.remove(module) self.object.plugins = ",".join(plugins_active) self.object.save() + messages.success(self.request, _('Your changes have been saved.')) return redirect(self.get_success_url()) def get_success_url(self) -> str: return reverse('control:event.settings.plugins', kwargs={ 'organizer': self.get_object().organizer.slug, 'event': self.get_object().slug, - }) + '?success=true' + }) class PaymentSettings(EventPermissionRequiredMixin, TemplateView, SingleObjectMixin): @@ -153,6 +158,7 @@ class PaymentSettings(EventPermissionRequiredMixin, TemplateView, SingleObjectMi else: success = False if success: + messages.success(self.request, _('Your changes have been saved.')) return redirect(self.get_success_url()) else: return self.get(request) @@ -161,7 +167,7 @@ class PaymentSettings(EventPermissionRequiredMixin, TemplateView, SingleObjectMi return reverse('control:event.settings.payment', kwargs={ 'organizer': self.get_object().organizer.slug, 'event': self.get_object().slug, - }) + '?success=true' + }) class TicketSettings(EventPermissionRequiredMixin, FormView): @@ -170,10 +176,6 @@ class TicketSettings(EventPermissionRequiredMixin, FormView): template_name = 'pretixcontrol/event/tickets.html' permission = 'can_change_settings' - def form_valid(self, form): - form.save() - return super().form_valid(form) - def get_context_data(self, *args, **kwargs) -> dict: context = super().get_context_data(*args, **kwargs) context['providers'] = self.provider_forms @@ -183,7 +185,7 @@ class TicketSettings(EventPermissionRequiredMixin, FormView): return reverse('control:event.settings.tickets', kwargs={ 'organizer': self.request.event.organizer.slug, 'event': self.request.event.slug - }) + '?success=true' + }) def get_form_kwargs(self): kwargs = super().get_form_kwargs() @@ -204,6 +206,8 @@ class TicketSettings(EventPermissionRequiredMixin, FormView): success = False form = self.get_form(self.get_form_class()) if success and form.is_valid(): + form.save() + messages.success(self.request, _('Your changes have been saved.')) return redirect(self.get_success_url()) else: return self.get(request) @@ -232,4 +236,101 @@ class TicketSettings(EventPermissionRequiredMixin, FormView): def index(request, organizer, event): - return render(request, 'pretixcontrol/event/index.html', {}) + ctx = { + 'products_active': Item.objects.current.filter( + event=request.event, + active=True, + ).count(), + 'tickets_total': OrderPosition.objects.current.filter( + order__event=request.event, + item__admission=True + ).count(), + 'tickets_revenue': Order.objects.current.filter( + event=request.event, + status=Order.STATUS_PAID, + ).aggregate(sum=Sum('total'))['sum'], + 'tickets_sold': OrderPosition.objects.current.filter( + order__event=request.event, + order__status=Order.STATUS_PAID, + item__admission=True + ).count() + } + return render(request, 'pretixcontrol/event/index.html', ctx) + + +class EventPermissionForm(VersionedModelForm): + class Meta: + model = EventPermission + fields = ( + 'can_change_settings', 'can_change_items', 'can_change_permissions', 'can_view_orders', + 'can_change_orders' + ) + + +class EventPermissionCreateForm(EventPermissionForm): + user = forms.EmailField(required=False, label=_('User')) + + +class EventPermissions(EventPermissionRequiredMixin, TemplateView): + model = Event + form_class = TicketSettingsForm + template_name = 'pretixcontrol/event/permissions.html' + permission = 'can_change_permissions' + + @cached_property + def formset(self): + fs = modelformset_factory( + EventPermission, + form=EventPermissionForm, + can_delete=True, can_order=False, extra=0 + ) + return fs(data=self.request.POST if self.request.method == "POST" else None, + prefix="formset", + queryset=EventPermission.objects.current.filter(event=self.request.event)) + + @cached_property + def add_form(self): + return EventPermissionCreateForm(data=self.request.POST if self.request.method == "POST" else None, + prefix="add") + + def get_context_data(self, **kwargs): + ctx = super().get_context_data(**kwargs) + ctx['formset'] = self.formset + ctx['add_form'] = self.add_form + return ctx + + def post(self, *args, **kwargs): + if self.formset.is_valid() and self.add_form.is_valid(): + if self.add_form.has_changed(): + try: + self.add_form.instance.user = User.objects.get(identifier=self.add_form.cleaned_data['user']) + self.add_form.instance.user_id = self.add_form.instance.user.id + self.add_form.instance.event = self.request.event + self.add_form.instance.event_id = self.request.event.identity + except User.DoesNotExist: + messages.error(self.request, _('There is no user with the email address you entered.')) + return self.get(*args, **kwargs) + else: + if EventPermission.objects.current.filter(user=self.add_form.instance.user, + event=self.request.event).exists(): + messages.error(self.request, _('This user already has permissions for this event.')) + return self.get(*args, **kwargs) + self.add_form.save() + for form in self.formset.forms: + if form.instance.user_id == self.request.user.pk: + if not form.cleaned_data['can_change_permissions'] or form in self.formset.deleted_forms: + messages.error(self.request, _('You cannot remove your own permission to view this page.')) + return self.get(*args, **kwargs) + + self.formset.save() + messages.success(self.request, _('Your changes have been saved.')) + return redirect(self.get_success_url()) + else: + messages.error(self.request, _('Your changes could not be saved.')) + return self.get(*args, **kwargs) + + def get_success_url(self) -> str: + return reverse('control:event.settings.permissions', kwargs={ + 'organizer': self.request.event.organizer.slug, + 'event': self.request.event.slug + }) diff --git a/src/pretix/control/views/main.py b/src/pretix/control/views/main.py index cacc18d0a..6e0d14a8e 100644 --- a/src/pretix/control/views/main.py +++ b/src/pretix/control/views/main.py @@ -24,7 +24,7 @@ class EventList(ListView): def index(request): - return render(request, 'pretixcontrol/base.html', {}) + return render(request, 'pretixcontrol/dashboard.html', {}) class EventCreateStart(TemplateView): diff --git a/src/pretix/control/views/orders.py b/src/pretix/control/views/orders.py index 2eae453c9..cdd5b430f 100644 --- a/src/pretix/control/views/orders.py +++ b/src/pretix/control/views/orders.py @@ -8,7 +8,7 @@ from django.http import HttpResponse from django.shortcuts import redirect, render from django.utils.functional import cached_property from django.views.generic import ListView, DetailView, TemplateView -from pretix.base.models import Order, Quota, OrderPosition +from pretix.base.models import Order, Quota, OrderPosition, ItemCategory from pretix.base.services.orders import mark_order_paid from pretix.base.signals import register_payment_providers from pretix.control.forms.orders import ExtendForm @@ -258,11 +258,12 @@ class OverView(EventPermissionRequiredMixin, TemplateView): item.num_refunded = sum(var.num_refunded for var in item.all_variations) item.num_paid = sum(var.num_paid for var in item.all_variations) + nonecat = ItemCategory(name=_('Uncategorized')) # Regroup those by category ctx['items_by_category'] = sorted( [ # a group is a tuple of a category and a list of items - (cat, [i for i in items if i.category == cat]) + (cat if cat is not None else nonecat, [i for i in items if i.category == cat]) for cat in set([i.category for i in items]) # insert categories into a set for uniqueness # a set is unsorted, so sort again by category diff --git a/src/pretix/presale/templates/pretixpresale/event/base.html b/src/pretix/presale/templates/pretixpresale/event/base.html index 8e2ae7fc3..3ea5e5521 100644 --- a/src/pretix/presale/templates/pretixpresale/event/base.html +++ b/src/pretix/presale/templates/pretixpresale/event/base.html @@ -61,6 +61,13 @@ {% endblock %}