Compare commits

..
39 Commits
Author SHA1 Message Date
pajowu e394054ae3 Fix duplicate default check in TicketLayoutSerializer (#6748) 2026-11-06 12:24:33 +01:00
Raphael Michel dda2a18fdf Week calendar: Fix navigation after dateutil 4.0 upgrade (#6746) 2026-11-06 10:03:55 +01:00
dependabot[bot] 68bd182f79 Bump arabic-reshaper from 3.0.1 to 3.1.0 (#6744)
Bumps [arabic-reshaper](https://github.com/mpcabd/python-arabic-reshaper) from 3.0.1 to 3.1.0.
- [Release notes](https://github.com/mpcabd/python-arabic-reshaper/releases)
- [Commits](https://github.com/mpcabd/python-arabic-reshaper/compare/v3.0.1...v3.1.0)

---
updated-dependencies:
- dependency-name: arabic-reshaper
  dependency-version: 3.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-11-05 20:03:54 +01:00
dependabot[bot] 2ee6ea7692 Update pytest-asyncio requirement from >=1.4.1 to >=1.4.1.post1 (#6743)
Updates the requirements on [pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio) to permit the latest version.
- [Release notes](https://github.com/pytest-dev/pytest-asyncio/releases)
- [Commits](https://github.com/pytest-dev/pytest-asyncio/compare/v1.4.1...v1.4.1.post1)

---
updated-dependencies:
- dependency-name: pytest-asyncio
  dependency-version: 1.4.1.post1
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-11-05 20:03:22 +01:00
dependabot[bot] a37305f8f4 Update flake8 requirement from ==7.4.* to ==7.5.* (#6745)
Updates the requirements on [flake8](https://github.com/pycqa/flake8) to permit the latest version.
- [Commits](https://github.com/pycqa/flake8/compare/7.4.0...7.5.0)

---
updated-dependencies:
- dependency-name: flake8
  dependency-version: 7.5.0
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-11-05 20:02:57 +01:00
Richard Schreiber bd4b049c16 Fix parameters for localization of SeatProtected errors (#6740) 2026-11-05 15:39:03 +01:00
Phin Wolkwitz cb852a8fa7 Fix itemcount in list beneath cart in event series (Z#23251632) (#6727) 2026-11-05 13:03:44 +01:00
Richard Schreiber 86dd5619e0 Move JavaScript importmap to top (#6734) 2026-11-05 12:39:21 +01:00
pajowu b1a1d66156 ticketoutputpdf api: save background to permanent file (#6735) 2026-11-05 10:33:08 +01:00
pajowu e229697d2a Fix changing sold-out addons if hide_sold_out is set (#6714)
The old item was shown in the frontend and you could de-select it, but this change was never applied
2026-11-04 20:37:05 +01:00
dependabot[bot] f9c7378da7 Update fakeredis requirement from ==2.39.* to ==2.40.* (#6737)
Updates the requirements on [fakeredis](https://github.com/cunla/fakeredis-py) to permit the latest version.
- [Release notes](https://github.com/cunla/fakeredis-py/releases)
- [Commits](https://github.com/cunla/fakeredis-py/compare/v2.39.0...v2.40.0)

---
updated-dependencies:
- dependency-name: fakeredis
  dependency-version: 2.40.0
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-11-04 20:21:03 +01:00
dependabot[bot] 86152a182a Update python-dateutil requirement from ==3.0.* to ==4.0.* (#6736)
Updates the requirements on [python-dateutil](https://github.com/dateutil/dateutil) to permit the latest version.
- [Release notes](https://github.com/dateutil/dateutil/releases)
- [Changelog](https://github.com/dateutil/dateutil/blob/master/NEWS)
- [Commits](https://github.com/dateutil/dateutil/compare/3.0.0...4.0.0)

---
updated-dependencies:
- dependency-name: python-dateutil
  dependency-version: 4.0.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-11-04 20:20:12 +01:00
dependabot[bot] 76899600b0 Update pytest-asyncio requirement from >=1.4.0 to >=1.4.1 (#6739)
Updates the requirements on [pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio) to permit the latest version.
- [Release notes](https://github.com/pytest-dev/pytest-asyncio/releases)
- [Commits](https://github.com/pytest-dev/pytest-asyncio/compare/v1.4.0...v1.4.1)

---
updated-dependencies:
- dependency-name: pytest-asyncio
  dependency-version: 1.4.1
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-11-04 20:17:40 +01:00
pajowu 04a0b009a6 Accept a list of sales_channels in (Sub)Event.annotated, filter_available (Z#23252067) (#6723) 2026-11-04 18:49:19 +01:00
pajowu 4e9d60d238 Fix tests loading local pretix.cfg (#6705)
test/sqlite.cfg does not exist, so pretix.testutils.settings never set PRETIX_CONFIG_FILE, leading to pretix.settings loading the local pretix.cfg

Not setting VITE_DEV_MODE outside CI only worked because most devs probably have set django.debug=on in their pretix.cfg
2026-11-04 17:44:11 +01:00
Raphael Michel fe0d0ceb2e Drop importlib_metadata dependency (#6720)
No longer needed as a polyfill and starts to break things
2026-11-04 17:44:02 +01:00
dependabot[bot] 8457603555 Update sphinx requirement from ==9.1.* to ==9.0.* (#6731)
Updates the requirements on [sphinx](https://github.com/sphinx-doc/sphinx) to permit the latest version.
- [Release notes](https://github.com/sphinx-doc/sphinx/releases)
- [Changelog](https://github.com/sphinx-doc/sphinx/blob/v9.0.4/CHANGES.rst)
- [Commits](https://github.com/sphinx-doc/sphinx/compare/v9.1.0rc1...v9.0.4)

---
updated-dependencies:
- dependency-name: sphinx
  dependency-version: 9.0.4
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-11-04 09:52:27 +01:00
dependabot[bot] ae35af596f Update tlds requirement from >=2026093003 to >=2026102900 (#6729)
Updates the requirements on [tlds](https://github.com/kichik/tlds) to permit the latest version.
- [Commits](https://github.com/kichik/tlds/commits)

---
updated-dependencies:
- dependency-name: tlds
  dependency-version: '2026102900'
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-11-04 09:52:20 +01:00
Christiaan de Die le Clercq 47c3493372 Translations: Update Dutch
Currently translated at 96.9% (6255 of 6452 strings)

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

powered by weblate
2026-11-04 09:52:05 +01:00
Isaac Raño 85d65d17b4 Translations: Update Galician
Currently translated at 18.7% (1209 of 6452 strings)

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

powered by weblate
2026-11-04 09:52:05 +01:00
vihumelo e50c845e09 Translations: Update Portuguese (Brazil)
Currently translated at 98.8% (257 of 260 strings)

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

powered by weblate
2026-11-04 09:52:05 +01:00
vihumelo c84d9061da Translations: Update Portuguese (Brazil)
Currently translated at 92.9% (5995 of 6452 strings)

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

powered by weblate
2026-11-04 09:52:05 +01:00
CVZ-es 25c9659655 Translations: Update Spanish
Currently translated at 100.0% (6452 of 6452 strings)

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

powered by weblate
2026-11-04 09:52:05 +01:00
CVZ-es b6bce961c3 Translations: Update French
Currently translated at 100.0% (6452 of 6452 strings)

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

powered by weblate
2026-11-04 09:52:05 +01:00
Mie Frydensbjerg 1de0455ebc Translations: Update Danish
Currently translated at 62.1% (4009 of 6452 strings)

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

powered by weblate
2026-11-04 09:52:05 +01:00
dependabot[bot] 9fdafa57de Update reportlab requirement from ==5.0.* to ==5.1.* (#6730)
Updates the requirements on [reportlab](https://www.reportlab.com/) to permit the latest version.

---
updated-dependencies:
- dependency-name: reportlab
  dependency-version: 5.1.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-11-04 09:51:36 +01:00
50bcfc8c74 OIDC: Expose SSO attributes to customer_signed_in signal (#6603)
* OIDC: Expose SSO attributes to customer_signed_in signal

* Change OIDC claim name

Co-authored-by: Raphael Michel <mail@raphaelmichel.de>

* Document the changed signature of the customer_signed_in signal

* Put docs on right signal

* Fix test assertions

---------

Co-authored-by: Raphael Michel <mail@raphaelmichel.de>
Co-authored-by: Raphael Michel <michel@rami.io>
2026-11-04 09:48:03 +01:00
Raphael Michel fa552fe7d1 Permissions: Add helptext for outgoingmails:read (Z#23251039) (#6707) 2026-11-04 09:20:29 +01:00
dependabot[bot] cbfc24dd64 Update css-inline requirement from ==0.22.* to ==0.23.* (#6683)
Updates the requirements on [css-inline](https://github.com/Stranger6667/css-inline) to permit the latest version.
- [Release notes](https://github.com/Stranger6667/css-inline/releases)
- [Changelog](https://github.com/Stranger6667/css-inline/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Stranger6667/css-inline/compare/c-v0.22.0...c-v0.23.0)

---
updated-dependencies:
- dependency-name: css-inline
  dependency-version: 0.23.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-11-03 17:21:28 +01:00
dependabot[bot] 6e0c2d69a5 Bump pycparser from 3.11 to 3.12 (#6701)
Bumps [pycparser](https://github.com/eliben/pycparser) from 3.11 to 3.12.
- [Release notes](https://github.com/eliben/pycparser/releases)
- [Commits](https://github.com/eliben/pycparser/compare/release_v3.11...release_v3.12)

---
updated-dependencies:
- dependency-name: pycparser
  dependency-version: '3.12'
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-11-03 17:19:46 +01:00
dependabot[bot]andRaphael Michel 34ed175abe Update dnspython requirement from ==2.8.* to ==2.9.* (#6671)
* Update dnspython requirement from ==2.8.* to ==2.9.*

Updates the requirements on [dnspython](https://github.com/rthalley/dnspython) to permit the latest version.
- [Release notes](https://github.com/rthalley/dnspython/releases)
- [Changelog](https://github.com/rthalley/dnspython/blob/main/doc/whatsnew.rst)
- [Commits](https://github.com/rthalley/dnspython/compare/v2.8.0rc1...v2.9.0)

---
updated-dependencies:
- dependency-name: dnspython
  dependency-version: 2.9.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update pyproject.toml

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Raphael Michel <michel@pretix.eu>
2026-11-03 17:19:17 +01:00
dependabot[bot] a9aaf8638e Update pytest-mock requirement from ==3.16.* to ==3.17.* (#6715)
Updates the requirements on [pytest-mock](https://github.com/pytest-dev/pytest-mock) to permit the latest version.
- [Release notes](https://github.com/pytest-dev/pytest-mock/releases)
- [Changelog](https://github.com/pytest-dev/pytest-mock/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest-mock/compare/v3.16.0...v3.17.0)

---
updated-dependencies:
- dependency-name: pytest-mock
  dependency-version: 3.17.0
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-11-03 17:18:21 +01:00
Raphael MichelandRaphael Michel a613affa05 Sentry: Scrub secrets from event details (#6218)
* Sentry: Scrub secrets from event details

* Apply suggestions from code review

Co-authored-by: Raphael Michel <mail@raphaelmichel.de>
2026-11-03 16:45:35 +01:00
Raphael Michel cd0ed78b76 Tests: Do not rely on actual DNS for peppol validation (#6711) 2026-11-03 16:44:31 +01:00
Raphael Michel 4889abd75c PDF editor: Warn about missing scannable QR code (#6726)
* PDF editor: Warn about missing scannable QR code

* Fix
2026-11-03 16:43:59 +01:00
Raphael Michel 0a73faa8bd Bump to i18nfield 1.12.0 2026-11-03 10:38:37 +01:00
Tobias Kunze def5042661 Ignore spaces in bank transfer queries (#6724)
When copying an order code from e.g. the order list, it's easy to
include spaces when pasting, and then this does not match anything. And
as the JavaScript side of the search *does* compare the stripped string
(normalizeQuery), just deleting the whitespace does not trigger the
order to be found either, you have delete one more letter.
2026-11-03 09:12:38 +01:00
Richard Schreiber e6f8f178af Extend log_action filter and make recursive (Z#23247315) (#6598)
* Extend log_action filter and make recursive

* fix flake8

* fix type mismatch

* add "salt" to sensitive keys

* match "key" (e.g. see payone)

* add "auth" to sensitive keys

* clean lists recursively

* improve clean method name as it also cleans list recursively

* Add test
2026-10-29 10:52:00 +01:00
Raphael Michel 5f5380e8b1 Bump version to 2026.10.0.dev0 2026-10-29 09:59:11 +01:00
58 changed files with 845 additions and 2002 deletions

No files matched your search

-42
View File
@@ -1,42 +0,0 @@
Führe den Upstream-Merge-Workflow für pretix_cgo durch.
## Normaler Ablauf
Das Script läuft im Terminal des Nutzers:
```bash
bash /home/monsi/git_gemeinde/pretix_cgo/.claude/upstream-merge.sh
```
Das Script ist weitgehend selbstständig:
- Holt Upstream-Tags, erstellt Branch, mergt Master, pusht + gibt MR-Link aus
- Prüft Gender-Muster → bei Befunden: öffnet automatisch eine Claude-Session zur Bereinigung
- Hält mit `read -p` bei MR-Merge-Bestätigung und cgm72-Prüfung an
- Pollt Build-Pipeline und Loginseiten selbst via `curl`
## Wenn ich von dem Script gerufen werde (Gender-Befunde)
Das Script hat gegenderte Sprache gefunden und startet mich mit den Befunden als Prompt.
Ich bereinige die Dateien, committe, pushe – dann beende ich die Session.
Das Script prüft danach nochmal und läuft automatisch weiter.
Bereinigungsregeln:
- Binneni (`*`, `:`, `_`, `(in)`) → maskuline Grundform (`Teilnehmer*in` → `Teilnehmer`)
- Partizip-Plural (`Teilnehmenden`, `Helfenden` …) → maskuline Grundform (`Teilnehmer`, `Helfer` …)
- Immer den vollständigen `msgstr`-Block als Kontext lesen, mehrzeilige Strings beachten.
## Fehler-Exit-Codes
| Code | Bedeutung | Aktion |
|------|--------------------------------------------|-----------------------------|
| 1 | Gender-Befunde nach Claude-Fix noch offen | Manuell prüfen |
| 2 | Build fehlgeschlagen oder Timeout | Nutzer informieren, stoppen |
| 3 | Loginseite nach 5 Min. nicht erreichbar | Nutzer informieren, stoppen |
## Notfall-Resume
Falls das Script mitten im Lauf abgebrochen ist (nach dem Branch-Push):
```bash
bash /home/monsi/git_gemeinde/pretix_cgo/.claude/upstream-merge.sh --resume
```
-39
View File
@@ -1,39 +0,0 @@
# Bereinigungsregeln: Gegenderte Sprache in deutschen Übersetzungen
## Zu prüfende Dateien
- `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`
## Suchmuster
| 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` |
## Ersetzungsregeln
- Binneni → maskuline Grundform des Nomens:
- `Teilnehmer*in` → `Teilnehmer`
- `Käufer:innen` → `Käufer`
- `Besucher_in` → `Besucher`
- Partizip-Plural → maskuline Grundform:
- `Teilnehmenden` → `Teilnehmer`
- `Helfenden` → `Helfer`
- `Organisierenden` → `Organisator` (Kontext beachten, ggf. `Veranstalter`)
- `Bestellenden` → `Besteller`
- `Buchenden` → `Bucher` (oder `Käufer`, je nach Kontext)
- `Zahlenden` → `Zahler`
## Vorgehen
1. Immer den **vollständigen `msgstr`-Block** lesen (kann mehrzeilig sein, z.B. `msgstr[0]`/`msgstr[1]` für Pluralformen).
2. Die zugehörige `msgid` für Kontext heranziehen.
3. Nur `msgstr`-Zeilen ändern, niemals `msgid`.
4. Bei Unsicherheit über die beste Ersetzung: konservativste Variante wählen und in der Commit-Message notieren.
-245
View File
@@ -1,245 +0,0 @@
#!/bin/bash
# Upstream-Merge-Workflow für pretix_cgo
# Aufruf: ./upstream-merge.sh – vollständiger Lauf
# ./upstream-merge.sh --resume – nach Gender-Bereinigung fortsetzen
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
GITOPS_DIR="$(cd "$REPO_DIR/../OrtlerstrasseGitOps" && pwd)"
STATE_FILE="$SCRIPT_DIR/.upstream-merge-state"
GITEA_API="https://git.ortlerstrasse.de/api/v1"
GITEA_OWNER="CGM_Public"
GITEA_REPO="pretix_cgo"
# GITEA_TOKEN aus interaktiver Shell laden falls nicht gesetzt
if [[ -z "${GITEA_TOKEN:-}" ]] && [[ -f ~/.bashrc ]]; then
GITEA_TOKEN=$(bash -i -c 'echo $GITEA_TOKEN' 2>/dev/null) || GITEA_TOKEN=""
fi
set -euo pipefail
# --- Ausgabe-Utilities ---
green() { echo -e "\033[0;32m[✓]\033[0m $*"; }
yellow() { echo -e "\033[1;33m[→]\033[0m $*"; }
red() { echo -e "\033[0;31m[✗]\033[0m $*" >&2; }
pause() { echo ""; yellow "$1"; read -rp " [Enter zum Fortfahren] "; echo ""; }
# --- State speichern/laden ---
save_state() {
cat > "$STATE_FILE" <<EOF
UPSTREAM_TAG=$UPSTREAM_TAG
VERSION=$VERSION
BRANCH=$BRANCH
NEW_TAG=$NEW_TAG
EOF
}
load_state() {
if [[ ! -f "$STATE_FILE" ]]; then
red "Kein State-File gefunden ($STATE_FILE). Bitte ohne --resume starten."
exit 1
fi
# shellcheck source=/dev/null
source "$STATE_FILE"
green "State geladen: UPSTREAM_TAG=$UPSTREAM_TAG | BRANCH=$BRANCH | NEW_TAG=$NEW_TAG"
}
# --- Build-Pipeline pollen ---
poll_pipeline() {
local tag_sha="$1"
if [[ -z "${GITEA_TOKEN:-}" ]]; then
yellow "GITEA_TOKEN nicht gesetzt – Pipeline-Polling nicht möglich."
pause "Build manuell auf Gitea prüfen, dann Enter drücken."
return
fi
yellow "Warte auf Pipeline-Run für SHA ${tag_sha:0:12}..."
local run_id=""
for i in $(seq 1 12); do
sleep 10
run_id=$(curl -sf -H "Authorization: token $GITEA_TOKEN" \
"$GITEA_API/repos/$GITEA_OWNER/$GITEA_REPO/actions/runs?limit=10" \
| jq -r --arg sha "$tag_sha" \
'.workflow_runs[] | select(.head_sha == $sha) | .id' \
| head -1 || true)
[[ -n "$run_id" ]] && break
echo " ... noch kein Run ($i/12, warte 10s)"
done
if [[ -z "$run_id" ]]; then
red "Pipeline-Run nicht gefunden nach 2 Minuten."
pause "Build manuell prüfen, dann Enter drücken."
return
fi
green "Pipeline-Run #$run_id gefunden, überwache..."
for i in $(seq 1 30); do
sleep 20
local result
result=$(curl -sf -H "Authorization: token $GITEA_TOKEN" \
"$GITEA_API/repos/$GITEA_OWNER/$GITEA_REPO/actions/runs/$run_id" \
| jq -r '"\(.status)/\(.conclusion // "")"')
echo " Status: $result"
case "$result" in
completed/success) green "Build erfolgreich!"; return ;;
completed/*) red "Build fehlgeschlagen: $result"; exit 2 ;;
esac
[[ $i -eq 30 ]] && { red "Timeout: Build nach 10 Minuten nicht fertig."; exit 2; }
done
}
# --- URL pollen bis HTTP 200 ---
poll_url() {
local url="$1"
local label="$2"
yellow "Warte auf $label ($url)..."
for i in $(seq 1 20); do
sleep 15
local http
http=$(curl -sLo /dev/null -w "%{http_code}" "$url" 2>/dev/null || echo "000")
echo " HTTP: $http"
[[ "$http" == "200" ]] && { green "$label erreichbar (HTTP 200)."; return; }
echo " ... warte ($i/20)"
done
red "$label nicht erreichbar nach 5 Minuten."
exit 3
}
# ============================================================
# Hauptlogik
# ============================================================
RESUME=false
[[ "${1:-}" == "--resume" ]] && RESUME=true
if $RESUME; then
load_state
else
# --- Phase 1: Git-Setup ---
cd "$REPO_DIR"
green "Schritt 1: Master aktualisieren..."
git checkout master
git pull
green "Schritt 2: Upstream-Tags holen..."
git fetch upstream --tags
UPSTREAM_TAG=$(git tag --sort=-version:refname | grep -E '^v[0-9]+\.[0-9]+\.[0-9]+$' | head -1)
VERSION="${UPSTREAM_TAG#v}"
BRANCH="upstream/$VERSION"
NEW_TAG="${VERSION}.0"
green "Upstream-Tag: $UPSTREAM_TAG | Branch: $BRANCH | Neuer Tag: $NEW_TAG"
save_state
green "Schritt 3: Branch erstellen..."
git checkout -b "$BRANCH" "tags/$UPSTREAM_TAG"
green "Schritt 4: Master mergen..."
git merge master
green "Schritt 5: Branch pushen + MR anlegen..."
PUSH_OUT=$(git push --set-upstream origin "$BRANCH" -o merge_request.create 2>&1 || true)
echo "$PUSH_OUT"
MR_URL=$(echo "$PUSH_OUT" | grep -oP 'https://\S+' | head -1 || true)
[[ -n "$MR_URL" ]] && yellow "MR-Link: $MR_URL"
# --- Phase 2: Gender-Prüfung ---
green "Schritt 6: Gender-Prüfung..."
PO_FILES=(
"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"
)
GENDER_PATTERN='([A-ZÄÖÜ][a-zäöü]+(\*|:|_)(in(nen)?)\b|[A-ZÄÖÜ][a-zäöü]+\((in|innen)\)|\b(Teilnehmenden|Helfenden|Organisierenden|Bestellenden|Buchenden|Zahlenden)\b)'
GENDER_HITS=$(grep -n -E "$GENDER_PATTERN" "${PO_FILES[@]}" 2>/dev/null || true)
if [[ -n "$GENDER_HITS" ]]; then
yellow "Gender-Befunde gefunden – öffne Claude zur Bereinigung..."
echo ""
RULES=$(cat "$SCRIPT_DIR/gender-cleanup-rules.md")
claude "Beim Upstream-Merge auf Branch '$BRANCH' wurden gegenderte Ausdrücke in den deutschen Übersetzungsdateien gefunden. Bitte bereinige sie, committe und pushe anschließend.
Arbeitsverzeichnis: $REPO_DIR
Befunde:
$GENDER_HITS
$RULES
Nach der Bereinigung:
git -C $REPO_DIR add src/pretix/locale/de/ src/pretix/locale/de_Informal/
git -C $REPO_DIR commit -m 'Remove gendered language from de/de_Informal translations'
git -C $REPO_DIR push
Danach diese Session beenden – das Script läuft dann automatisch weiter."
# Nochmal prüfen ob alles bereinigt wurde
GENDER_HITS2=$(grep -n -E "$GENDER_PATTERN" "${PO_FILES[@]}" 2>/dev/null || true)
if [[ -n "$GENDER_HITS2" ]]; then
red "Noch immer Gender-Befunde vorhanden – bitte manuell prüfen:"
echo "$GENDER_HITS2"
exit 1
fi
green "Gender-Bereinigung erfolgreich."
else
green "Gender-Prüfung: Keine Befunde."
fi
fi
# --- Phase 3: Warten auf MR-Merge ---
pause "Schritt 7: MR auf Gitea mergen, dann Enter drücken."
# --- Phase 4: Tag setzen + Build ---
cd "$REPO_DIR"
green "Schritt 8: Master aktualisieren + Tag $NEW_TAG setzen..."
git checkout master
git pull
TAG_SHA=$(git rev-parse HEAD)
git tag "$NEW_TAG"
git push origin "$NEW_TAG"
green "Tag $NEW_TAG gepusht (SHA: ${TAG_SHA:0:12})."
green "Schritt 9: Build-Pipeline überwachen..."
poll_pipeline "$TAG_SHA"
# --- Phase 5: cgm72 GitOps-Update ---
green "Schritt 10: cgm72 GitOps-Update..."
CGM72_YAML="$GITOPS_DIR/pretix-cgm72/pretix-deployment.yaml"
OLD_TAG=$(grep -oP 'cr\.ortlerstrasse\.de/cgo/pretix:\K[0-9]\S+' "$CGM72_YAML")
sed -i "s|cr.ortlerstrasse.de/cgo/pretix:${OLD_TAG}|cr.ortlerstrasse.de/cgo/pretix:${NEW_TAG}|" "$CGM72_YAML"
git -C "$GITOPS_DIR" add pretix-cgm72/pretix-deployment.yaml
git -C "$GITOPS_DIR" commit -m "Update pretix-cgm72 to $NEW_TAG"
git -C "$GITOPS_DIR" push
green "cgm72 YAML aktualisiert ($OLD_TAG → $NEW_TAG)."
green "Schritt 11: Warte auf cgm72..."
poll_url "https://anmeldung.christliche-gemeinde.de/" "cgm72"
# --- Phase 6: Manuelle Bestätigung cgm72 ---
pause "Schritt 12: cgm72 manuell prüfen (https://anmeldung.christliche-gemeinde.de/). OK? Enter drücken."
# --- Phase 7: sola GitOps-Update ---
green "Schritt 13: sola GitOps-Update..."
SOLA_YAML="$GITOPS_DIR/pretix-sola/pretix-deployment.yaml"
OLD_TAG_SOLA=$(grep -oP 'cr\.ortlerstrasse\.de/cgo/pretix:\K[0-9]\S+' "$SOLA_YAML")
sed -i "s|cr.ortlerstrasse.de/cgo/pretix:${OLD_TAG_SOLA}|cr.ortlerstrasse.de/cgo/pretix:${NEW_TAG}|" "$SOLA_YAML"
git -C "$GITOPS_DIR" add pretix-sola/pretix-deployment.yaml
git -C "$GITOPS_DIR" commit -m "Update pretix-sola to $NEW_TAG"
git -C "$GITOPS_DIR" push
green "sola YAML aktualisiert ($OLD_TAG_SOLA → $NEW_TAG)."
green "Schritt 14: Warte auf sola..."
poll_url "https://anmeldung.sola-muenchen.de" "sola"
# Aufräumen
rm -f "$STATE_FILE"
echo ""
green "============================================"
green " Upstream-Merge $NEW_TAG abgeschlossen ✓"
green "============================================"
-31
View File
@@ -1,31 +0,0 @@
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 }}"
+1 -2
View File
@@ -61,8 +61,7 @@ RUN pip3 install -U \
cd /pretix && \
PRETIX_DOCKER_BUILD=TRUE pip3 install \
-e ".[memcached]" \
gunicorn django-extensions ipython \
pretix-oidc && \
gunicorn django-extensions ipython && \
rm -rf ~/.cache/pip
RUN chmod +x /usr/local/bin/pretix && \
+1 -1
View File
@@ -1,4 +1,4 @@
sphinx==9.1.*
sphinx==9.0.*
sphinx-rtd-theme~=3.1.0
sphinxcontrib-httpdomain~=2.1.0
sphinxcontrib-images~=1.0.1
+1 -1
View File
@@ -1,5 +1,5 @@
-e ../
sphinx==9.1.*
sphinx==9.0.*
sphinx-rtd-theme~=3.1.0
sphinxcontrib-httpdomain~=2.1.0
sphinxcontrib-images~=1.0.1
+13 -16
View File
@@ -27,16 +27,16 @@ classifiers = [
]
dependencies = [
"arabic-reshaper==3.0.1", # Support for Arabic in reportlab
"arabic-reshaper==3.1.0", # Support for Arabic in reportlab
"babel",
"BeautifulSoup4==4.15.*",
"bleach==6.4.*",
"celery==5.6.*",
"chardet==5.2.*",
"cryptography>=50.0.2",
"css-inline==0.22.*",
"css-inline==0.23.*",
"defusedcsv>=3.0.0",
"dnspython==2.*",
"dnspython==2.9.*",
"Django[argon2]==5.2.*,>=5.2.17",
"django-bootstrap3==26.3",
"django-compressor==4.6.0",
@@ -46,7 +46,7 @@ dependencies = [
"django-formtools==2.7",
"django-hierarkey==2.0.*,>=2.0.2",
"django-hijack==3.7.*",
"django-i18nfield==1.11.*",
"django-i18nfield==1.12.*",
"django-libsass==0.9",
"django-localflavor==5.1",
"django-markup",
@@ -58,17 +58,14 @@ dependencies = [
"django-scopes==2.1.*",
"django-statici18n==2.8.*",
"djangorestframework>=3.18.3",
"dnspython==2.8.*",
"drf_ujson2==1.7.*",
"geoip2==5.*",
"importlib_metadata==9.*", # Polyfill, we can probably drop this once we require Python 3.10+
"isoweek",
"jsonschema",
"kombu==5.6.*",
"libsass==0.23.*",
"lxml",
"markdown==3.11.2", # 3.3.5 requires importlib-metadata>=4.4, but django-bootstrap3 requires importlib-metadata<3.
# We can upgrade markdown again once django-bootstrap3 upgrades or once we drop Python 3.6 and 3.7
"markdown==3.11.2",
"mt-940==4.30.*",
"oauthlib==3.3.*",
"openpyxl==3.1.*",
@@ -82,23 +79,23 @@ dependencies = [
"protobuf==7.36.*",
"psycopg2-binary",
"pycountry",
"pycparser==3.11",
"pycparser==3.12",
"pycryptodome==3.24.*",
"pypdf==6.20.*",
"python-bidi==0.6.*", # Support for Arabic in reportlab
"python-dateutil==3.0.*",
"python-dateutil==4.0.*",
"pytz",
"pytz-deprecation-shim==0.1.*",
"pyuca",
"qrcode==8.2",
"redis==7.4.*",
"reportlab==5.0.*",
"reportlab==5.1.*",
"requests==2.34.*",
"sentry-sdk==2.71.*",
"sepaxml==2.7.*",
"stripe==7.9.*",
"text-unidecode==1.*",
"tlds>=2026093003",
"tlds>=2026102900",
"tqdm==4.*",
"ua-parser==1.0.*",
"vobject==0.9.*",
@@ -112,17 +109,17 @@ dev = [
"aiohttp==3.14.*",
"coverage",
"coveralls",
"fakeredis==2.39.*",
"flake8==7.4.*",
"fakeredis==2.40.*",
"flake8==7.5.*",
"freezegun",
"isort==9.0.*",
"pep8-naming==0.15.*",
"potypo",
"pytest-asyncio>=1.4.0",
"pytest-asyncio>=1.4.1.post1",
"pytest-cache",
"pytest-cov",
"pytest-django==4.*",
"pytest-mock==3.16.*",
"pytest-mock==3.17.*",
"pytest-sugar",
"pytest-xdist==3.8.*",
"pytest-playwright",
+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.9.0"
__version__ = "2026.10.0.dev0"
+2
View File
@@ -264,6 +264,8 @@ def oidc_validate_authorization(provider, code, redirect_uri, pkce_code_verifier
)
)
profile['oidc_claims'] = userinfo
return profile
-1
View File
@@ -28,6 +28,5 @@ 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
@@ -90,7 +90,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 = False
featured = True
repeatable_read = False
@cached_property
File diff suppressed because it is too large. Load diff
+22 -19
View File
@@ -131,6 +131,27 @@ class PeppolIdValidator:
def __init__(self, validate_online=False):
self.validate_online = validate_online
def _validate_peppol_id_online(self, value):
base_hostnames = ['participant.sml.prod.tech.peppol.org', 'participant.sml.test.tech.peppol.org']
smp_id = base64.b32encode(hashlib.sha256(value.lower().encode()).digest()).decode().rstrip("=")
for base_hostname in base_hostnames:
smp_domain = f'{smp_id}.iso6523-actorid-upis.{base_hostname}'
resolver = dns.resolver.Resolver()
try:
answers = resolver.resolve(smp_domain, 'NAPTR', lifetime=1.0)
if answers:
return value
except (dns.resolver.NXDOMAIN, dns.resolver.NoAnswer):
# ID not registered, do not set found=True
pass
except Exception: # noqa
# Error likely on our end or infrastructure is down, allow user to proceed
return value
raise ValidationError(
_("The Peppol participant ID is not registered on the Peppol network."),
)
def __call__(self, value):
if ":" not in value:
raise ValidationError(_("A Peppol participant ID always starts with a prefix, followed by a colon (:)."))
@@ -146,25 +167,7 @@ class PeppolIdValidator:
params={"number": prefix})
if self.validate_online:
base_hostnames = ['participant.sml.prod.tech.peppol.org', 'participant.sml.test.tech.peppol.org']
smp_id = base64.b32encode(hashlib.sha256(value.lower().encode()).digest()).decode().rstrip("=")
for base_hostname in base_hostnames:
smp_domain = f'{smp_id}.iso6523-actorid-upis.{base_hostname}'
resolver = dns.resolver.Resolver()
try:
answers = resolver.resolve(smp_domain, 'NAPTR', lifetime=1.0)
if answers:
return value
except (dns.resolver.NXDOMAIN, dns.resolver.NoAnswer):
# ID not registered, do not set found=True
pass
except Exception: # noqa
# Error likely on our end or infrastructure is down, allow user to proceed
return value
raise ValidationError(
_("The Peppol participant ID is not registered on the Peppol network."),
)
value = self._validate_peppol_id_online(value)
return value
+21 -4
View File
@@ -151,12 +151,29 @@ class LoggingMixin:
logentry = LogEntry(content_object=self, user=user, action_type=action, event=event,
organizer_id=organizer_id, **kwargs)
if isinstance(data, dict):
sensitivekeys = ['password', 'secret', 'api_key']
# sensitivekeys are matched whether contained, not exactly
sensitivekeys = [
'auth',
'key',
'token',
'password',
'Password',
'_pass',
'salt',
'secret',
]
for sensitivekey in sensitivekeys:
for k, v in data.items():
if (sensitivekey in k) and v:
def clean_recursive(d):
data = d
data_iterator = d.items() if isinstance(d, dict) else enumerate(d)
for k, v in data_iterator:
if v and any([sensitivekey in str(k) for sensitivekey in sensitivekeys]):
data[k] = "********"
elif isinstance(v, (list, dict)):
data[k] = clean_recursive(v)
return data
data = clean_recursive(data)
logentry.data = json.dumps(data, cls=CustomJSONEncoder, sort_keys=True)
elif data:
+20 -6
View File
@@ -83,6 +83,8 @@ from .organizer import Organizer, Team
if TYPE_CHECKING:
from hierarkey.proxy import HierarkeyProxy
from .organizer import SalesChannel
logger = logging.getLogger(__name__)
@@ -336,12 +338,18 @@ class EventMixin:
return safe_string(json.dumps(eventdict))
@classmethod
def annotated(cls, qs, channel, voucher=None):
def annotated(cls, qs, channel: "str | SalesChannel | list[SalesChannel]", voucher=None):
# Channel can currently be a SalesChannel or a str, since we need that compatibility, but a SalesChannel
# makes the query SIGNIFICANTLY faster
from pretix.base.models import Item, ItemVariation, Quota, SalesChannel
assert isinstance(channel, (SalesChannel, str))
assert isinstance(channel, (SalesChannel, str, list))
if isinstance(channel, SalesChannel):
channel = [channel]
if isinstance(channel, list):
assert all(isinstance(c, SalesChannel) for c in channel)
sq_active_item = Item.objects.using(settings.DATABASE_REPLICA).filter_available(channel=channel, voucher=voucher).filter(
Q(variations__isnull=True)
@@ -364,8 +372,8 @@ class EventMixin:
q_variation &= Q(Q(all_sales_channels=True) | Q(limit_sales_channels__identifier=channel))
q_variation &= Q(Q(item__all_sales_channels=True) | Q(item__limit_sales_channels__identifier=channel))
else:
q_variation &= Q(Q(all_sales_channels=True) | Q(limit_sales_channels=channel))
q_variation &= Q(Q(item__all_sales_channels=True) | Q(item__limit_sales_channels=channel))
q_variation &= Q(Q(all_sales_channels=True) | Q(limit_sales_channels__in=channel))
q_variation &= Q(Q(item__all_sales_channels=True) | Q(item__limit_sales_channels__in=channel))
if voucher:
if voucher.variation_id:
@@ -1661,11 +1669,17 @@ class SubEvent(EventMixin, LoggedModel):
return qs_annotated
@classmethod
def annotated(cls, qs, channel, voucher=None):
def annotated(cls, qs, channel: "str | SalesChannel | list[SalesChannel]", voucher=None):
from .items import SubEventItem, SubEventItemVariation
from .organizer import SalesChannel
assert isinstance(channel, (str, SalesChannel))
assert isinstance(channel, (SalesChannel, str, list))
if isinstance(channel, SalesChannel):
channel = [channel]
if isinstance(channel, list):
assert all(isinstance(c, SalesChannel) for c in channel)
qs = super().annotated(qs, channel, voucher=voucher)
qs = qs.annotate(
+9 -2
View File
@@ -313,7 +313,14 @@ def filter_available(qs, channel='web', voucher=None, allow_addons=False, allow_
# makes the query SIGNIFICANTLY faster
from .organizer import SalesChannel
assert isinstance(channel, (SalesChannel, str))
assert isinstance(channel, (SalesChannel, str, list))
if isinstance(channel, SalesChannel):
channel = [channel]
if isinstance(channel, list):
assert all(isinstance(c, SalesChannel) for c in channel)
q = (
# IMPORTANT: If this is updated, also update the ItemVariation query
# in models/event.py: EventMixin.annotated()
@@ -325,7 +332,7 @@ def filter_available(qs, channel='web', voucher=None, allow_addons=False, allow_
if isinstance(channel, str):
q &= Q(Q(all_sales_channels=True) | Q(limit_sales_channels__identifier=channel))
else:
q &= Q(Q(all_sales_channels=True) | Q(limit_sales_channels=channel))
q &= Q(Q(all_sales_channels=True) | Q(limit_sales_channels__in=channel))
if not allow_addons:
q &= Q(Q(category__isnull=True) | Q(category__is_addon=False))
+1
View File
@@ -330,5 +330,6 @@ def register_default_organizer_permissions(sender, **kwargs):
PermissionOption(actions=tuple(), label=pgettext_lazy("permission_level", "No access")),
PermissionOption(actions=("read",), label=pgettext_lazy("permission_level", "View")),
],
help_text=_("View access includes the option to e.g. abort pending emails or retry failed emails."),
),
]
+1 -1
View File
@@ -22,9 +22,9 @@
import os
import sys
from enum import Enum
from importlib import metadata
from typing import List
import importlib_metadata as metadata
from django.apps import AppConfig, apps
from django.conf import settings
from django.core.exceptions import ImproperlyConfigured
+2 -1
View File
@@ -2176,7 +2176,8 @@ class OrderChangeManager:
subevent=a.subevent,
voucher=None,
base_qs=Item.objects.filter(pk=a.item.pk),
allow_addons=True
allow_addons=True,
ignore_hide_sold_out_for_item_ids={a.item.pk}
)
if (not items) or items[0].current_unavailability_reason:
return False
+2 -2
View File
@@ -126,10 +126,10 @@ def generate_seats(event, subevent, plan, mapping, blocked_guids=None):
for s in current_seats.values():
if s.has_op:
raise SeatProtected(_('You can not change the plan since seat "%s" is not present in the new plan and is '
'already sold.', s.name))
'already sold.'), s.name)
if s.has_v:
raise SeatProtected(_('You can not change the plan since seat "%s" is not present in the new plan and is '
'already used in a voucher.', s.name))
'already used in a voucher.'), s.name)
Seat.objects.bulk_create(create_seats)
CartPosition.objects.filter(addon_to__seat__in=[s.pk for s in current_seats.values()]).delete()
+4 -1
View File
@@ -1199,11 +1199,14 @@ The ``sender`` keyword argument will contain the organizer.
customer_signed_in = OrganizerPluginSignal(allow_legacy_plugins=True)
"""
Arguments: ``customer``
Arguments: ``customer``, ``profile``
This signal is sent out every time a customer signs in. The ``customer`` object
is given as the first argument.
In case of SSO login, the full claims will be passed in the ``profile`` argument,
e.g. as ``oidc_claims`` for OIDC. Otherwise, ``profile`` will be ``None``.
The ``sender`` keyword argument will contain the organizer.
"""
+1 -1
View File
@@ -23,10 +23,10 @@ import json
import logging
import pathlib
import re
from importlib import metadata
from urllib.parse import urljoin
from urllib.request import urlopen
import importlib_metadata as metadata
from django import template
from django.conf import settings
from django.utils.safestring import mark_safe
@@ -16,6 +16,7 @@
<link rel="stylesheet" type="text/x-scss" href="{% static "pretixcontrol/scss/main.scss" %}" />
<link rel="stylesheet" type="text/x-scss" href="{% static "lightbox/css/lightbox.scss" %}" />
{% endcompress %}
{% vite_importmap %}
{% if DEBUG %}
<script type="text/javascript" src="{% url 'javascript-catalog' lang=request.LANGUAGE_CODE %}"></script>
{% else %}
@@ -87,7 +88,6 @@
<meta name="theme-color" content="#3b1c4a">
<meta name="referrer" content="origin">
{% vite_importmap %}
{% block custom_header %}{% endblock %}
</head>
<body data-datetimeformat="{{ js_datetime_format }}" data-timeformat="{{ js_time_format }}"
@@ -225,6 +225,14 @@
</div>
</div>
<div class="col-md-3" id="editor-toolbox-area">
{% if checkin_qr_warning %}
<div class="alert alert-warning" id="nocheckin-notice">
{% blocktrans trimmed %}
This layout does not contain a QR code that can be used to scan tickets at check-in.
{% endblocktrans %}
</div>
{% endif %}
<div class="panel panel-default" id="toolbox">
<div class="panel-heading">
<span id="toolbox-heading">
+2 -1
View File
@@ -31,7 +31,8 @@
# Unless required by applicable law or agreed to in writing, software distributed under the Apache License 2.0 is
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under the License.
import importlib_metadata as metadata
from importlib import metadata as metadata
from django.conf import settings
from django.contrib import messages
from django.db import transaction
+2
View File
@@ -65,6 +65,7 @@ class BaseEditorView(EventPermissionRequiredMixin, TemplateView):
)
maxfilesize = settings.FILE_UPLOAD_MAX_SIZE_IMAGE
minfilesize = 10
checkin_qr_warning = False
title = None
def get(self, request, *args, **kwargs):
@@ -292,6 +293,7 @@ class BaseEditorView(EventPermissionRequiredMixin, TemplateView):
ctx['title'] = self.title
ctx['locales'] = [p for p in settings.LANGUAGES if p[0] in self.request.event.settings.locales]
ctx['maxfilesize'] = self.maxfilesize
ctx['checkin_qr_warning'] = self.checkin_qr_warning
return ctx
+6 -6
View File
@@ -4,16 +4,16 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-28 10:48+0000\n"
"PO-Revision-Date: 2026-07-31 18:00+0000\n"
"Last-Translator: Nikolai <nikolai@lengefeldt.de>\n"
"Language-Team: Danish <https://translate.pretix.eu/projects/pretix/pretix/da/"
">\n"
"PO-Revision-Date: 2026-10-29 17:00+0000\n"
"Last-Translator: Mie Frydensbjerg <mif@aarhus.dk>\n"
"Language-Team: Danish <https://translate.pretix.eu/projects/pretix/pretix/"
"da/>\n"
"Language: da\n"
"MIME-Version: 1.0\n"
"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.7.1\n"
"X-Generator: Weblate 2026.10.1\n"
#: pretix/_base_settings.py
msgid "English"
@@ -34962,7 +34962,7 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/event/fragment_quota_left.html
#, python-format
msgid "%(num)s currently available"
msgstr "%(num)s pt. tilgængelig"
msgstr "%(num)s pt. ledig"
#: pretix/presale/templates/pretixpresale/event/fragment_subevent_calendar.html
#: pretix/presale/templates/pretixpresale/event/fragment_subevent_calendar_week.html
+87 -106
View File
@@ -852,7 +852,7 @@ msgstr "Details der Bestellposition"
#: pretix/base/datasync/sourcefields.py
msgid "Attendee details"
msgstr "Details Teilnehmer"
msgstr "Details Teilnehmer*in"
#: pretix/base/datasync/sourcefields.py pretix/base/exporters/answers.py
#: pretix/base/models/items.py pretix/control/navigation.py
@@ -899,11 +899,11 @@ msgstr "Veranstaltungs- oder Termininformationen"
#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html
#: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html
msgid "Attendee name"
msgstr "Name"
msgstr "Name Teilnehmer*in"
#: pretix/base/datasync/sourcefields.py
msgid "Attendee"
msgstr "Teilnehmer"
msgstr "Teilnehmer*in"
#: pretix/base/datasync/sourcefields.py pretix/base/exporters/orderlist.py
#: pretix/base/forms/questions.py pretix/base/models/customers.py
@@ -911,11 +911,11 @@ msgstr "Teilnehmer"
#: pretix/control/templates/pretixcontrol/order/index.html
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html
msgid "Attendee email"
msgstr "E-Mail Teilnehmer"
msgstr "E-Mail Teilnehmer*in"
#: pretix/base/datasync/sourcefields.py
msgid "Attendee or order email"
msgstr "E-Mail Teilnehmer oder Bestellung"
msgstr "E-Mail Teilnehmer*in oder Bestellung"
#: pretix/base/datasync/sourcefields.py pretix/base/exporters/orderlist.py
#: pretix/base/pdf.py pretix/control/templates/pretixcontrol/order/index.html
@@ -923,23 +923,23 @@ msgstr "E-Mail Teilnehmer oder Bestellung"
#: pretix/plugins/ticketoutputpdf/exporters.py
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html
msgid "Attendee company"
msgstr "Teilnehmer-Firma"
msgstr "Teilnehmer*innen-Firma"
#: pretix/base/datasync/sourcefields.py
msgid "Attendee address street"
msgstr "Teilnehmer-Adresse: Straße"
msgstr "Teilnehmer*innen-Adresse: Straße"
#: pretix/base/datasync/sourcefields.py
msgid "Attendee address ZIP code"
msgstr "Teilnehmer-Adresse: PLZ"
msgstr "Teilnehmer*innen-Adresse: PLZ"
#: pretix/base/datasync/sourcefields.py
msgid "Attendee address city"
msgstr "Teilnehmer-Adresse: Stadt"
msgstr "Teilnehmer*innen-Adresse: Stadt"
#: pretix/base/datasync/sourcefields.py
msgid "Attendee address country"
msgstr "Teilnehmer-Adresse: Land"
msgstr "Teilnehmer*innen-Adresse: Land"
#: pretix/base/datasync/sourcefields.py pretix/base/exporters/orderlist.py
#: pretix/base/pdf.py
@@ -1173,7 +1173,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 Kunden im Bestellprozess als "
"ZIP-Datei mit allen Dateien, die von Kund*innen im Bestellprozess als "
"Antwort auf eine Frage hochgeladen wurden."
#: pretix/base/exporters/answers.py pretix/base/exporters/orderlist.py
@@ -2034,11 +2034,7 @@ 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
#: pretix/base/exporters/json.py
msgid ""
"Download a structured JSON representation of all orders. This might be "
"useful for the import in third-party systems."
@@ -2055,8 +2051,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äufern und "
"Ticketinhaber eingesammelt wurden."
"Textdatei mit allen E-Mail-Adressen, die von Käufer*innen und "
"Ticketinhaber*innen eingesammelt wurden."
#: pretix/base/exporters/mail.py pretix/plugins/reports/exporters.py
msgid "Filter by status"
@@ -2073,30 +2069,15 @@ 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
#: pretix/control/templates/pretixcontrol/orders/index.html:8
#: pretix/control/templates/pretixcontrol/orders/index.html:10
#: pretix/control/templates/pretixcontrol/organizers/customer.html:205
#: pretix/control/templates/pretixcontrol/subevents/detail.html:203
#: pretix/plugins/reports/accountingreport.py:673
#: pretix/plugins/reports/accountingreport.py:873
#: pretix/plugins/reports/exporters.py:673 pretix/plugins/statistics/apps.py:39
#: pretix/presale/templates/pretixpresale/organizers/customer_orders.html:13
#: pretix/presale/views/customer.py:364
#: pretix/base/exporters/orderlist.py pretix/base/models/orders.py
#: pretix/base/permissions.py pretix/control/navigation.py
#: pretix/control/templates/pretixcontrol/orders/index.html
#: pretix/control/templates/pretixcontrol/organizers/customer.html
#: pretix/control/templates/pretixcontrol/subevents/detail.html
#: pretix/plugins/reports/accountingreport.py
#: pretix/plugins/reports/exporters.py pretix/plugins/statistics/apps.py
#: pretix/presale/templates/pretixpresale/organizers/customer_orders.html
#: pretix/presale/views/customer.py
msgid "Orders"
msgstr "Bestellungen"
@@ -3880,13 +3861,13 @@ msgstr "Bitte wählen Sie einen gültigen Staat aus."
#: pretix/base/modelimport_orders.py pretix/control/forms/filter.py
msgid "Attendee email address"
msgstr "Teilnehmer-E-Mail-Adresse"
msgstr "Teilnehmer*innen-E-Mail-Adresse"
#: pretix/base/modelimport_orders.py pretix/control/forms/filter.py
#: pretix/control/templates/pretixcontrol/order/index.html
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html
msgid "Attendee address"
msgstr "Teilnehmer-Adresse"
msgstr "Teilnehmer*innen-Adresse"
#: pretix/base/modelimport_orders.py
msgid "Calculate from product"
@@ -5394,8 +5375,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 Studenten "
"nützlich, deren Studentenausweis noch geprüft werden soll."
"dieses Ticket besondere Behandlung braucht. Das ist z.B. für Studierende "
"nützlich, deren Studierendenausweis noch geprüft werden soll."
#: pretix/base/models/items.py
msgid ""
@@ -6287,8 +6268,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 Studenten "
"nützlich, deren Studentenausweis noch geprüft werden soll."
"dieses Ticket besondere Behandlung braucht. Das ist z.B. für Studierende "
"nützlich, deren Studierendenausweis noch geprüft werden soll."
#: pretix/base/models/orders.py
msgid ""
@@ -7764,7 +7745,7 @@ msgstr "Musterfirma GmbH"
#: pretix/base/pdf.py
msgid "Full attendee address"
msgstr "Volle Teilnehmer-Adresse"
msgstr "Volle Teilnehmer*innen-Adresse"
#: pretix/base/pdf.py
msgid ""
@@ -7782,23 +7763,23 @@ msgstr ""
#: pretix/base/pdf.py
msgid "Attendee street"
msgstr "Teilnehmer-Straße"
msgstr "Teilnehmer*innen-Straße"
#: pretix/base/pdf.py
msgid "Attendee ZIP code"
msgstr "Teilnehmer-PLZ"
msgstr "Teilnehmer*innen-PLZ"
#: pretix/base/pdf.py
msgid "Attendee city"
msgstr "Teilnehmer-Stadt"
msgstr "Teilnehmer*innen-Stadt"
#: pretix/base/pdf.py
msgid "Attendee state"
msgstr "Teilnehmer-Bundesstaat"
msgstr "Teilnehmer*innen-Bundesstaat"
#: pretix/base/pdf.py
msgid "Attendee country"
msgstr "Teilnehmer-Land"
msgstr "Teilnehmer*innen-Land"
#: pretix/base/pdf.py
msgid "Pseudonymization ID (lead scanning)"
@@ -8093,7 +8074,7 @@ msgstr "Herr Mustermann"
#: pretix/plugins/ticketoutputpdf/exporters.py
#, python-brace-format
msgid "Attendee name: {part}"
msgstr "Teilnehmername: {part}"
msgstr "Teilnehmer*innenname: {part}"
#: pretix/base/pdf.py
msgid "Invoice address name for salutation"
@@ -9023,7 +9004,7 @@ msgstr "Veranstaltungsort: {location}"
#, python-brace-format
msgctxt "invoice"
msgid "Attendee: {name}"
msgstr "Teilnehmer: {name}"
msgstr "Teilnehmer*in: {name}"
#: pretix/base/services/invoices.py pretix/plugins/reports/exporters.py
#, python-brace-format
@@ -9980,7 +9961,7 @@ msgstr ""
#: pretix/base/settings.py
msgid "Hide prices on attendee ticket page"
msgstr "Preise auf Teilnehmer-Ticket-Seite verstecken"
msgstr "Preise auf Teilnehmer*innen-Ticket-Seite verstecken"
#: pretix/base/settings.py
msgid ""
@@ -9990,13 +9971,13 @@ msgid ""
"price."
msgstr ""
"Wenn eine Person mehrere Tickets erwirbt und E-Mails an alle "
"Teilnehmer verschickt werden, wird mit dieser Option der Ticketpreis "
"auf der Ticket-Seite der einzelnen Teilnehmer versteckt. Nur die "
"Teilnehmer*innen verschickt werden, wird mit dieser Option der Ticketpreis "
"auf der Ticket-Seite der einzelnen Teilnehmer*innen versteckt. Nur die "
"Person, welche die Tickets kauft, sieht den Preis."
#: pretix/base/settings.py
msgid "Ask for attendee names"
msgstr "Namen der Teilnehmer erfragen"
msgstr "Namen der Teilnehmer*innen erfragen"
#: pretix/base/settings.py
msgid "Ask for a name for all personalized tickets."
@@ -10005,11 +9986,11 @@ msgstr ""
#: pretix/base/settings.py
msgid "Require attendee names"
msgstr "Namen der Teilnehmer erfordern"
msgstr "Namen der Teilnehmer*innen erfordern"
#: pretix/base/settings.py
msgid "Require customers to fill in the names of all attendees."
msgstr "Erfordere die Eingabe aller Teilnehmer-Namen."
msgstr "Erfordere die Eingabe aller Teilnehmer*innen-Namen."
#: pretix/base/settings.py
msgid "Ask for email addresses per ticket"
@@ -10563,8 +10544,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äufern weiter angezeigt, "
"aber Teilnehmern, die ihr Ticket nicht selbst gekauft haben, werden "
"Die Box mit Zahlungsinstruktionen wird Ticketkäufer*innen weiter angezeigt, "
"aber Teilnehmer*innen, die ihr Ticket nicht selbst gekauft haben, werden "
"keine Anzeichen des fehlenden Zahlungseingangs sehen."
#: pretix/base/settings.py
@@ -11075,7 +11056,7 @@ msgstr ""
#: pretix/base/settings.py
msgid "Show number of check-ins to customer"
msgstr "Zeige Anzahl der Check-ins für Kunden an"
msgstr "Zeige Anzahl der Check-ins für Kund*innen an"
#: pretix/base/settings.py
msgid ""
@@ -11086,12 +11067,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 Kunden selbst sehen, wie oft sie die "
"Wenn diese Option aktiv ist, können Kund*innen 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 Kunden die bisherige Nutzung des Tickets einsehen "
"erlauben, sodass Kund*innen die bisherige Nutzung des Tickets einsehen "
"können. Ausgänge oder fehlgeschlagene Scans werden nicht angezeigt und die "
"Kunden sehen keine Aufschlüsselung verschiedener Check-in-Listen."
"Kund*innen sehen keine Aufschlüsselung verschiedener Check-in-Listen."
#: pretix/base/settings.py
msgid "Allow users to download tickets"
@@ -11264,7 +11245,7 @@ msgstr ""
#: pretix/base/settings.py
msgid "Both the attendee and the person who ordered can make changes"
msgstr ""
"Sowohl Besteller als auch Teilnehmer können Änderungen vornehmen"
"Sowohl Besteller*in als auch Teilnehmer*innen können Änderungen vornehmen"
#: pretix/base/settings.py
msgid "Allow customers to modify their information"
@@ -11372,7 +11353,7 @@ msgstr ""
#: pretix/base/settings.py
msgid "Allow individual attendees to change their ticket"
msgstr "Erlaubt einzelnen Teilnehmern ihr Ticket zu ändern"
msgstr "Erlaubt einzelnen Teilnehmer*innen ihr Ticket zu ändern"
#: pretix/base/settings.py
msgid ""
@@ -11384,7 +11365,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 Änderungen vornehmen. Teilnehmer können "
"auch einzelne Teilnehmer*innen Änderungen vornehmen. Teilnehmer*innen 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."
@@ -11693,7 +11674,7 @@ msgid ""
"people."
msgstr ""
"Sie können dieses Feld benutzen, um zusätzliche Informationen mit Ihren "
"Teilnehmer zu teilen, wie z.B. Anreise-Informationen oder den Link zu "
"Teilnehmer*innen 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 "
@@ -11929,8 +11910,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 als "
"auch Teilnehmer verschickt. Nicht geeignet zum Versand nicht-"
"Bestellung\" von oben auftreten. Sie wird ggf. sowohl an Besteller*innen als "
"auch Teilnehmer*innen 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 "
@@ -15234,7 +15215,7 @@ msgstr "Check-in-Status"
#: pretix/control/forms/filter.py pretix/plugins/checkinlists/exporters.py
msgid "All attendees"
msgstr "Alle Teilnehmer"
msgstr "Alle Teilnehmer*innen"
#: pretix/control/forms/filter.py
#: pretix/control/templates/pretixcontrol/checkin/index.html
@@ -15837,7 +15818,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, "
"z.B. Dieses reduzierte Ticket ist erhältlich für Vollzeitstudent*innen, "
"Arbeitslose und Menschen über 65. Das Ticket enthält Zugang zu allen Teilen "
"der Veranstaltung außer des VIP-Bereiches."
@@ -16148,7 +16129,7 @@ msgstr ""
#: pretix/control/forms/orders.py
msgid "Notify customer by email"
msgstr "Kunde per E-Mail benachrichtigen"
msgstr "Kund*in per E-Mail benachrichtigen"
#: pretix/control/forms/orders.py
msgid "Keep a cancellation fee of"
@@ -17767,7 +17748,7 @@ msgstr "Eine individuelle E-Mail wurde verschickt."
#: pretix/control/logdisplay.py
msgid "A custom email has been sent to an attendee."
msgstr "Eine individuelle E-Mail wurde an einen Teilnehmer verschickt."
msgstr "Eine individuelle E-Mail wurde an eine Teilnehmer*in verschickt."
#: pretix/control/logdisplay.py
msgid ""
@@ -19572,7 +19553,7 @@ msgstr "Terminal-ID"
#: pretix/control/templates/pretixcontrol/boxoffice/payment.html
msgid "Card holder"
msgstr "Karteninhaber"
msgstr "Karteninhaber*in"
#: pretix/control/templates/pretixcontrol/boxoffice/payment.html
msgid "Card expiration"
@@ -19776,7 +19757,7 @@ msgstr "CSV"
#: pretix/control/templates/pretixcontrol/checkin/index.html
msgid "No attendee record was found."
msgstr "Keine passenden Teilnehmer gefunden."
msgstr "Keine passenden Teilnehmer*innen gefunden."
#: pretix/control/templates/pretixcontrol/checkin/index.html
#: pretix/control/templates/pretixcontrol/datasync/failed_jobs.html
@@ -22537,7 +22518,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\" gewertet, "
"Nur Käufe eines solchen Produkts werden als \"Teilnehmer*innen\" gewertet, "
"z.B. in Statistiken oder in Funktionen von Erweiterungen."
#: pretix/control/templates/pretixcontrol/item/create.html
@@ -22616,7 +22597,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-Daten "
"Das System wird nicht nach einem Namen oder anderen Teilnehmer*innen-Daten "
"fragen. Dies betrifft nur vom System bereitgestellte Felder, eigene Fragen "
"können trotzdem hinzugefügt werden."
@@ -24921,7 +24902,7 @@ msgstr "Sonstige Datenexporte"
#: pretix/control/templates/pretixcontrol/orders/export.html
#: pretix/control/templates/pretixcontrol/organizers/export.html
msgid "Recommended for new users"
msgstr "Empfohlen für neue Benutzer"
msgstr "Empfohlen für neue Benutzer*innen"
#: pretix/control/templates/pretixcontrol/orders/export.html
#: pretix/control/templates/pretixcontrol/organizers/export.html
@@ -25863,7 +25844,7 @@ msgstr "Domains"
#: pretix/control/templates/pretixcontrol/organizers/edit.html
msgid "This dialog is intended for advanced users."
msgstr "Dieser Dialog ist für fortgeschrittene Anwender gedacht."
msgstr "Dieser Dialog ist für fortgeschrittene Anwender*innen gedacht."
#: pretix/control/templates/pretixcontrol/organizers/edit.html
msgid ""
@@ -28313,7 +28294,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 Kunden die Warteliste nicht "
"nicht angezeigt. Dies führt dazu, dass Kund*innen die Warteliste nicht "
"finden können."
#: pretix/control/templates/pretixcontrol/waitinglist/index.html
@@ -28633,11 +28614,11 @@ msgstr "Das ausgewählte List wurde gelöscht."
#: pretix/control/views/dashboards.py
msgid "Attendees (ordered)"
msgstr "Teilnehmer (bestellt)"
msgstr "Teilnehmende (bestellt)"
#: pretix/control/views/dashboards.py
msgid "Attendees (paid)"
msgstr "Teilnehmer (bezahlt)"
msgstr "Teilnehmende (bezahlt)"
#: pretix/control/views/dashboards.py
#, python-brace-format
@@ -30703,7 +30684,7 @@ msgstr "PDF-Sammlungen"
#: pretix/plugins/badges/exporters.py
msgid "Download all attendee badges as one large PDF for printing."
msgstr "Alle Teilnehmer-Badges in einer großen PDF-Datei für den Druck."
msgstr "Alle Teilnehmer*innen-Badges in einer großen PDF-Datei für den Druck."
#: pretix/plugins/badges/exporters.py
#: pretix/plugins/ticketoutputpdf/exporters.py
@@ -30954,7 +30935,7 @@ msgstr "Anderes Bankkonto"
#: pretix/plugins/banktransfer/payment.py
msgid "Name of account holder"
msgstr "Kontoinhaber"
msgstr "Kontoinhaber*in"
#: pretix/plugins/banktransfer/payment.py
msgid ""
@@ -31090,7 +31071,7 @@ msgstr "Bitte überweisen Sie den vollen Betrag auf das folgende Bankkonto:"
#: pretix/plugins/banktransfer/views.py pretix/plugins/stripe/payment.py
#: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_confirm.html
msgid "Account holder"
msgstr "Kontoinhaber"
msgstr "Kontoinhaber*in"
#: pretix/plugins/banktransfer/payment.py
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html
@@ -31667,7 +31648,7 @@ msgid ""
"Download a spreadsheet with all attendees that are included in a check-in "
"list."
msgstr ""
"Tabelle (Excel oder CSV) mit allen Teilnehmer, die in einer Check-in-"
"Tabelle (Excel oder CSV) mit allen Teilnehmer*innen, die in einer Check-in-"
"Liste zutrittsberechtigt sind."
#: pretix/plugins/checkinlists/exporters.py
@@ -32798,7 +32779,7 @@ msgstr "Geplante E-Mails"
#: pretix/plugins/sendmail/signals.py
msgid "Mass email was sent to customers or attendees."
msgstr "Rundmail wurde an Kunden oder Teilnehmer verschickt."
msgstr "Rundmail wurde an Kunden oder Teilnehmer*innen verschickt."
#: pretix/plugins/sendmail/signals.py
msgid "Mass email was sent to waiting list entries."
@@ -32830,7 +32811,7 @@ msgstr "Eine automatisierte E-Mail wurde an den Besteller verschickt"
#: pretix/plugins/sendmail/signals.py
msgid "A scheduled email was sent to a ticket holder"
msgstr "Eine automatisierte E-Mail wurde an eine Teilnehmer verschickt."
msgstr "Eine automatisierte E-Mail wurde an eine Teilnehmer*in verschickt."
#: pretix/plugins/sendmail/signals.py
msgid "An email rule was deleted"
@@ -32863,7 +32844,7 @@ msgstr "Alle nicht eingecheckten Kunden"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/history_fragment_orders.html
msgid "Attendee contact addresses"
msgstr "Teilnehmer-E-Mail-Adressen"
msgstr "Teilnehmer*innen-E-Mail-Adressen"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/history_fragment_orders.html
msgid "All contact addresses"
@@ -33015,14 +32996,14 @@ msgstr ""
#: pretix/plugins/sendmail/views.py
msgid "Orders or attendees"
msgstr "Bestellungen oder Teilnehmer"
msgstr "Bestellungen oder Teilnehmer*innen"
#: pretix/plugins/sendmail/views.py
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, alle Ticketinhaber "
"Senden Sie eine E-Mail an alle Ticketkäufer*innen, alle Ticketinhaber*innen "
"oder eine Kombination aus beiden Gruppen."
#: pretix/plugins/sendmail/views.py
@@ -33589,23 +33570,23 @@ msgstr "SEPA-Lastschrift"
#: pretix/plugins/stripe/payment.py
msgid "Account Holder Name"
msgstr "Kontoinhaber"
msgstr "Kontoinhaber*in"
#: pretix/plugins/stripe/payment.py
msgid "Account Holder Street"
msgstr "Straße (Kontoinhaber)"
msgstr "Straße (Kontoinhaber*in)"
#: pretix/plugins/stripe/payment.py
msgid "Account Holder Postal Code"
msgstr "PLZ (Kontoinhaber)"
msgstr "PLZ (Kontoinhaber*in)"
#: pretix/plugins/stripe/payment.py
msgid "Account Holder City"
msgstr "Stadt (Kontoinhaber)"
msgstr "Stadt (Kontoinhaber*in)"
#: pretix/plugins/stripe/payment.py
msgid "Account Holder Country"
msgstr "Land (Kontoinhaber)"
msgstr "Land (Kontoinhaber*in)"
#: pretix/plugins/stripe/payment.py
msgid "Affirm via Stripe"
@@ -34045,7 +34026,7 @@ msgstr "MOTO"
#: pretix/plugins/stripe/templates/pretixplugins/stripe/control.html
msgid "Payer name"
msgstr "Name des Zahlers"
msgstr "Name des Zahlenden"
#: pretix/plugins/stripe/templates/pretixplugins/stripe/control.html
msgid "Payment receipt"
@@ -35355,7 +35336,7 @@ msgstr[1] "Das Ticket wurde %(count)s-mal eingelöst."
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html
msgid "No attendee name provided"
msgstr "Name des Teilnehmenrs nicht angegeben"
msgstr "Name der teilnehmenden Person nicht angegeben"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html
msgid "The price of this product was reduced because of an automatic discount."
@@ -37122,12 +37103,12 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/organizers/customer_profiles.html
#: pretix/presale/views/customer.py
msgid "Attendee profiles"
msgstr "Teilnehmer-Profile"
msgstr "Teilnehmer*innen-Profile"
#: pretix/presale/templates/pretixpresale/organizers/customer_profiles.html
msgid "You don’t have any attendee profiles in your account yet."
msgstr ""
"In Ihrem Kundenkonto sind noch keine Teilnehmer-Profile gespeichert."
"In Ihrem Kundenkonto sind noch keine Teilnehmer*innen-Profile gespeichert."
#: pretix/presale/templates/pretixpresale/organizers/customer_registration.html
msgid "Registration"
@@ -38939,7 +38920,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 zu erstellen."
#~ "Teilnehmer*innen zu erstellen."
#~ msgid "This plugin allows you to receive payments via PayPal"
#~ msgstr "Dieses Plugin erlaubt, Zahlungen über PayPal anzunehmen"
+2 -2
View File
@@ -153,11 +153,11 @@ msgstr "Bezahlte Bestellungen"
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js
msgid "Attendees (ordered)"
msgstr "Teilnehmer (bestellt)"
msgstr "Teilnehmende (bestellt)"
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js
msgid "Attendees (paid)"
msgstr "Teilnehmer (bezahlt)"
msgstr "Teilnehmende (bezahlt)"
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js
msgid "Total revenue"
@@ -854,7 +854,7 @@ msgstr "Details der Bestellposition"
#: pretix/base/datasync/sourcefields.py
msgid "Attendee details"
msgstr "Details Teilnehmer"
msgstr "Details Teilnehmer*in"
#: pretix/base/datasync/sourcefields.py pretix/base/exporters/answers.py
#: pretix/base/models/items.py pretix/control/navigation.py
@@ -901,11 +901,11 @@ msgstr "Veranstaltungs- oder Termininformationen"
#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html
#: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html
msgid "Attendee name"
msgstr "Name"
msgstr "Name Teilnehmer*in"
#: pretix/base/datasync/sourcefields.py
msgid "Attendee"
msgstr "Teilnehmer"
msgstr "Teilnehmer*in"
#: pretix/base/datasync/sourcefields.py pretix/base/exporters/orderlist.py
#: pretix/base/forms/questions.py pretix/base/models/customers.py
@@ -913,11 +913,11 @@ msgstr "Teilnehmer"
#: pretix/control/templates/pretixcontrol/order/index.html
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html
msgid "Attendee email"
msgstr "E-Mail Teilnehmer"
msgstr "E-Mail Teilnehmer*in"
#: pretix/base/datasync/sourcefields.py
msgid "Attendee or order email"
msgstr "E-Mail Teilnehmer oder Bestellung"
msgstr "E-Mail Teilnehmer*in oder Bestellung"
#: pretix/base/datasync/sourcefields.py pretix/base/exporters/orderlist.py
#: pretix/base/pdf.py pretix/control/templates/pretixcontrol/order/index.html
@@ -925,23 +925,23 @@ msgstr "E-Mail Teilnehmer oder Bestellung"
#: pretix/plugins/ticketoutputpdf/exporters.py
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html
msgid "Attendee company"
msgstr "Teilnehmer-Firma"
msgstr "Teilnehmer*innen-Firma"
#: pretix/base/datasync/sourcefields.py
msgid "Attendee address street"
msgstr "Teilnehmer-Adresse: Straße"
msgstr "Teilnehmer*innen-Adresse: Straße"
#: pretix/base/datasync/sourcefields.py
msgid "Attendee address ZIP code"
msgstr "Teilnehmer-Adresse: PLZ"
msgstr "Teilnehmer*innen-Adresse: PLZ"
#: pretix/base/datasync/sourcefields.py
msgid "Attendee address city"
msgstr "Teilnehmer-Adresse: Stadt"
msgstr "Teilnehmer*innen-Adresse: Stadt"
#: pretix/base/datasync/sourcefields.py
msgid "Attendee address country"
msgstr "Teilnehmer-Adresse: Land"
msgstr "Teilnehmer*innen-Adresse: Land"
#: pretix/base/datasync/sourcefields.py pretix/base/exporters/orderlist.py
#: pretix/base/pdf.py
@@ -1175,7 +1175,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 Kunden im Bestellprozess als "
"ZIP-Datei mit allen Dateien, die von Kund*innen im Bestellprozess als "
"Antwort auf eine Frage hochgeladen wurden."
#: pretix/base/exporters/answers.py pretix/base/exporters/orderlist.py
@@ -2053,8 +2053,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 und "
"Ticketinhaber eingesammelt wurden."
"Textdatei mit allen E-Mail-Adressen, die von Käufer*innen und "
"Ticketinhaber*innen eingesammelt wurden."
#: pretix/base/exporters/mail.py pretix/plugins/reports/exporters.py
msgid "Filter by status"
@@ -3861,13 +3861,13 @@ msgstr "Bitte wähle einen gültigen Staat aus."
#: pretix/base/modelimport_orders.py pretix/control/forms/filter.py
msgid "Attendee email address"
msgstr "Teilnehmer-E-Mail-Adresse"
msgstr "Teilnehmer*innen-E-Mail-Adresse"
#: pretix/base/modelimport_orders.py pretix/control/forms/filter.py
#: pretix/control/templates/pretixcontrol/order/index.html
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html
msgid "Attendee address"
msgstr "Teilnehmer-Adresse"
msgstr "Teilnehmer*innen-Adresse"
#: pretix/base/modelimport_orders.py
msgid "Calculate from product"
@@ -5370,8 +5370,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 Studenten "
"nützlich, deren Studentenausweis noch geprüft werden soll."
"dieses Ticket besondere Behandlung braucht. Das ist z.B. für Studierende "
"nützlich, deren Studierendenausweis noch geprüft werden soll."
#: pretix/base/models/items.py
msgid ""
@@ -6263,8 +6263,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 Studenten "
"nützlich, deren Studentenausweis noch geprüft werden soll."
"dieses Ticket besondere Behandlung braucht. Das ist z.B. für Studierende "
"nützlich, deren Studierendenausweis noch geprüft werden soll."
#: pretix/base/models/orders.py
msgid ""
@@ -7736,7 +7736,7 @@ msgstr "Musterfirma"
#: pretix/base/pdf.py
msgid "Full attendee address"
msgstr "Volle Teilnehmer-Adresse"
msgstr "Volle Teilnehmer*innen-Adresse"
#: pretix/base/pdf.py
msgid ""
@@ -7754,23 +7754,23 @@ msgstr ""
#: pretix/base/pdf.py
msgid "Attendee street"
msgstr "Teilnehmer-Straße"
msgstr "Teilnehmer*innen-Straße"
#: pretix/base/pdf.py
msgid "Attendee ZIP code"
msgstr "Teilnehmer-PLZ"
msgstr "Teilnehmer*innen-PLZ"
#: pretix/base/pdf.py
msgid "Attendee city"
msgstr "Teilnehmer-Stadt"
msgstr "Teilnehmer*innen-Stadt"
#: pretix/base/pdf.py
msgid "Attendee state"
msgstr "Teilnehmer-Bundesstaat"
msgstr "Teilnehmer*innen-Bundesstaat"
#: pretix/base/pdf.py
msgid "Attendee country"
msgstr "Teilnehmer-Land"
msgstr "Teilnehmer*innen-Land"
#: pretix/base/pdf.py
msgid "Pseudonymization ID (lead scanning)"
@@ -8065,7 +8065,7 @@ msgstr "Herr Mustermann"
#: pretix/plugins/ticketoutputpdf/exporters.py
#, python-brace-format
msgid "Attendee name: {part}"
msgstr "Teilnehmer: {part}"
msgstr "Teilnehmer*innenname: {part}"
#: pretix/base/pdf.py
msgid "Invoice address name for salutation"
@@ -8992,7 +8992,7 @@ msgstr "Veranstaltungsort: {location}"
#, python-brace-format
msgctxt "invoice"
msgid "Attendee: {name}"
msgstr "Teilnehmer: {name}"
msgstr "Teilnehmer*in: {name}"
#: pretix/base/services/invoices.py pretix/plugins/reports/exporters.py
#, python-brace-format
@@ -9948,7 +9948,7 @@ msgstr ""
#: pretix/base/settings.py
msgid "Hide prices on attendee ticket page"
msgstr "Preise auf Teilnehmer-Ticket-Seite verstecken"
msgstr "Preise auf Teilnehmer*innen-Ticket-Seite verstecken"
#: pretix/base/settings.py
msgid ""
@@ -9958,13 +9958,13 @@ msgid ""
"price."
msgstr ""
"Wenn eine Person mehrere Tickets erwirbt und E-Mails an alle "
"Teilnehmer verschickt werden, wird mit dieser Option der Ticketpreis "
"auf der Ticket-Seite der einzelnen Teilnehmer versteckt. Nur die "
"Teilnehmer*innen verschickt werden, wird mit dieser Option der Ticketpreis "
"auf der Ticket-Seite der einzelnen Teilnehmer*innen versteckt. Nur die "
"Person, welche die Tickets kauft, sieht den Preis."
#: pretix/base/settings.py
msgid "Ask for attendee names"
msgstr "Namen der Teilnehmer erfragen"
msgstr "Namen der Teilnehmer*innen erfragen"
#: pretix/base/settings.py
msgid "Ask for a name for all personalized tickets."
@@ -9973,11 +9973,11 @@ msgstr ""
#: pretix/base/settings.py
msgid "Require attendee names"
msgstr "Namen der Teilnehmer erfordern"
msgstr "Namen der Teilnehmer*innen erfordern"
#: pretix/base/settings.py
msgid "Require customers to fill in the names of all attendees."
msgstr "Erfordere die Eingabe aller Teilnehmer-Namen."
msgstr "Erfordere die Eingabe aller Teilnehmer*innen-Namen."
#: pretix/base/settings.py
msgid "Ask for email addresses per ticket"
@@ -9999,7 +9999,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 jedem Teilnehmer benötigst. pretix sendet die Bestellbestätigung "
"von jeder Teilnehmer*in 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."
@@ -10530,8 +10530,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äufern weiter angezeigt, "
"aber Teilnehmer, die ihr Ticket nicht selbst gekauft haben, werden "
"Die Box mit Zahlungsinstruktionen wird Ticketkäufer*innen weiter angezeigt, "
"aber Teilnehmer*innen, die ihr Ticket nicht selbst gekauft haben, werden "
"keine Anzeichen des fehlenden Zahlungseingangs sehen."
#: pretix/base/settings.py
@@ -11042,7 +11042,7 @@ msgstr ""
#: pretix/base/settings.py
msgid "Show number of check-ins to customer"
msgstr "Zeige Anzahl der Check-ins für Kunden an"
msgstr "Zeige Anzahl der Check-ins für Kund*innen an"
#: pretix/base/settings.py
msgid ""
@@ -11053,12 +11053,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 Kunden selbst sehen, wie oft sie die "
"Wenn diese Option aktiv ist, können Kund*innen 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 Kunden die bisherige Nutzung des Tickets einsehen "
"erlauben, sodass Kund*innen die bisherige Nutzung des Tickets einsehen "
"können. Ausgänge oder fehlgeschlagene Scans werden nicht angezeigt und die "
"Kunden sehen keine Aufschlüsselung verschiedener Check-in-Listen."
"Kund*innen sehen keine Aufschlüsselung verschiedener Check-in-Listen."
#: pretix/base/settings.py
msgid "Allow users to download tickets"
@@ -11231,7 +11231,7 @@ msgstr ""
#: pretix/base/settings.py
msgid "Both the attendee and the person who ordered can make changes"
msgstr ""
"Sowohl Besteller als auch Teilnehmer können Änderungen vornehmen"
"Sowohl Besteller*in als auch Teilnehmer*innen können Änderungen vornehmen"
#: pretix/base/settings.py
msgid "Allow customers to modify their information"
@@ -11339,7 +11339,7 @@ msgstr ""
#: pretix/base/settings.py
msgid "Allow individual attendees to change their ticket"
msgstr "Erlaubt einzelnen Teilnehmer ihr Ticket zu ändern"
msgstr "Erlaubt einzelnen Teilnehmer*innen ihr Ticket zu ändern"
#: pretix/base/settings.py
msgid ""
@@ -11351,7 +11351,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 Änderungen vornehmen. Teilnehmer können "
"auch einzelne Teilnehmer*innen Änderungen vornehmen. Teilnehmer*innen 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."
@@ -11534,7 +11534,7 @@ msgstr "Kontakt-E-Mail"
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "We'll show this publicly to allow attendees to contact you."
msgstr ""
"Wir werden diese Adresse veröffentlichen um Teilnehmern zu ermöglichen, "
"Wir werden diese Adresse veröffentlichen um Teilnehmer*innen zu ermöglichen, "
"dich zu kontaktieren."
#: pretix/base/settings.py
@@ -11659,7 +11659,7 @@ msgid ""
"people."
msgstr ""
"Du kannst dieses Feld benutzen um zusätzliche Informationen mit deinen "
"Teilnehmer zu teilen, wie z.B. Anreise-Informationen oder den Link zu "
"Teilnehmer*innen 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 "
@@ -11894,8 +11894,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 als "
"auch Teilnehmer verschickt. Nicht geeignet zum Versand nicht-"
"Bestellung\" von oben auftreten. Sie wird ggf. sowohl an Besteller*innen als "
"auch Teilnehmer*innen 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 "
@@ -13138,7 +13138,7 @@ msgstr ""
msgid ""
"You cannot require specifying attendee names if you do not ask for them."
msgstr ""
"Du kannst die Angabe von Teilnehmernamen nur erfordern, wenn auch nach "
"Du kannst die Angabe von Teilnehmer*innennamen nur erfordern, wenn auch nach "
"Namen gefragt wird."
#: pretix/base/settings.py
@@ -14827,11 +14827,11 @@ msgstr "Ticket-Downloads"
#: pretix/control/forms/event.py
msgid "Your customers will be able to download their tickets in PDF format."
msgstr ""
"Die Teilnehmer werden ihre Tickets im PDF-Format herunterladen können."
"Die Teilnehmer*innen werden ihre Tickets im PDF-Format herunterladen können."
#: pretix/control/forms/event.py
msgid "Require all attendees to fill in their names"
msgstr "Erfordere, dass alle Teilnehmer ihre Namen ausfüllen"
msgstr "Erfordere, dass alle Teilnehmer*innen ihre Namen ausfüllen"
#: pretix/control/forms/event.py
msgid ""
@@ -14867,7 +14867,7 @@ msgid ""
"then import your bank statements to process the payments within pretix, or "
"mark them as paid manually."
msgstr ""
"Deine Teilnehmer werden angewiesen, das Geld direkt auf dein Bankkonto "
"Deine Teilnehmer*innen 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."
@@ -15190,7 +15190,7 @@ msgstr "Check-in-Status"
#: pretix/control/forms/filter.py pretix/plugins/checkinlists/exporters.py
msgid "All attendees"
msgstr "Alle Teilnehmer"
msgstr "Alle Teilnehmer*innen"
#: pretix/control/forms/filter.py
#: pretix/control/templates/pretixcontrol/checkin/index.html
@@ -15793,7 +15793,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 Vollzeitstudenten, "
"z.B. Dieses reduzierte Ticket ist erhältlich für Vollzeitstudent*innen, "
"Arbeitslose und Menschen über 65. Das Ticket enthält Zugang zu allen Teilen "
"der Veranstaltung außer des VIP-Bereiches."
@@ -17723,7 +17723,7 @@ msgstr "Eine individuelle E-Mail wurde verschickt."
#: pretix/control/logdisplay.py
msgid "A custom email has been sent to an attendee."
msgstr "Eine individuelle E-Mail wurde an eine Teilnehmer verschickt."
msgstr "Eine individuelle E-Mail wurde an eine Teilnehmer*in verschickt."
#: pretix/control/logdisplay.py
msgid ""
@@ -19526,7 +19526,7 @@ msgstr "Terminal-ID"
#: pretix/control/templates/pretixcontrol/boxoffice/payment.html
msgid "Card holder"
msgstr "Karteninhaber"
msgstr "Karteninhaber*in"
#: pretix/control/templates/pretixcontrol/boxoffice/payment.html
msgid "Card expiration"
@@ -19730,7 +19730,7 @@ msgstr "CSV"
#: pretix/control/templates/pretixcontrol/checkin/index.html
msgid "No attendee record was found."
msgstr "Keine passenden Teilnehmer gefunden."
msgstr "Keine passenden Teilnehmer*innen gefunden."
#: pretix/control/templates/pretixcontrol/checkin/index.html
#: pretix/control/templates/pretixcontrol/datasync/failed_jobs.html
@@ -21510,7 +21510,7 @@ msgid ""
"provide ways for your attendees to contact you:"
msgstr ""
"Wenn irgendetwas schiefgeht oder unklar ist, empfehlen wir, dass du deinen "
"Teilnehmer die Möglichkeit gibst, dich zu benachrichtigen:"
"Teilnehmer*innen die Möglichkeit gibst, dich zu benachrichtigen:"
#: pretix/control/templates/pretixcontrol/event/settings.html
msgid "Basics"
@@ -22487,7 +22487,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\" gewertet, "
"Nur Käufe eines solchen Produkts werden als \"Teilnehmer*innen\" gewertet, "
"z.B. in Statistiken oder in Funktionen von Erweiterungen."
#: pretix/control/templates/pretixcontrol/item/create.html
@@ -22566,7 +22566,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-Daten "
"Das System wird nicht nach einem Namen oder anderen Teilnehmer*innen-Daten "
"fragen. Dies betrifft nur vom System bereitgestellte Felder, eigene Fragen "
"können trotzdem hinzugefügt werden."
@@ -23237,9 +23237,9 @@ msgid ""
"ticket. If you provide food, one example might be to ask your users about "
"dietary requirements."
msgstr ""
"Fragen erlauben deinen Besucher, zusätzliche Informationen zu ihrem "
"Fragen erlauben deinen Besucher*innen, zusätzliche Informationen zu ihrem "
"Ticket auszufüllen. Wenn deine Veranstaltung Verpflegung beinhaltet, "
"könntest du z.B. nach Allergien deiner Teilnehmer fragen."
"könntest du z.B. nach Allergien deiner Teilnehmer*innen fragen."
#: pretix/control/templates/pretixcontrol/items/questions.html
msgid "Create a new per-ticket question"
@@ -23445,7 +23445,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 aufnehmen kann oder ob die Anzahl begrenzt ist. Du kannst "
"Teilnehmer*innen 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."
@@ -24868,7 +24868,7 @@ msgstr "Sonstige Datenexporte"
#: pretix/control/templates/pretixcontrol/orders/export.html
#: pretix/control/templates/pretixcontrol/organizers/export.html
msgid "Recommended for new users"
msgstr "Empfohlen für neue Benutzer"
msgstr "Empfohlen für neue Benutzer*innen"
#: pretix/control/templates/pretixcontrol/orders/export.html
#: pretix/control/templates/pretixcontrol/organizers/export.html
@@ -25809,7 +25809,7 @@ msgstr "Domains"
#: pretix/control/templates/pretixcontrol/organizers/edit.html
msgid "This dialog is intended for advanced users."
msgstr "Dieser Dialog ist für fortgeschrittene Anwender gedacht."
msgstr "Dieser Dialog ist für fortgeschrittene Anwender*innen gedacht."
#: pretix/control/templates/pretixcontrol/organizers/edit.html
msgid ""
@@ -28254,7 +28254,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 Kunden die Warteliste nicht "
"nicht angezeigt. Dies führt dazu, dass Kund*innen die Warteliste nicht "
"finden können."
#: pretix/control/templates/pretixcontrol/waitinglist/index.html
@@ -28573,11 +28573,11 @@ msgstr "Das ausgewählte List wurde gelöscht."
#: pretix/control/views/dashboards.py
msgid "Attendees (ordered)"
msgstr "Teilnehmer (bestellt)"
msgstr "Teilnehmende (bestellt)"
#: pretix/control/views/dashboards.py
msgid "Attendees (paid)"
msgstr "Teilnehmer (bezahlt)"
msgstr "Teilnehmende (bezahlt)"
#: pretix/control/views/dashboards.py
#, python-brace-format
@@ -30638,7 +30638,7 @@ msgstr "PDF-Sammlungen"
#: pretix/plugins/badges/exporters.py
msgid "Download all attendee badges as one large PDF for printing."
msgstr "Alle Teilnehmer-Badges in einer großen PDF-Datei für den Druck."
msgstr "Alle Teilnehmer*innen-Badges in einer großen PDF-Datei für den Druck."
#: pretix/plugins/badges/exporters.py
#: pretix/plugins/ticketoutputpdf/exporters.py
@@ -30888,7 +30888,7 @@ msgstr "Anderes Bankkonto"
#: pretix/plugins/banktransfer/payment.py
msgid "Name of account holder"
msgstr "Kontoinhaber"
msgstr "Kontoinhaber*in"
#: pretix/plugins/banktransfer/payment.py
msgid ""
@@ -31024,7 +31024,7 @@ msgstr "Bitte überweise den vollen Betrag auf das folgende Bankkonto:"
#: pretix/plugins/banktransfer/views.py pretix/plugins/stripe/payment.py
#: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_confirm.html
msgid "Account holder"
msgstr "Kontoinhaber"
msgstr "Kontoinhaber*in"
#: pretix/plugins/banktransfer/payment.py
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html
@@ -31602,7 +31602,7 @@ msgid ""
"Download a spreadsheet with all attendees that are included in a check-in "
"list."
msgstr ""
"Tabelle (Excel oder CSV) mit allen Teilnehmer, die in einer Check-in-"
"Tabelle (Excel oder CSV) mit allen Teilnehmer*innen, die in einer Check-in-"
"Liste zutrittsberechtigt sind."
#: pretix/plugins/checkinlists/exporters.py
@@ -32729,7 +32729,7 @@ msgstr "Geplante E-Mails"
#: pretix/plugins/sendmail/signals.py
msgid "Mass email was sent to customers or attendees."
msgstr "Rundmail wurde an Kunden oder Teilnehmer verschickt."
msgstr "Rundmail wurde an Kunden oder Teilnehmer*innen verschickt."
#: pretix/plugins/sendmail/signals.py
msgid "Mass email was sent to waiting list entries."
@@ -32761,7 +32761,7 @@ msgstr "Eine automatisierte E-Mail wurde an den Besteller verschickt"
#: pretix/plugins/sendmail/signals.py
msgid "A scheduled email was sent to a ticket holder"
msgstr "Eine automatisierte E-Mail wurde an einen Teilnehmer verschickt."
msgstr "Eine automatisierte E-Mail wurde an eine Teilnehmer*in verschickt."
#: pretix/plugins/sendmail/signals.py
msgid "An email rule was deleted"
@@ -32794,7 +32794,7 @@ msgstr "Alle nicht eingecheckten Kunden"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/history_fragment_orders.html
msgid "Attendee contact addresses"
msgstr "Teilnehmer-E-Mail-Adressen"
msgstr "Teilnehmer*innen-E-Mail-Adressen"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/history_fragment_orders.html
msgid "All contact addresses"
@@ -32948,14 +32948,14 @@ msgstr ""
#: pretix/plugins/sendmail/views.py
msgid "Orders or attendees"
msgstr "Bestellungen oder Teilnehmer"
msgstr "Bestellungen oder Teilnehmer*innen"
#: pretix/plugins/sendmail/views.py
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, alle Ticketinhaber oder "
"Sende eine E-Mail an alle Ticketkäufer*innen, alle Ticketinhaber*innen oder "
"eine Kombination aus beiden Gruppen."
#: pretix/plugins/sendmail/views.py
@@ -33520,23 +33520,23 @@ msgstr "SEPA-Lastschrift"
#: pretix/plugins/stripe/payment.py
msgid "Account Holder Name"
msgstr "Kontoinhaber"
msgstr "Kontoinhaber*in"
#: pretix/plugins/stripe/payment.py
msgid "Account Holder Street"
msgstr "Straße (Kontoinhaber)"
msgstr "Straße (Kontoinhaber*in)"
#: pretix/plugins/stripe/payment.py
msgid "Account Holder Postal Code"
msgstr "PLZ (Kontoinhaber)"
msgstr "PLZ (Kontoinhaber*in)"
#: pretix/plugins/stripe/payment.py
msgid "Account Holder City"
msgstr "Stadt (Kontoinhaber)"
msgstr "Stadt (Kontoinhaber*in)"
#: pretix/plugins/stripe/payment.py
msgid "Account Holder Country"
msgstr "Land (Kontoinhaber)"
msgstr "Land (Kontoinhaber*in)"
#: pretix/plugins/stripe/payment.py
msgid "Affirm via Stripe"
@@ -33974,7 +33974,7 @@ msgstr "MOTO"
#: pretix/plugins/stripe/templates/pretixplugins/stripe/control.html
msgid "Payer name"
msgstr "Name des Zahlers"
msgstr "Name des Zahlenden"
#: pretix/plugins/stripe/templates/pretixplugins/stripe/control.html
msgid "Payment receipt"
@@ -35279,7 +35279,7 @@ msgstr[1] "Das Ticket wurde %(count)s-mal eingelöst."
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html
msgid "No attendee name provided"
msgstr "Name des Teilnehmenrs nicht angegeben"
msgstr "Name der teilnehmenden Person nicht angegeben"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html
msgid "The price of this product was reduced because of an automatic discount."
@@ -37044,12 +37044,12 @@ msgstr "Möchtest das folgende Profil wirklich aus deinem Kundenkonto löschen?"
#: pretix/presale/templates/pretixpresale/organizers/customer_profiles.html
#: pretix/presale/views/customer.py
msgid "Attendee profiles"
msgstr "Teilnehmer-Adresse"
msgstr "Teilnehmer*innen-Adresse"
#: pretix/presale/templates/pretixpresale/organizers/customer_profiles.html
msgid "You don’t have any attendee profiles in your account yet."
msgstr ""
"In deinem Kundenkonto sind noch keine Teilnehmer-Profile gespeichert."
"In deinem Kundenkonto sind noch keine Teilnehmer*innen-Profile gespeichert."
#: pretix/presale/templates/pretixpresale/organizers/customer_registration.html
msgid "Registration"
@@ -38806,7 +38806,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 zu erstellen."
#~ "Teilnehmer*innen zu erstellen."
#~ msgid "This plugin allows you to receive payments via PayPal"
#~ msgstr "Dieses Plugin erlaubt, Zahlungen über PayPal anzunehmen"
@@ -39380,7 +39380,7 @@ msgstr "Kosovo"
#~ msgstr "Biete Ticket-Download bereits vor Bezahlung einer Bestellung an"
#~ msgid "Attendee names"
#~ msgstr "Teilnehmername"
#~ msgstr "Teilnehmer*innennamen"
#~ msgid "Enable output"
#~ msgstr "Aktivieren"
@@ -39657,7 +39657,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 selbstständig "
#~ "Wenn diese Option aktiviert ist, können Teilnehmer*innen selbstständig "
#~ "Bestellungen stornieren solange sie nicht bezahlt wurden."
#~ msgid "Sales overview"
@@ -153,11 +153,11 @@ msgstr "Bezahlte Bestellungen"
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js
msgid "Attendees (ordered)"
msgstr "Teilnehmer (bestellt)"
msgstr "Teilnehmende (bestellt)"
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js
msgid "Attendees (paid)"
msgstr "Teilnehmer (bezahlt)"
msgstr "Teilnehmende (bezahlt)"
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js
msgid "Total revenue"
+32 -35
View File
@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-28 10:48+0000\n"
"PO-Revision-Date: 2026-10-26 23:00+0000\n"
"Last-Translator: Tim <plicnetwork@gmail.com>\n"
"PO-Revision-Date: 2026-10-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"
"Language: es\n"
@@ -7656,17 +7656,14 @@ msgid "This gift card was used in the meantime. Please try again."
msgstr "Mientras tanto, esta tarjeta de regalo se utilizó. Inténtalo de nuevo."
#: pretix/base/payment.py
#, fuzzy
#| msgid "Gift card code"
msgid "Gift card not found."
msgstr "Código de la tarjeta de regalo"
msgstr "No se ha encontrado la tarjeta regalo."
#: pretix/base/payment.py
#, fuzzy
#| msgid "Only test gift cards can be used in test mode."
msgid "Only test gift card can be used in test mode and vice versa."
msgstr ""
"En el modo de prueba solo se pueden utilizar tarjetas regalo de prueba."
"En el modo de prueba solo se pueden utilizar tarjetas regalo de prueba, y "
"viceversa."
#: pretix/base/payment.py
msgid ""
@@ -16689,12 +16686,9 @@ msgid "Phone"
msgstr "Teléfono"
#: pretix/control/forms/organizer.py
#, fuzzy
#| msgctxt "sso_oidc"
#| msgid "Base URL"
msgctxt "sso_oidc"
msgid "Base URL / issuer"
msgstr "URL de base"
msgstr "URL base / emisor"
#: pretix/control/forms/organizer.py
msgctxt "sso_oidc"
@@ -16767,21 +16761,16 @@ msgstr ""
"endpoint de autorización. Introducir como: {example}"
#: pretix/control/forms/organizer.py pretix/control/views/organizer.py
#, fuzzy
#| msgctxt "sso_oidc"
#| msgid "Base URL"
msgid "Base URL / issuer"
msgstr "URL de base"
msgstr "URL base / emisor"
#: pretix/control/forms/organizer.py
msgid "Invalidate old client secret and generate a new one"
msgstr "Invalidar el antiguo secreto del cliente y generar uno nuevo"
#: pretix/control/forms/organizer.py pretix/control/views/organizer.py
#, fuzzy
#| msgid "will be retried"
msgid "(will be generated)"
msgstr "se volverá a intentar"
msgstr "(se generará)"
#: pretix/control/forms/organizer.py
msgid "Organizer short name"
@@ -26404,16 +26393,16 @@ msgstr "Cliente SSO:"
#: pretix/control/templates/pretixcontrol/organizers/ssoclient_edit.html
#: pretix/control/templates/pretixcontrol/organizers/ssoclients.html
#, fuzzy
#| msgid "Create a new SSO client"
msgid "Create credentials for a new SSO client"
msgstr "Crear un nuevo cliente SSO"
msgstr "Crear credenciales para un nuevo cliente de SSO"
#: pretix/control/templates/pretixcontrol/organizers/ssoclient_edit.html
msgid ""
"After submitting this form, client credentials for your SSO client will be "
"generated."
msgstr ""
"Una vez enviado este formulario, se generarán las credenciales de cliente "
"para tu cliente SSO."
#: pretix/control/templates/pretixcontrol/organizers/ssoclient_edit.html
#: pretix/control/templates/pretixcontrol/organizers/ssoclients.html
@@ -26423,6 +26412,9 @@ msgid ""
"href=\"%(url)s\">Using pretix as an SSO provider with external SSO clients</"
"a>."
msgstr ""
"Para obtener más información, consulta nuestra documentación en <a href=\"%"
"(url)s\">Uso de Pretix como proveedor de SSO con clientes de SSO externos</a>"
"."
#: pretix/control/templates/pretixcontrol/organizers/ssoclients.html
msgid ""
@@ -26430,6 +26422,9 @@ msgid ""
" \t\"Login with pretix\" in external systems\n"
" "
msgstr ""
"\n"
" \t«Iniciar sesión con pretix» en sistemas externos\n"
" "
#: pretix/control/templates/pretixcontrol/organizers/ssoclients.html
msgid ""
@@ -26454,17 +26449,13 @@ msgid "This SSO provider cannot be deleted since it has already been used."
msgstr "Este proveedor de SSO no se puede eliminar porque ya se ha utilizado."
#: pretix/control/templates/pretixcontrol/organizers/ssoprovider_edit.html
#, fuzzy
#| msgid "Delete SSO provider:"
msgid "External SSO provider:"
msgstr "Eliminar proveedor de SSO:"
msgstr "Proveedor externo de SSO:"
#: pretix/control/templates/pretixcontrol/organizers/ssoprovider_edit.html
#: pretix/control/templates/pretixcontrol/organizers/ssoproviders.html
#, fuzzy
#| msgid "Create a new SSO provider"
msgid "Connect to an external SSO provider"
msgstr "Agregar un nuevo proveedor SSO"
msgstr "Conectarse a un proveedor externo de SSO"
#: pretix/control/templates/pretixcontrol/organizers/ssoprovider_edit.html
#: pretix/control/templates/pretixcontrol/organizers/ssoproviders.html
@@ -26473,6 +26464,8 @@ msgid ""
"For more information, refer to our documentation on <a href=\"%(url)s\" "
"target=\"_blank\">Using pretix as an SSO client</a>."
msgstr ""
"Para obtener más información, consulta nuestra documentación sobre <a "
"href=\"%(url)s\" target=\"_blank\">El uso de pretix como cliente de SSO</a>."
#: pretix/control/templates/pretixcontrol/organizers/ssoprovider_edit.html
msgctxt "sso"
@@ -26485,6 +26478,9 @@ msgid ""
" \tConnect to an external login provider\n"
" "
msgstr ""
"\n"
" \tConectarse a un proveedor de inicio de sesión externo\n"
" "
#: pretix/control/templates/pretixcontrol/organizers/ssoproviders.html
msgid ""
@@ -30025,15 +30021,10 @@ msgid "The provider has been created."
msgstr "Se ha creado el proveedor."
#: pretix/control/views/organizer.py
#, fuzzy
#| msgid ""
#| "Your changes have been saved. Please note down the following client "
#| "secret, it will never be shown again: {secret}"
msgid ""
"Please note down the following client secret, it will never be shown again."
msgstr ""
"Se han guardado los cambios. Anote el siguiente secreto de cliente; no se "
"volverá a mostrar nunca más: {secret}"
"Anota el siguiente secreto de cliente; no volverá a mostrarse nunca más."
#: pretix/control/views/organizer.py
msgid ""
@@ -32586,6 +32577,12 @@ msgid ""
"one of those get linked to their own separate order page restricted to only "
"that product."
msgstr ""
"Es posible que se envíen varios correos electrónicos a la misma dirección de "
"correo si un pedido contiene varios productos para asistentes y se restringe "
"el acceso a los productos y, al mismo tiempo, se limita el envío de correos "
"únicamente a los asistentes. Esto es intencionado, ya que cada uno de ellos "
"se vincula a su propia página de pedido independiente, restringida "
"exclusivamente a ese producto."
#: pretix/plugins/sendmail/forms.py
msgid "Filter check-in status"
@@ -33498,7 +33495,7 @@ msgstr "MobilePay"
#: pretix/plugins/stripe/payment.py
msgid "Wero"
msgstr ""
msgstr "Wero"
#: pretix/plugins/stripe/payment.py
msgid "Destination"
+34 -36
View File
@@ -4,10 +4,10 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-28 10:48+0000\n"
"PO-Revision-Date: 2026-10-27 17:00+0000\n"
"PO-Revision-Date: 2026-10-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-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"
@@ -7707,16 +7707,14 @@ msgid "This gift card was used in the meantime. Please try again."
msgstr "Cette carte-cadeau a été utilisée entre-temps. Veuillez réessayer."
#: pretix/base/payment.py
#, fuzzy
#| msgid "Gift card code"
msgid "Gift card not found."
msgstr "Code carte-cadeau"
msgstr "Carte cadeau introuvable."
#: pretix/base/payment.py
#, fuzzy
#| msgid "Only test gift cards can be used in test mode."
msgid "Only test gift card can be used in test mode and vice versa."
msgstr "Seules les cartes-cadeaux de test peuvent être utilisées en mode test."
msgstr ""
"Seule la carte cadeau de test peut être utilisée en mode test, et "
"inversement."
#: pretix/base/payment.py
msgid ""
@@ -16850,12 +16848,9 @@ msgid "Phone"
msgstr "Téléphone"
#: pretix/control/forms/organizer.py
#, fuzzy
#| msgctxt "sso_oidc"
#| msgid "Base URL"
msgctxt "sso_oidc"
msgid "Base URL / issuer"
msgstr "URL de base"
msgstr "URL de base / émetteur"
#: pretix/control/forms/organizer.py
msgctxt "sso_oidc"
@@ -16928,21 +16923,16 @@ msgstr ""
"Saisissez-les sous la forme suivante : {example}"
#: pretix/control/forms/organizer.py pretix/control/views/organizer.py
#, fuzzy
#| msgctxt "sso_oidc"
#| msgid "Base URL"
msgid "Base URL / issuer"
msgstr "URL de base"
msgstr "URL de base / émetteur"
#: pretix/control/forms/organizer.py
msgid "Invalidate old client secret and generate a new one"
msgstr "Invalider l’ancienne clé secrète client et en générer une nouvelle"
#: pretix/control/forms/organizer.py pretix/control/views/organizer.py
#, fuzzy
#| msgid "will be retried"
msgid "(will be generated)"
msgstr "sera réessayé"
msgstr "(sera généré)"
#: pretix/control/forms/organizer.py
msgid "Organizer short name"
@@ -26606,16 +26596,16 @@ msgstr "Client SSO :"
#: pretix/control/templates/pretixcontrol/organizers/ssoclient_edit.html
#: pretix/control/templates/pretixcontrol/organizers/ssoclients.html
#, fuzzy
#| msgid "Create a new SSO client"
msgid "Create credentials for a new SSO client"
msgstr "Créer un nouveau client SSO"
msgstr "Créer des identifiants pour un nouveau client SSO"
#: pretix/control/templates/pretixcontrol/organizers/ssoclient_edit.html
msgid ""
"After submitting this form, client credentials for your SSO client will be "
"generated."
msgstr ""
"Une fois ce formulaire envoyé, les identifiants de votre client SSO seront "
"générés."
#: pretix/control/templates/pretixcontrol/organizers/ssoclient_edit.html
#: pretix/control/templates/pretixcontrol/organizers/ssoclients.html
@@ -26625,6 +26615,9 @@ msgid ""
"href=\"%(url)s\">Using pretix as an SSO provider with external SSO clients</"
"a>."
msgstr ""
"Pour plus d'informations, consultez notre documentation sur <a href=\"%(url)"
"s\">L'utilisation de Pretix en tant que fournisseur SSO avec des clients SSO "
"externes</a>."
#: pretix/control/templates/pretixcontrol/organizers/ssoclients.html
msgid ""
@@ -26632,6 +26625,9 @@ msgid ""
" \t\"Login with pretix\" in external systems\n"
" "
msgstr ""
"\n"
" \t« Se connecter avec pretix » dans les systèmes externes\n"
" "
#: pretix/control/templates/pretixcontrol/organizers/ssoclients.html
msgid ""
@@ -26659,17 +26655,13 @@ msgstr ""
"Ce fournisseur SSO ne peut pas être supprimé car il a déjà été utilisé."
#: pretix/control/templates/pretixcontrol/organizers/ssoprovider_edit.html
#, fuzzy
#| msgid "Delete SSO provider:"
msgid "External SSO provider:"
msgstr "Supprimer le fournisseur SSO :"
msgstr "Fournisseur SSO externe :"
#: pretix/control/templates/pretixcontrol/organizers/ssoprovider_edit.html
#: pretix/control/templates/pretixcontrol/organizers/ssoproviders.html
#, fuzzy
#| msgid "Create a new SSO provider"
msgid "Connect to an external SSO provider"
msgstr "Créer un nouveau fournisseur SSO"
msgstr "Se connecter à un fournisseur SSO externe"
#: pretix/control/templates/pretixcontrol/organizers/ssoprovider_edit.html
#: pretix/control/templates/pretixcontrol/organizers/ssoproviders.html
@@ -26678,6 +26670,8 @@ msgid ""
"For more information, refer to our documentation on <a href=\"%(url)s\" "
"target=\"_blank\">Using pretix as an SSO client</a>."
msgstr ""
"Pour plus d'informations, consultez notre documentation sur <a href=\"%(url)"
"s\" target=\"_blank\">L'utilisation de pretix en tant que client SSO</a>."
#: pretix/control/templates/pretixcontrol/organizers/ssoprovider_edit.html
msgctxt "sso"
@@ -26690,6 +26684,9 @@ msgid ""
" \tConnect to an external login provider\n"
" "
msgstr ""
"\n"
" \tSe connecter à un fournisseur d'authentification externe\n"
" "
#: pretix/control/templates/pretixcontrol/organizers/ssoproviders.html
msgid ""
@@ -30269,15 +30266,10 @@ msgid "The provider has been created."
msgstr "Le fournisseur a été créé."
#: pretix/control/views/organizer.py
#, fuzzy
#| msgid ""
#| "Your changes have been saved. Please note down the following client "
#| "secret, it will never be shown again: {secret}"
msgid ""
"Please note down the following client secret, it will never be shown again."
msgstr ""
"Vos modifications ont été enregistrées. Veuillez noter la clé secrète client "
"suivante, elle ne sera plus jamais affichée : {secret}"
"Veuillez noter le secret client suivant ; il ne s'affichera plus jamais."
#: pretix/control/views/organizer.py
msgid ""
@@ -32862,6 +32854,12 @@ msgid ""
"one of those get linked to their own separate order page restricted to only "
"that product."
msgstr ""
"Il se peut que plusieurs e-mails soient envoyés à la même adresse e-mail si "
"une commande comprend plusieurs produits destinés à des participants, "
"lorsque vous limitez l'accès aux produits tout en restreignant les e-mails "
"aux seuls participants. Ce comportement est normal, car chacun de ces "
"produits est associé à sa propre page de commande, dont l'accès est limité à "
"ce produit uniquement."
#: pretix/plugins/sendmail/forms.py
msgid "Filter check-in status"
@@ -33777,7 +33775,7 @@ msgstr "MobilePay"
#: pretix/plugins/stripe/payment.py
msgid "Wero"
msgstr ""
msgstr "Wero"
#: pretix/plugins/stripe/payment.py
msgid "Destination"
+7 -8
View File
@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-28 10:48+0000\n"
"PO-Revision-Date: 2026-04-21 11:05+0000\n"
"Last-Translator: Sandra Rial Pérez <sandrarial@gestiontickets.online>\n"
"PO-Revision-Date: 2026-11-02 11:32+0000\n"
"Last-Translator: Isaac Raño <isaac@ovixia.com>\n"
"Language-Team: Galician <https://translate.pretix.eu/projects/pretix/pretix/"
"gl/>\n"
"Language: gl\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.17\n"
"X-Generator: Weblate 2026.10.1\n"
#: pretix/_base_settings.py
msgid "English"
@@ -93,7 +93,7 @@ msgstr "Hebreo"
#: pretix/_base_settings.py
msgid "Hungarian"
msgstr ""
msgstr "Húngaro"
#: pretix/_base_settings.py
msgid "Indonesian"
@@ -153,7 +153,7 @@ msgstr "Español (América Latina)"
#: pretix/_base_settings.py
msgid "Thai"
msgstr ""
msgstr "Tailandés"
#: pretix/_base_settings.py
msgid "Turkish"
@@ -409,7 +409,7 @@ msgstr ""
#: pretix/api/serializers/organizer.py pretix/control/views/organizer.py
#, python-format
msgid "You've been invited to join %(organizer)s"
msgstr ""
msgstr "Convidáronte a unirte a %(organizer)s"
#: pretix/api/serializers/organizer.py pretix/control/views/organizer.py
msgid "This user already has been invited for this team."
@@ -429,9 +429,8 @@ msgid "Medium connected to other event"
msgstr "O medio conectou a outro acontecemento"
#: pretix/api/views/checkin.py
#, fuzzy
msgid "You cannot exchange a medium for a medium."
msgstr "No puede cancelar este pedido."
msgstr "Non se pode trocar un medio por outro."
#: pretix/api/views/checkin.py
#, fuzzy
+33 -8
View File
@@ -7,16 +7,16 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-28 10:48+0000\n"
"PO-Revision-Date: 2026-10-19 02:00+0000\n"
"PO-Revision-Date: 2026-11-03 08:12+0000\n"
"Last-Translator: Christiaan de Die le Clercq <contact@techwolf12.nl>\n"
"Language-Team: Dutch <https://translate.pretix.eu/projects/pretix/pretix/nl/"
">\n"
"Language-Team: Dutch <https://translate.pretix.eu/projects/pretix/pretix/nl/>"
"\n"
"Language: nl\n"
"MIME-Version: 1.0\n"
"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.10.1\n"
"X-Generator: Weblate 2026.11\n"
#: pretix/_base_settings.py
msgid "English"
@@ -8379,12 +8379,12 @@ msgstr "Niet ingesteld"
#: pretix/base/reldate.py
#, python-brace-format
msgid "A relative date cannot be expressed as \"before\" for \"{}\""
msgstr ""
msgstr "Een relatieve datum kan niet worden uitgedrukt als \"voor\" voor \"{}\""
#: pretix/base/reldate.py
#, python-brace-format
msgid "A relative date cannot be expressed as \"after\" for \"{}\""
msgstr ""
msgstr "Een relatieve datum kan niet worden uitgedrukt als \"na\" voor \"{}\""
#: pretix/base/reldate.py
#, python-brace-format
@@ -8415,7 +8415,7 @@ msgstr "Evenement geannuleerd"
#: pretix/base/services/cancelevent.py
msgid "Confirm event cancellation and bulk refund"
msgstr ""
msgstr "Evenementannulering en bulkterugbetaling bevestigen"
#: pretix/base/services/cart.py pretix/base/services/modelimport.py
#: pretix/base/services/orders.py
@@ -9355,6 +9355,7 @@ msgstr "Een voucher kan niet worden aangemaakt zonder code."
msgid ""
"Voucher codes must be unique. Code \"{code}\" already exists in this import."
msgstr ""
"Vouchercodes moeten uniek zijn. Code \"{code}\" bestaat al in deze import."
#: pretix/base/services/modelimport.py
#, python-brace-format
@@ -9363,13 +9364,18 @@ msgid ""
msgid_plural ""
"Voucher codes must be unique. Import contains existing voucher codes {code}."
msgstr[0] ""
"Vouchercodes moeten uniek zijn. Import bevat al bestaande vouchercode {code}."
msgstr[1] ""
"Vouchercodes moeten uniek zijn. Import bevat al bestaande vouchercodes {code}"
"."
#: pretix/base/services/modelimport.py
msgid ""
"Vouchers could not be imported, probably due to a voucher code already being "
"in use."
msgstr ""
"Vouchers konden niet worden geïmporteerd, waarschijnlijk omdat een "
"vouchercode al in gebruik is."
#: pretix/base/services/orders.py
msgid ""
@@ -10431,7 +10437,7 @@ msgstr ""
#: pretix/base/settings.py
msgid "No dates match your criteria."
msgstr ""
msgstr "Geen data voldoen aan je zoekcriteria."
#: pretix/base/settings.py
msgctxt "subevents"
@@ -10632,6 +10638,10 @@ msgid ""
"their order without selecting a payment method. This is useful whenever "
"orders are not created by the same person who is making the payment."
msgstr ""
"Als uitgestelde betaling is toegestaan op een verkoopkanaal, kunnen klanten "
"hun bestelling afronden zonder een betaalmethode te kiezen. Dit is handig "
"wanneer bestellingen niet worden geplaatst door dezelfde persoon als degene "
"die de betaling uitvoert."
#: pretix/base/settings.py
msgid "Show start date"
@@ -11603,6 +11613,10 @@ msgid ""
"the email address above. Please note that you still need to add a contact "
"email address that will be shared with all emails you send."
msgstr ""
"Als je dit instelt, verwijst de contactlink in de voettekst hiernaartoe in "
"plaats van naar het bovenstaande e-mailadres. Let op dat je nog steeds een "
"contact-e-mailadres moet toevoegen dat wordt meegestuurd met alle e-mails "
"die je verzendt."
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "Imprint URL"
@@ -13494,6 +13508,8 @@ msgid ""
"Don't share this code with anyone. The %(instance)s team will never ask you "
"for it."
msgstr ""
"Deel deze code met niemand. Het %(instance)s-team zal je hier nooit om "
"vragen."
#: pretix/base/templates/pretixbase/email/cancel_confirm.txt
#: pretix/base/templates/pretixbase/email/export_failed.txt
@@ -13502,6 +13518,8 @@ msgid ""
"Thanks, \n"
"The %(instance)s Team"
msgstr ""
"Bedankt, \n"
"Het %(instance)s-team"
#: pretix/base/templates/pretixbase/email/email_footer.html
#, python-format
@@ -13698,11 +13716,14 @@ msgstr "Ga verder in een nieuw tabblad"
#: pretix/base/templates/pretixbase/framebreak.html
msgid "For security reasons, the following step is only possible in a new tab."
msgstr ""
"Om veiligheidsredenen is de volgende stap alleen mogelijk in een nieuw "
"tabblad."
#: pretix/base/templates/pretixbase/framebreak.html
msgid ""
"If the new tab did not open automatically, please click the following button:"
msgstr ""
"Als het nieuwe tabblad niet automatisch opent, klik dan op de volgende knop:"
#: pretix/base/templates/pretixbase/framebreak.html
#: pretix/presale/templates/pretixpresale/event/cookies.html
@@ -37134,6 +37155,10 @@ msgid ""
"before retrying can help. As a last step, try using a different browser or "
"another device (for example, a desktop or laptop computer)."
msgstr ""
"Als het probleem zich blijft voordoen, kan het helpen om alle "
"browservensters te sluiten en cookies te verwijderen voordat je het opnieuw "
"probeert. Als laatste stap kun je proberen een andere browser of een ander "
"apparaat (bijvoorbeeld een desktop of laptop) te gebruiken."
#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html
msgid "Your membership"
+151 -54
View File
@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-28 10:48+0000\n"
"PO-Revision-Date: 2026-09-02 08:35+0000\n"
"Last-Translator: Renne Rocha <renne@rocha.dev.br>\n"
"PO-Revision-Date: 2026-10-30 03:00+0000\n"
"Last-Translator: vihumelo <victordimelo@gmail.com>\n"
"Language-Team: Portuguese (Brazil) <https://translate.pretix.eu/projects/"
"pretix/pretix/pt_BR/>\n"
"Language: pt_BR\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.8.1\n"
"X-Generator: Weblate 2026.10.1\n"
#: pretix/_base_settings.py
msgid "English"
@@ -411,7 +411,7 @@ msgstr ""
#: pretix/api/serializers/organizer.py pretix/control/views/organizer.py
#, python-format
msgid "You've been invited to join %(organizer)s"
msgstr ""
msgstr "Você recebeu um convite para integrar %(organizer)s"
#: pretix/api/serializers/organizer.py pretix/control/views/organizer.py
msgid "This user already has been invited for this team."
@@ -607,6 +607,9 @@ msgid ""
"This includes related events like creation, deletion, opening or closing of "
"quotas. No webhook is sent for changes to the resulting availability."
msgstr ""
"Isso inclui eventos relacionados, como a criação, exclusão, abertura ou "
"fechamento de cotas. Nenhum webhook é enviado em decorrência de alterações "
"na disponibilidade."
#: pretix/api/webhooks.py
msgid "Shop taken live"
@@ -1678,7 +1681,7 @@ msgstr "Endereço"
#: pretix/base/settings.py pretix/control/forms/filter.py
#: pretix/plugins/checkinlists/exporters.py pretix/plugins/reports/exporters.py
msgid "ZIP code"
msgstr "Código Postal"
msgstr "CEP"
#: pretix/base/exporters/invoices.py pretix/base/exporters/orderlist.py
#: pretix/base/forms/questions.py pretix/base/modelimport_orders.py
@@ -3622,6 +3625,9 @@ msgid ""
"The Peppol participant ID prefix %(number)s is not known to our system. "
"Please reach out to us if you are sure this ID is correct."
msgstr ""
"Nosso sistema não reconhece o prefixo %(number)s do identificador de "
"participante da Peppol. Se você tem certeza de que esse identificador está "
"correto, entre em contato conosco."
#: pretix/base/invoicing/peppol.py
#, python-format
@@ -5600,6 +5606,9 @@ msgid ""
"prior to their usage. Therefore, the selected media policy does not make "
"sense for this media type."
msgstr ""
"O tipo de mídia selecionado exige que todas as mídias sejam cadastradas no "
"sistema antes de serem utilizadas. Portanto, a política de mídia selecionada "
"não é adequada para esse tipo de mídia."
#: pretix/base/models/items.py
msgid ""
@@ -5821,7 +5830,7 @@ msgstr "Código do país (ISO 3166-1 alfa-2)"
#: pretix/base/models/items.py
msgid "Asked on"
msgstr ""
msgstr "Pergunta feita em"
#: pretix/base/models/items.py pretix/base/models/organizer.py
msgid ""
@@ -6171,12 +6180,12 @@ msgstr "retornou"
#: pretix/base/models/media.py
msgctxt "reusable_medium"
msgid "Claim token"
msgstr ""
msgstr "Token de vinculação"
#: pretix/base/models/media.py
msgctxt "reusable_medium"
msgid "Label"
msgstr ""
msgstr "Rótulo"
#: pretix/base/models/media.py
#, fuzzy
@@ -6190,6 +6199,9 @@ msgid ""
"validity. If multiple tickets are valid at once, this will lead to failed "
"check-ins."
msgstr ""
"Se você vincular mais de um ingresso, certifique-se de que os períodos de "
"validade não se sobreponham. Se vários ingressos estiverem válidos ao mesmo "
"tempo, poderão ocorrer falhas no check-in."
#: pretix/base/models/memberships.py
#: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html
@@ -8119,6 +8131,8 @@ msgstr "Apenas API"
msgid ""
"Menu item will only show up if the user has permission for general settings."
msgstr ""
"Esta opção só será exibida no menu se o usuário tiver permissão para acessar "
"as configurações gerais."
#: pretix/base/permissions.py
msgctxt "permission_level"
@@ -8136,6 +8150,8 @@ msgid ""
"This includes access to all settings not listed explicitly below, including "
"plugin settings."
msgstr ""
"Isso inclui o acesso a todas as configurações que não estão explicitamente "
"listadas abaixo, incluindo as configurações dos plugins."
#: pretix/base/permissions.py
#: pretix/control/templates/pretixcontrol/event/payment.html
@@ -8165,7 +8181,7 @@ msgstr "Produtos, cotas e perguntas"
#: pretix/base/permissions.py
msgid "Also includes related objects like categories or discounts."
msgstr ""
msgstr "Também inclui elementos relacionados, como categorias ou descontos."
#: pretix/base/permissions.py
msgctxt "permission_level"
@@ -8219,12 +8235,14 @@ msgstr "Acessar eventos existentes"
#: pretix/base/permissions.py
msgctxt "permission_level"
msgid "Access existing and create new events"
msgstr ""
msgstr "Acessar eventos existentes e criar novos eventos"
#: pretix/base/permissions.py
msgid ""
"The level of access to events is determined in detail by the settings below."
msgstr ""
"O nível de acesso aos eventos é definido detalhadamente pelas configurações "
"abaixo."
#: pretix/base/permissions.py pretix/control/navigation.py
#: pretix/control/templates/pretixcontrol/event/invoicing.html
@@ -8241,12 +8259,17 @@ msgid ""
"This includes access to all organizer-level functionality not listed "
"explicitly below, including plugin settings."
msgstr ""
"Isso inclui o acesso a todas as funcionalidades disponíveis no nível do "
"organizador que não estejam explicitamente listadas abaixo, incluindo as "
"configurações dos plugins."
#: pretix/base/permissions.py
msgid ""
"Includes the ability to give someone (including oneself) additional "
"permissions."
msgstr ""
"Inclui a possibilidade de conceder permissões adicionais a alguém (inclusive "
"a si mesmo)."
#: pretix/base/permissions.py pretix/control/navigation.py
msgid "Devices"
@@ -8257,6 +8280,8 @@ msgid ""
"Includes the ability to give access to events and data oneself does not have "
"access to."
msgstr ""
"Inclui a possibilidade de conceder acesso a eventos e dados aos quais você "
"mesmo não tem acesso."
#: pretix/base/permissions.py
#, fuzzy
@@ -8349,22 +8374,22 @@ msgstr "Não definido"
#: pretix/base/reldate.py
#, python-brace-format
msgid "A relative date cannot be expressed as \"before\" for \"{}\""
msgstr ""
msgstr "Uma data relativa não pode ser expressa como \"antes de\" para \"{}\""
#: pretix/base/reldate.py
#, python-brace-format
msgid "A relative date cannot be expressed as \"after\" for \"{}\""
msgstr ""
msgstr "Uma data relativa não pode ser expressa como \"depois de\" para \"{}\""
#: pretix/base/reldate.py
#, python-brace-format
msgid "A relative time cannot be expressed as \"before\" for \"{}\""
msgstr ""
msgstr "Um tempo relativo não pode ser expresso como \"antes de\" para \"{}\""
#: pretix/base/reldate.py
#, python-brace-format
msgid "A relative time cannot be expressed as \"after\" for \"{}\""
msgstr ""
msgstr "Um tempo relativo não pode ser expresso como \"depois de\" para \"{}\""
#: pretix/base/secrets.py
msgid "Random (default, works with all pretix apps)"
@@ -8385,7 +8410,7 @@ msgstr "Evento cancelado"
#: pretix/base/services/cancelevent.py
msgid "Confirm event cancellation and bulk refund"
msgstr ""
msgstr "Confirmar o cancelamento do evento e o reembolso em massa"
#: pretix/base/services/cart.py pretix/base/services/modelimport.py
#: pretix/base/services/orders.py
@@ -8933,13 +8958,15 @@ msgstr "Você precisa responder a perguntas para concluir este check-in."
#: pretix/base/services/checkin.py
msgid "Ticket needs to be exchanged to a suitable medium."
msgstr ""
msgstr "O ingresso precisa ser trocado por um meio adequado."
#: pretix/base/services/checkin.py
msgid ""
"This ticket has already been exchanged for a reusable medium that now needs "
"to be used instead."
msgstr ""
"Este ingresso já foi trocado por uma mídia reutilizável, que agora deve ser "
"utilizado em seu lugar."
#: pretix/base/services/checkin.py
msgid "This ticket has already been redeemed."
@@ -9105,62 +9132,44 @@ msgid "You are receiving this email because you placed an order for {event}."
msgstr "Você está recebendo este email porque fez um pedido para {event}."
#: pretix/base/services/media.py
#, fuzzy
#| msgid "Invalid input type."
msgid "Invalid medium type."
msgstr "Tipo de entrada inválido."
msgstr "Tipo de mídia inválido."
#: pretix/base/services/media.py
#, fuzzy
#| msgid "The selected media type is not enabled in your organizer settings."
msgid "Medium type is not enabled for organizer."
msgstr ""
"O tipo de mídia selecionado não está habilitado nas configurações do "
"organizador."
msgstr "O tipo de mídia não está habilitado para o organizador."
#: pretix/base/services/media.py
msgid "Incorrect medium type for product."
msgstr ""
msgstr "Tipo de mídia incorreto para o produto."
#: pretix/base/services/media.py
#, fuzzy
#| msgid "This ticket has already been redeemed."
msgid "Ticket is already exchanged for reusable medium."
msgstr "Este ingresso já foi resgatado."
msgstr "Este ingresso já foi trocado por uma mídia reutilizável."
#: pretix/base/services/media.py
#, fuzzy
#| msgid "Reusable Medium ID"
msgid "Reusable medium not found."
msgstr "ID de mídia reutilizável"
msgstr "Mídia reutilizável não encontrada."
#: pretix/base/services/media.py
#, fuzzy
#| msgid "The reusable medium has been created."
msgid "Reusable medium is inactive or expired."
msgstr "A mídia reutilizável foi criada."
msgstr "A mídia reutilizável está inativa ou expirada."
#: pretix/base/services/media.py
#, fuzzy
#| msgid "The reusable medium has been created."
msgid "Reusable medium not found and could not be created."
msgstr "A mídia reutilizável foi criada."
msgstr "A mídia reutilizável não foi encontrada e não pôde ser criada."
#: pretix/base/services/media.py
#, fuzzy
#| msgid "Reusable media type"
msgid "Reusable medium already exists."
msgstr "Tipo de mídia reutilizável"
msgstr "A mídia reutilizável já existe."
#: pretix/base/services/media.py
#, fuzzy
#| msgid "The reusable medium has been created."
msgid "Reusable medium could not be created."
msgstr "A mídia reutilizável foi criada."
msgstr "Não foi possível criar a mídia reutilizável."
#: pretix/base/services/media.py
msgid "Product does not support medium exchange."
msgstr ""
msgstr "O produto não permite a troca por mídia."
#: pretix/base/services/memberships.py
#, python-brace-format
@@ -9325,6 +9334,8 @@ msgstr "Um cupom não pode ser criado sem um código."
msgid ""
"Voucher codes must be unique. Code \"{code}\" already exists in this import."
msgstr ""
"Os códigos dos cupons devem ser únicos. O código \"{code}\" já existe nesta "
"importação."
#: pretix/base/services/modelimport.py
#, python-brace-format
@@ -9333,13 +9344,19 @@ msgid ""
msgid_plural ""
"Voucher codes must be unique. Import contains existing voucher codes {code}."
msgstr[0] ""
"Os códigos dos cupons devem ser únicos. A importação contém um código de "
"cupom já existente: {code}."
msgstr[1] ""
"Os códigos dos cupons devem ser únicos. A importação contém códigos de "
"cupons já existentes: {code}."
#: pretix/base/services/modelimport.py
msgid ""
"Vouchers could not be imported, probably due to a voucher code already being "
"in use."
msgstr ""
"Não foi possível importar os cupons, provavelmente porque um dos códigos já "
"está em uso."
#: pretix/base/services/orders.py
msgid ""
@@ -9917,7 +9934,7 @@ msgstr ""
#: pretix/base/settings.py
msgid "Enforce the usage of issued reusable media for check-in"
msgstr ""
msgstr "Exigir o uso de mídias reutilizáveis emitidas para realizar o check-in"
#: pretix/base/settings.py
msgid ""
@@ -9925,6 +9942,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 ""
"Se esta opção estiver ativada, o código de barras do ingresso não será mais "
"aceito caso uma mídia reutilizável tenha sido criada e vinculada a ele. Se a "
"opção permanecer desativada, a mídia reutilizável e o ingresso serão "
"considerados equivalentes."
#: pretix/base/settings.py
msgid "Length of barcodes"
@@ -10392,12 +10413,12 @@ msgstr ""
#: pretix/base/settings.py
msgid "No dates match your criteria."
msgstr ""
msgstr "Nenhuma data corresponde aos seus critérios."
#: pretix/base/settings.py
msgctxt "subevents"
msgid "Text for empty date results"
msgstr ""
msgstr "Texto exibido quando a data não retorna resultados"
#: pretix/base/settings.py
msgctxt "subevents"
@@ -10408,6 +10429,11 @@ msgid ""
"touch with you to arrange further dates. We do not recommend more than one "
"or two sentences."
msgstr ""
"Este texto será exibido quando o calendário ou a lista de datas estiver "
"vazio, por exemplo, quando não houver datas disponíveis em determinado mês "
"ou quando um filtro selecionado pelo usuário não retornar resultados. Você "
"pode usar esse espaço para informar como entrar em contato com você para "
"combinar novas datas. Recomendamos usar apenas uma ou duas frases."
#: pretix/base/settings.py
msgid "Guidance text"
@@ -10593,6 +10619,9 @@ msgid ""
"their order without selecting a payment method. This is useful whenever "
"orders are not created by the same person who is making the payment."
msgstr ""
"Se o pagamento posterior for permitido em um canal de vendas, os clientes "
"poderão concluir seus pedidos sem selecionar uma forma de pagamento. Isso é "
"útil quando a pessoa que faz o pedido não é a mesma que realiza o pagamento."
#: pretix/base/settings.py
msgid "Show start date"
@@ -11561,6 +11590,10 @@ msgid ""
"the email address above. Please note that you still need to add a contact "
"email address that will be shared with all emails you send."
msgstr ""
"Se você configurar esta opção, o link de contato no rodapé direcionará para "
"o endereço informado aqui, em vez de utilizar o endereço de e-mail acima. "
"Observe que ainda será necessário informar um endereço de e-mail de contato, "
"que será incluído em todos os e-mails enviados."
#: pretix/base/settings.py pretix/control/forms/event.py
msgid "Imprint URL"
@@ -13156,7 +13189,7 @@ msgstr ""
#: pretix/base/settings.py
#, python-brace-format
msgid "VAT-ID is not supported for \"{}\"."
msgstr ""
msgstr "O VAT-ID não é compatível para \"{}\"."
#: pretix/base/settings.py
msgid "The last payment date cannot be before the end of presale."
@@ -13451,6 +13484,8 @@ msgid ""
"Don't share this code with anyone. The %(instance)s team will never ask you "
"for it."
msgstr ""
"Não compartilhe este código com ninguém. A equipe do %(instance)s nunca "
"solicitará esse código."
#: pretix/base/templates/pretixbase/email/cancel_confirm.txt
#: pretix/base/templates/pretixbase/email/export_failed.txt
@@ -13459,6 +13494,8 @@ msgid ""
"Thanks, \n"
"The %(instance)s Team"
msgstr ""
"Obrigado,\n"
"Time %(instance)s"
#: pretix/base/templates/pretixbase/email/email_footer.html
#, python-format
@@ -14021,6 +14058,8 @@ msgid ""
"You entered an URL, which is not allowed. Please remove %(match)s from your "
"input."
msgstr ""
"Você inseriu uma URL, o que não é permitido. Remova %(match)s do texto "
"informado."
#: pretix/base/views/errors.py
msgid ""
@@ -14281,6 +14320,8 @@ msgid ""
"You cannot choose a team that would give you more access than you have on "
"the event you are copying."
msgstr ""
"Você não pode escolher um time que lhe conceda um nível de acesso superior "
"ao que você possui no evento que está copiando."
#: pretix/control/forms/event.py
msgid "Copy configuration from"
@@ -14295,6 +14336,8 @@ msgid ""
"You cannot choose an event on which you have less access than the team you "
"selected in the previous step."
msgstr ""
"Você não pode escolher um evento no qual tenha um nível de acesso inferior "
"ao do time selecionado na etapa anterior."
#: pretix/control/forms/event.py pretix/control/forms/item.py
#: pretix/control/forms/subevents.py
@@ -14397,7 +14440,7 @@ msgstr "Data de pagamento"
#: pretix/control/forms/event.py
msgid "same as above"
msgstr ""
msgstr "o mesmo que acima"
#: pretix/control/forms/event.py
#, fuzzy
@@ -14479,6 +14522,13 @@ msgid ""
"configured whenever possible. Gross prices may still change if they are "
"impossible to derive from a rounded net price."
msgstr ""
"Recomendado para a emissão de faturas eletrônicas quando você vende "
"principalmente para consumidores finais. Os preços brutos ou líquidos de "
"alguns produtos podem ser ajustados automaticamente para garantir o "
"arredondamento correto do total do pedido. O sistema procura manter os "
"preços brutos conforme configurados sempre que possível. No entanto, esses "
"preços ainda podem sofrer alterações quando não for possível calculá-los a "
"partir de um preço líquido arredondado."
#: pretix/control/forms/event.py
msgid "Generate invoices for Sales channels"
@@ -16648,7 +16698,7 @@ msgstr "Você pode definir apenas um domínio de organizador."
#: pretix/control/forms/organizer.py
msgid "Provided by a plugin"
msgstr ""
msgstr "Fornecido por um plugin"
#: pretix/control/forms/organizer.py
msgid ""
@@ -16906,7 +16956,7 @@ msgstr "terceiro"
#: pretix/control/forms/rrule.py
msgctxt "rrule"
msgid "fourth"
msgstr ""
msgstr "quarto"
#: pretix/control/forms/rrule.py
msgctxt "rrule"
@@ -16925,7 +16975,7 @@ msgstr "Dia do fim de semana"
#: pretix/control/forms/subevents.py
msgctxt "subevent"
msgid "Skip dates that overlap with any existing date"
msgstr ""
msgstr "Ignorar datas que se sobreponham a qualquer data existente"
#: pretix/control/forms/subevents.py
msgctxt "subevent"
@@ -16935,6 +16985,10 @@ msgid ""
"This respects even inactive dates and works best if all dates have both a "
"start and end time."
msgstr ""
"Isso pode ser útil se todas as datas ocorrerem no mesmo local e você quiser "
"evitar a criação de datas recorrentes que entrem em conflito com eventos "
"especiais já existentes. Essa opção também considera as datas inativas e "
"funciona melhor quando todas as datas têm horários de início e término."
#: pretix/control/forms/subevents.py
msgid "Keep the current values"
@@ -16984,6 +17038,9 @@ msgid ""
"because at least one of the selected vouchers has already been redeemed "
"%(max_redeemed)s times."
msgstr ""
"Você não pode reduzir o número máximo de resgates para %(max_usages)s, pois "
"pelo menos um dos cupons selecionados já foi resgatato %(max_redeemed)s "
"vezes."
#: pretix/control/forms/vouchers.py
#, fuzzy
@@ -17017,6 +17074,8 @@ msgid ""
"Changing the maximum number of usages in bulk is not supported if any of the "
"selected vouchers is assigned a seat."
msgstr ""
"Não é possível alterar em massa o número máximo de utilizações se algum dos "
"cupons selecionados estiver vinculado a um assento."
#: pretix/control/forms/vouchers.py
msgctxt "subevent"
@@ -17024,18 +17083,24 @@ msgid ""
"Changing the date in bulk is not supported if any of the selected vouchers "
"is assigned a seat."
msgstr ""
"Não é possível alterar a data em massa se algum dos cupons selecionados "
"estiver vinculado a um assento."
#: pretix/control/forms/vouchers.py
msgid ""
"Changing the product to a quota is not supported if any of the selected "
"vouchers is assigned a seat."
msgstr ""
"Não é possível alterar o produto para uma cota se algum dos cupons "
"selecionados estiver vinculado a um assento."
#: pretix/control/forms/vouchers.py
msgid ""
"This change cannot be completed because not all assigned seats of the "
"vouchers are still available"
msgstr ""
"Esta alteração não pode ser concluída porque nem todos os assentos "
"vinculados aos cupons ainda estão disponíveis"
#: pretix/control/forms/vouchers.py
msgid "Codes"
@@ -18198,6 +18263,8 @@ msgid ""
"The ticket #{positionid} was exchanged for reusable medium "
"{medium_identifier}."
msgstr ""
"O ingresso #{positionid} foi trocado pela mídia reutilizável "
"{medium_identifier}."
#: pretix/control/logdisplay.py
msgid "The medium has been connected to a new gift card."
@@ -18255,6 +18322,8 @@ msgstr "Um código de emergência de dois fatores foi gerado."
#: pretix/control/logdisplay.py
msgid "Drift and throttle values for two-factor devices have been reset."
msgstr ""
"Os dados de sincronização e de controle de tentativas dos dispositivos de "
"autenticação de dois fatores foram redefinidos."
#: pretix/control/logdisplay.py
#, python-brace-format
@@ -20067,6 +20136,8 @@ msgid ""
"This ticket needs to be exchanged into a <strong>%(media_type)s</strong> "
"reusable medium. <strong>%(media_policy)s</strong>."
msgstr ""
"Este ingresso precisa ser trocado por uma mídia reutilizável do tipo <strong>"
"%(media_type)s</strong>. <strong>%(media_policy)s</strong>."
#: pretix/control/templates/pretixcontrol/checkin/simulator.html
msgid "Special attention required"
@@ -20322,6 +20393,18 @@ msgid ""
"Thanks, \n"
"The %(instance)s Team\n"
msgstr ""
"Olá,\n"
"\n"
"Recebemos uma solicitação para redefinir a senha da sua conta %(instance)s. "
"Para definir uma nova senha, acesse o link abaixo:\n"
"\n"
"%(url)s\n"
"\n"
"Se você não fez essa solicitação, pode ignorar este e-mail com segurança — "
"sua senha não será alterada.\n"
"\n"
"Obrigado,\n"
"Equipe %(instance)s\n"
#: pretix/control/templates/pretixcontrol/email/invitation.txt
#, fuzzy, python-format
@@ -20385,14 +20468,17 @@ msgid ""
"\n"
"We noticed a new sign-in to your %(instance)s account:\n"
msgstr ""
"Olá,\n"
"\n"
"Identificamos um novo acesso à sua conta %(instance)s:\n"
#: pretix/control/templates/pretixcontrol/email/login_notice.txt
msgid "Browser"
msgstr ""
msgstr "Navegador"
#: pretix/control/templates/pretixcontrol/email/login_notice.txt
msgid "Operating system"
msgstr ""
msgstr "Sistema operacional"
#: pretix/control/templates/pretixcontrol/email/login_notice.txt
#, python-format
@@ -20407,6 +20493,14 @@ msgid ""
"Thanks, \n"
"The %(instance)s Team\n"
msgstr ""
"Se foi você, nenhuma ação é necessária.\n"
"\n"
"Se você não reconhece este acesso, altere sua senha imediatamente:\n"
"\n"
"%(url)s\n"
"\n"
"Obrigado,\n"
"Equipe %(instance)s\n"
#: pretix/control/templates/pretixcontrol/email/security_notice.txt
#, fuzzy, python-format
@@ -22387,6 +22481,9 @@ msgid ""
"debugging problems in your pretix installation, and verifying that your "
"usage of pretix is in compliance with the Enterprise license you purchased."
msgstr ""
"Isso tem duas finalidades: coletar informações úteis que possam ajudar a "
"diagnosticar problemas na sua instalação do pretix e verificar se o uso do "
"pretix está em conformidade com a licença Enterprise que você adquiriu."
#: pretix/control/templates/pretixcontrol/global_sysreport.html
msgid "First month of license term:"
@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-30 07:26+0000\n"
"PO-Revision-Date: 2026-03-25 08:00+0000\n"
"Last-Translator: Renne Rocha <renne@rocha.dev.br>\n"
"PO-Revision-Date: 2026-10-30 03:00+0000\n"
"Last-Translator: vihumelo <victordimelo@gmail.com>\n"
"Language-Team: Portuguese (Brazil) <https://translate.pretix.eu/projects/"
"pretix/pretix-js/pt_BR/>\n"
"Language: pt_BR\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.10.1\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js
msgid "Marked as paid"
@@ -430,7 +430,7 @@ msgstr "Pressione Ctrl+C para copiar!"
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue
msgid "Edit"
msgstr ""
msgstr "Editar"
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue
msgid "Visualize"
+1 -1
View File
@@ -239,7 +239,7 @@ class ActionView(View):
})
def get(self, request, *args, **kwargs):
u = request.GET.get('query', '')
u = request.GET.get('query', '').strip()
if len(u) < 2:
return JsonResponse({'results': []})
+14 -2
View File
@@ -98,13 +98,25 @@ class TicketLayoutSerializer(I18nAwareModelSerializer):
return d
def validate(self, attrs):
if attrs.get('default') and self.context['event'].ticket_layouts.filter(default=True).exists:
if attrs.get('default') and self.context['event'].ticket_layouts.filter(default=True).exists():
raise ValidationError('You cannot have two layouts with default = True')
return attrs
def create(self, validated_data):
validated_data["event"] = self.context["event"]
return super().create(validated_data)
background = validated_data.pop("background", None)
instance = super().create(validated_data)
if background:
instance.background.save('background.pdf', background)
return instance
def update(self, instance, validated_data):
background = validated_data.pop("background", None)
if background:
if instance.background and TicketLayout.objects.filter(background=instance.background).count() == 1:
instance.background.delete()
instance.background.save('background.pdf', background)
return super().update(instance, validated_data)
class TicketLayoutViewSet(viewsets.ModelViewSet):
@@ -235,6 +235,7 @@ class LayoutGetDefault(EventPermissionRequiredMixin, View):
class LayoutEditorView(BaseEditorView):
checkin_qr_warning = True
@cached_property
def layout(self):
+9
View File
@@ -20,6 +20,7 @@
# <https://www.gnu.org/licenses/>.
#
import sys
from collections import Counter
from datetime import datetime
from typing import Optional
@@ -472,3 +473,11 @@ def _item_num_options(item):
def get_item_option_count(items):
return sum(_item_num_options(item) for item in items)
def get_item_var_sums(positions, subevent):
itemvarsums = Counter()
for pos in positions:
if pos.subevent == subevent:
itemvarsums[pos.variation or pos.item] += 1
return itemvarsums
@@ -125,10 +125,10 @@
<div class="col-md-8 col-sm-6 col-xs-12">
<h{{ headline_level|default:3|add:2 }} class="h5" id="{{ form_prefix }}item-{{ item.pk }}-{{ var.pk }}-legend">
{{ var }}
{% if cart.itemvarsums|getitem:var %}
{% if itemvarsums|getitem:var %}
<span class="textbubble-success">
{% icon "shopping-cart" %}
{% blocktrans trimmed count amount=cart.itemvarsums|getitem:var %}
{% blocktrans trimmed count amount=itemvarsums|getitem:var %}
{{ amount }}× in your cart
{% plural %}
{{ amount }}× in your cart
@@ -299,10 +299,10 @@
<div class="product-description {% if item.picture %}with-picture{% endif %}">
<h{{ headline_level|default:3|add:1 }} class="h4" id="{{ form_prefix }}item-{{ item.pk }}-legend">
{{ item.name }}
{% if cart.itemvarsums|getitem:item %}
{% if itemvarsums|getitem:item %}
<span class="textbubble-success">
{% icon "shopping-cart" %}
{% blocktrans trimmed count amount=cart.itemvarsums|getitem:item %}
{% blocktrans trimmed count amount=itemvarsums|getitem:item %}
{{ amount }}× in your cart
{% plural %}
{{ amount }}× in your cart
+1 -6
View File
@@ -33,7 +33,7 @@
# License for the specific language governing permissions and limitations under the License.
import copy
import warnings
from collections import Counter, defaultdict
from collections import defaultdict
from datetime import datetime, timedelta
from decimal import Decimal
from functools import wraps
@@ -266,10 +266,6 @@ class CartMixin:
minutes_left = None
seconds_left = None
itemvarsums = Counter()
for p in cartpos:
itemvarsums[p.variation or p.item] += 1
return {
'positions': positions,
'invoice_address': self.invoice_address,
@@ -291,7 +287,6 @@ class CartMixin:
not self.request.event.settings.display_net_prices and
sum(c.price_includes_rounding_correction for c in positions) + sum(f.price_includes_rounding_correction for f in fees)
),
'itemvarsums': itemvarsums,
'current_selected_payments': [
p for p in self.current_selected_payments(lcp, fees, self.invoice_address)
if p.get('multi_use_supported')
+3 -1
View File
@@ -70,7 +70,8 @@ from pretix.helpers.http import redirect_to_url
from pretix.helpers.safedownload import check_token
from pretix.multidomain.urlreverse import eventreverse
from pretix.presale.productlist import (
get_item_option_count, item_group_by_category, prepare_item_list_for_shop,
get_item_option_count, get_item_var_sums, item_group_by_category,
prepare_item_list_for_shop,
)
from pretix.presale.views import (
CartMixin, EventViewMixin, allow_cors_if_namespaced,
@@ -701,6 +702,7 @@ class RedeemView(NoSearchIndexViewMixin, EventViewMixin, CartMixin, TemplateView
)
context['cart'] = self.get_cart()
context['itemvarsums'] = get_item_var_sums(context['cart'].get('raw', []), self.subevent)
context['show_cart'] = context['cart']['positions']
# Regroup those by category
+2 -2
View File
@@ -156,7 +156,7 @@ class LoginView(RedirectBackMixin, FormView):
"""Security check complete. Log the user in."""
customer = form.get_customer()
customer_login(self.request, customer)
customer_signed_in.send(customer.organizer, customer=customer)
customer_signed_in.send(customer.organizer, customer=customer, profile=None)
return HttpResponseRedirect(self.get_success_url())
@@ -901,7 +901,7 @@ class SSOLoginReturnView(RedirectBackMixin, View):
popup_origin
)
customer_signed_in.send(customer.organizer, customer=customer)
customer_signed_in.send(customer.organizer, customer=customer, profile=profile)
if popup_origin:
return render(self.request, 'pretixpresale/postmessage.html', {
+3 -1
View File
@@ -72,7 +72,8 @@ from pretix.helpers.http import redirect_to_url
from pretix.multidomain.urlreverse import eventreverse
from pretix.presale.ical import get_public_ical
from pretix.presale.productlist import (
get_item_option_count, item_group_by_category, prepare_item_list_for_shop,
get_item_option_count, get_item_var_sums, item_group_by_category,
prepare_item_list_for_shop,
)
from pretix.presale.signals import seatingframe_html_head
from pretix.presale.views.organizer import (
@@ -244,6 +245,7 @@ class EventIndex(EventViewMixin, EventListMixin, CartMixin, TemplateView):
context['display_add_to_cart'] = display_add_to_cart
context['cart'] = self.get_cart()
context['itemvarsums'] = get_item_var_sums(context['cart'].get('raw', []), self.subevent)
context['has_addon_choices'] = any(cp.has_addon_choices for cp in get_cart(self.request))
templating_context = PlaceholderContext(event_or_subevent=self.subevent or self.request.event, event=self.request.event)
+6 -1
View File
@@ -35,6 +35,7 @@ import calendar
import hashlib
import math
import operator
import re
from collections import defaultdict
from datetime import date, datetime, time, timedelta
from functools import reduce
@@ -381,7 +382,11 @@ class EventListMixin:
def _set_week_year(self):
if 'date' in self.request.GET:
try:
iso = dateutil.parser.isoparse(self.request.GET.get('date')).isocalendar()
input = self.request.GET.get('date')
# Our parameters for the single-digit weeks of the year are 2027-W2, as emitted by Django's "W" format code,
# but dateutil 4.0 is strict about ISO and only accepts 2027-W02 as valid.
input = re.sub('-W([0-9])$', '-W0\\1', input)
iso = dateutil.parser.isoparse(input).isocalendar()
except ValueError:
iso = time_machine_now().isocalendar()
self.year = iso[0]
+35 -1
View File
@@ -19,12 +19,18 @@
# 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 re
import typing
import weakref
from celery.exceptions import Retry
from sentry_sdk import Hub
from sentry_sdk.integrations import django as djangosentry
from sentry_sdk.utils import capture_internal_exceptions
from sentry_sdk.scrubber import EventScrubber
from sentry_sdk.utils import AnnotatedValue, capture_internal_exceptions
if typing.TYPE_CHECKING:
from sentry_sdk._types import Event
def _make_event_processor(weak_request, integration):
@@ -96,3 +102,31 @@ def setup_custom_filters():
hub = Hub.current
with hub.configure_scope() as scope:
scope.add_event_processor(ignore_retry)
class PretixEventScrubber(EventScrubber):
secret_re = re.compile(
'.*(pretixsecret|ramiiosecret|PRIVATE KEY|://[^/@:]*:[^/@:]+@).*',
re.IGNORECASE
)
def scrub_dict(self, d: object) -> None:
if not isinstance(d, dict):
return
super().scrub_dict(d)
self._scrub_dict_for_known_secrets(d)
def _scrub_dict_for_known_secrets(self, d: dict):
for k, v in d.items():
if isinstance(v, str) and self.secret_re.match(v):
d[k] = AnnotatedValue.substituted_because_contains_sensitive_data()
def scrub_exception(self, event: "Event") -> None:
with capture_internal_exceptions():
if "exception" in event:
self.scrub_dict(event["exception"])
def scrub_event(self, event: "Event") -> None:
super().scrub_event(event)
self.scrub_exception(event)
+4 -4
View File
@@ -41,7 +41,7 @@ from json import loads
from pathlib import Path
from urllib.parse import urlparse
import importlib_metadata as metadata
from importlib import metadata
from django.core.exceptions import ImproperlyConfigured
from django.utils.crypto import get_random_string
from kombu import Queue
@@ -721,9 +721,9 @@ if config.has_option('sentry', 'dsn') and not any(c in sys.argv for c in ('shell
from sentry_sdk.integrations.logging import (
LoggingIntegration, ignore_logger,
)
from sentry_sdk.scrubber import DEFAULT_DENYLIST, EventScrubber
from sentry_sdk.scrubber import DEFAULT_DENYLIST
from .sentry import PretixSentryIntegration, setup_custom_filters
from .sentry import PretixSentryIntegration, PretixEventScrubber, setup_custom_filters
SENTRY_TOKEN = config.get('sentry', 'traces_sample_token', fallback='')
SENTRY_ENABLE_LOGS = config.getboolean('sentry', 'enable_logs', fallback=False)
@@ -759,7 +759,7 @@ if config.has_option('sentry', 'dsn') and not any(c in sys.argv for c in ('shell
traces_sampler=traces_sampler,
environment=urlparse(SITE_URL).netloc,
release=__version__,
event_scrubber=EventScrubber(denylist=pretix_denylist, recursive=True),
event_scrubber=PretixEventScrubber(denylist=pretix_denylist, recursive=True),
send_default_pii=False,
propagate_traces=False, # see https://github.com/getsentry/sentry-python/issues/1717
)
@@ -618,18 +618,21 @@ var editor = {
$('#loading-initial').remove()
})
}
editor._update_version_notice()
editor._update_notices()
},
_update_version_notice: function () {
_update_notices: function () {
$('#version-notice').toggle(
editor._other_page_objects.some((o) => o.type === 'textcontainer')
|| editor.fabric.getObjects().some((o) => o.type === 'textcontainer')
)
$('#nocheckin-notice').toggle(
!editor.fabric.getObjects().some((o) => o.type === 'barcodearea' && (!o.content || o.content === 'secret'))
)
},
_update_toolbox_values: function () {
editor._update_version_notice()
editor._update_notices()
let o = editor.fabric.getActiveObject()
if (!o) {
return
@@ -898,6 +901,7 @@ var editor = {
o.setCoords()
editor.fabric.renderAll()
editor._update_notices()
},
_update_toolbox: function () {
@@ -103,3 +103,6 @@ body {
.panel-pdf-editor .panel-heading form > .btn-group {
margin-right: 1em;
}
#nocheckin-notice {
display: none;
}
+5 -2
View File
@@ -25,8 +25,10 @@ import tempfile
tmpdir = tempfile.TemporaryDirectory()
os.environ.setdefault('DATA_DIR', tmpdir.name)
if os.path.exists('test/sqlite.cfg'):
os.environ.setdefault('PRETIX_CONFIG_FILE', 'test/sqlite.cfg')
if os.path.exists('tests/ci_sqlite.cfg'):
os.environ.setdefault('PRETIX_CONFIG_FILE', 'tests/ci_sqlite.cfg')
else:
os.environ.setdefault("PRETIX_CONFIG_FILE", "")
from pretix.settings import * # NOQA
@@ -100,3 +102,4 @@ class DisableMigrations(object):
if not os.environ.get("GITHUB_WORKFLOW", ""):
MIGRATION_MODULES = DisableMigrations()
VITE_DEV_MODE = True
+11 -3
View File
@@ -26,6 +26,7 @@ from unittest import mock
import pytest
from django.core import mail as djmail
from django.core.exceptions import ValidationError
from django.core.files.base import ContentFile
from django.utils.timezone import now
from django_countries.fields import Country
@@ -248,7 +249,14 @@ def test_order_update_state_validation(token_client, organizer, event, order):
@pytest.mark.django_db
def test_order_update_transmission_validation(token_client, organizer, event, order):
def test_order_update_transmission_validation(token_client, organizer, event, order, monkeypatch):
def mock_validate(self, value):
if value == "9930:DE111111111":
return value
raise ValidationError("Invalid")
monkeypatch.setattr("pretix.base.invoicing.peppol.PeppolIdValidator._validate_peppol_id_online", mock_validate)
resp = token_client.patch(
'/api/v1/organizers/{}/events/{}/orders/{}/'.format(
organizer.slug, event.slug, order.code
@@ -374,7 +382,7 @@ def test_order_update_transmission_validation(token_client, organizer, event, or
"vat_id": "",
"transmission_type": "peppol",
"transmission_info": {
"transmission_peppol_participant_id": "9930:DE811569869",
"transmission_peppol_participant_id": "9930:DE111111111",
"ignored": "parameter",
},
}
@@ -384,7 +392,7 @@ def test_order_update_transmission_validation(token_client, organizer, event, or
order.invoice_address.refresh_from_db()
assert order.invoice_address.transmission_type == "peppol"
assert order.invoice_address.transmission_info == {
"transmission_peppol_participant_id": "9930:DE811569869",
"transmission_peppol_participant_id": "9930:DE111111111",
}
+77
View File
@@ -94,6 +94,83 @@ def question(event, item):
return q
@pytest.mark.django_db
def test_log_action_filter(event, order):
sensitivekeys = [
'auth',
'key',
'token',
'password',
'Password',
'_pass',
'salt',
'secret',
]
log_data = log_data_filtered = {
'foo': 'bar',
}
for d in (log_data, log_data_filtered):
value = '********' if d == log_data_filtered else '__sensitive_info__'
for k in sensitivekeys:
d[k] = d['prefix' + k] = d['prefix' + k + 'suffix'] = d[k + 'suffix'] = value
d['recursive_dict'] = {
'test': 'dummy',
'test_token': value,
'd': {
'baz': 'foo',
'mypassword': value,
'l': [
'foo',
'bar',
{
'baz': True,
'superkey': value,
},
],
},
'l': [
'okay',
{
'salt_to_secret': value,
'name': 'okay'
},
'element',
[
'another',
{
'api_password': value,
},
'list'
]
]
}
d['recursive_list'] = [
'foo',
'bar',
[
'foo',
'bar',
{
'foo': 'bar',
'api_token': value,
},
'baz',
],
{
'foo': 'bar',
'MyPassword': value,
}
]
l1 = order.log_action(
'dummy.log',
data=log_data,
)
l1.refresh_from_db()
assert json.loads(l1.data) == log_data_filtered
@pytest.mark.django_db
def test_email_shredder(event, order):
l1 = order.log_action(
@@ -147,6 +147,7 @@ def test_api_create(env, token_client):
assert resp.status_code == 201
tl = env[0].ticket_layouts.get(pk=resp.data["id"])
assert tl.background
assert "cachedfile" not in tl.background.name
@pytest.mark.django_db
@@ -163,6 +164,21 @@ def test_api_create_validate_default(env, token_client):
assert resp.status_code == 400
assert resp.data == {"non_field_errors": ["You cannot have two layouts with default = True"]}
env[0].ticket_layouts.filter(default=True).update(default=False)
resp = token_client.post(
'/api/v1/organizers/{}/events/{}/ticketlayouts/'.format(env[0].slug, env[0].slug),
{
'name': 'Foo',
'default': True,
'layout': [],
},
format='json'
)
assert resp.status_code == 201
tl = env[0].ticket_layouts.get(pk=resp.data["id"])
assert tl.default
@pytest.mark.django_db
def test_api_create_validate_layout(env, token_client):
@@ -215,6 +231,7 @@ def test_api_update(env, token_client):
assert json.loads(env[1].layout) == [
{"type": "barcodearea", "left": "7.00", "bottom": "11.15", "size": "45.00", "content": "secret"}
]
assert "cachedfile" not in env[1].background.name
@pytest.mark.django_db
@@ -230,6 +247,18 @@ def test_api_update_validate_default(env, token_client):
assert resp.status_code == 400
assert resp.data == {"non_field_errors": ["You cannot have two layouts with default = True"]}
env[0].ticket_layouts.filter(default=True).update(default=False)
resp = token_client.patch(
'/api/v1/organizers/{}/events/{}/ticketlayouts/{}/'.format(env[0].slug, env[0].slug, tl2.pk),
{
"default": True,
},
format='json'
)
assert resp.status_code == 200
tl2.refresh_from_db()
assert tl2.default
@pytest.mark.django_db
def test_api_delete(env, token_client):
+13 -4
View File
@@ -193,7 +193,7 @@ def test_org_login_logout(env, client, mocker):
})
assert r.status_code == 302
customer_signed_in.send.assert_called_once_with(customer.organizer, customer=customer)
customer_signed_in.send.assert_called_once_with(customer.organizer, customer=customer, profile=None)
r = client.get('/bigevents/account/')
assert r.status_code == 200
@@ -349,7 +349,10 @@ def test_org_sso_login_new_customer(env, client, provider, mocker):
c = Customer.objects.get(provider=provider)
assert c.external_identifier == "abcdf"
customer_created.send.assert_called_once_with(c.organizer, customer=c)
customer_signed_in.send.assert_called_once_with(c.organizer, customer=c)
customer_signed_in.send.assert_called_once_with(c.organizer, customer=c, profile={
'uid': 'abcdf', 'email': 'test@example.org',
'oidc_claims': {'sub': 'abcdf', 'email': 'test@example.org'},
})
r = client.get('/bigevents/account/')
assert r.status_code == 200
@@ -401,7 +404,10 @@ def test_org_sso_login_returning_customer_new_email(env, client, provider, mocke
_sso_login(client, provider)
with scopes_disabled():
c = Customer.objects.get(provider=provider)
customer_signed_in.send.assert_called_once_with(c.organizer, customer=c)
customer_signed_in.send.assert_called_once_with(c.organizer, customer=c, profile={
'uid': 'abcdf', 'email': 'test@example.org',
'oidc_claims': {'sub': 'abcdf', 'email': 'test@example.org'},
})
customer_signed_in.send.reset_mock()
r = client.get('/bigevents/account/logout')
@@ -410,7 +416,10 @@ def test_org_sso_login_returning_customer_new_email(env, client, provider, mocke
_sso_login(client, provider, 'new@example.net')
c.refresh_from_db()
assert c.email == "new@example.net"
customer_signed_in.send.assert_called_once_with(c.organizer, customer=c)
customer_signed_in.send.assert_called_once_with(c.organizer, customer=c, profile={
'uid': 'abcdf', 'email': 'new@example.net',
'oidc_claims': {'sub': 'abcdf', 'email': 'new@example.net'},
})
@pytest.mark.django_db(transaction=True)
+55
View File
@@ -1393,6 +1393,61 @@ class OrderChangeAddonsTest(BaseOrdersTest):
assert a.item == self.workshop2
assert a.variation == self.workshop2a
def test_quota_sold_out_change_hide_sold_out(self):
self.event.settings.hide_sold_out = True
self.workshopquota.size = 1
self.workshopquota.items.remove(self.workshop2)
self.workshopquota.variations.remove(self.workshop2a)
self.workshopquota.variations.remove(self.workshop2b)
self.workshopquota.save()
self.workshopquota2 = Quota.objects.create(event=self.event, name='Workshop 2', size=5)
self.workshopquota2.items.add(self.workshop2)
self.workshopquota2.variations.add(self.workshop2a)
self.workshopquota2.variations.add(self.workshop2b)
with scopes_disabled():
OrderPosition.objects.create(
order=self.order,
item=self.workshop1,
variation=None,
price=Decimal("12"),
addon_to=self.ticket_pos,
attendee_name_parts={'full_name': "Peter"}
)
self.order.total += Decimal("12")
self.order.save()
response = self.client.get(
'/%s/%s/order/%s/%s/change' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret)
)
assert response.status_code == 200
assert 'Workshop 1' in response.content.decode()
doc = BeautifulSoup(response.content.decode(), "lxml")
assert doc.select(f'input[name=cp_{self.ticket_pos.pk}_item_{self.workshop1.pk}]')[0].attrs['checked']
response = self.client.post(
'/%s/%s/order/%s/%s/change' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret),
{
f'cp_{self.ticket_pos.pk}_variation_{self.workshop2.pk}_{self.workshop2a.pk}': '1'
},
follow=True
)
doc = BeautifulSoup(response.content.decode(), "lxml")
assert 'alert-danger' not in response.content.decode()
form_data = extract_form_fields(doc.select('.main-box form')[0])
form_data['confirm'] = 'true'
response = self.client.post(
'/%s/%s/order/%s/%s/change' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret), form_data, follow=True
)
assert 'alert-success' in response.content.decode()
with scopes_disabled():
a = self.ticket_pos.addons.get(canceled=False)
assert a.item == self.workshop2
assert a.variation == self.workshop2a
def _assert_ws2a_not_allowed(self):
response = self.client.get(
'/%s/%s/order/%s/%s/change' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret)