Compare commits

...
Author SHA1 Message Date
simon 22158bdd59 Merge pull request 'upstream/2026.6.0' (#20) from upstream/2026.6.0 into master
Reviewed-on: CGM_Public/pretix_cgo#20
2026-07-02 18:40:30 +00:00
TechuserUpdatechecker 91bc46c3db Remove gendered language from de/de_Informal translations 2026-07-02 20:37:43 +02:00
TechuserUpdatechecker 8d94ac74f8 Merge branch 'master' into upstream/2026.6.0
# Conflicts:
#	src/pretix/__init__.py
#	src/pretix/base/exporters/reusablemedia.py
#	src/pretix/plugins/reports/accountingreport.py
2026-07-02 20:28:38 +02:00
simon 60af7e5984 Merge pull request 'upstream/2026.5.2' (#19) from upstream/2026.5.2 into master
Reviewed-on: CGM_Public/pretix_cgo#19
2026-07-01 19:27:12 +00:00
TechuserUpdatechecker ce2704f6fd Remove gendered language from de/de_Informal translations 2026-07-01 21:26:32 +02:00
TechuserUpdatechecker 04cecedffb Merge branch 'master' into upstream/2026.5.2 2026-07-01 21:21:43 +02:00
Raphael Michel fd565ecdb2 Bump version to 2026.6.0 2026-07-01 16:33:07 +02:00
Nikita Mitasov f35b13b686 Translations: Update Russian
Currently translated at 18.9% (1200 of 6343 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/ru/

powered by weblate
2026-07-01 16:32:06 +02:00
CVZ-es 550bb675f5 Translations: Update Spanish
Currently translated at 100.0% (260 of 260 strings)

Translation: pretix/pretix (JavaScript parts)
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix-js/es/

powered by weblate
2026-07-01 16:32:06 +02:00
CVZ-es adc9c9d514 Translations: Update Spanish
Currently translated at 100.0% (6343 of 6343 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/es/

powered by weblate
2026-07-01 16:32:06 +02:00
CVZ-es 8441c4bc7a Translations: Update French
Currently translated at 100.0% (260 of 260 strings)

Translation: pretix/pretix (JavaScript parts)
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix-js/fr/

powered by weblate
2026-07-01 16:32:06 +02:00
CVZ-es 97ff252c09 Translations: Update French
Currently translated at 100.0% (6343 of 6343 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/fr/

powered by weblate
2026-07-01 16:32:06 +02:00
CVZ-es d3ca2ac1e5 Translations: Update German
Currently translated at 100.0% (6343 of 6343 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/de/

powered by weblate
2026-07-01 16:32:06 +02:00
Raphael MichelandMira Weller 6eebaaa563 [SECURITY] Hardening for user impersonation feature (CVE-2026-13602)
---------

Co-authored-by: Mira Weller <weller@pretix.eu>
2026-07-01 15:15:43 +02:00
Raphael MichelandMira Weller c9781f012b [SECURITY] Centralize framebreaking logic from payment plugins to core (CVE-2026-13602)
- Add central framebreaker page via safelink helper
- Update paypal, paypal2 and stripe plugins to use central framebreaker
- Add CSP header to cookies.html

---------

Co-authored-by: Mira Weller <weller@pretix.eu>
2026-07-01 15:15:43 +02:00
Mira WellerandRaphael Michel 000bf54105 [SECURITY] Allowlisting and changed salts for safelink and safelink_callback (CVE-2026-13602)
---------

Co-authored-by: Raphael Michel <michel@pretix.eu>
2026-07-01 15:15:43 +02:00
Lukas Bockstaller e42d3d632f filter out the 404 log records from django.request (#6324) 2026-07-01 11:33:04 +02:00
Lukas Bockstaller 3bf5a5e478 include settings attribute during type checking (#6323)
* include settings attribute during type checking

* isort
2026-07-01 11:32:54 +02:00
Raphael Michel 7faf6cfd80 Bump to 2026.5.2 2026-06-25 16:40:44 +02:00
Raphael Michel cdeb3609f3 [SECURITY] Properly escape HTML tags in PDF generation (CVE-2026-57535) 2026-06-25 16:40:28 +02:00
Raphael Michel 53d8aa5679 [SECURITY] Prevent reading of any local files in reportlab (CVE-2026-57535) 2026-06-25 16:40:00 +02:00
Raphael Michel 80601cc013 [SECURITY] Disable outbound and file access for reportlab (CVE-2026-57535) 2026-06-25 16:40:00 +02:00
Mira Weller e2661f304d [SECURITY] Fix reflected XSS in redirection page (CVE-2026-57533) 2026-06-25 16:40:00 +02:00
Mira Weller 71f6ade5d6 [SECURITY] Fix stored XSS in ticket confirmation page (CVE-2026-13225) 2026-06-25 16:40:00 +02:00
Mira Weller e087dd39b8 [SECURITY] Hardening: Don't use |safe on confirm_messages 2026-06-25 16:40:00 +02:00
Mira Weller f3a8ce39f1 [SECURITY] Fix XSS in ticket layout JSON (CVE-2026-57532) 2026-06-25 16:40:00 +02:00
TechuserUpdatechecker 54479f8f32 Update pretix domain 2026-06-20 21:33:05 +02:00
simon 8142cc8b18 Merge pull request 'upstream/2026.5.1' (#18) from upstream/2026.5.1 into master
Reviewed-on: CGM_Public/pretix_cgo#18
2026-06-20 19:21:33 +00:00
TechuserUpdatechecker 87c1232a38 Merge branch 'master' into upstream/2026.5.1 2026-06-20 21:00:06 +02:00
TechuserUpdatechecker f838e29400 Add claude skill 2026-06-20 20:59:23 +02:00
simon bd1e583266 Merge branch 'feature/pretix-oidc-plugin' into master
Adds pretix-oidc plugin to Dockerfile for Keycloak SSO integration.
Plugin is only active when configured (currently cgm72 only).
2026-06-20 20:35:55 +02:00
simonandClaude Sonnet 4.6 7a9640ddca Add pretix-oidc plugin for Keycloak SSO integration
Enables OIDC authentication against Keycloak and automatic team assignment
via claim-based rules (pretix_scanner, pretix_shop, pretix_admin).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 22:10:45 +02:00
Raphael Michel a6c417eb2f Bump version to 2026.5.1 2026-06-09 13:22:17 +02:00
Richard Schreiber 5d449ea313 [SECURITY] Reusable media export: Respect giftcard permissions (CVE-2026-11764) (#6261) 2026-06-09 13:21:41 +02:00
simon f700b57d57 Merge pull request 'upstream/2026.5.0' (#17) from upstream/2026.5.0 into master
Reviewed-on: CGM_Public/pretix_cgo#17
2026-05-31 18:34:40 +00:00
TechuserUpdatecheckerandClaude Sonnet 4.6 9e2ae90b1e Merge master into upstream/2026.5.0
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 20:32:21 +02:00
simon 3ccd0f7cd5 Merge pull request 'upstream/2026.4.1' (#16) from upstream/2026.4.1 into master
Reviewed-on: CGM_Public/pretix_cgo#16
2026-05-16 19:58:34 +00:00
TechuserUpdatecheckerandClaude Sonnet 4.6 51cdb437db Remove gendered language from de/de_Informal translations
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 21:56:20 +02:00
TechuserUpdatechecker 215dc8b48b Merge branch 'master' into upstream/2026.4.1 2026-05-16 21:54:40 +02:00
Raphael Michel f88a560d5f Bump to 2026.4.1 2026-05-04 11:24:26 +02:00
Thomas Göttgens 4019f956a8 Fix Dockerfile syntax for chmod command (#6145) 2026-05-04 11:24:04 +02:00
Raphael Michel c75c847393 Settings: Fix typo in class path to mail backend (#6144) 2026-05-04 11:24:04 +02:00
luelista 4e3d3b1f22 Fix permissions of /pretix in docker container (#6133) 2026-05-04 11:24:04 +02:00
TechuserUpdatecheckerandClaude Sonnet 4.6 e2bf94ff9f Dockerfile: Fix /pretix permissions for nginx on Debian Trixie
Debian Trixie changed the default home directory mode from 0755 to 0700,
causing nginx (www-data) to get 403 Forbidden on all static files.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-03 21:41:06 +02:00
simon a37e6c8270 Merge pull request 'upstream/2026.4.0' (#15) from upstream/2026.4.0 into master
Reviewed-on: CGM_Public/pretix_cgo#15
2026-05-03 19:11:35 +00:00
TechuserUpdatechecker dfe94e09cc Merge with Master 2026-05-03 21:08:58 +02:00
simon d87f7b0072 Merge pull request 'upstream/2026.3.1' (#14) from upstream/2026.3.1 into master
Reviewed-on: CGM_Public/pretix_cgo#14
2026-04-13 09:11:15 +00:00
TechuserUpdatechecker 393cd0235e Update Teilnehmer 2026-04-13 11:07:57 +02:00
TechuserUpdatechecker 7fdc7f3405 Merge with master 2026-04-13 11:05:15 +02:00
Raphael Michel 21d62c5078 Bump version to 2026.3.1 2026-04-08 13:58:36 +02:00
Raphael Michel 988dc112ac [SECURITY] API: Add missing event filter for check-ins 2026-04-08 13:58:23 +02:00
simon 2da8d250c8 Merge pull request 'upstream/2026.2.0' (#13) from upstream/2026.2.0 into master
Reviewed-on: CGM_Public/pretix_cgo#13
2026-03-23 20:25:57 +00:00
TechuserUpdatechecker 02e0fed4a0 Merge branch 'master' into upstream/2026.2.0 2026-03-23 21:19:51 +01:00
simon 932b646fcc Merge pull request 'upstream/v2026.1.0' (#12) from upstream/v2026.1.0 into master
Reviewed-on: CGM_Public/pretix_cgo#12
2026-02-03 21:56:31 +00:00
TechuserUpdatechecker edf1bd08f8 Merge branch 'master' into upstream/v2026.1.0
# Conflicts:
#	src/pretix/__init__.py
2026-02-03 22:56:14 +01:00
simon 09aff627bb Merge pull request 'upstream/2025.10.1' (#11) from upstream/2025.10.1 into master
Reviewed-on: CGM_Public/pretix_cgo#11
2025-12-26 19:38:03 +00:00
TechuserUpdatechecker da87c64ea0 Merge branch 'master' into upstream/2025.10.1 2025-12-26 20:35:13 +01:00
Raphael Michel 5d87f9a26f Bump to 2025.10.1 2025-12-19 13:06:58 +01:00
Raphael Michel 4b5651862c [SECURITY] Prevent access to arbitrary cached files by UUID (CVE-2025-14881) 2025-12-19 13:06:48 +01:00
simon 26f3a92d09 Merge pull request 'upstream/2025.10.0' (#10) from upstream/2025.10.0 into master
Reviewed-on: CGM_Public/pretix_cgo#10
2025-12-18 22:18:53 +00:00
TechuserUpdatechecker d468e0a2b3 Merge master 2025-12-18 23:18:30 +01:00
simon 8de80d5867 Merge pull request 'upstream/2025.9.0.1' (#9) from upstream/2025.9.0.1 into master
Reviewed-on: CGM_Public/pretix_cgo#9
2025-11-09 19:16:53 +00:00
TechuserUpdatechecker ec3272dd7c merge with master 2025-11-09 20:13:46 +01:00
TechuserUpdatechecker 72b14e04c0 Merge with 2025.8.0 2025-10-05 20:58:06 +02:00
philipp 93cb51c7de Merge pull request 'upstream/2025.7.1' (#7) from upstream/2025.7.1 into master
Reviewed-on: simon/pretix_cgo#7
2025-09-16 17:03:57 +00:00
philipp 64b56afe44 Fix language file bug 2025-09-16 19:00:58 +02:00
philipp 8e16c18060 Merge branch 'master' into upstream/2025.7.1 2025-09-16 18:36:21 +02:00
Raphael Michel 2d42c1f166 Bump to 2025.7.1 2025-08-23 10:15:29 +02:00
Raphael Michel e4b8c5da25 Bump hierarkey to 2.0.1 2025-08-23 09:14:06 +02:00
luelista c85b496187 Organizer plugins: Do not show plugins as active if they are inactive on org-level (#5396) 2025-08-23 09:13:56 +02:00
simon b632fa620e Merge pull request 'upstream/2025.6.0' (#6) from upstream/2025.6.0 into master
Reviewed-on: simon/pretix_cgo#6
2025-07-04 20:24:59 +00:00
philipp 04684ed93f Merge pull request 'upstream/2025.5.0' (#5) from upstream/2025.5.0 into master
Reviewed-on: simon/pretix_cgo#5
2025-06-03 16:12:49 +00:00
philipp 466bf49941 Merge branch 'master' into upstream/2025.5.0 2025-06-03 17:51:30 +02:00
philipp e03ec73490 Merge pull request 'upstream/2025.4.0' (#4) from upstream/2025.4.0 into master
Reviewed-on: simon/pretix_cgo#4
2025-05-08 22:05:43 +00:00
philipp 3fda118234 Merge branch 'master' into upstream/2025.4.0 2025-05-08 23:44:59 +02:00
simon 1cb98d0837 Merge pull request 'upstream/2025.3.0' (#3) from upstream/2025.3.0 into master
Reviewed-on: simon/pretix_cgo#3
2025-03-30 20:07:31 +00:00
simon 713e3a40aa Merge pull request 'upstream/2025.2.0' (#2) from upstream/2025.2.0 into master
Reviewed-on: simon/pretix_cgo#2
2025-03-07 22:45:05 +00:00
TechuserUpdatechecker be234edc0f Merge from master 2025-03-07 23:10:21 +01:00
philipp 34efc2d953 Add relevant_orderlist exporter (including bugfixes)
This Exporter has the most useful information in the first rows of the
exported document. Specifically the product and the custom questions.
Other fields are also resorted somewhat to place very useless columns at
the end of the table. See code for details :)
- register relevant_orderlist as separate data_exporter
- sort it with the other order data exporters.
2025-02-12 13:17:21 +01:00
UpdateBot 82366dd6c9 Add debugging Information 2025-02-11 20:48:27 +01:00
UpdateBot 38abad0bf6 Update dockerbuild, use Tag if a tag was pushed, latest otherwise 2025-02-11 20:44:55 +01:00
simon 41817fe080 Merge pull request 'Furhter text udpates' (#1) from release/2025.1.0 into master
Reviewed-on: simon/pretix_cgo#1
2025-02-10 14:49:03 +00:00
simon 6cee467dbd Merge branch 'master' into release/2025.1.0 2025-02-10 14:48:25 +00:00
UpdateBot 931ba73f1d Furhter text udpates 2025-02-10 15:47:21 +01:00
UpdateBot 9179621e72 Use latest tag in master branch 2025-02-05 22:02:20 +01:00
UpdateBot 65c978558e Merge branch 'release/2025.1.0' 2025-02-05 22:01:24 +01:00
UpdateBot f4f090506b Update Texts 2025-02-04 22:11:52 +01:00
41 changed files with 1918 additions and 628 deletions
+202
View File
@@ -0,0 +1,202 @@
Führe den vollständigen Upstream-Merge-Workflow für pretix_cgo durch. Gehe dabei strikt Schritt für Schritt vor und warte an den markierten Stellen auf Bestätigung.
---
## Schritt 1 Master aktualisieren
```bash
git checkout master
git pull
```
---
## Schritt 2 Upstream-Tags holen & neuesten Tag ermitteln
```bash
git fetch upstream --tags
```
Bestimme danach den neuesten upstream-Tag (Format `vYYYY.M.P`, **ohne** das `.0`-Suffix unserer eigenen Tags):
```bash
git tag --sort=-version:refname | grep -E '^v[0-9]+\.[0-9]+\.[0-9]+$' | head -1
```
Merke dir diesen Tag als `UPSTREAM_TAG` (z.B. `v2026.5.0`) und leite daraus den Branch-Namen ab: `upstream/2026.5.0` (ohne führendes `v`).
---
## Schritt 3 Branch erstellen
```bash
git checkout -b upstream/<VERSION> tags/<UPSTREAM_TAG>
# Beispiel: git checkout -b upstream/2026.5.0 tags/v2026.5.0
```
---
## Schritt 4 Master mergen (immer, nicht optional)
```bash
git merge master
```
Bei Merge-Konflikten: Konflikte anzeigen und gemeinsam mit dem Nutzer lösen, bevor es weitergeht.
---
## Schritt 5 Branch pushen & MR anlegen
Push mit Push Option, damit Gitea direkt einen MR anlegt:
```bash
git push --set-upstream origin upstream/<VERSION> -o merge_request.create
```
---
## Schritt 6 Gender-Prüfung in den deutschen Übersetzungen
**Erst nach dem Merge mit master** die folgenden vier Dateien auf gegenderte Sprache prüfen:
- `src/pretix/locale/de/LC_MESSAGES/django.po`
- `src/pretix/locale/de/LC_MESSAGES/djangojs.po`
- `src/pretix/locale/de_Informal/LC_MESSAGES/django.po`
- `src/pretix/locale/de_Informal/LC_MESSAGES/djangojs.po`
Suche in den `msgstr`-Zeilen (und den zugehörigen `msgid`-Zeilen für Kontext) nach folgenden Mustern:
| Muster | Beispiele |
|--------|-----------|
| Binneni mit `*` | `Teilnehmer*in`, `Käufer*innen` |
| Binneni mit `:` | `Teilnehmer:in`, `Käufer:innen` |
| Binneni mit `_` | `Teilnehmer_in`, `Käufer_innen` |
| Binneni mit `(in)` | `Teilnehmer(in)`, `Käufer(innen)` |
| Partizip-Plural auf `-enden` | `Teilnehmenden`, `Helfenden`, `Organisierenden`, `Bestellenden`, `Buchenden`, `Zahlenden` |
**Ausgabe der Befunde:** Zeige für jeden Treffer:
1. Datei + Zeilennummer
2. Den vollständigen `msgstr`-Block (mehrzeilig wenn nötig) als Kontext
3. Den konkreten Vorschlag für die Ersetzung (z.B. `Teilnehmer*in``Teilnehmer`, `Teilnehmenden``Teilnehmer`)
Warte dann auf Freigabe durch den Nutzer, bevor Änderungen vorgenommen werden.
Nach Freigabe: Korrekturen direkt in den Dateien vornehmen und committen:
```bash
git add src/pretix/locale/de/ src/pretix/locale/de_Informal/
git commit -m "Remove gendered language from de/de_Informal translations"
git push
```
---
## Schritt 7 Warten auf Merge-Bestätigung
**Hier pausieren.** Den Nutzer auffordern zu bestätigen, sobald der MR auf Gitea gemergt wurde.
---
## Schritt 8 Master aktualisieren und neuen Tag vergeben
Nach Bestätigung:
```bash
git checkout master
git pull
```
Den neuen Tag ableiten: `<UPSTREAM_TAG>.0` **ohne führendes `v`** (z.B. `v2026.5.0``2026.5.0.0`):
```bash
git tag <VERSION>.0
# Beispiel: git tag 2026.5.0.0
git push origin <VERSION>.0
```
Ausgabe: Bestätigung mit dem neuen Tag und kurzem Status.
---
## Schritt 9 Warten auf Build-Pipeline
Nutze den Gitea MCP Server, um den Pipeline-Lauf für den soeben gepushten Tag zu überwachen:
- **Repo:** `CGM_Public` / `pretix_cgo`
- **Methode:** `mcp__gitea__actions_run_read` mit `method: list_runs`
- Warte, bis ein Run mit dem passenden Ref (`refs/tags/<NEUER_TAG>`) den Status `success` erreicht.
- Prüfe alle ~30 Sekunden erneut und zeige dem Nutzer den aktuellen Status (running / success / failure).
- Bei `failure`: sofort stoppen und dem Nutzer melden.
Erst wenn der Build erfolgreich (`success`) abgeschlossen ist, weitermachen.
---
## Schritt 10 cgm72 GitOps-Update
Im GitOps-Repo unter `../OrtlerstrasseGitOps/` (liegt immer neben dem pretix_cgo-Repo):
1. In `pretix-cgm72/pretix-deployment.yaml` den Image-Tag aktualisieren:
- Suche: `cr.ortlerstrasse.de/cgo/pretix:<ALTER_TAG>`
- Ersetze mit: `cr.ortlerstrasse.de/cgo/pretix:<NEUER_TAG>` (= der in Schritt 8 gesetzte Git-Tag, z.B. `2026.5.0.0`)
2. Committen und pushen (im OrtlerstrasseGitOps-Verzeichnis):
```bash
git -C ../OrtlerstrasseGitOps add pretix-cgm72/pretix-deployment.yaml
git -C ../OrtlerstrasseGitOps commit -m "Update pretix-cgm72 to <NEUER_TAG>"
git -C ../OrtlerstrasseGitOps push
```
Der GitOps-Operator wendet das YAML automatisch via `kubectl apply` an und rollt den Container neu aus.
---
## Schritt 11 cgm72: Container-Neustart abwarten und Loginseite prüfen
Warte, bis der Container neu gestartet ist, und prüfe dann die Loginseite:
- **URL:** `https://anmeldung.christliche-gemeinde.de/`
- **Prüfung:** HTTP 200 und die Seite enthält typische Pretix-Inhalte (z.B. Stichwort „pretix" oder ein Login-Formular im Body)
Methode: Nutze `mcp__claude_ai_Simon_Fetch__fetch_page` (oder `curl -sI`), um die URL alle ~30 Sekunden abzurufen. Erwarte einen kurzen Ausfall während des Neustarts warte danach auf eine erfolgreiche Antwort.
Zeige dem Nutzer das Ergebnis (Status-Code + kurzen Seitenausschnitt als Bestätigung).
---
## Schritt 12 Manuelle Bestätigung für cgm72
**Hier pausieren.** Den Nutzer auffordern zu bestätigen, dass cgm72 korrekt funktioniert (`https://anmeldung.christliche-gemeinde.de/`), bevor mit sola fortgefahren wird.
---
## Schritt 13 sola GitOps-Update
Im GitOps-Repo unter `../OrtlerstrasseGitOps/` (liegt immer neben dem pretix_cgo-Repo):
1. In `pretix-sola/pretix-deployment.yaml` den Image-Tag aktualisieren:
- Suche: `cr.ortlerstrasse.de/cgo/pretix:<ALTER_TAG>`
- Ersetze mit: `cr.ortlerstrasse.de/cgo/pretix:<NEUER_TAG>`
2. Committen und pushen:
```bash
git -C ../OrtlerstrasseGitOps add pretix-sola/pretix-deployment.yaml
git -C ../OrtlerstrasseGitOps commit -m "Update pretix-sola to <NEUER_TAG>"
git -C ../OrtlerstrasseGitOps push
```
---
## Schritt 14 sola: Container-Neustart abwarten und Loginseite prüfen
Warte, bis der Container neu gestartet ist, und prüfe dann die Loginseite:
- **URL:** `https://anmeldung.sola-muenchen.de`
- **Prüfung:** HTTP 200 und die Seite enthält typische Pretix-Inhalte
Methode: wie in Schritt 11.
Ausgabe: Bestätigung mit kurzem Abschluss-Status des gesamten Workflows.
+31
View File
@@ -0,0 +1,31 @@
name: Build Deploy email notification tool
run-name: ${{ gitea.actor }} building new version of the email notification tool
on:
push: # Baut bei jedem Push (Branches + Tags)
workflow_dispatch:
jobs:
Apply-Kubernetes-Resources:
runs-on: podman
steps:
- name: Check out repository code
uses: actions/checkout@v3
- name: Login to Docker Registry
run: podman login -u ${{ secrets.REGISTRY_USERNAME }} -p ${{ secrets.REGISTRY_TOKEN }} cr.ortlerstrasse.de
- name: Set Docker Image Tag
run: |
if [[ "${{ gitea.ref }}" == refs/tags/* ]]; then
echo "TAG_NAME=${{ gitea.ref_name }}" >> $GITHUB_ENV
else
echo "TAG_NAME=latest" >> $GITHUB_ENV
fi
- name: Build Docker image
run: podman build -t cr.ortlerstrasse.de/cgo/pretix:${{ env.TAG_NAME }} .
- name: Push Docker image
run: |
podman push cr.ortlerstrasse.de/cgo/pretix:${{ env.TAG_NAME }}
echo "Image pushed successfully: cr.ortlerstrasse.de/cgo/pretix:${{ env.TAG_NAME }}"
+2 -1
View File
@@ -61,7 +61,8 @@ RUN pip3 install -U \
cd /pretix && \
PRETIX_DOCKER_BUILD=TRUE pip3 install \
-e ".[memcached]" \
gunicorn django-extensions ipython && \
gunicorn django-extensions ipython \
pretix-oidc && \
rm -rf ~/.cache/pip
RUN chmod +x /usr/local/bin/pretix && \
+1 -1
View File
@@ -19,4 +19,4 @@
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
# <https://www.gnu.org/licenses/>.
#
__version__ = "2026.6.0.dev0"
__version__ = "2026.6.0"
+1
View File
@@ -28,5 +28,6 @@ from .items import * # noqa
from .json import * # noqa
from .mail import * # noqa
from .orderlist import * # noqa
from .relevant_orderlist import * # noqa
from .reusablemedia import * # noqa
from .waitinglist import * # noqa
+1 -1
View File
@@ -89,7 +89,7 @@ class OrderListExporter(MultiSheetListExporter):
description = gettext_lazy('Download a spreadsheet of all orders. The spreadsheet will include three sheets, one '
'with a line for every order, one with a line for every order position, and one with '
'a line for every additional fee charged in an order.')
featured = True
featured = False
repeatable_read = False
@cached_property
File diff suppressed because it is too large Load Diff
+7
View File
@@ -40,6 +40,7 @@ import warnings
from collections import Counter, OrderedDict, defaultdict
from datetime import datetime, time, timedelta
from operator import attrgetter
from typing import TYPE_CHECKING
from urllib.parse import urljoin
from zoneinfo import ZoneInfo
@@ -79,10 +80,16 @@ from pretix.helpers.thumb import get_thumbnail
from ..settings import settings_hierarkey
from .organizer import Organizer, Team
if TYPE_CHECKING:
from hierarkey.proxy import HierarkeyProxy
logger = logging.getLogger(__name__)
class EventMixin:
if TYPE_CHECKING:
settings: HierarkeyProxy
def clean(self):
if self.presale_start and self.presale_end and self.presale_start > self.presale_end:
raise ValidationError({'presale_end': _('The end of the presale period has to be later than its start.')})
+7
View File
@@ -35,6 +35,7 @@ import operator
import string
from datetime import date, datetime, time
from functools import reduce
from typing import TYPE_CHECKING
import pytz_deprecation_shim
from django.conf import settings
@@ -61,6 +62,9 @@ from ...helpers.permission_migration import (
from ..settings import settings_hierarkey
from .auth import User
if TYPE_CHECKING:
from hierarkey.proxy import HierarkeyProxy
@settings_hierarkey.add(cache_namespace='organizer')
class Organizer(LoggedModel):
@@ -78,6 +82,9 @@ class Organizer(LoggedModel):
"""
settings_namespace = 'organizer'
if TYPE_CHECKING:
settings: HierarkeyProxy
name = models.CharField(max_length=200,
verbose_name=_("Name"))
slug = models.CharField(
@@ -0,0 +1,28 @@
{% extends "error.html" %}
{% load i18n %}
{% load eventurl %}
{% load urlreplace %}
{% load static %}
{% block content %}
<h1>{% trans "Please continue in a new tab" %}</h1>
<p class="larger">
{% blocktrans trimmed %}
For security reasons, the following step is only possible in a new tab.
{% endblocktrans %}
</p>
<p class="larger">
{% blocktrans trimmed %}
If the new tab did not open automatically, please click the following button:
{% endblocktrans %}
</p>
<div class="text-center">
<a href="{{ url }}"
class="btn btn-primary btn-lg" target="_blank">
<span class="fa fa-external-link-square"></span>
{% trans "Continue in new tab" %}
</a>
{{ url|json_script:"framebreak-url" }}
<script type="text/javascript" src="{% static "pretixbase/js/framebreak.js" %}"></script>
</div>
{% endblock %}
+2 -2
View File
@@ -54,6 +54,7 @@ from markdown.postprocessors import Postprocessor
from markdown.treeprocessors import UnescapeTreeprocessor
from tlds import tld_set
from pretix.base.views.redirect import safelink
from pretix.helpers.format import SafeFormatter, format_map
register = template.Library()
@@ -158,8 +159,7 @@ def safelink_callback(attrs, new=False):
"""
url = html.unescape(attrs.get((None, 'href'), '/'))
if not url_has_allowed_host_and_scheme(url, allowed_hosts=None) and not url.startswith('mailto:') and not url.startswith('tel:'):
signer = signing.Signer(salt='safe-redirect')
attrs[None, 'href'] = reverse('redirect') + '?url=' + urllib.parse.quote(signer.sign(url))
attrs[None, 'href'] = safelink(url)
attrs[None, 'target'] = '_blank'
attrs[None, 'rel'] = 'noopener'
return attrs
+29 -6
View File
@@ -19,6 +19,7 @@
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
# <https://www.gnu.org/licenses/>.
#
import logging
import urllib.parse
from django.core import signing
@@ -26,6 +27,8 @@ from django.http import HttpResponseBadRequest, HttpResponseRedirect
from django.shortcuts import render
from django.urls import reverse
logger = logging.getLogger(__name__)
def _is_samesite_referer(request):
referer = request.headers.get('referer')
@@ -42,11 +45,16 @@ def _is_samesite_referer(request):
def redir_view(request):
signer = signing.Signer(salt='safe-redirect')
framebreak = "framebreak" in request.GET
salt = 'framebreak-safelink-url' if framebreak else 'safelink-url'
try:
url = signer.unsign(request.GET.get('url', ''))
url = signing.Signer(salt=salt).unsign(request.GET.get('url', ''))
except signing.BadSignature:
return HttpResponseBadRequest('Invalid parameter')
try:
# Backwards-compatibility for a change in 2026-06, remove after a while
url = signing.Signer(salt='safe-redirect').unsign(request.GET.get('url', ''))
except signing.BadSignature:
return HttpResponseBadRequest('Invalid parameter')
if not _is_samesite_referer(request):
u = urllib.parse.urlparse(url)
@@ -55,11 +63,26 @@ def redir_view(request):
'url': url,
})
if framebreak:
r = render(request, 'pretixbase/framebreak.html', {
'url': url,
})
r.xframe_options_exempt = True
return r
r = HttpResponseRedirect(url)
r['X-Robots-Tag'] = 'noindex'
return r
def safelink(url):
signer = signing.Signer(salt='safe-redirect')
return reverse('redirect') + '?url=' + urllib.parse.quote(signer.sign(url))
def safelink(url, framebreak=False):
url = str(url)
if not (url.startswith('https://') or url.startswith('http://') or url.startswith("/")):
logger.warning('Invalid URL passed to safelink: %r', url)
return '#invalid-url'
salt = 'framebreak-safelink-url' if framebreak else 'safelink-url'
signer = signing.Signer(salt=salt)
u = reverse('redirect') + '?url=' + urllib.parse.quote(signer.sign(url))
if framebreak:
u += "&framebreak=true"
return u
+1 -1
View File
@@ -212,7 +212,7 @@ class AuditLogMiddleware:
if request.path.startswith(get_script_prefix() + 'control') and request.user.is_authenticated:
if getattr(request.user, "is_hijacked", False):
hijack_history = request.session.get('hijack_history', False)
hijacker = get_object_or_404(User, pk=hijack_history[0])
hijacker = get_object_or_404(User, pk=hijack_history[0]["user"])
ss = hijacker.get_active_staff_session(request.session.get('hijacker_session'))
if ss:
ss.logs.create(
+29 -5
View File
@@ -19,19 +19,22 @@
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
# <https://www.gnu.org/licenses/>.
#
import hmac
import json
from contextlib import contextmanager
from django.conf import settings
from django.contrib import messages
from django.contrib.auth import (
BACKEND_SESSION_KEY, get_user_model, load_backend, login,
BACKEND_SESSION_KEY, HASH_SESSION_KEY, get_user_model, load_backend, login,
logout,
)
from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.auth.views import redirect_to_login
from django.db import transaction
from django.shortcuts import get_object_or_404, redirect
from django.urls import reverse
from django.utils.crypto import get_random_string
from django.utils.crypto import get_random_string, salted_hmac
from django.utils.functional import cached_property
from django.utils.translation import gettext_lazy as _
from django.views import View
@@ -230,7 +233,15 @@ class UserImpersonateView(AdministratorPermissionRequiredMixin, RecentAuthentica
hijacked = self.object
hijack_history = request.session.get("hijack_history", [])
hijack_history.append(request.user._meta.pk.value_to_string(hijacker))
hijack_history.append({
"user": request.user.pk,
# We include the auth_hash, because it is unguessable. So should an attacker gain an attack vector to
# modify hijack_history, they can't just insert or change a user that shouldn't be there. We HMAC it
# again, though, since we also do not want the auth_hash of the admin user to be in the session of an
# unprivileged user to contain the risk if there is some leak of session data.
"auth_hash": salted_hmac(key_salt=b"hijack-history-hash", value=request.session[HASH_SESSION_KEY],
algorithm="sha256", secret=settings.SECRET_KEY).hexdigest(),
})
backend = get_used_backend(request)
backend = f"{backend.__module__}.{backend.__class__.__name__}"
@@ -259,8 +270,21 @@ class UserImpersonateStopView(LoginRequiredMixin, View):
hijs = request.session['hijacker_session']
hijack_history = request.session.get("hijack_history", [])
hijacked = request.user
user_pk = hijack_history.pop()
hijacker = get_object_or_404(get_user_model(), pk=user_pk)
prev_session = hijack_history.pop()
hijacker = get_object_or_404(get_user_model(), pk=prev_session["user"])
expected_hash = salted_hmac(
key_salt=b"hijack-history-hash",
value=hijacker.get_session_auth_hash(),
algorithm="sha256",
secret=settings.SECRET_KEY
).hexdigest()
if not hmac.compare_digest(expected_hash, prev_session["auth_hash"]):
# Could be an attacker-controlled hijack history, but could also be e.g. a password change of the admin user
# that happened during the hijack session
logout(request)
return redirect_to_login(request.get_full_path())
backend = get_used_backend(request)
backend = f"{backend.__module__}.{backend.__class__.__name__}"
with signals.no_update_last_login(), keep_session_age(request.session):
+7
View File
@@ -46,6 +46,13 @@ class RequestIdFilter(logging.Filter):
return True
class SkipNotFoundFilter(logging.Filter):
# Drop the WARNING "Not Found: ..." records django.request emits for 404s
# We have different access logs for that
def filter(self, record):
return getattr(record, 'status_code', None) != 404
class RequestIdMiddleware:
def __init__(self, get_response):
self.get_response = get_response
+95 -79
View File
@@ -5,8 +5,8 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-06-28 14:42+0000\n"
"PO-Revision-Date: 2026-06-28 15:19+0000\n"
"Last-Translator: Raphael Michel <michel@rami.io>\n"
"PO-Revision-Date: 2026-06-29 17:00+0000\n"
"Last-Translator: CVZ-es <damien.bremont@casadevelazquez.org>\n"
"Language-Team: German <https://translate.pretix.eu/projects/pretix/pretix/"
"de/>\n"
"Language: de\n"
@@ -898,7 +898,7 @@ msgstr "Details der Bestellposition"
#: pretix/base/datasync/sourcefields.py:129
msgid "Attendee details"
msgstr "Details Teilnehmer*in"
msgstr "Details Teilnehmer"
#: pretix/base/datasync/sourcefields.py:130 pretix/base/exporters/answers.py:66
#: pretix/base/models/items.py:1777 pretix/control/navigation.py:185
@@ -960,13 +960,13 @@ msgstr "Veranstaltungs- oder Termininformationen"
#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:50
#: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html:36
msgid "Attendee name"
msgstr "Name Teilnehmer*in"
msgstr "Name Teilnehmer"
#: pretix/base/datasync/sourcefields.py:187
#: pretix/base/datasync/sourcefields.py:604
#: pretix/base/datasync/sourcefields.py:628
msgid "Attendee"
msgstr "Teilnehmer*in"
msgstr "Teilnehmer"
#: pretix/base/datasync/sourcefields.py:207
#: pretix/base/exporters/orderlist.py:648 pretix/base/forms/questions.py:713
@@ -977,11 +977,11 @@ msgstr "Teilnehmer*in"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:172
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:175
msgid "Attendee email"
msgstr "E-Mail Teilnehmer*in"
msgstr "E-Mail Teilnehmer"
#: pretix/base/datasync/sourcefields.py:219
msgid "Attendee or order email"
msgstr "E-Mail Teilnehmer*in oder Bestellung"
msgstr "E-Mail Teilnehmer oder Bestellung"
#: pretix/base/datasync/sourcefields.py:232
#: pretix/base/exporters/orderlist.py:649 pretix/base/pdf.py:188
@@ -991,23 +991,23 @@ msgstr "E-Mail Teilnehmer*in oder Bestellung"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:182
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:185
msgid "Attendee company"
msgstr "Teilnehmer*innen-Firma"
msgstr "Teilnehmer-Firma"
#: pretix/base/datasync/sourcefields.py:241
msgid "Attendee address street"
msgstr "Teilnehmer*innen-Adresse: Straße"
msgstr "Teilnehmer-Adresse: Straße"
#: pretix/base/datasync/sourcefields.py:250
msgid "Attendee address ZIP code"
msgstr "Teilnehmer*innen-Adresse: PLZ"
msgstr "Teilnehmer-Adresse: PLZ"
#: pretix/base/datasync/sourcefields.py:259
msgid "Attendee address city"
msgstr "Teilnehmer*innen-Adresse: Stadt"
msgstr "Teilnehmer-Adresse: Stadt"
#: pretix/base/datasync/sourcefields.py:268
msgid "Attendee address country"
msgstr "Teilnehmer*innen-Adresse: Land"
msgstr "Teilnehmer-Adresse: Land"
#: pretix/base/datasync/sourcefields.py:279
#: pretix/base/exporters/orderlist.py:691 pretix/base/pdf.py:346
@@ -1286,7 +1286,7 @@ msgid ""
"Download a ZIP file including all files that have been uploaded by your "
"customers while creating an order."
msgstr ""
"ZIP-Datei mit allen Dateien, die von Kund*innen im Bestellprozess als "
"ZIP-Datei mit allen Dateien, die von Kunden im Bestellprozess als "
"Antwort auf eine Frage hochgeladen wurden."
#: pretix/base/exporters/answers.py:76 pretix/base/exporters/orderlist.py:629
@@ -2256,6 +2256,10 @@ msgstr "Ohne gültige Mitgliedschaft verstecken"
msgid "Order data"
msgstr "Bestelldaten"
#: pretix/base/exporters/relevant_orderlist.py:86
msgid "Order data (sorted by relevance)"
msgstr "Bestelldaten (nach Relevanz sortiert)"
#: pretix/base/exporters/json.py:53
msgid ""
"Download a structured JSON representation of all orders. This might be "
@@ -2273,8 +2277,8 @@ msgid ""
"Download a text file with all email addresses collected either from buyers "
"or from ticket holders."
msgstr ""
"Textdatei mit allen E-Mail-Adressen, die von Käufer*innen und "
"Ticketinhaber*innen eingesammelt wurden."
"Textdatei mit allen E-Mail-Adressen, die von Käufern und "
"Ticketinhaber eingesammelt wurden."
#: pretix/base/exporters/mail.py:76 pretix/plugins/reports/exporters.py:502
#: pretix/plugins/reports/exporters.py:685
@@ -2292,6 +2296,18 @@ msgstr ""
"Bestellposition und das dritte eine Zeile für jede zusätzlich erhobene "
"Gebühr."
#: pretix/base/exporters/relevant_orderlist.py:88
msgid ""
"Download a spreadsheet of all orders. The spreadsheet will include three "
"sheets, one with a line for every order, one with a line for every order "
"position, and one with a line for every additional fee charged in an "
"order. The most relevant data is in the first columns of the tables."
msgstr ""
"Tabelle (Excel oder CSV) mit allen Bestellungen. Das erste Tabellenblatt "
"enthält eine Zeile für jede Bestellung, das zweite eine Zeile für jede "
"Bestellposition und das dritte eine Zeile für jede zusätzlich erhobene "
"Gebühr. Die relevantesten Daten sind in den ersten Spalten der Tabellen."
#: pretix/base/exporters/orderlist.py:102 pretix/base/models/orders.py:336
#: pretix/base/permissions.py:228 pretix/control/navigation.py:267
#: pretix/control/navigation.py:387
@@ -4263,7 +4279,7 @@ msgstr "Bitte wählen Sie einen gültigen Staat aus."
#: pretix/base/modelimport_orders.py:359 pretix/control/forms/filter.py:688
msgid "Attendee email address"
msgstr "Teilnehmer*innen-E-Mail-Adresse"
msgstr "Teilnehmer-E-Mail-Adresse"
#: pretix/base/modelimport_orders.py:375 pretix/base/modelimport_orders.py:386
#: pretix/base/modelimport_orders.py:397 pretix/base/modelimport_orders.py:408
@@ -4275,7 +4291,7 @@ msgstr "Teilnehmer*innen-E-Mail-Adresse"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:193
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:196
msgid "Attendee address"
msgstr "Teilnehmer*innen-Adresse"
msgstr "Teilnehmer-Adresse"
#: pretix/base/modelimport_orders.py:468
msgid "Calculate from product"
@@ -5814,8 +5830,8 @@ msgid ""
"needs to be checked."
msgstr ""
"Wenn diese Option gesetzt ist, wird die Check-in-Anwendung melden, dass "
"dieses Ticket besondere Behandlung braucht. Das ist z.B. für Studierende "
"nützlich, deren Studierendenausweis noch geprüft werden soll."
"dieses Ticket besondere Behandlung braucht. Das ist z.B. für Studenten "
"nützlich, deren Studentenausweis noch geprüft werden soll."
#: pretix/base/models/items.py:670 pretix/base/models/items.py:1261
msgid ""
@@ -6718,8 +6734,8 @@ msgid ""
"cases."
msgstr ""
"Wenn diese Option gesetzt ist, wird die Check-in-Anwendung melden, dass "
"dieses Ticket besondere Behandlung braucht. Das ist z.B. für Studierende "
"nützlich, deren Studierendenausweis noch geprüft werden soll."
"dieses Ticket besondere Behandlung braucht. Das ist z.B. für Studenten "
"nützlich, deren Studentenausweis noch geprüft werden soll."
#: pretix/base/models/orders.py:290
msgid ""
@@ -8209,7 +8225,7 @@ msgstr "Musterfirma GmbH"
#: pretix/base/pdf.py:193
msgid "Full attendee address"
msgstr "Volle Teilnehmer*innen-Adresse"
msgstr "Volle Teilnehmer-Adresse"
#: pretix/base/pdf.py:194
msgid ""
@@ -8227,23 +8243,23 @@ msgstr ""
#: pretix/base/pdf.py:198
msgid "Attendee street"
msgstr "Teilnehmer*innen-Straße"
msgstr "Teilnehmer-Straße"
#: pretix/base/pdf.py:203
msgid "Attendee ZIP code"
msgstr "Teilnehmer*innen-PLZ"
msgstr "Teilnehmer-PLZ"
#: pretix/base/pdf.py:208
msgid "Attendee city"
msgstr "Teilnehmer*innen-Stadt"
msgstr "Teilnehmer-Stadt"
#: pretix/base/pdf.py:213
msgid "Attendee state"
msgstr "Teilnehmer*innen-Bundesstaat"
msgstr "Teilnehmer-Bundesstaat"
#: pretix/base/pdf.py:218
msgid "Attendee country"
msgstr "Teilnehmer*innen-Land"
msgstr "Teilnehmer-Land"
#: pretix/base/pdf.py:230
msgid "Pseudonymization ID (lead scanning)"
@@ -8549,7 +8565,7 @@ msgstr "Herr Mustermann"
#: pretix/plugins/ticketoutputpdf/exporters.py:99
#, python-brace-format
msgid "Attendee name: {part}"
msgstr "Teilnehmer*innenname: {part}"
msgstr "Teilnehmername: {part}"
#: pretix/base/pdf.py:700
msgid "Invoice address name for salutation"
@@ -9475,7 +9491,7 @@ msgstr "Veranstaltungsort: {location}"
#, python-brace-format
msgctxt "invoice"
msgid "Attendee: {name}"
msgstr "Teilnehmer*in: {name}"
msgstr "Teilnehmer: {name}"
#: pretix/base/services/invoices.py:293 pretix/plugins/reports/exporters.py:308
#, python-brace-format
@@ -10405,7 +10421,7 @@ msgstr ""
#: pretix/base/settings.py:375
msgid "Hide prices on attendee ticket page"
msgstr "Preise auf Teilnehmer*innen-Ticket-Seite verstecken"
msgstr "Preise auf Teilnehmer-Ticket-Seite verstecken"
#: pretix/base/settings.py:376
msgid ""
@@ -10415,13 +10431,13 @@ msgid ""
"price."
msgstr ""
"Wenn eine Person mehrere Tickets erwirbt und E-Mails an alle "
"Teilnehmer*innen verschickt werden, wird mit dieser Option der Ticketpreis "
"auf der Ticket-Seite der einzelnen Teilnehmer*innen versteckt. Nur die "
"Teilnehmer verschickt werden, wird mit dieser Option der Ticketpreis "
"auf der Ticket-Seite der einzelnen Teilnehmer versteckt. Nur die "
"Person, welche die Tickets kauft, sieht den Preis."
#: pretix/base/settings.py:394
msgid "Ask for attendee names"
msgstr "Namen der Teilnehmer*innen erfragen"
msgstr "Namen der Teilnehmer erfragen"
#: pretix/base/settings.py:395
msgid "Ask for a name for all personalized tickets."
@@ -10430,11 +10446,11 @@ msgstr ""
#: pretix/base/settings.py:404
msgid "Require attendee names"
msgstr "Namen der Teilnehmer*innen erfordern"
msgstr "Namen der Teilnehmer erfordern"
#: pretix/base/settings.py:405
msgid "Require customers to fill in the names of all attendees."
msgstr "Erfordere die Eingabe aller Teilnehmer*innen-Namen."
msgstr "Erfordere die Eingabe aller Teilnehmer-Namen."
#: pretix/base/settings.py:415
msgid "Ask for email addresses per ticket"
@@ -10965,8 +10981,8 @@ msgid ""
"but no indication of missing payment will be visible on the ticket pages of "
"attendees who did not buy the ticket themselves."
msgstr ""
"Die Box mit Zahlungsinstruktionen wird Ticketkäufer*innen weiter angezeigt, "
"aber Teilnehmer*innen, die ihr Ticket nicht selbst gekauft haben, werden "
"Die Box mit Zahlungsinstruktionen wird Ticketkäufern weiter angezeigt, "
"aber Teilnehmern, die ihr Ticket nicht selbst gekauft haben, werden "
"keine Anzeichen des fehlenden Zahlungseingangs sehen."
#: pretix/base/settings.py:1120
@@ -11464,7 +11480,7 @@ msgstr ""
#: pretix/base/settings.py:1763
msgid "Show number of check-ins to customer"
msgstr "Zeige Anzahl der Check-ins für Kund*innen an"
msgstr "Zeige Anzahl der Check-ins für Kunden an"
#: pretix/base/settings.py:1764
msgid ""
@@ -11475,12 +11491,12 @@ msgid ""
"failed scans will not be counted, and the user will not see the different "
"check-in lists."
msgstr ""
"Wenn diese Option aktiv ist, können Kund*innen selbst sehen, wie oft sie die "
"Wenn diese Option aktiv ist, können Kunden selbst sehen, wie oft sie die "
"Veranstaltung betreten haben. Das ist normalerweise nicht nötig, aber kann "
"nützlich sein, wenn es Tickets gibt, die eine bestimmte Anzahl an Eintritten "
"erlauben, sodass Kund*innen die bisherige Nutzung des Tickets einsehen "
"erlauben, sodass Kunden die bisherige Nutzung des Tickets einsehen "
"können. Ausgänge oder fehlgeschlagene Scans werden nicht angezeigt und die "
"Kund*innen sehen keine Aufschlüsselung verschiedener Check-in-Listen."
"Kunden sehen keine Aufschlüsselung verschiedener Check-in-Listen."
#: pretix/base/settings.py:1777
msgid "Allow users to download tickets"
@@ -11661,7 +11677,7 @@ msgstr ""
#: pretix/base/settings.py:1940 pretix/base/settings.py:1949
msgid "Both the attendee and the person who ordered can make changes"
msgstr ""
"Sowohl Besteller*in als auch Teilnehmer*innen können Änderungen vornehmen"
"Sowohl Besteller als auch Teilnehmer können Änderungen vornehmen"
#: pretix/base/settings.py:1944
msgid "Allow customers to modify their information"
@@ -11769,7 +11785,7 @@ msgstr ""
#: pretix/base/settings.py:2050
msgid "Allow individual attendees to change their ticket"
msgstr "Erlaubt einzelnen Teilnehmer*innen ihr Ticket zu ändern"
msgstr "Erlaubt einzelnen Teilnehmern ihr Ticket zu ändern"
#: pretix/base/settings.py:2051
msgid ""
@@ -11781,7 +11797,7 @@ msgid ""
msgstr ""
"Standardmäßig kann nur die Person, welche die Tickets gekauft hat, "
"Änderungen an der Bestellung vornehmen. Wenn diese Option aktiv ist, können "
"auch einzelne Teilnehmer*innen Änderungen vornehmen. Teilnehmer*innen können "
"auch einzelne Teilnehmer Änderungen vornehmen. Teilnehmer können "
"jedoch immer nur Änderungen vornehmen, welche die Gesamtkosten der "
"Bestellung nicht verändern. Solche Änderungen können nur vom Ticketkäufer "
"vorgenommen werden."
@@ -12078,7 +12094,7 @@ msgid ""
"people."
msgstr ""
"Sie können dieses Feld benutzen, um zusätzliche Informationen mit Ihren "
"Teilnehmer*innen zu teilen, wie z.B. Anreise-Informationen oder den Link zu "
"Teilnehmer zu teilen, wie z.B. Anreise-Informationen oder den Link zu "
"einer digitalen Veranstaltung. Wenn das Feld leer ist, fügen wir automatisch "
"einen Link zum Ticketshop, die Einlass-Uhrzeit und den Veranstalter hier "
"ein. Es sind keine Platzhalter mit sensiblen personenbezogenen Daten "
@@ -12319,8 +12335,8 @@ msgstr ""
"Diese Datei wird an die erste E-Mail angehängt, die wir beim Eingang einer "
"neuen Bestellung verschicken. Sie kann daher mit den Textvorlagen "
"\"Getätigte Bestellung\", \"Kostenlose Bestellung\" oder \"Erhaltene "
"Bestellung\" von oben auftreten. Sie wird ggf. sowohl an Besteller*innen als "
"auch Teilnehmer*innen verschickt. Nicht geeignet zum Versand nicht-"
"Bestellung\" von oben auftreten. Sie wird ggf. sowohl an Besteller als "
"auch Teilnehmer verschickt. Nicht geeignet zum Versand nicht-"
"öffentlicher Informationen, da die Datei unabhängig davon verschickt wird, "
"ob die Bestellung bezahlt oder freigegeben ist. Um zu vermeiden, dass diese "
"wichtige E-Mail nicht ankommt, können nur PDF-Dateien mit maximal {size} MB "
@@ -15656,7 +15672,7 @@ msgstr "Check-in-Status"
#: pretix/control/forms/filter.py:2174
#: pretix/plugins/checkinlists/exporters.py:109
msgid "All attendees"
msgstr "Alle Teilnehmer*innen"
msgstr "Alle Teilnehmer"
#: pretix/control/forms/filter.py:2175
#: pretix/control/templates/pretixcontrol/checkin/index.html:183
@@ -16241,7 +16257,7 @@ msgid ""
"people over 65. This ticket includes access to all parts of the event, "
"except the VIP area."
msgstr ""
"z.B. Dieses reduzierte Ticket ist erhältlich für Vollzeitstudent*innen, "
"z.B. Dieses reduzierte Ticket ist erhältlich für Vollzeitstudent, "
"Arbeitslose und Menschen über 65. Das Ticket enthält Zugang zu allen Teilen "
"der Veranstaltung außer des VIP-Bereiches."
@@ -16555,7 +16571,7 @@ msgstr ""
#: pretix/control/forms/orders.py:167 pretix/control/forms/orders.py:226
#: pretix/control/forms/orders.py:240
msgid "Notify customer by email"
msgstr "Kund*in per E-Mail benachrichtigen"
msgstr "Kunde per E-Mail benachrichtigen"
#: pretix/control/forms/orders.py:174
msgid "Keep a cancellation fee of"
@@ -18114,7 +18130,7 @@ msgstr "Eine individuelle E-Mail wurde verschickt."
#: pretix/control/logdisplay.py:554
msgid "A custom email has been sent to an attendee."
msgstr "Eine individuelle E-Mail wurde an eine Teilnehmer*in verschickt."
msgstr "Eine individuelle E-Mail wurde an einen Teilnehmer verschickt."
#: pretix/control/logdisplay.py:555
msgid ""
@@ -19850,7 +19866,7 @@ msgstr "Terminal-ID"
#: pretix/control/templates/pretixcontrol/boxoffice/payment.html:104
msgid "Card holder"
msgstr "Karteninhaber*in"
msgstr "Karteninhaber"
#: pretix/control/templates/pretixcontrol/boxoffice/payment.html:108
msgid "Card expiration"
@@ -20161,7 +20177,7 @@ msgstr "CSV"
#: pretix/control/templates/pretixcontrol/checkin/index.html:73
msgid "No attendee record was found."
msgstr "Keine passenden Teilnehmer*innen gefunden."
msgstr "Keine passenden Teilnehmer gefunden."
#: pretix/control/templates/pretixcontrol/checkin/index.html:91
#: pretix/control/templates/pretixcontrol/datasync/failed_jobs.html:19
@@ -22972,7 +22988,7 @@ msgid ""
"Only purchases of such products will be considered \"attendees\" for most "
"statistical purposes or within some plugins."
msgstr ""
"Nur Käufe eines solchen Produkts werden als \"Teilnehmer*innen\" gewertet, "
"Nur Käufe eines solchen Produkts werden als \"Teilnehmer\" gewertet, "
"z.B. in Statistiken oder in Funktionen von Erweiterungen."
#: pretix/control/templates/pretixcontrol/item/create.html:39
@@ -23051,7 +23067,7 @@ msgid ""
"The system will not ask for a name or other attendee details. This only "
"affects system-provided fields, you can still add your own questions."
msgstr ""
"Das System wird nicht nach einem Namen oder anderen Teilnehmer*innen-Daten "
"Das System wird nicht nach einem Namen oder anderen Teilnehmer-Daten "
"fragen. Dies betrifft nur vom System bereitgestellte Felder, eigene Fragen "
"können trotzdem hinzugefügt werden."
@@ -25389,7 +25405,7 @@ msgstr "Sonstige Datenexporte"
#: pretix/control/templates/pretixcontrol/orders/export.html:107
#: pretix/control/templates/pretixcontrol/organizers/export.html:107
msgid "Recommended for new users"
msgstr "Empfohlen für neue Benutzer*innen"
msgstr "Empfohlen für neue Benutzer"
#: pretix/control/templates/pretixcontrol/orders/export.html:120
#: pretix/control/templates/pretixcontrol/organizers/export.html:120
@@ -26349,7 +26365,7 @@ msgstr "Domains"
#: pretix/control/templates/pretixcontrol/organizers/edit.html:321
msgid "This dialog is intended for advanced users."
msgstr "Dieser Dialog ist für fortgeschrittene Anwender*innen gedacht."
msgstr "Dieser Dialog ist für fortgeschrittene Anwender gedacht."
#: pretix/control/templates/pretixcontrol/organizers/edit.html:322
msgid ""
@@ -28798,7 +28814,7 @@ msgid ""
"customers. This way, customers will not be able to discover the waiting list."
msgstr ""
"Entsprechend Ihrer Veranstaltungseinstellungen werden ausverkaufte Produkte "
"nicht angezeigt. Dies führt dazu, dass Kund*innen die Warteliste nicht "
"nicht angezeigt. Dies führt dazu, dass Kunden die Warteliste nicht "
"finden können."
#: pretix/control/templates/pretixcontrol/waitinglist/index.html:38
@@ -29109,11 +29125,11 @@ msgstr "Das ausgewählte List wurde gelöscht."
#: pretix/control/views/dashboards.py:115
msgid "Attendees (ordered)"
msgstr "Teilnehmende (bestellt)"
msgstr "Teilnehmer (bestellt)"
#: pretix/control/views/dashboards.py:125
msgid "Attendees (paid)"
msgstr "Teilnehmende (bezahlt)"
msgstr "Teilnehmer (bezahlt)"
#: pretix/control/views/dashboards.py:137
#, python-brace-format
@@ -31197,7 +31213,7 @@ msgstr "PDF-Sammlungen"
#: pretix/plugins/badges/exporters.py:431
msgid "Download all attendee badges as one large PDF for printing."
msgstr "Alle Teilnehmer*innen-Badges in einer großen PDF-Datei für den Druck."
msgstr "Alle Teilnehmer-Badges in einer großen PDF-Datei für den Druck."
#: pretix/plugins/badges/exporters.py:452
#: pretix/plugins/ticketoutputpdf/exporters.py:80
@@ -31477,7 +31493,7 @@ msgstr "Anderes Bankkonto"
#: pretix/plugins/banktransfer/payment.py:85
msgid "Name of account holder"
msgstr "Kontoinhaber*in"
msgstr "Kontoinhaber"
#: pretix/plugins/banktransfer/payment.py:87
msgid ""
@@ -31619,7 +31635,7 @@ msgstr "Bitte überweisen Sie den vollen Betrag auf das folgende Bankkonto:"
#: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_confirm.html:32
#: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_confirm.html:35
msgid "Account holder"
msgstr "Kontoinhaber*in"
msgstr "Kontoinhaber"
#: pretix/plugins/banktransfer/payment.py:304
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:20
@@ -32214,7 +32230,7 @@ msgid ""
"Download a spreadsheet with all attendees that are included in a check-in "
"list."
msgstr ""
"Tabelle (Excel oder CSV) mit allen Teilnehmer*innen, die in einer Check-in-"
"Tabelle (Excel oder CSV) mit allen Teilnehmer, die in einer Check-in-"
"Liste zutrittsberechtigt sind."
#: pretix/plugins/checkinlists/exporters.py:500
@@ -33393,7 +33409,7 @@ msgstr "Geplante E-Mails"
#: pretix/plugins/sendmail/signals.py:122
msgid "Mass email was sent to customers or attendees."
msgstr "Rundmail wurde an Kunden oder Teilnehmer*innen verschickt."
msgstr "Rundmail wurde an Kunden oder Teilnehmer verschickt."
#: pretix/plugins/sendmail/signals.py:123
msgid "Mass email was sent to waiting list entries."
@@ -33425,7 +33441,7 @@ msgstr "Eine automatisierte E-Mail wurde an den Besteller verschickt"
#: pretix/plugins/sendmail/signals.py:142
msgid "A scheduled email was sent to a ticket holder"
msgstr "Eine automatisierte E-Mail wurde an eine Teilnehmer*in verschickt."
msgstr "Eine automatisierte E-Mail wurde an eine Teilnehmer verschickt."
#: pretix/plugins/sendmail/signals.py:143
msgid "An email rule was deleted"
@@ -33458,7 +33474,7 @@ msgstr "Alle nicht eingecheckten Kunden"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/history_fragment_orders.html:23
msgid "Attendee contact addresses"
msgstr "Teilnehmer*innen-E-Mail-Adressen"
msgstr "Teilnehmer-E-Mail-Adressen"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/history_fragment_orders.html:25
msgid "All contact addresses"
@@ -33617,14 +33633,14 @@ msgstr ""
#: pretix/plugins/sendmail/views.py:250
msgid "Orders or attendees"
msgstr "Bestellungen oder Teilnehmer*innen"
msgstr "Bestellungen oder Teilnehmer"
#: pretix/plugins/sendmail/views.py:251
msgid ""
"Send an email to every customer, or to every person a ticket has been "
"purchased for, or a combination of both."
msgstr ""
"Senden Sie eine E-Mail an alle Ticketkäufer*innen, alle Ticketinhaber*innen "
"Senden Sie eine E-Mail an alle Ticketkäufer, alle Ticketinhaber "
"oder eine Kombination aus beiden Gruppen."
#: pretix/plugins/sendmail/views.py:417
@@ -34198,23 +34214,23 @@ msgstr "SEPA-Lastschrift"
#: pretix/plugins/stripe/payment.py:1277
msgid "Account Holder Name"
msgstr "Kontoinhaber*in"
msgstr "Kontoinhaber"
#: pretix/plugins/stripe/payment.py:1282
msgid "Account Holder Street"
msgstr "Straße (Kontoinhaber*in)"
msgstr "Straße (Kontoinhaber)"
#: pretix/plugins/stripe/payment.py:1294
msgid "Account Holder Postal Code"
msgstr "PLZ (Kontoinhaber*in)"
msgstr "PLZ (Kontoinhaber)"
#: pretix/plugins/stripe/payment.py:1306
msgid "Account Holder City"
msgstr "Stadt (Kontoinhaber*in)"
msgstr "Stadt (Kontoinhaber)"
#: pretix/plugins/stripe/payment.py:1318
msgid "Account Holder Country"
msgstr "Land (Kontoinhaber*in)"
msgstr "Land (Kontoinhaber)"
#: pretix/plugins/stripe/payment.py:1362
msgid "Affirm via Stripe"
@@ -34665,7 +34681,7 @@ msgstr "MOTO"
#: pretix/plugins/stripe/templates/pretixplugins/stripe/control.html:64
#: pretix/plugins/stripe/templates/pretixplugins/stripe/control.html:67
msgid "Payer name"
msgstr "Name des Zahlenden"
msgstr "Name des Zahlers"
#: pretix/plugins/stripe/templates/pretixplugins/stripe/control.html:91
msgid "Payment receipt"
@@ -36060,7 +36076,7 @@ msgstr[1] "Das Ticket wurde %(count)s-mal eingelöst."
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:166
msgid "No attendee name provided"
msgstr "Name der teilnehmenden Person nicht angegeben"
msgstr "Name des Teilnehmenrs nicht angegeben"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:219
msgid "The image you previously uploaded"
@@ -37822,12 +37838,12 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/organizers/customer_profiles.html:11
#: pretix/presale/views/customer.py:388
msgid "Attendee profiles"
msgstr "Teilnehmer*innen-Profile"
msgstr "Teilnehmer-Profile"
#: pretix/presale/templates/pretixpresale/organizers/customer_profiles.html:37
msgid "You dont have any attendee profiles in your account yet."
msgstr ""
"In Ihrem Kundenkonto sind noch keine Teilnehmer*innen-Profile gespeichert."
"In Ihrem Kundenkonto sind noch keine Teilnehmer-Profile gespeichert."
#: pretix/presale/templates/pretixpresale/organizers/customer_registration.html:7
msgid "Registration"
@@ -39457,7 +39473,7 @@ msgstr "Kosovo"
#~ "This plugin allows you to generate badges or name tags for your attendees."
#~ msgstr ""
#~ "Diese Erweiterung erlaubt, Namensschilder oder Badges für die "
#~ "Teilnehmer*innen zu erstellen."
#~ "Teilnehmer zu erstellen."
#~ msgid "This plugin allows you to receive payments via PayPal"
#~ msgstr "Dieses Plugin erlaubt, Zahlungen über PayPal anzunehmen"
+2 -2
View File
@@ -162,12 +162,12 @@ msgstr "Bezahlte Bestellungen"
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:27
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:39
msgid "Attendees (ordered)"
msgstr "Teilnehmende (bestellt)"
msgstr "Teilnehmer (bestellt)"
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:27
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:39
msgid "Attendees (paid)"
msgstr "Teilnehmende (bezahlt)"
msgstr "Teilnehmer (bezahlt)"
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:51
msgid "Total revenue"
@@ -900,7 +900,7 @@ msgstr "Details der Bestellposition"
#: pretix/base/datasync/sourcefields.py:129
msgid "Attendee details"
msgstr "Details Teilnehmer*in"
msgstr "Details Teilnehmer"
#: pretix/base/datasync/sourcefields.py:130 pretix/base/exporters/answers.py:66
#: pretix/base/models/items.py:1777 pretix/control/navigation.py:185
@@ -962,13 +962,13 @@ msgstr "Veranstaltungs- oder Termininformationen"
#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:50
#: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html:36
msgid "Attendee name"
msgstr "Name Teilnehmer*in"
msgstr "Name Teilnehmer"
#: pretix/base/datasync/sourcefields.py:187
#: pretix/base/datasync/sourcefields.py:604
#: pretix/base/datasync/sourcefields.py:628
msgid "Attendee"
msgstr "Teilnehmer*in"
msgstr "Teilnehmer"
#: pretix/base/datasync/sourcefields.py:207
#: pretix/base/exporters/orderlist.py:648 pretix/base/forms/questions.py:713
@@ -979,11 +979,11 @@ msgstr "Teilnehmer*in"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:172
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:175
msgid "Attendee email"
msgstr "E-Mail Teilnehmer*in"
msgstr "E-Mail Teilnehmer"
#: pretix/base/datasync/sourcefields.py:219
msgid "Attendee or order email"
msgstr "E-Mail Teilnehmer*in oder Bestellung"
msgstr "E-Mail Teilnehmer oder Bestellung"
#: pretix/base/datasync/sourcefields.py:232
#: pretix/base/exporters/orderlist.py:649 pretix/base/pdf.py:188
@@ -993,23 +993,23 @@ msgstr "E-Mail Teilnehmer*in oder Bestellung"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:182
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:185
msgid "Attendee company"
msgstr "Teilnehmer*innen-Firma"
msgstr "Teilnehmer-Firma"
#: pretix/base/datasync/sourcefields.py:241
msgid "Attendee address street"
msgstr "Teilnehmer*innen-Adresse: Straße"
msgstr "Teilnehmer-Adresse: Straße"
#: pretix/base/datasync/sourcefields.py:250
msgid "Attendee address ZIP code"
msgstr "Teilnehmer*innen-Adresse: PLZ"
msgstr "Teilnehmer-Adresse: PLZ"
#: pretix/base/datasync/sourcefields.py:259
msgid "Attendee address city"
msgstr "Teilnehmer*innen-Adresse: Stadt"
msgstr "Teilnehmer-Adresse: Stadt"
#: pretix/base/datasync/sourcefields.py:268
msgid "Attendee address country"
msgstr "Teilnehmer*innen-Adresse: Land"
msgstr "Teilnehmer-Adresse: Land"
#: pretix/base/datasync/sourcefields.py:279
#: pretix/base/exporters/orderlist.py:691 pretix/base/pdf.py:346
@@ -1288,7 +1288,7 @@ msgid ""
"Download a ZIP file including all files that have been uploaded by your "
"customers while creating an order."
msgstr ""
"ZIP-Datei mit allen Dateien, die von Kund*innen im Bestellprozess als "
"ZIP-Datei mit allen Dateien, die von Kunden im Bestellprozess als "
"Antwort auf eine Frage hochgeladen wurden."
#: pretix/base/exporters/answers.py:76 pretix/base/exporters/orderlist.py:629
@@ -2275,8 +2275,8 @@ msgid ""
"Download a text file with all email addresses collected either from buyers "
"or from ticket holders."
msgstr ""
"Textdatei mit allen E-Mail-Adressen, die von Käufer*innen und "
"Ticketinhaber*innen eingesammelt wurden."
"Textdatei mit allen E-Mail-Adressen, die von Käufer und "
"Ticketinhaber eingesammelt wurden."
#: pretix/base/exporters/mail.py:76 pretix/plugins/reports/exporters.py:502
#: pretix/plugins/reports/exporters.py:685
@@ -4265,7 +4265,7 @@ msgstr "Bitte wähle einen gültigen Staat aus."
#: pretix/base/modelimport_orders.py:359 pretix/control/forms/filter.py:688
msgid "Attendee email address"
msgstr "Teilnehmer*innen-E-Mail-Adresse"
msgstr "Teilnehmer-E-Mail-Adresse"
#: pretix/base/modelimport_orders.py:375 pretix/base/modelimport_orders.py:386
#: pretix/base/modelimport_orders.py:397 pretix/base/modelimport_orders.py:408
@@ -4277,7 +4277,7 @@ msgstr "Teilnehmer*innen-E-Mail-Adresse"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:193
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:196
msgid "Attendee address"
msgstr "Teilnehmer*innen-Adresse"
msgstr "Teilnehmer-Adresse"
#: pretix/base/modelimport_orders.py:468
msgid "Calculate from product"
@@ -5811,8 +5811,8 @@ msgid ""
"needs to be checked."
msgstr ""
"Wenn diese Option gesetzt ist, wird die Check-in-Anwendung melden, dass "
"dieses Ticket besondere Behandlung braucht. Das ist z.B. für Studierende "
"nützlich, deren Studierendenausweis noch geprüft werden soll."
"dieses Ticket besondere Behandlung braucht. Das ist z.B. für Studenten "
"nützlich, deren Studentenausweis noch geprüft werden soll."
#: pretix/base/models/items.py:670 pretix/base/models/items.py:1261
msgid ""
@@ -6715,8 +6715,8 @@ msgid ""
"cases."
msgstr ""
"Wenn diese Option gesetzt ist, wird die Check-in-Anwendung melden, dass "
"dieses Ticket besondere Behandlung braucht. Das ist z.B. für Studierende "
"nützlich, deren Studierendenausweis noch geprüft werden soll."
"dieses Ticket besondere Behandlung braucht. Das ist z.B. für Studenten "
"nützlich, deren Studentenausweis noch geprüft werden soll."
#: pretix/base/models/orders.py:290
msgid ""
@@ -8202,7 +8202,7 @@ msgstr "Musterfirma"
#: pretix/base/pdf.py:193
msgid "Full attendee address"
msgstr "Volle Teilnehmer*innen-Adresse"
msgstr "Volle Teilnehmer-Adresse"
#: pretix/base/pdf.py:194
msgid ""
@@ -8220,23 +8220,23 @@ msgstr ""
#: pretix/base/pdf.py:198
msgid "Attendee street"
msgstr "Teilnehmer*innen-Straße"
msgstr "Teilnehmer-Straße"
#: pretix/base/pdf.py:203
msgid "Attendee ZIP code"
msgstr "Teilnehmer*innen-PLZ"
msgstr "Teilnehmer-PLZ"
#: pretix/base/pdf.py:208
msgid "Attendee city"
msgstr "Teilnehmer*innen-Stadt"
msgstr "Teilnehmer-Stadt"
#: pretix/base/pdf.py:213
msgid "Attendee state"
msgstr "Teilnehmer*innen-Bundesstaat"
msgstr "Teilnehmer-Bundesstaat"
#: pretix/base/pdf.py:218
msgid "Attendee country"
msgstr "Teilnehmer*innen-Land"
msgstr "Teilnehmer-Land"
#: pretix/base/pdf.py:230
msgid "Pseudonymization ID (lead scanning)"
@@ -8542,7 +8542,7 @@ msgstr "Herr Mustermann"
#: pretix/plugins/ticketoutputpdf/exporters.py:99
#, python-brace-format
msgid "Attendee name: {part}"
msgstr "Teilnehmer*innenname: {part}"
msgstr "Teilnehmer: {part}"
#: pretix/base/pdf.py:700
msgid "Invoice address name for salutation"
@@ -9465,7 +9465,7 @@ msgstr "Veranstaltungsort: {location}"
#, python-brace-format
msgctxt "invoice"
msgid "Attendee: {name}"
msgstr "Teilnehmer*in: {name}"
msgstr "Teilnehmer: {name}"
#: pretix/base/services/invoices.py:293 pretix/plugins/reports/exporters.py:308
#, python-brace-format
@@ -10393,7 +10393,7 @@ msgstr ""
#: pretix/base/settings.py:375
msgid "Hide prices on attendee ticket page"
msgstr "Preise auf Teilnehmer*innen-Ticket-Seite verstecken"
msgstr "Preise auf Teilnehmer-Ticket-Seite verstecken"
#: pretix/base/settings.py:376
msgid ""
@@ -10403,13 +10403,13 @@ msgid ""
"price."
msgstr ""
"Wenn eine Person mehrere Tickets erwirbt und E-Mails an alle "
"Teilnehmer*innen verschickt werden, wird mit dieser Option der Ticketpreis "
"auf der Ticket-Seite der einzelnen Teilnehmer*innen versteckt. Nur die "
"Teilnehmer verschickt werden, wird mit dieser Option der Ticketpreis "
"auf der Ticket-Seite der einzelnen Teilnehmer versteckt. Nur die "
"Person, welche die Tickets kauft, sieht den Preis."
#: pretix/base/settings.py:394
msgid "Ask for attendee names"
msgstr "Namen der Teilnehmer*innen erfragen"
msgstr "Namen der Teilnehmer erfragen"
#: pretix/base/settings.py:395
msgid "Ask for a name for all personalized tickets."
@@ -10418,11 +10418,11 @@ msgstr ""
#: pretix/base/settings.py:404
msgid "Require attendee names"
msgstr "Namen der Teilnehmer*innen erfordern"
msgstr "Namen der Teilnehmer erfordern"
#: pretix/base/settings.py:405
msgid "Require customers to fill in the names of all attendees."
msgstr "Erfordere die Eingabe aller Teilnehmer*innen-Namen."
msgstr "Erfordere die Eingabe aller Teilnehmer-Namen."
#: pretix/base/settings.py:415
msgid "Ask for email addresses per ticket"
@@ -10444,7 +10444,7 @@ msgstr ""
"aktivierst, fragt das System zusätzlich nach einzelnen E-Mail-Adressen für "
"jedes personalisierte Ticket in der Bestellung. Dies könnte z.B. nützlich "
"sein, wenn du auch im Falle von Gruppenbestellungen individuelle Adressen "
"von jeder Teilnehmer*in benötigst. pretix sendet die Bestellbestätigung "
"von jedem Teilnehmer benötigst. pretix sendet die Bestellbestätigung "
"standardmäßig nach wie vor nur an die primäre Adresse, dies kann jedoch in "
"den E-Mail-Einstellungen angepasst werden."
@@ -10952,8 +10952,8 @@ msgid ""
"but no indication of missing payment will be visible on the ticket pages of "
"attendees who did not buy the ticket themselves."
msgstr ""
"Die Box mit Zahlungsinstruktionen wird Ticketkäufer*innen weiter angezeigt, "
"aber Teilnehmer*innen, die ihr Ticket nicht selbst gekauft haben, werden "
"Die Box mit Zahlungsinstruktionen wird Ticketkäufern weiter angezeigt, "
"aber Teilnehmer, die ihr Ticket nicht selbst gekauft haben, werden "
"keine Anzeichen des fehlenden Zahlungseingangs sehen."
#: pretix/base/settings.py:1120
@@ -11451,7 +11451,7 @@ msgstr ""
#: pretix/base/settings.py:1763
msgid "Show number of check-ins to customer"
msgstr "Zeige Anzahl der Check-ins für Kund*innen an"
msgstr "Zeige Anzahl der Check-ins für Kunden an"
#: pretix/base/settings.py:1764
msgid ""
@@ -11462,12 +11462,12 @@ msgid ""
"failed scans will not be counted, and the user will not see the different "
"check-in lists."
msgstr ""
"Wenn diese Option aktiv ist, können Kund*innen selbst sehen, wie oft sie die "
"Wenn diese Option aktiv ist, können Kunden selbst sehen, wie oft sie die "
"Veranstaltung betreten haben. Das ist normalerweise nicht nötig, aber kann "
"nützlich sein, wenn es Tickets gibt, die eine bestimmte Anzahl an Eintritten "
"erlauben, sodass Kund*innen die bisherige Nutzung des Tickets einsehen "
"erlauben, sodass Kunden die bisherige Nutzung des Tickets einsehen "
"können. Ausgänge oder fehlgeschlagene Scans werden nicht angezeigt und die "
"Kund*innen sehen keine Aufschlüsselung verschiedener Check-in-Listen."
"Kunden sehen keine Aufschlüsselung verschiedener Check-in-Listen."
#: pretix/base/settings.py:1777
msgid "Allow users to download tickets"
@@ -11648,7 +11648,7 @@ msgstr ""
#: pretix/base/settings.py:1940 pretix/base/settings.py:1949
msgid "Both the attendee and the person who ordered can make changes"
msgstr ""
"Sowohl Besteller*in als auch Teilnehmer*innen können Änderungen vornehmen"
"Sowohl Besteller als auch Teilnehmer können Änderungen vornehmen"
#: pretix/base/settings.py:1944
msgid "Allow customers to modify their information"
@@ -11756,7 +11756,7 @@ msgstr ""
#: pretix/base/settings.py:2050
msgid "Allow individual attendees to change their ticket"
msgstr "Erlaubt einzelnen Teilnehmer*innen ihr Ticket zu ändern"
msgstr "Erlaubt einzelnen Teilnehmer ihr Ticket zu ändern"
#: pretix/base/settings.py:2051
msgid ""
@@ -11768,7 +11768,7 @@ msgid ""
msgstr ""
"Standardmäßig kann nur die Person, welche die Tickets gekauft hat, "
"Änderungen an der Bestellung vornehmen. Wenn diese Option aktiv ist, können "
"auch einzelne Teilnehmer*innen Änderungen vornehmen. Teilnehmer*innen können "
"auch einzelne Teilnehmer Änderungen vornehmen. Teilnehmer können "
"jedoch immer nur Änderungen vornehmen, welche die Gesamtkosten der "
"Bestellung nicht verändern. Solche Änderungen können nur vom Ticketkäufer "
"vorgenommen werden."
@@ -11952,7 +11952,7 @@ msgstr "Kontakt-E-Mail"
#: pretix/base/settings.py:2286 pretix/control/forms/event.py:1900
msgid "We'll show this publicly to allow attendees to contact you."
msgstr ""
"Wir werden diese Adresse veröffentlichen um Teilnehmer*innen zu ermöglichen, "
"Wir werden diese Adresse veröffentlichen um Teilnehmern zu ermöglichen, "
"dich zu kontaktieren."
#: pretix/base/settings.py:2294 pretix/control/forms/event.py:1892
@@ -12064,7 +12064,7 @@ msgid ""
"people."
msgstr ""
"Du kannst dieses Feld benutzen um zusätzliche Informationen mit deinen "
"Teilnehmer*innen zu teilen, wie z.B. Anreise-Informationen oder den Link zu "
"Teilnehmer zu teilen, wie z.B. Anreise-Informationen oder den Link zu "
"einer digitalen Veranstaltung. Wenn das Feld leer ist, fügen wir automatisch "
"einen Link zum Ticketshop, die Einlass-Uhrzeit und den Veranstalter hier "
"ein. Es sind keine Platzhalter mit sensiblen personenbezogenen Daten "
@@ -12304,8 +12304,8 @@ msgstr ""
"Diese Datei wird an die erste E-Mail angehängt, die wir beim Eingang einer "
"neuen Bestellung verschicken. Sie kann daher mit den Textvorlagen "
"\"Getätigte Bestellung\", \"Kostenlose Bestellung\" oder \"Erhaltene "
"Bestellung\" von oben auftreten. Sie wird ggf. sowohl an Besteller*innen als "
"auch Teilnehmer*innen verschickt. Nicht geeignet zum Versand nicht-"
"Bestellung\" von oben auftreten. Sie wird ggf. sowohl an Besteller als "
"auch Teilnehmer verschickt. Nicht geeignet zum Versand nicht-"
"öffentlicher Informationen, da die Datei unabhängig davon verschickt wird, "
"ob die Bestellung bezahlt oder freigegeben ist. Um zu vermeiden, dass diese "
"wichtige E-Mail nicht ankommt, können nur PDF-Dateien mit maximal {size} MB "
@@ -13568,7 +13568,7 @@ msgstr ""
msgid ""
"You cannot require specifying attendee names if you do not ask for them."
msgstr ""
"Du kannst die Angabe von Teilnehmer*innennamen nur erfordern, wenn auch nach "
"Du kannst die Angabe von Teilnehmernamen nur erfordern, wenn auch nach "
"Namen gefragt wird."
#: pretix/base/settings.py:4146
@@ -15243,11 +15243,11 @@ msgstr "Ticket-Downloads"
#: pretix/control/forms/event.py:1882
msgid "Your customers will be able to download their tickets in PDF format."
msgstr ""
"Die Teilnehmer*innen werden ihre Tickets im PDF-Format herunterladen können."
"Die Teilnehmer werden ihre Tickets im PDF-Format herunterladen können."
#: pretix/control/forms/event.py:1886
msgid "Require all attendees to fill in their names"
msgstr "Erfordere, dass alle Teilnehmer*innen ihre Namen ausfüllen"
msgstr "Erfordere, dass alle Teilnehmer ihre Namen ausfüllen"
#: pretix/control/forms/event.py:1887
msgid ""
@@ -15283,7 +15283,7 @@ msgid ""
"then import your bank statements to process the payments within pretix, or "
"mark them as paid manually."
msgstr ""
"Deine Teilnehmer*innen werden angewiesen, das Geld direkt auf dein Bankkonto "
"Deine Teilnehmer werden angewiesen, das Geld direkt auf dein Bankkonto "
"zu überweisen. Du kannst dann deinen Kontoauszug in pretix importieren, um "
"Zahlungen zuzuweisen, oder die Bestellungen manuell als bezahlt markieren."
@@ -15632,7 +15632,7 @@ msgstr "Check-in-Status"
#: pretix/control/forms/filter.py:2174
#: pretix/plugins/checkinlists/exporters.py:109
msgid "All attendees"
msgstr "Alle Teilnehmer*innen"
msgstr "Alle Teilnehmer"
#: pretix/control/forms/filter.py:2175
#: pretix/control/templates/pretixcontrol/checkin/index.html:183
@@ -16217,7 +16217,7 @@ msgid ""
"people over 65. This ticket includes access to all parts of the event, "
"except the VIP area."
msgstr ""
"z.B. Dieses reduzierte Ticket ist erhältlich für Vollzeitstudent*innen, "
"z.B. Dieses reduzierte Ticket ist erhältlich für Vollzeitstudenten, "
"Arbeitslose und Menschen über 65. Das Ticket enthält Zugang zu allen Teilen "
"der Veranstaltung außer des VIP-Bereiches."
@@ -18090,7 +18090,7 @@ msgstr "Eine individuelle E-Mail wurde verschickt."
#: pretix/control/logdisplay.py:554
msgid "A custom email has been sent to an attendee."
msgstr "Eine individuelle E-Mail wurde an eine Teilnehmer*in verschickt."
msgstr "Eine individuelle E-Mail wurde an eine Teilnehmer verschickt."
#: pretix/control/logdisplay.py:555
msgid ""
@@ -19824,7 +19824,7 @@ msgstr "Terminal-ID"
#: pretix/control/templates/pretixcontrol/boxoffice/payment.html:104
msgid "Card holder"
msgstr "Karteninhaber*in"
msgstr "Karteninhaber"
#: pretix/control/templates/pretixcontrol/boxoffice/payment.html:108
msgid "Card expiration"
@@ -20135,7 +20135,7 @@ msgstr "CSV"
#: pretix/control/templates/pretixcontrol/checkin/index.html:73
msgid "No attendee record was found."
msgstr "Keine passenden Teilnehmer*innen gefunden."
msgstr "Keine passenden Teilnehmer gefunden."
#: pretix/control/templates/pretixcontrol/checkin/index.html:91
#: pretix/control/templates/pretixcontrol/datasync/failed_jobs.html:19
@@ -21962,7 +21962,7 @@ msgid ""
"provide ways for your attendees to contact you:"
msgstr ""
"Wenn irgendetwas schiefgeht oder unklar ist, empfehlen wir, dass du deinen "
"Teilnehmer*innen die Möglichkeit gibst, dich zu benachrichtigen:"
"Teilnehmer die Möglichkeit gibst, dich zu benachrichtigen:"
#: pretix/control/templates/pretixcontrol/event/settings.html:21
msgid "Basics"
@@ -22939,7 +22939,7 @@ msgid ""
"Only purchases of such products will be considered \"attendees\" for most "
"statistical purposes or within some plugins."
msgstr ""
"Nur Käufe eines solchen Produkts werden als \"Teilnehmer*innen\" gewertet, "
"Nur Käufe eines solchen Produkts werden als \"Teilnehmer\" gewertet, "
"z.B. in Statistiken oder in Funktionen von Erweiterungen."
#: pretix/control/templates/pretixcontrol/item/create.html:39
@@ -23018,7 +23018,7 @@ msgid ""
"The system will not ask for a name or other attendee details. This only "
"affects system-provided fields, you can still add your own questions."
msgstr ""
"Das System wird nicht nach einem Namen oder anderen Teilnehmer*innen-Daten "
"Das System wird nicht nach einem Namen oder anderen Teilnehmer-Daten "
"fragen. Dies betrifft nur vom System bereitgestellte Felder, eigene Fragen "
"können trotzdem hinzugefügt werden."
@@ -23715,9 +23715,9 @@ msgid ""
"ticket. If you provide food, one example might be to ask your users about "
"dietary requirements."
msgstr ""
"Fragen erlauben deinen Besucher*innen, zusätzliche Informationen zu ihrem "
"Fragen erlauben deinen Besucher, zusätzliche Informationen zu ihrem "
"Ticket auszufüllen. Wenn deine Veranstaltung Verpflegung beinhaltet, "
"könntest du z.B. nach Allergien deiner Teilnehmer*innen fragen."
"könntest du z.B. nach Allergien deiner Teilnehmer fragen."
#: pretix/control/templates/pretixcontrol/items/questions.html:15
msgid "Create a new question"
@@ -23882,7 +23882,7 @@ msgstr ""
"Um deine Produkte verfügbar zu machen, musst du Kontingente anlegen. "
"Kontingente definieren, wie oft ein Produkt verkauft werden darf. Auf diese "
"Art kannst du konfigurieren, ob deine Veranstaltung unbegrenzt viele "
"Teilnehmer*innen aufnehmen kann oder ob die Anzahl begrenzt ist. Du kannst "
"Teilnehmer aufnehmen kann oder ob die Anzahl begrenzt ist. Du kannst "
"ein Produkt zu mehreren Kontingenten hinzufügen, um komplexere Anforderungen "
"abzubilden, z.B. wenn du die Gesamtzahl der Tickets begrenzen willst, aber "
"einen speziellen Ticket-Typ noch stärker begrenzen willst."
@@ -25353,7 +25353,7 @@ msgstr "Sonstige Datenexporte"
#: pretix/control/templates/pretixcontrol/orders/export.html:107
#: pretix/control/templates/pretixcontrol/organizers/export.html:107
msgid "Recommended for new users"
msgstr "Empfohlen für neue Benutzer*innen"
msgstr "Empfohlen für neue Benutzer"
#: pretix/control/templates/pretixcontrol/orders/export.html:120
#: pretix/control/templates/pretixcontrol/organizers/export.html:120
@@ -26312,7 +26312,7 @@ msgstr "Domains"
#: pretix/control/templates/pretixcontrol/organizers/edit.html:321
msgid "This dialog is intended for advanced users."
msgstr "Dieser Dialog ist für fortgeschrittene Anwender*innen gedacht."
msgstr "Dieser Dialog ist für fortgeschrittene Anwender gedacht."
#: pretix/control/templates/pretixcontrol/organizers/edit.html:322
msgid ""
@@ -28756,7 +28756,7 @@ msgid ""
"customers. This way, customers will not be able to discover the waiting list."
msgstr ""
"Entsprechend deiner Veranstaltungseinstellungen werden ausverkaufte Produkte "
"nicht angezeigt. Dies führt dazu, dass Kund*innen die Warteliste nicht "
"nicht angezeigt. Dies führt dazu, dass Kunden die Warteliste nicht "
"finden können."
#: pretix/control/templates/pretixcontrol/waitinglist/index.html:38
@@ -29066,11 +29066,11 @@ msgstr "Das ausgewählte List wurde gelöscht."
#: pretix/control/views/dashboards.py:115
msgid "Attendees (ordered)"
msgstr "Teilnehmende (bestellt)"
msgstr "Teilnehmer (bestellt)"
#: pretix/control/views/dashboards.py:125
msgid "Attendees (paid)"
msgstr "Teilnehmende (bezahlt)"
msgstr "Teilnehmer (bezahlt)"
#: pretix/control/views/dashboards.py:137
#, python-brace-format
@@ -31150,7 +31150,7 @@ msgstr "PDF-Sammlungen"
#: pretix/plugins/badges/exporters.py:431
msgid "Download all attendee badges as one large PDF for printing."
msgstr "Alle Teilnehmer*innen-Badges in einer großen PDF-Datei für den Druck."
msgstr "Alle Teilnehmer-Badges in einer großen PDF-Datei für den Druck."
#: pretix/plugins/badges/exporters.py:452
#: pretix/plugins/ticketoutputpdf/exporters.py:80
@@ -31429,7 +31429,7 @@ msgstr "Anderes Bankkonto"
#: pretix/plugins/banktransfer/payment.py:85
msgid "Name of account holder"
msgstr "Kontoinhaber*in"
msgstr "Kontoinhaber"
#: pretix/plugins/banktransfer/payment.py:87
msgid ""
@@ -31571,7 +31571,7 @@ msgstr "Bitte überweise den vollen Betrag auf das folgende Bankkonto:"
#: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_confirm.html:32
#: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_confirm.html:35
msgid "Account holder"
msgstr "Kontoinhaber*in"
msgstr "Kontoinhaber"
#: pretix/plugins/banktransfer/payment.py:304
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:20
@@ -32167,7 +32167,7 @@ msgid ""
"Download a spreadsheet with all attendees that are included in a check-in "
"list."
msgstr ""
"Tabelle (Excel oder CSV) mit allen Teilnehmer*innen, die in einer Check-in-"
"Tabelle (Excel oder CSV) mit allen Teilnehmer, die in einer Check-in-"
"Liste zutrittsberechtigt sind."
#: pretix/plugins/checkinlists/exporters.py:500
@@ -33343,7 +33343,7 @@ msgstr "Geplante E-Mails"
#: pretix/plugins/sendmail/signals.py:122
msgid "Mass email was sent to customers or attendees."
msgstr "Rundmail wurde an Kunden oder Teilnehmer*innen verschickt."
msgstr "Rundmail wurde an Kunden oder Teilnehmer verschickt."
#: pretix/plugins/sendmail/signals.py:123
msgid "Mass email was sent to waiting list entries."
@@ -33375,7 +33375,7 @@ msgstr "Eine automatisierte E-Mail wurde an den Besteller verschickt"
#: pretix/plugins/sendmail/signals.py:142
msgid "A scheduled email was sent to a ticket holder"
msgstr "Eine automatisierte E-Mail wurde an eine Teilnehmer*in verschickt."
msgstr "Eine automatisierte E-Mail wurde an einen Teilnehmer verschickt."
#: pretix/plugins/sendmail/signals.py:143
msgid "An email rule was deleted"
@@ -33408,7 +33408,7 @@ msgstr "Alle nicht eingecheckten Kunden"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/history_fragment_orders.html:23
msgid "Attendee contact addresses"
msgstr "Teilnehmer*innen-E-Mail-Adressen"
msgstr "Teilnehmer-E-Mail-Adressen"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/history_fragment_orders.html:25
msgid "All contact addresses"
@@ -33569,14 +33569,14 @@ msgstr ""
#: pretix/plugins/sendmail/views.py:250
msgid "Orders or attendees"
msgstr "Bestellungen oder Teilnehmer*innen"
msgstr "Bestellungen oder Teilnehmer"
#: pretix/plugins/sendmail/views.py:251
msgid ""
"Send an email to every customer, or to every person a ticket has been "
"purchased for, or a combination of both."
msgstr ""
"Sende eine E-Mail an alle Ticketkäufer*innen, alle Ticketinhaber*innen oder "
"Sende eine E-Mail an alle Ticketkäufer, alle Ticketinhaber oder "
"eine Kombination aus beiden Gruppen."
#: pretix/plugins/sendmail/views.py:417
@@ -34148,23 +34148,23 @@ msgstr "SEPA-Lastschrift"
#: pretix/plugins/stripe/payment.py:1277
msgid "Account Holder Name"
msgstr "Kontoinhaber*in"
msgstr "Kontoinhaber"
#: pretix/plugins/stripe/payment.py:1282
msgid "Account Holder Street"
msgstr "Straße (Kontoinhaber*in)"
msgstr "Straße (Kontoinhaber)"
#: pretix/plugins/stripe/payment.py:1294
msgid "Account Holder Postal Code"
msgstr "PLZ (Kontoinhaber*in)"
msgstr "PLZ (Kontoinhaber)"
#: pretix/plugins/stripe/payment.py:1306
msgid "Account Holder City"
msgstr "Stadt (Kontoinhaber*in)"
msgstr "Stadt (Kontoinhaber)"
#: pretix/plugins/stripe/payment.py:1318
msgid "Account Holder Country"
msgstr "Land (Kontoinhaber*in)"
msgstr "Land (Kontoinhaber)"
#: pretix/plugins/stripe/payment.py:1362
msgid "Affirm via Stripe"
@@ -34613,7 +34613,7 @@ msgstr "MOTO"
#: pretix/plugins/stripe/templates/pretixplugins/stripe/control.html:64
#: pretix/plugins/stripe/templates/pretixplugins/stripe/control.html:67
msgid "Payer name"
msgstr "Name des Zahlenden"
msgstr "Name des Zahlers"
#: pretix/plugins/stripe/templates/pretixplugins/stripe/control.html:91
msgid "Payment receipt"
@@ -36003,7 +36003,7 @@ msgstr[1] "Das Ticket wurde %(count)s-mal eingelöst."
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:166
msgid "No attendee name provided"
msgstr "Name der teilnehmenden Person nicht angegeben"
msgstr "Name des Teilnehmenrs nicht angegeben"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:219
msgid "The image you previously uploaded"
@@ -37763,12 +37763,12 @@ msgstr "Möchtest das folgende Profil wirklich aus deinem Kundenkonto löschen?"
#: pretix/presale/templates/pretixpresale/organizers/customer_profiles.html:11
#: pretix/presale/views/customer.py:388
msgid "Attendee profiles"
msgstr "Teilnehmer*innen-Adresse"
msgstr "Teilnehmer-Adresse"
#: pretix/presale/templates/pretixpresale/organizers/customer_profiles.html:37
msgid "You dont have any attendee profiles in your account yet."
msgstr ""
"In deinem Kundenkonto sind noch keine Teilnehmer*innen-Profile gespeichert."
"In deinem Kundenkonto sind noch keine Teilnehmer-Profile gespeichert."
#: pretix/presale/templates/pretixpresale/organizers/customer_registration.html:7
msgid "Registration"
@@ -39343,7 +39343,7 @@ msgstr "Kosovo"
#~ "This plugin allows you to generate badges or name tags for your attendees."
#~ msgstr ""
#~ "Diese Erweiterung erlaubt, Namensschilder oder Badges für die "
#~ "Teilnehmer*innen zu erstellen."
#~ "Teilnehmer zu erstellen."
#~ msgid "This plugin allows you to receive payments via PayPal"
#~ msgstr "Dieses Plugin erlaubt, Zahlungen über PayPal anzunehmen"
@@ -39921,7 +39921,7 @@ msgstr "Kosovo"
#~ msgstr "Biete Ticket-Download bereits vor Bezahlung einer Bestellung an"
#~ msgid "Attendee names"
#~ msgstr "Teilnehmer*innennamen"
#~ msgstr "Teilnehmername"
#~ msgid "Enable output"
#~ msgstr "Aktivieren"
@@ -40198,7 +40198,7 @@ msgstr "Kosovo"
#~ "If checked, users can cancel orders by themselves as long as they are not "
#~ "yet paid."
#~ msgstr ""
#~ "Wenn diese Option aktiviert ist, können Teilnehmer*innen selbstständig "
#~ "Wenn diese Option aktiviert ist, können Teilnehmer selbstständig "
#~ "Bestellungen stornieren solange sie nicht bezahlt wurden."
#~ msgid "Sales overview"
@@ -162,12 +162,12 @@ msgstr "Bezahlte Bestellungen"
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:27
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:39
msgid "Attendees (ordered)"
msgstr "Teilnehmende (bestellt)"
msgstr "Teilnehmer (bestellt)"
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:27
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:39
msgid "Attendees (paid)"
msgstr "Teilnehmende (bezahlt)"
msgstr "Teilnehmer (bezahlt)"
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:51
msgid "Total revenue"
+71 -112
View File
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-06-28 14:42+0000\n"
"PO-Revision-Date: 2026-05-29 17:00+0000\n"
"PO-Revision-Date: 2026-06-29 17:00+0000\n"
"Last-Translator: CVZ-es <damien.bremont@casadevelazquez.org>\n"
"Language-Team: Spanish <https://translate.pretix.eu/projects/pretix/pretix/"
"es/>\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 2026.5\n"
"X-Generator: Weblate 2026.6.1\n"
#: htmlcov/d_daa1541d0cbf5e2b_dashboards_py.html:670
#: pretix/control/templates/pretixcontrol/events/index.html:166
@@ -467,10 +467,8 @@ msgid "Medium connected to other event"
msgstr "Medio conectado a otro evento"
#: pretix/api/views/checkin.py:814
#, fuzzy
#| msgid "You cannot change this order."
msgid "You cannot exchange a medium for a medium."
msgstr "No puedes cambiar este pedido."
msgstr "No se puede cambiar un medio por otro."
#: pretix/api/views/oauth.py:107 pretix/control/logdisplay.py:777
#, python-brace-format
@@ -4730,22 +4728,16 @@ msgid "Check-in annulled"
msgstr "Check-in anulado"
#: pretix/base/models/checkin.py:372
#, fuzzy
#| msgid "Ticket already used"
msgid "Ticket already exchanged"
msgstr "Esta entrada ya fue utilizada"
msgstr "Entrada ya canjeada"
#: pretix/base/models/checkin.py:373
#, fuzzy
#| msgid "Reusable media"
msgid "Reusable medium invalid"
msgstr "Medios reutilizables"
msgstr "Soporte reutilizable no válido"
#: pretix/base/models/checkin.py:374
#, fuzzy
#| msgid "Reusable media type"
msgid "Reusable medium already exists"
msgstr "Tipo de medio reusable"
msgstr "El soporte reutilizable ya existe"
#: pretix/base/models/customers.py:63
msgid "Provider name"
@@ -5330,11 +5322,8 @@ msgstr ""
"ambas cosas."
#: pretix/base/models/event.py:1884
#, fuzzy
#| msgid "The bundled item must belong to the same event as the item."
msgid "Property and event must belong to the same organizer."
msgstr ""
"La agrupación de artículos debe pertenecer al mismo evento que el artículo."
msgstr "La propiedad y el evento deben pertenecer al mismo organizador."
#: pretix/base/models/event.py:1928 pretix/base/models/organizer.py:627
msgid "Link text"
@@ -5586,42 +5575,41 @@ msgid "Show product with info on why its unavailable"
msgstr "Mostrar el producto con la razón que no está disponible"
#: pretix/base/models/items.py:458 pretix/base/models/items.py:786
#, fuzzy
#| msgid "Don't use re-usable media, use regular one-off tickets"
msgid "Don't use reusable media, use regular one-off tickets"
msgstr "No usar medios reutilizables, usar entradas de un solo uso"
msgstr ""
"No utilizar soportes reutilizables, sino billetes normales de un solo uso"
#: pretix/base/models/items.py:459
msgid "Require a previously unknown medium to be newly added"
msgstr "Exigir que un medio desconocido anteriormente se adicione de nuevo"
#: pretix/base/models/items.py:460
#, fuzzy
#| msgid "Require an existing medium to be re-used"
msgid "Require an existing medium to be reused, replacing any previous tickets"
msgstr "Exigir que se reuse un medio ya existente"
msgstr ""
"Necesita que se reutilice un soporte ya existente, sustituyendo cualquier "
"billete anterior"
#: pretix/base/models/items.py:461
#, fuzzy
#| msgid "Require either an existing or a new medium to be used"
msgid ""
"Require either an existing or a new medium to be used, replacing any "
"previous tickets"
msgstr "Exigir que se use un medio existente o uno nuevo"
msgstr ""
"Se debe utilizar un soporte ya existente o uno nuevo, sustituyendo cualquier "
"billete anterior"
#: pretix/base/models/items.py:462
#, fuzzy
#| msgid "Require an existing medium to be re-used"
msgid "Require an existing medium to be reused, adding to any previous tickets"
msgstr "Exigir que se reuse un medio ya existente"
msgstr ""
"Exigir que se reutilice un soporte ya existente, añadiendo esta información "
"a cualquier entrada anterior"
#: pretix/base/models/items.py:464
#, fuzzy
#| msgid "Require either an existing or a new medium to be used"
msgid ""
"Require either an existing or a new medium to be used, adding to any "
"previous tickets"
msgstr "Exigir que se use un medio existente o uno nuevo"
msgstr ""
"Es necesario utilizar un medio ya existente o uno nuevo, que se sumará a los "
"billetes anteriores"
#: pretix/base/models/items.py:480 pretix/base/models/items.py:1468
msgid "Category"
@@ -5981,14 +5969,6 @@ msgid "Reusable media policy"
msgstr "Condiciones de utilización de medios"
#: pretix/base/models/items.py:777
#, fuzzy
#| msgid ""
#| "If this product should be stored on a re-usable physical medium, you can "
#| "attach a physical media policy. This is not required for regular tickets, "
#| "which just use a one-time barcode, but only for products like renewable "
#| "season tickets or re-chargeable gift card wristbands. This is an advanced "
#| "feature that also requires specific configuration of ticketing and "
#| "printing settings."
msgid ""
"If this product should be stored on a reusable physical medium, you can "
"attach a physical media policy. This is not required for regular tickets, "
@@ -6052,6 +6032,9 @@ msgid ""
"prior to their usage. Therefore, the selected media policy does not make "
"sense for this media type."
msgstr ""
"El tipo de soporte seleccionado requiere que todos los soportes se registren "
"en el sistema antes de su uso. Por lo tanto, la política de soportes "
"seleccionada no es aplicable a este tipo de soporte."
#: pretix/base/models/items.py:1009
msgid ""
@@ -6626,18 +6609,16 @@ msgstr "rebotado"
#: pretix/base/models/media.py:77
msgctxt "reusable_medium"
msgid "Claim token"
msgstr ""
msgstr "Canjear el token"
#: pretix/base/models/media.py:82
msgctxt "reusable_medium"
msgid "Label"
msgstr ""
msgstr "Designación"
#: pretix/base/models/media.py:105
#, fuzzy
#| msgid "Linked ticket"
msgid "Linked tickets"
msgstr "Entrada vinculada"
msgstr "Entradas vinculadas"
#: pretix/base/models/media.py:107
msgid ""
@@ -6645,6 +6626,9 @@ msgid ""
"validity. If multiple tickets are valid at once, this will lead to failed "
"check-ins."
msgstr ""
"Si enlaza más de un billete, asegúrese de que no haya solapamiento en la "
"validez. Si varios billetes son válidos al mismo tiempo, esto provocará que "
"no se puedan realizar el check-in."
#: pretix/base/models/memberships.py:44
#: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html:28
@@ -8390,14 +8374,10 @@ msgid "Atlantis"
msgstr "Atlántida"
#: pretix/base/pdf.py:376
#, fuzzy
#| msgid "Invoice recipient email"
msgid "Invoice custom recipient field"
msgstr "Correo electrónico del destinatario de la factura"
msgstr "Campo personalizado de destinatario en la factura"
#: pretix/base/pdf.py:377
#, fuzzy
#| msgid "Custom recipient field label"
msgid "Custom recipient field"
msgstr "Campo de destinatario personalizado"
@@ -9415,13 +9395,15 @@ msgstr "Necesitas responder preguntas para terminar el check-in."
#: pretix/base/services/checkin.py:1121
msgid "Ticket needs to be exchanged to a suitable medium."
msgstr ""
msgstr "El billete debe canjearse por un soporte adecuado."
#: pretix/base/services/checkin.py:1128
msgid ""
"This ticket has already been exchanged for a reusable medium that now needs "
"to be used instead."
msgstr ""
"Esta entrada ya se ha canjeado por un soporte reutilizable que ahora hay que "
"utilizar en su lugar."
#: pretix/base/services/checkin.py:1180
msgid "This ticket has already been redeemed."
@@ -9587,64 +9569,46 @@ msgstr ""
"{event}."
#: pretix/base/services/media.py:93 pretix/base/services/media.py:95
#, fuzzy
#| msgid "Invalid input type."
msgid "Invalid medium type."
msgstr "Tipo de entrada no válido."
msgstr "Tipo de soporte no válido."
#: pretix/base/services/media.py:100 pretix/base/services/media.py:102
#, fuzzy
#| msgid "The selected media type is not enabled in your organizer settings."
msgid "Medium type is not enabled for organizer."
msgstr ""
"El tipo de medio seleccionado no está activo en tus ajustes de organizador/a/"
"e."
msgstr "Este tipo de medio no está habilitado para el organizador."
#: pretix/base/services/media.py:107 pretix/base/services/media.py:109
msgid "Incorrect medium type for product."
msgstr ""
msgstr "El tipo de soporte no es el adecuado para este producto."
#: pretix/base/services/media.py:114 pretix/base/services/media.py:116
#, fuzzy
#| msgid "This ticket has already been redeemed."
msgid "Ticket is already exchanged for reusable medium."
msgstr "Esta entrada ya ha sido canjeada."
msgstr "La entrada ya se ha canjeado por un soporte reutilizable."
#: pretix/base/services/media.py:133 pretix/base/services/media.py:135
#, fuzzy
#| msgid "Reusable Medium ID"
msgid "Reusable medium not found."
msgstr "ID mediana reutilizable"
msgstr "No se ha encontrado el soporte reutilizable."
#: pretix/base/services/media.py:140 pretix/base/services/media.py:142
#: pretix/base/services/media.py:168 pretix/base/services/media.py:170
#, fuzzy
#| msgid "The reusable medium has been created."
msgid "Reusable medium is inactive or expired."
msgstr "Se ha creado el medio reutilizable."
msgstr "El medio reutilizable está inactivo o caducado."
#: pretix/base/services/media.py:155 pretix/base/services/media.py:162
#: pretix/base/services/media.py:176
#, fuzzy
#| msgid "The reusable medium has been created."
msgid "Reusable medium not found and could not be created."
msgstr "Se ha creado el medio reutilizable."
msgstr "No se ha encontrado el soporte reutilizable y no se ha podido crear."
#: pretix/base/services/media.py:183
#, fuzzy
#| msgid "Reusable media type"
msgid "Reusable medium already exists."
msgstr "Tipo de medio reusable"
msgstr "Ya existe un soporte reutilizable."
#: pretix/base/services/media.py:189
#, fuzzy
#| msgid "The reusable medium has been created."
msgid "Reusable medium could not be created."
msgstr "Se ha creado el medio reutilizable."
msgstr "No se ha podido crear el soporte reutilizable."
#: pretix/base/services/media.py:195 pretix/base/services/media.py:197
msgid "Product does not support medium exchange."
msgstr ""
msgstr "Este producto no admite el cambio de medio."
#: pretix/base/services/memberships.py:108
#, python-brace-format
@@ -10368,17 +10332,10 @@ msgstr ""
"inició sesión durante la compra."
#: pretix/base/settings.py:214
#, fuzzy
#| msgid "Activate re-usable media"
msgid "Activate reusable media"
msgstr "Activar medios reutilizables"
#: pretix/base/settings.py:215
#, fuzzy
#| msgid ""
#| "The re-usable media feature allows you to connect tickets and gift cards "
#| "with physical media such as wristbands or chip cards that may be re-used "
#| "for different tickets or gift cards later."
msgid ""
"The reusable media feature allows you to connect tickets and gift cards with "
"physical media such as wristbands or chip cards that may be reused for "
@@ -10390,7 +10347,7 @@ msgstr ""
#: pretix/base/settings.py:226
msgid "Enforce the usage of issued reusable media for check-in"
msgstr ""
msgstr "Exigir el uso de los soportes reutilizables para el check-in"
#: pretix/base/settings.py:227
msgid ""
@@ -10398,6 +10355,10 @@ msgid ""
"medium has been created and linked to a ticket. Keeping this option turned "
"off will treat the reusable medium and ticket as equals."
msgstr ""
"Si se activa esta opción, ya no se aceptarán los códigos de barras de los "
"billetes cuando se haya creado un soporte reutilizable y se haya vinculado a "
"un billete. Si se mantiene desactivada esta opción, el soporte reutilizable "
"y el billete se tratarán como iguales."
#: pretix/base/settings.py:254
msgid "Length of barcodes"
@@ -18548,16 +18509,12 @@ msgid "The reusable medium has been changed."
msgstr "El medio reutilizable ha sido modificado."
#: pretix/control/logdisplay.py:746
#, fuzzy
#| msgid "The new member has been added to the team."
msgid "A new ticket has been added to the medium."
msgstr "El nuevo miembro ha sido añadido al equipo."
msgstr "Se ha añadido un nuevo billete al medio."
#: pretix/control/logdisplay.py:747
#, fuzzy
#| msgid "{user} has been removed from the team."
msgid "A ticket has been removed from the medium."
msgstr "{user} ha sido removido del equipo."
msgstr "Se ha eliminado un billete del medio."
#: pretix/control/logdisplay.py:748
msgid "The medium has been connected to a new ticket."
@@ -18569,6 +18526,8 @@ msgid ""
"The ticket #{positionid} was exchanged for reusable medium "
"{medium_identifier}."
msgstr ""
"El billete n.º {positionid} se ha canjeado por un medio reutilizable "
"{medium_identifier}."
#: pretix/control/logdisplay.py:750
msgid "The medium has been connected to a new gift card."
@@ -20483,10 +20442,8 @@ msgstr ""
"check-in:"
#: pretix/control/templates/pretixcontrol/checkin/simulator.html:85
#, fuzzy
#| msgid "Special attention required"
msgid "Media exchange required"
msgstr "Atención especial requerida"
msgstr "Es necesario intercambiar medios"
#: pretix/control/templates/pretixcontrol/checkin/simulator.html:87
#, python-format
@@ -20494,6 +20451,8 @@ msgid ""
"This ticket needs to be exchanged into a <strong>%(media_type)s</strong> "
"reusable medium. <strong>%(media_policy)s</strong>."
msgstr ""
"Esta entrada debe canjearse por un soporte reutilizable <strong>%(media_type)"
"s</strong>. <strong>%(media_policy)s</strong>."
#: pretix/control/templates/pretixcontrol/checkin/simulator.html:103
msgid "Special attention required"
@@ -27038,6 +26997,9 @@ msgid ""
"Even if a team has no access to a certain category of data, they might still "
"be able to see parts of this data when it is linked to data they can see."
msgstr ""
"Aunque un equipo no tenga acceso a una determinada categoría de datos, es "
"posible que pueda ver parte de esos datos cuando estén vinculados a datos a "
"los que sí tiene acceso."
#: pretix/control/templates/pretixcontrol/organizers/team_edit.html:35
msgid ""
@@ -27045,6 +27007,10 @@ msgid ""
"some information about gift cards linked to a customer account, even if they "
"generally can't see gift cards directly."
msgstr ""
"Por ejemplo, una persona con acceso a las cuentas de los clientes podrá ver "
"cierta información sobre las tarjetas regalo vinculadas a una cuenta de "
"cliente, aunque, por lo general, no pueda ver las tarjetas regalo "
"directamente."
#: pretix/control/templates/pretixcontrol/organizers/team_edit.html:59
msgid ""
@@ -27052,6 +27018,9 @@ msgid ""
"information about vouchers used to create an order, even if they generally "
"can't see vouchers directly."
msgstr ""
"Por ejemplo, una persona con acceso a los pedidos podrá ver cierta "
"información sobre los vales utilizados para crear un pedido, aunque "
"normalmente no pueda ver los vales directamente."
#: pretix/control/templates/pretixcontrol/organizers/team_members.html:21
msgid "Member"
@@ -27912,30 +27881,22 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/subevents/detail.html:9
#: pretix/control/templates/pretixcontrol/subevents/detail.html:13
#, fuzzy, python-format
#| msgid "Quota: %(name)s"
#, python-format
msgctxt "subevent"
msgid "Date: %(name)s"
msgstr "Cuota: %(name)s"
msgstr "Fecha: %(name)s"
#: pretix/control/templates/pretixcontrol/subevents/detail.html:234
#, fuzzy
#| msgid "Partially paid"
msgid "partially canceled"
msgstr "Pagado parcialmente"
msgstr "cancelado parcialmente"
#: pretix/control/templates/pretixcontrol/subevents/detail.html:282
#, fuzzy
#| msgctxt "permission_level"
#| msgid "View all"
msgid "View all"
msgstr "Ver todo"
#: pretix/control/templates/pretixcontrol/subevents/detail.html:289
#, fuzzy
#| msgid "No archived events found."
msgid "No orders found."
msgstr "No se han encontrado eventos archivados."
msgstr "No se han encontrado pedidos."
#: pretix/control/templates/pretixcontrol/subevents/detail.html:302
#: pretix/control/templates/pretixcontrol/subevents/edit.html:279
@@ -30708,10 +30669,8 @@ msgid "Voucher {}"
msgstr "Vale de compra {}"
#: pretix/control/views/typeahead.py:179 pretix/control/views/typeahead.py:180
#, fuzzy
#| msgid "Go to event"
msgid "No event"
msgstr "Ir al evento"
msgstr "No hay eventos"
#: pretix/control/views/user.py:169
msgid "The password you entered was invalid, please try again."
+8 -5
View File
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-06-28 15:49+0000\n"
"PO-Revision-Date: 2026-03-30 03:00+0000\n"
"PO-Revision-Date: 2026-06-29 17:00+0000\n"
"Last-Translator: CVZ-es <damien.bremont@casadevelazquez.org>\n"
"Language-Team: Spanish <https://translate.pretix.eu/projects/pretix/pretix-"
"js/es/>\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.16.2\n"
"X-Generator: Weblate 2026.6.1\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
@@ -442,11 +442,11 @@ msgstr "¡Presione Control+C para copiar!"
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue:80
msgid "Edit"
msgstr ""
msgstr "Editar"
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue:86
msgid "Visualize"
msgstr ""
msgstr "Visualizar"
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue:96
msgid ""
@@ -454,10 +454,13 @@ msgid ""
"or variations are not contained in any of your rule parts so people with "
"these tickets will not get in:"
msgstr ""
"Su regla siempre filtra por producto o variante, pero los siguientes "
"productos o variantes no figuran en ninguna de las partes de su regla, por "
"lo que las personas con estos tickets no podrán acceder:"
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue:99
msgid "Please double-check if this was intentional."
msgstr ""
msgstr "Por favor, comprueba bien si esto ha sido a propósito."
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:4
msgid "All of the conditions below (AND)"
+71 -111
View File
@@ -4,10 +4,10 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-06-28 14:42+0000\n"
"PO-Revision-Date: 2026-06-08 17:00+0000\n"
"Last-Translator: Sébastien BRUNEAU <s.bruneau@beauvaisis.fr>\n"
"Language-Team: French <https://translate.pretix.eu/projects/pretix/pretix/fr/"
">\n"
"PO-Revision-Date: 2026-06-29 17:00+0000\n"
"Last-Translator: CVZ-es <damien.bremont@casadevelazquez.org>\n"
"Language-Team: French <https://translate.pretix.eu/projects/pretix/pretix/"
"fr/>\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -466,10 +466,8 @@ msgid "Medium connected to other event"
msgstr "Média connecté à un autre événement"
#: pretix/api/views/checkin.py:814
#, fuzzy
#| msgid "You cannot change this order."
msgid "You cannot exchange a medium for a medium."
msgstr "Vous ne pouvez pas modifier cette commande."
msgstr "Il n'est pas possible d'échanger un support contre un autre support."
#: pretix/api/views/oauth.py:107 pretix/control/logdisplay.py:777
#, python-brace-format
@@ -4736,22 +4734,16 @@ msgid "Check-in annulled"
msgstr "Enregistrement annulé"
#: pretix/base/models/checkin.py:372
#, fuzzy
#| msgid "Ticket already used"
msgid "Ticket already exchanged"
msgstr "Billet déjà utilisé"
msgstr "Billet déjà échangé"
#: pretix/base/models/checkin.py:373
#, fuzzy
#| msgid "Reusable media"
msgid "Reusable medium invalid"
msgstr "Support réutilisable"
msgstr "Support réutilisable non valide"
#: pretix/base/models/checkin.py:374
#, fuzzy
#| msgid "Reusable media type"
msgid "Reusable medium already exists"
msgstr "Type de support réutilisable"
msgstr "Il existe déjà un support réutilisable"
#: pretix/base/models/customers.py:63
msgid "Provider name"
@@ -5343,10 +5335,8 @@ msgstr ""
"deux."
#: pretix/base/models/event.py:1884
#, fuzzy
#| msgid "The bundled item must belong to the same event as the item."
msgid "Property and event must belong to the same organizer."
msgstr "L’élément groupé doit appartenir au même événement que l’élément."
msgstr "La propriété et l'événement doivent appartenir au même organisateur."
#: pretix/base/models/event.py:1928 pretix/base/models/organizer.py:627
msgid "Link text"
@@ -5601,8 +5591,6 @@ msgstr ""
"indisponibilité"
#: pretix/base/models/items.py:458 pretix/base/models/items.py:786
#, fuzzy
#| msgid "Don't use re-usable media, use regular one-off tickets"
msgid "Don't use reusable media, use regular one-off tickets"
msgstr ""
"N'utilisez pas de supports réutilisables, mais plutôt des tickets uniques "
@@ -5613,32 +5601,30 @@ msgid "Require a previously unknown medium to be newly added"
msgstr "Exiger l'ajout d'un support inconnu jusqu'alors"
#: pretix/base/models/items.py:460
#, fuzzy
#| msgid "Require an existing medium to be re-used"
msgid "Require an existing medium to be reused, replacing any previous tickets"
msgstr "Exiger la réutilisation d'un support existant"
#: pretix/base/models/items.py:461
#, fuzzy
#| msgid "Require either an existing or a new medium to be used"
msgid ""
"Require either an existing or a new medium to be used, replacing any "
"previous tickets"
msgstr "Nécessiter l'utilisation d'un support existant ou d'un nouveau support"
msgstr ""
"Exiger l'utilisation d'un support existant ou d'un nouveau support, en "
"remplacement de tout billet antérieur"
#: pretix/base/models/items.py:462
#, fuzzy
#| msgid "Require an existing medium to be re-used"
msgid "Require an existing medium to be reused, adding to any previous tickets"
msgstr "Exiger la réutilisation d'un support existant"
msgstr ""
"Exiger la réutilisation d'un support existant, en ajoutant cette demande à "
"tout ticket précédent"
#: pretix/base/models/items.py:464
#, fuzzy
#| msgid "Require either an existing or a new medium to be used"
msgid ""
"Require either an existing or a new medium to be used, adding to any "
"previous tickets"
msgstr "Nécessiter l'utilisation d'un support existant ou d'un nouveau support"
msgstr ""
"Exiger l'utilisation d'un support existant ou d'un nouveau support, en "
"complément des tickets précédents"
#: pretix/base/models/items.py:480 pretix/base/models/items.py:1468
msgid "Category"
@@ -6001,14 +5987,6 @@ msgid "Reusable media policy"
msgstr "Politique relative aux médias réutilisables"
#: pretix/base/models/items.py:777
#, fuzzy
#| msgid ""
#| "If this product should be stored on a re-usable physical medium, you can "
#| "attach a physical media policy. This is not required for regular tickets, "
#| "which just use a one-time barcode, but only for products like renewable "
#| "season tickets or re-chargeable gift card wristbands. This is an advanced "
#| "feature that also requires specific configuration of ticketing and "
#| "printing settings."
msgid ""
"If this product should be stored on a reusable physical medium, you can "
"attach a physical media policy. This is not required for regular tickets, "
@@ -6073,6 +6051,10 @@ msgid ""
"prior to their usage. Therefore, the selected media policy does not make "
"sense for this media type."
msgstr ""
"Le type de support sélectionné exige que tous les supports soient "
"enregistrés dans le système avant leur utilisation. Par conséquent, la "
"politique relative aux supports sélectionnée n'est pas applicable à ce type "
"de support."
#: pretix/base/models/items.py:1009
msgid ""
@@ -6649,18 +6631,16 @@ msgstr "Non distribué"
#: pretix/base/models/media.py:77
msgctxt "reusable_medium"
msgid "Claim token"
msgstr ""
msgstr "Réclamer un jeton"
#: pretix/base/models/media.py:82
msgctxt "reusable_medium"
msgid "Label"
msgstr ""
msgstr "Descriptif"
#: pretix/base/models/media.py:105
#, fuzzy
#| msgid "Linked ticket"
msgid "Linked tickets"
msgstr "Billet lié"
msgstr "Billets liés"
#: pretix/base/models/media.py:107
msgid ""
@@ -6668,6 +6648,9 @@ msgid ""
"validity. If multiple tickets are valid at once, this will lead to failed "
"check-ins."
msgstr ""
"Si vous associez plusieurs billets, assurez-vous qu'il n'y ait pas de "
"chevauchement entre leurs périodes de validité. Si plusieurs billets sont "
"valables en même temps, cela entraînera l'échec de l'enregistrement."
#: pretix/base/models/memberships.py:44
#: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html:28
@@ -8437,16 +8420,12 @@ msgid "Atlantis"
msgstr "Atlantide"
#: pretix/base/pdf.py:376
#, fuzzy
#| msgid "Invoice recipient email"
msgid "Invoice custom recipient field"
msgstr "E-mail du destinataire de la facture"
msgstr "Champ personnalisé destinataire de la facture"
#: pretix/base/pdf.py:377
#, fuzzy
#| msgid "Custom recipient field label"
msgid "Custom recipient field"
msgstr "Libellé personnalisé du champ destinataire"
msgstr "Champ de destinataire personnalisé"
#: pretix/base/pdf.py:381
msgid "List of Add-Ons"
@@ -9471,13 +9450,15 @@ msgstr ""
#: pretix/base/services/checkin.py:1121
msgid "Ticket needs to be exchanged to a suitable medium."
msgstr ""
msgstr "Le billet doit être échangé contre un support adapté."
#: pretix/base/services/checkin.py:1128
msgid ""
"This ticket has already been exchanged for a reusable medium that now needs "
"to be used instead."
msgstr ""
"Ce billet a déjà été échangé contre un support réutilisable qui doit "
"désormais être utilisé à sa place."
#: pretix/base/services/checkin.py:1180
msgid "This ticket has already been redeemed."
@@ -9643,64 +9624,46 @@ msgstr ""
"Vous recevez cet e-mail parce que vous avez passé une commande pour {event}."
#: pretix/base/services/media.py:93 pretix/base/services/media.py:95
#, fuzzy
#| msgid "Invalid input type."
msgid "Invalid medium type."
msgstr "Type dentrée non valide."
msgstr "Type de support non valide."
#: pretix/base/services/media.py:100 pretix/base/services/media.py:102
#, fuzzy
#| msgid "The selected media type is not enabled in your organizer settings."
msgid "Medium type is not enabled for organizer."
msgstr ""
"Le type de média sélectionné nest pas activé dans les paramètres de votre "
"organisateur."
msgstr "Ce type de média nest pas activé par l'organisateur."
#: pretix/base/services/media.py:107 pretix/base/services/media.py:109
msgid "Incorrect medium type for product."
msgstr ""
msgstr "Type de support incorrect pour ce produit."
#: pretix/base/services/media.py:114 pretix/base/services/media.py:116
#, fuzzy
#| msgid "This ticket has already been redeemed."
msgid "Ticket is already exchanged for reusable medium."
msgstr "Ce billet a déjà été échangé."
msgstr "Le billet a déjà été échangé contre un support réutilisable."
#: pretix/base/services/media.py:133 pretix/base/services/media.py:135
#, fuzzy
#| msgid "Reusable Medium ID"
msgid "Reusable medium not found."
msgstr "Identification de support réutilisable"
msgstr "Support réutilisable introuvable."
#: pretix/base/services/media.py:140 pretix/base/services/media.py:142
#: pretix/base/services/media.py:168 pretix/base/services/media.py:170
#, fuzzy
#| msgid "The reusable medium has been created."
msgid "Reusable medium is inactive or expired."
msgstr "Le support réutilisable a été créé."
msgstr "Le support réutilisable est inactif ou a expiré."
#: pretix/base/services/media.py:155 pretix/base/services/media.py:162
#: pretix/base/services/media.py:176
#, fuzzy
#| msgid "The reusable medium has been created."
msgid "Reusable medium not found and could not be created."
msgstr "Le support réutilisable a été créé."
msgstr "Support réutilisable introuvable et impossible à créer."
#: pretix/base/services/media.py:183
#, fuzzy
#| msgid "Reusable media type"
msgid "Reusable medium already exists."
msgstr "Type de support réutilisable"
msgstr "Le type de support réutilisable existe déjà."
#: pretix/base/services/media.py:189
#, fuzzy
#| msgid "The reusable medium has been created."
msgid "Reusable medium could not be created."
msgstr "Le support réutilisable a été créé."
msgstr "Impossible de créer le support réutilisable."
#: pretix/base/services/media.py:195 pretix/base/services/media.py:197
msgid "Product does not support medium exchange."
msgstr ""
msgstr "Ce produit ne permet pas de changer de support."
#: pretix/base/services/memberships.py:108
#, python-brace-format
@@ -10426,17 +10389,10 @@ msgstr ""
"lachat."
#: pretix/base/settings.py:214
#, fuzzy
#| msgid "Activate re-usable media"
msgid "Activate reusable media"
msgstr "Activer les supports réutilisables"
#: pretix/base/settings.py:215
#, fuzzy
#| msgid ""
#| "The re-usable media feature allows you to connect tickets and gift cards "
#| "with physical media such as wristbands or chip cards that may be re-used "
#| "for different tickets or gift cards later."
msgid ""
"The reusable media feature allows you to connect tickets and gift cards with "
"physical media such as wristbands or chip cards that may be reused for "
@@ -10450,6 +10406,8 @@ msgstr ""
#: pretix/base/settings.py:226
msgid "Enforce the usage of issued reusable media for check-in"
msgstr ""
"Imposer l'utilisation de supports réutilisables fournis lors de "
"l'enregistrement"
#: pretix/base/settings.py:227
msgid ""
@@ -10457,6 +10415,10 @@ msgid ""
"medium has been created and linked to a ticket. Keeping this option turned "
"off will treat the reusable medium and ticket as equals."
msgstr ""
"Si cette option est activée, le code-barres d'un billet ne sera plus accepté "
"dès lors qu'un support réutilisable a été créé et associé à ce billet. Si "
"cette option reste désactivée, le support réutilisable et le billet seront "
"considérés comme équivalents."
#: pretix/base/settings.py:254
msgid "Length of barcodes"
@@ -18691,16 +18653,12 @@ msgid "The reusable medium has been changed."
msgstr "Le support réutilisable a été changé."
#: pretix/control/logdisplay.py:746
#, fuzzy
#| msgid "The new member has been added to the team."
msgid "A new ticket has been added to the medium."
msgstr "Le nouveau membre a été ajouté à l'équipe."
msgstr "Un nouveau billet a été ajouté sur le support."
#: pretix/control/logdisplay.py:747
#, fuzzy
#| msgid "{user} has been removed from the team."
msgid "A ticket has been removed from the medium."
msgstr "{user} a été retiré de l'équipe."
msgstr "Un billet a été retiré du support."
#: pretix/control/logdisplay.py:748
msgid "The medium has been connected to a new ticket."
@@ -18712,6 +18670,8 @@ msgid ""
"The ticket #{positionid} was exchanged for reusable medium "
"{medium_identifier}."
msgstr ""
"Le ticket n° {positionid} a été échangé contre un support réutilisable "
"{medium_identifier}."
#: pretix/control/logdisplay.py:750
msgid "The medium has been connected to a new gift card."
@@ -20627,10 +20587,8 @@ msgstr ""
"lenregistrement :"
#: pretix/control/templates/pretixcontrol/checkin/simulator.html:85
#, fuzzy
#| msgid "Special attention required"
msgid "Media exchange required"
msgstr "Une attention particulière est requise"
msgstr "Échange de supports requis"
#: pretix/control/templates/pretixcontrol/checkin/simulator.html:87
#, python-format
@@ -20638,6 +20596,8 @@ msgid ""
"This ticket needs to be exchanged into a <strong>%(media_type)s</strong> "
"reusable medium. <strong>%(media_policy)s</strong>."
msgstr ""
"Ce billet doit être échangé contre un support réutilisable <strong>%"
"(media_type)s</strong>. <strong>%(media_policy)s</strong>."
#: pretix/control/templates/pretixcontrol/checkin/simulator.html:103
msgid "Special attention required"
@@ -27232,6 +27192,9 @@ msgid ""
"Even if a team has no access to a certain category of data, they might still "
"be able to see parts of this data when it is linked to data they can see."
msgstr ""
"Même si une équipe n'a pas accès à une certaine catégorie de données, elle "
"peut néanmoins être en mesure de consulter certaines parties de ces données "
"lorsque celles-ci sont liées à des données auxquelles elle a accès."
#: pretix/control/templates/pretixcontrol/organizers/team_edit.html:35
msgid ""
@@ -27239,6 +27202,10 @@ msgid ""
"some information about gift cards linked to a customer account, even if they "
"generally can't see gift cards directly."
msgstr ""
"Par exemple, une personne ayant accès aux comptes clients pourra consulter "
"certaines informations concernant les cartes cadeaux associées à un compte "
"client, même si, en règle générale, elle ne peut pas voir directement ces "
"cartes cadeaux."
#: pretix/control/templates/pretixcontrol/organizers/team_edit.html:59
msgid ""
@@ -27246,6 +27213,9 @@ msgid ""
"information about vouchers used to create an order, even if they generally "
"can't see vouchers directly."
msgstr ""
"Par exemple, une personne ayant accès aux commandes pourra consulter "
"certaines informations concernant les bons utilisés pour créer une commande, "
"même si, en règle générale, elle ne peut pas consulter directement ces bons."
#: pretix/control/templates/pretixcontrol/organizers/team_members.html:21
msgid "Member"
@@ -28117,30 +28087,22 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/subevents/detail.html:9
#: pretix/control/templates/pretixcontrol/subevents/detail.html:13
#, fuzzy, python-format
#| msgid "Quota: %(name)s"
#, python-format
msgctxt "subevent"
msgid "Date: %(name)s"
msgstr "Quota : %(name)s"
msgstr "Date : %(name)s"
#: pretix/control/templates/pretixcontrol/subevents/detail.html:234
#, fuzzy
#| msgid "Partially paid"
msgid "partially canceled"
msgstr "Partiellement payé"
msgstr "partiellement annulé"
#: pretix/control/templates/pretixcontrol/subevents/detail.html:282
#, fuzzy
#| msgctxt "permission_level"
#| msgid "View all"
msgid "View all"
msgstr "Tout afficher"
#: pretix/control/templates/pretixcontrol/subevents/detail.html:289
#, fuzzy
#| msgid "No archived events found."
msgid "No orders found."
msgstr "Aucun événement archivé trouvé."
msgstr "Aucune commande trouvée."
#: pretix/control/templates/pretixcontrol/subevents/detail.html:302
#: pretix/control/templates/pretixcontrol/subevents/edit.html:279
@@ -30938,10 +30900,8 @@ msgid "Voucher {}"
msgstr "Bon {}"
#: pretix/control/views/typeahead.py:179 pretix/control/views/typeahead.py:180
#, fuzzy
#| msgid "Go to event"
msgid "No event"
msgstr "Aller à l'événement"
msgstr "Aucun événement"
#: pretix/control/views/user.py:169
msgid "The password you entered was invalid, please try again."
+9 -5
View File
@@ -7,7 +7,7 @@ msgstr ""
"Project-Id-Version: French\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-06-28 15:49+0000\n"
"PO-Revision-Date: 2026-03-18 12:23+0000\n"
"PO-Revision-Date: 2026-06-29 17:00+0000\n"
"Last-Translator: CVZ-es <damien.bremont@casadevelazquez.org>\n"
"Language-Team: French <https://translate.pretix.eu/projects/pretix/pretix-js/"
"fr/>\n"
@@ -16,7 +16,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 5.16.2\n"
"X-Generator: Weblate 2026.6.1\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
@@ -443,11 +443,11 @@ msgstr "Appuyez sur Ctrl-C pour copier !"
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue:80
msgid "Edit"
msgstr ""
msgstr "Éditer"
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue:86
msgid "Visualize"
msgstr ""
msgstr "Visualiser"
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue:96
msgid ""
@@ -455,10 +455,14 @@ msgid ""
"or variations are not contained in any of your rule parts so people with "
"these tickets will not get in:"
msgstr ""
"Votre règle effectue toujours un filtrage par produit ou variante, mais les "
"produits ou variantes suivants ne figurent dans aucune des parties de votre "
"règle; par conséquent, les personnes détenant ces billets ne seront pas "
"admises :"
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue:99
msgid "Please double-check if this was intentional."
msgstr ""
msgstr "Veuillez vérifier si cela était intentionnel."
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts:4
msgid "All of the conditions below (AND)"
+2 -4
View File
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-06-28 14:42+0000\n"
"PO-Revision-Date: 2026-06-20 17:00+0000\n"
"PO-Revision-Date: 2026-06-30 16:52+0000\n"
"Last-Translator: Nikita Mitasov <me@ch4og.com>\n"
"Language-Team: Russian <https://translate.pretix.eu/projects/pretix/pretix/"
"ru/>\n"
@@ -35488,10 +35488,8 @@ msgstr "Введите промокод ниже, чтобы купить эт
#: pretix/presale/templates/pretixpresale/event/fragment_availability.html:10
#: pretix/presale/templates/pretixpresale/event/fragment_availability.html:14
#, fuzzy
#| msgid "Quota availabilities"
msgid "Not available yet."
msgstr "Наличие квот"
msgstr "Еще недоступно."
#: pretix/presale/templates/pretixpresale/event/fragment_availability.html:18
msgid "Not available any more."
+2 -7
View File
@@ -34,7 +34,6 @@
import json
import logging
import urllib.parse
from collections import OrderedDict
from decimal import Decimal
@@ -42,7 +41,6 @@ import paypalrestsdk
import paypalrestsdk.exceptions
from django import forms
from django.contrib import messages
from django.core import signing
from django.http import HttpRequest
from django.template.loader import get_template
from django.urls import reverse
@@ -58,6 +56,7 @@ from pretix.base.forms import SecretKeySettingsField
from pretix.base.models import Event, Order, OrderPayment, OrderRefund, Quota
from pretix.base.payment import BasePaymentProvider, PaymentException
from pretix.base.settings import SettingsSandbox
from pretix.base.views.redirect import safelink
from pretix.multidomain.urlreverse import eventreverse_absolute
from pretix.plugins.paypal.api import Api
from pretix.plugins.paypal.models import ReferencedPayPalObject
@@ -349,11 +348,7 @@ class Paypal(BasePaymentProvider):
for link in payment.links:
if link.method == "REDIRECT" and link.rel == "approval_url":
if request.session.get('iframe_session', False):
signer = signing.Signer(salt='safe-redirect')
return (
eventreverse_absolute(request.event, 'plugins:paypal:redirect') + '?url=' +
urllib.parse.quote(signer.sign(link.href))
)
return safelink(link.href, framebreak=True)
else:
return str(link.href)
else:
@@ -1,33 +0,0 @@
{% load compress %}
{% load i18n %}
{% load static %}
<!DOCTYPE html>
<html>
<head>
<title>{{ settings.PRETIX_INSTANCE_NAME }}</title>
{% compress css %}
<link rel="stylesheet" type="text/x-scss" href="{% static "pretixbase/scss/cachedfiles.scss" %}"/>
{% endcompress %}
{% compress js %}
<script type="text/javascript" src="{% static "jquery/js/jquery-3.6.4.min.js" %}"></script>
{% endcompress %}
</head>
<body>
<div class="container">
<h1>{% trans "The payment process has started in a new window." %}</h1>
<p>
{% trans "The window to enter your payment data was not opened or was closed?" %}
</p>
<p>
<a href="{{ url }}" target="_blank" class="btn btn-default btn-lg">
<span class="fa fa-external-link-square"></span>
{% trans "Click here in order to open the window." %}
</a>
</p>
<script>
window.open('{{ url|escapejs }}');
</script>
</div>
</body>
</html>
+1 -2
View File
@@ -21,13 +21,12 @@
#
from django.urls import include, re_path
from .views import abort, oauth_disconnect, redirect_view, success
from .views import abort, oauth_disconnect, success
event_patterns = [
re_path(r'^paypal/', include([
re_path(r'^abort/$', abort, name='abort'),
re_path(r'^return/$', success, name='return'),
re_path(r'^redirect/$', redirect_view, name='redirect'),
re_path(r'w/(?P<cart_namespace>[a-zA-Z0-9]{16})/abort/', abort, name='abort'),
re_path(r'w/(?P<cart_namespace>[a-zA-Z0-9]{16})/return/', success, name='return'),
+1 -19
View File
@@ -39,13 +39,10 @@ from decimal import Decimal
import paypalrestsdk
import paypalrestsdk.exceptions
from django.contrib import messages
from django.core import signing
from django.db.models import Sum
from django.http import HttpResponse, HttpResponseBadRequest
from django.shortcuts import render
from django.http import HttpResponse
from django.urls import reverse
from django.utils.translation import gettext_lazy as _
from django.views.decorators.clickjacking import xframe_options_exempt
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.http import require_POST
from django_scopes import scopes_disabled
@@ -61,21 +58,6 @@ from pretix.plugins.paypal.payment import Paypal
logger = logging.getLogger('pretix.plugins.paypal')
@xframe_options_exempt
def redirect_view(request, *args, **kwargs):
signer = signing.Signer(salt='safe-redirect')
try:
url = signer.unsign(request.GET.get('url', ''))
except signing.BadSignature:
return HttpResponseBadRequest('Invalid parameter')
r = render(request, 'pretixplugins/paypal/redirect.html', {
'url': url,
})
r._csp_ignore = True
return r
def success(request, *args, **kwargs):
pid = request.GET.get('paymentId')
token = request.GET.get('token')
@@ -1,33 +0,0 @@
{% load compress %}
{% load i18n %}
{% load static %}
<!DOCTYPE html>
<html>
<head>
<title>{{ settings.PRETIX_INSTANCE_NAME }}</title>
{% compress css %}
<link rel="stylesheet" type="text/x-scss" href="{% static "pretixbase/scss/cachedfiles.scss" %}"/>
{% endcompress %}
{% compress js %}
<script type="text/javascript" src="{% static "jquery/js/jquery-3.6.4.min.js" %}"></script>
{% endcompress %}
</head>
<body>
<div class="container">
<h1>{% trans "The payment process has started in a new window." %}</h1>
<p>
{% trans "The window to enter your payment data was not opened or was closed?" %}
</p>
<p>
<a href="{{ url }}" target="_blank" class="btn btn-default btn-lg">
<span class="fa fa-external-link-square"></span>
{% trans "Click here in order to open the window." %}
</a>
</p>
<script>
window.open('{{ url|escapejs }}');
</script>
</div>
</body>
</html>
+1 -3
View File
@@ -22,15 +22,13 @@
from django.urls import include, re_path
from .views import (
PayView, XHRView, abort, isu_disconnect, isu_return, redirect_view,
success, webhook,
PayView, XHRView, abort, isu_disconnect, isu_return, success, webhook,
)
event_patterns = [
re_path(r'^paypal2/', include([
re_path(r'^abort/$', abort, name='abort'),
re_path(r'^return/$', success, name='return'),
re_path(r'^redirect/$', redirect_view, name='redirect'),
re_path(r'^xhr/$', XHRView.as_view(), name='xhr'),
re_path(r'^pay/(?P<order>[^/]+)/(?P<hash>[^/]+)/(?P<payment>[^/]+)/$', PayView.as_view(), name='pay'),
re_path(r'^(?P<order>[^/][^w]+)/(?P<secret>[A-Za-z0-9]+)/xhr/$', XHRView.as_view(), name='xhr'),
+1 -19
View File
@@ -36,13 +36,10 @@ import logging
from decimal import Decimal
from django.contrib import messages
from django.core import signing
from django.core.cache import cache
from django.db import transaction
from django.db.models import Sum
from django.http import (
Http404, HttpResponse, HttpResponseBadRequest, JsonResponse,
)
from django.http import Http404, HttpResponse, JsonResponse
from django.shortcuts import get_object_or_404, redirect, render
from django.urls import reverse
from django.utils.decorators import method_decorator
@@ -104,21 +101,6 @@ class PaypalOrderView:
}) + ('?paid=yes' if self.order.status == Order.STATUS_PAID else ''))
@xframe_options_exempt
def redirect_view(request, *args, **kwargs):
signer = signing.Signer(salt='safe-redirect')
try:
url = signer.unsign(request.GET.get('url', ''))
except signing.BadSignature:
return HttpResponseBadRequest('Invalid parameter')
r = render(request, 'pretixplugins/paypal2/redirect.html', {
'url': url,
})
r._csp_ignore = True
return r
@method_decorator(csrf_exempt, name='dispatch')
@method_decorator(xframe_options_exempt, 'dispatch')
class XHRView(View):
+3 -15
View File
@@ -46,7 +46,6 @@ import stripe
from django import forms
from django.conf import settings
from django.contrib import messages
from django.core import signing
from django.db import transaction
from django.http import HttpRequest
from django.template.loader import get_template
@@ -72,6 +71,7 @@ from pretix.base.payment import (
)
from pretix.base.plugins import get_all_plugins
from pretix.base.settings import SettingsSandbox
from pretix.base.views.redirect import safelink
from pretix.helpers import OF_SELF
from pretix.helpers.countries import CachedCountries
from pretix.helpers.http import get_client_ip
@@ -745,15 +745,7 @@ class StripeMethod(BasePaymentProvider):
def redirect(self, request, url):
if request.session.get('iframe_session', False):
return (
eventreverse_absolute(request.event, 'plugins:stripe:redirect') +
'?data=' + signing.dumps({
'url': url,
'session': {
'payment_stripe_order_secret': request.session['payment_stripe_order_secret'],
},
}, salt='safe-redirect')
)
return safelink(url, framebreak=True)
else:
return str(url)
@@ -1053,11 +1045,7 @@ class StripeMethod(BasePaymentProvider):
'hash': payment.order.tagged_secret('plugins:stripe'),
})
if not self.redirect_in_widget_allowed and request.session.get('iframe_session', False):
return eventreverse_absolute(self.event, 'plugins:stripe:redirect') + '?data=' + signing.dumps({
'url': url,
'session': {},
}, salt='safe-redirect')
return safelink(url, framebreak=True)
return url
def _confirm_payment_intent(self, request, payment):
@@ -1,33 +0,0 @@
{% load compress %}
{% load i18n %}
{% load static %}
<!DOCTYPE html>
<html>
<head>
<title>{{ settings.PRETIX_INSTANCE_NAME }}</title>
{% compress css %}
<link rel="stylesheet" type="text/x-scss" href="{% static "pretixbase/scss/cachedfiles.scss" %}"/>
{% endcompress %}
{% compress js %}
<script type="text/javascript" src="{% static "jquery/js/jquery-3.6.4.min.js" %}"></script>
{% endcompress %}
</head>
<body>
<div class="container">
<h1>{% trans "The payment process has started in a new window." %}</h1>
<p>
{% trans "The window to enter your payment data was not opened or was closed?" %}
</p>
<p>
<a href="{{ url }}" target="_blank" class="btn btn-default btn-lg">
<span class="fa fa-external-link-square"></span>
{% trans "Click here in order to open the window." %}
</a>
</p>
<script>
window.open('{{ url|escapejs }}');
</script>
</div>
</body>
</html>
+1 -2
View File
@@ -25,13 +25,12 @@ from pretix.multidomain import event_url
from .views import (
OrganizerSettingsFormView, ReturnView, ScaReturnView, ScaView,
oauth_disconnect, oauth_return, redirect_view, webhook,
oauth_disconnect, oauth_return, webhook,
)
event_patterns = [
re_path(r'^stripe/', include([
event_url(r'^webhook/$', webhook, name='webhook', require_live=False),
re_path(r'^redirect/$', redirect_view, name='redirect'),
re_path(r'^return/(?P<order>[^/]+)/(?P<hash>[^/]+)/(?P<payment>[0-9]+)/$', ReturnView.as_view(), name='return'),
re_path(r'^sca/(?P<order>[^/]+)/(?P<hash>[^/]+)/(?P<payment>[0-9]+)/$', ScaView.as_view(), name='sca'),
re_path(r'^sca/(?P<order>[^/]+)/(?P<hash>[^/]+)/(?P<payment>[0-9]+)/return/$',
+2 -31
View File
@@ -34,13 +34,11 @@
import json
import logging
import urllib.parse
import requests
from django.contrib import messages
from django.core import signing
from django.db import transaction
from django.http import Http404, HttpResponse, HttpResponseBadRequest
from django.http import Http404, HttpResponse
from django.shortcuts import get_object_or_404, redirect, render
from django.urls import reverse
from django.utils.decorators import method_decorator
@@ -64,7 +62,7 @@ from pretix.control.views.event import DecoupleMixin
from pretix.control.views.organizer import OrganizerDetailViewMixin
from pretix.helpers import OF_SELF
from pretix.helpers.http import redirect_to_url
from pretix.multidomain.urlreverse import eventreverse, eventreverse_absolute
from pretix.multidomain.urlreverse import eventreverse
from pretix.plugins.stripe.forms import OrganizerStripeSettingsForm
from pretix.plugins.stripe.models import ReferencedStripeObject
from pretix.plugins.stripe.tasks import (
@@ -74,28 +72,6 @@ from pretix.plugins.stripe.tasks import (
logger = logging.getLogger('pretix.plugins.stripe')
@xframe_options_exempt
def redirect_view(request, *args, **kwargs):
try:
data = signing.loads(request.GET.get('data', ''), salt='safe-redirect')
except signing.BadSignature:
return HttpResponseBadRequest('Invalid parameter')
if 'go' in request.GET:
if 'session' in data:
for k, v in data['session'].items():
request.session[k] = v
return redirect(data['url'])
else:
params = request.GET.copy()
params['go'] = '1'
r = render(request, 'pretixplugins/stripe/redirect.html', {
'url': eventreverse_absolute(request.event, 'plugins:stripe:redirect') + '?' + urllib.parse.urlencode(params),
})
r._csp_ignore = True
return r
@scopes_disabled()
def oauth_return(request, *args, **kwargs):
import stripe
@@ -514,11 +490,6 @@ class StripeOrderView:
return self.request.event.get_payment_providers()[self.payment.provider]
def _redirect_to_order(self):
if self.request.session.get('payment_stripe_order_secret') != self.order.secret and not self.payment.provider.startswith('stripe'):
messages.error(self.request, _('Sorry, there was an error in the payment process. Please check the link '
'in your emails to continue.'))
return redirect_to_url(eventreverse(self.request.event, 'presale:event.index'))
return redirect_to_url(eventreverse(self.request.event, 'presale:event.order', kwargs={
'order': self.order.code,
'secret': self.order.secret
@@ -2,6 +2,7 @@
{% load i18n %}
{% load eventurl %}
{% load urlreplace %}
{% load static %}
{% block content %}
{% if cart_namespace %}
@@ -23,9 +24,8 @@
class="btn btn-primary btn-lg" target="_blank">
{% trans "Continue in new tab" %}
</a>
<script>
window.open('{{ url|escapejs }}');
</script>
{{ url|json_script:"framebreak-url" }}
<script type="text/javascript" src="{% static "pretixbase/js/framebreak.js" %}"></script>
</div>
{% else %}
<h1>{% trans "Cookies not supported" %}</h1>
-1
View File
@@ -536,7 +536,6 @@ class EventIndex(EventViewMixin, EventListMixin, CartMixin, TemplateView):
**pass_through_url_params,
})
})
r._csp_ignore = True
return r
if not request.event.all_sales_channels and request.sales_channel.identifier not in (s.identifier for s in request.event.limit_sales_channels.all()):
-1
View File
@@ -125,7 +125,6 @@ class WaitingView(EventViewMixin, FormView):
request.event, "presale:event.waitinglist", kwargs={'cart_namespace': kwargs.get('cart_namespace')}
) + '?' + url_replace(request, 'require_cookie', '', 'iframe', '', 'locale', request.GET.get('locale', get_language_without_region()))
})
r._csp_ignore = True
return r
if not self.itemvars:
+4
View File
@@ -624,6 +624,9 @@ LOGGING = {
'request_id': {
'()': 'pretix.helpers.logs.RequestIdFilter'
},
'skip_not_found': {
'()': 'pretix.helpers.logs.SkipNotFoundFilter',
}
},
'handlers': {
'console': {
@@ -665,6 +668,7 @@ LOGGING = {
'handlers': ['file', 'console', 'mail_admins'],
'level': loglevel,
'propagate': True,
'filters': ['skip_not_found'],
},
'pretix.security.csp': {
'handlers': ['csp_file'],
@@ -0,0 +1,3 @@
// Attempt to auto-open page in new tab. Will be ignored by most browser's popup blockers anyways, though.
var url = JSON.parse(document.getElementById('framebreak-url').innerText)
window.open(url)
+1 -1
View File
@@ -119,7 +119,7 @@ def test_linkify_abs(link):
assert markdown_compile_email(input) == f"<p>{output}</p>"
signer = signing.Signer(salt='safe-redirect')
signer = signing.Signer(salt='safelink-url')
@pytest.mark.parametrize(