Compare commits

..
Author SHA1 Message Date
Raphael Michel aa2d202e07 Voucher CSV download: Do not output "any product" (Z#23224795) 2026-03-09 17:48:49 +01:00
Raphael Michel 5099fa16e0 Fix incorrect type annotation 2026-03-09 17:48:38 +01:00
Kara Engelhardt f3fb1e66dc Fix waiting list availability calculation if WL vouchers have seats (Z#23226856) 2026-03-09 17:18:47 +02:00
Ruud Hendrickx 99e9690d48 Translations: Update Dutch (Belgium)
Currently translated at 71.3% (4465 of 6257 strings)

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

powered by weblate
2026-03-09 14:24:17 +01:00
Hijiri Umemoto e63e82e854 Translations: Update Japanese
Currently translated at 100.0% (6257 of 6257 strings)

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

powered by weblate
2026-03-09 14:24:17 +01:00
argonimos c662e627d5 Translations: Update German
Currently translated at 100.0% (6257 of 6257 strings)

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

powered by weblate
2026-03-09 14:24:17 +01:00
Mie Frydensbjerg f2121c7853 Translations: Update Danish
Currently translated at 44.7% (2800 of 6257 strings)

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

powered by weblate
2026-03-09 14:24:17 +01:00
Raphael Michel 3ce6dbf798 Mail: Remove redundant SQL queries (#5896)
On my local test event, this saved 75 queries on sending an email due to
an N+1 query problem in the metadata querying.
2026-03-09 13:53:20 +01:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> 43b91af5e6 Update sentry-sdk requirement from ==2.53.* to ==2.54.* (#5947)
Updates the requirements on [sentry-sdk](https://github.com/getsentry/sentry-python) to permit the latest version.
- [Release notes](https://github.com/getsentry/sentry-python/releases)
- [Changelog](https://github.com/getsentry/sentry-python/blob/master/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-python/compare/2.53.0...2.54.0)

---
updated-dependencies:
- dependency-name: sentry-sdk
  dependency-version: 2.54.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-03-09 13:53:00 +01:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> 034d6b997e Bump minimatch from 3.0.4 to 3.1.5 in /src/pretix/static/npm_dir (#5937)
Bumps [minimatch](https://github.com/isaacs/minimatch) from 3.0.4 to 3.1.5.
- [Changelog](https://github.com/isaacs/minimatch/blob/main/changelog.md)
- [Commits](https://github.com/isaacs/minimatch/compare/v3.0.4...v3.1.5)

---
updated-dependencies:
- dependency-name: minimatch
  dependency-version: 3.1.5
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-09 13:52:50 +01:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> 345ad35fcf Update protobuf requirement from ==6.33.* to ==7.34.* (#5945)
Updates the requirements on [protobuf](https://github.com/protocolbuffers/protobuf) to permit the latest version.
- [Release notes](https://github.com/protocolbuffers/protobuf/releases)
- [Commits](https://github.com/protocolbuffers/protobuf/commits)

---
updated-dependencies:
- dependency-name: protobuf
  dependency-version: 7.34.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-03-09 13:52:44 +01:00
Raphael Michel 347337e76f Invoice generation: Add way for renderers to signal they are not ready (#5905) 2026-03-09 13:52:11 +01:00
Lukas BockstallerandRichard Schreiber c07ba31307 API: add organizer-level orderpositions endpoint (#5848)
* initial implementation

* handle permissions

* split out organizer list endpoint

* remove left over empty lines

* revert import changes

* tidying up

* revert no longer needed test changes

* revert no longer needed test changes

* Apply suggestions from code review

Co-authored-by: Richard Schreiber <schreiber@pretix.eu>

* add event to api response

* prefetch

* handle auth

* document event

* bump querycounts for prefetches

* Use existing Permission Denied Error Message

---------

Co-authored-by: Richard Schreiber <schreiber@pretix.eu>
2026-03-06 11:55:38 +01:00
Ruud Hendrickx 87b3e0c417 Translations: Update Dutch (Belgium)
Currently translated at 71.0% (4446 of 6257 strings)

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

powered by weblate
2026-03-05 07:34:01 +01:00
Ruud Hendrickx d3fd031639 Translations: Update Dutch (Belgium)
Currently translated at 69.6% (4355 of 6257 strings)

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

powered by weblate
2026-03-05 07:34:01 +01:00
Renne Rocha 9253327334 Translations: Update Portuguese (Brazil)
Currently translated at 92.9% (5813 of 6257 strings)

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

powered by weblate
2026-03-05 07:34:01 +01:00
Ruud Hendrickx 080b9cacaf Translations: Update Dutch (Belgium)
Currently translated at 63.6% (3982 of 6257 strings)

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

powered by weblate
2026-03-05 07:34:01 +01:00
CVZ-es 9c2cc02df1 Translations: Update Spanish
Currently translated at 100.0% (6257 of 6257 strings)

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

powered by weblate
2026-03-05 07:34:01 +01:00
Ruud Hendrickx fceae0a2fe Translations: Update Dutch
Currently translated at 100.0% (6257 of 6257 strings)

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

powered by weblate
2026-03-05 07:34:01 +01:00
CVZ-es 9fc3fdf751 Translations: Update French
Currently translated at 100.0% (6257 of 6257 strings)

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

powered by weblate
2026-03-05 07:34:01 +01:00
André Almeida 04f79b7014 Translations: Update Portuguese (Brazil)
Currently translated at 92.8% (5811 of 6257 strings)

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

powered by weblate
2026-03-05 07:34:01 +01:00
Ruud Hendrickx 9d0b9387e6 Translations: Update Dutch (Belgium)
Currently translated at 57.2% (3581 of 6257 strings)

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

powered by weblate
2026-03-05 07:34:01 +01:00
Sandra Rial Pérez b25e6f598d Translations: Update Galician
Currently translated at 100.0% (256 of 256 strings)

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

powered by weblate
2026-03-05 07:34:01 +01:00
Sandra Rial Pérez e8e2648f7e Translations: Update Galician
Currently translated at 17.5% (1095 of 6257 strings)

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

powered by weblate
2026-03-05 07:34:01 +01:00
Ruud Hendrickx e0fac42225 Translations: Update Dutch (Belgium)
Currently translated at 53.1% (3326 of 6257 strings)

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

powered by weblate
2026-03-05 07:34:01 +01:00
Ruud Hendrickx 3e9bc7675b Translations: Update Dutch (Belgium)
Currently translated at 50.7% (3176 of 6257 strings)

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

powered by weblate
2026-03-05 07:34:01 +01:00
Hijiri Umemoto 1541033467 Translations: Update Japanese
Currently translated at 100.0% (6257 of 6257 strings)

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

powered by weblate
2026-03-05 07:34:01 +01:00
Ruud Hendrickx 6b8c3ef15c Translations: Update Dutch (informal) (nl_Informal)
Currently translated at 100.0% (6257 of 6257 strings)

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

powered by weblate
2026-03-05 07:34:01 +01:00
Alberto Ortega 135e07c183 Translations: Update Spanish
Currently translated at 99.9% (6256 of 6257 strings)

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

powered by weblate
2026-03-05 07:34:01 +01:00
Ruud Hendrickx fe97915b36 Translations: Update Dutch
Currently translated at 100.0% (6257 of 6257 strings)

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

powered by weblate
2026-03-05 07:34:01 +01:00
Hijiri Umemoto 233281cea4 Translations: Update Japanese
Currently translated at 99.9% (6255 of 6257 strings)

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

powered by weblate
2026-03-05 07:34:01 +01:00
Renne Rocha 0300a44634 Translations: Update Portuguese (Brazil)
Currently translated at 92.6% (5797 of 6257 strings)

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

powered by weblate
2026-03-05 07:34:01 +01:00
Ruud Hendrickx 449d930565 Translations: Update Dutch (Belgium)
Currently translated at 46.7% (2927 of 6257 strings)

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

powered by weblate
2026-03-05 07:34:01 +01:00
Sandra Rial Pérez 49f49bd8a6 Translations: Update Galician
Currently translated at 16.7% (1048 of 6257 strings)

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

powered by weblate
2026-03-05 07:34:01 +01:00
Ruud Hendrickx e896704fe0 Translations: Update Dutch (Belgium)
Currently translated at 42.9% (2689 of 6257 strings)

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

powered by weblate
2026-03-05 07:34:01 +01:00
Sandra Rial Pérez cfee402a27 Translations: Update Galician
Currently translated at 16.3% (1026 of 6257 strings)

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

powered by weblate
2026-03-05 07:34:01 +01:00
David Ibáñez Cerdeira f8878e53a3 Translations: Update Galician
Currently translated at 16.3% (1026 of 6257 strings)

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

powered by weblate
2026-03-05 07:34:01 +01:00
Renne Rocha fd6a342bc6 Translations: Update Portuguese (Brazil)
Currently translated at 92.6% (5797 of 6257 strings)

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

powered by weblate
2026-03-05 07:34:01 +01:00
Pedro Orlando 865433276e Translations: Update Portuguese (Brazil)
Currently translated at 92.6% (5797 of 6257 strings)

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

powered by weblate
2026-03-05 07:34:01 +01:00
André Almeida f616f64f47 Translations: Update Portuguese (Brazil)
Currently translated at 92.6% (5797 of 6257 strings)

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

powered by weblate
2026-03-05 07:34:01 +01:00
Ruud Hendrickx 26550887b7 Translations: Update Dutch (Belgium)
Currently translated at 30.7% (1924 of 6257 strings)

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

powered by weblate
2026-03-05 07:34:01 +01:00
David Ibáñez Cerdeira 0f3de911b8 Translations: Update Galician
Currently translated at 100.0% (256 of 256 strings)

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

powered by weblate
2026-03-05 07:34:01 +01:00
David Ibáñez Cerdeira b648390dbf Translations: Update Galician
Currently translated at 15.7% (986 of 6257 strings)

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

powered by weblate
2026-03-05 07:34:01 +01:00
David Ibáñez Cerdeira 50fec0b31c Translations: Update Greek
Currently translated at 43.8% (2743 of 6257 strings)

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

powered by weblate
2026-03-05 07:34:01 +01:00
Ruud Hendrickx e44af04e43 Translations: Update Dutch (informal) (nl_Informal)
Currently translated at 100.0% (6257 of 6257 strings)

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

powered by weblate
2026-03-05 07:34:01 +01:00
André Almeida 276c3177f5 Translations: Update Portuguese (Brazil)
Currently translated at 89.7% (5616 of 6257 strings)

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

powered by weblate
2026-03-05 07:34:01 +01:00
Pedro Orlando 27ac004a0b Translations: Update Portuguese (Brazil)
Currently translated at 89.7% (5616 of 6257 strings)

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

powered by weblate
2026-03-05 07:34:01 +01:00
André Almeida 6d517d4e8d Translations: Update Portuguese (Brazil)
Currently translated at 89.7% (5616 of 6257 strings)

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

powered by weblate
2026-03-05 07:34:01 +01:00
Ruud Hendrickx d9c3deda8a Translations: Update Dutch
Currently translated at 100.0% (6257 of 6257 strings)

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

powered by weblate
2026-03-05 07:34:01 +01:00
CVZ-es fe6add618a Translations: Update Spanish
Currently translated at 100.0% (6257 of 6257 strings)

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

powered by weblate
2026-03-05 07:34:01 +01:00
CVZ-es 3615a52cc4 Translations: Update French
Currently translated at 100.0% (6257 of 6257 strings)

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

powered by weblate
2026-03-05 07:34:01 +01:00
Kara Engelhardt e3ae3b08bd Handle PlainHtmlAlternativeString in placeholder help text 2026-03-04 18:57:25 +02:00
Richard SchreiberandRaphael Michel 959e926a67 API: validate payment_info (#5944)
* API: validate payment_info

* improve dict-check

* Apply suggestions from code review

Co-authored-by: Raphael Michel <michel@pretix.eu>

---------

Co-authored-by: Raphael Michel <michel@pretix.eu>
2026-03-02 12:28:47 +01:00
Raphael Michel 876ddf1321 Add a log entry on manual VAT ID validation (Z#23223874) (#5939) 2026-02-27 15:22:50 +01:00
Richard Schreiber 005b1d54d3 add missing licenseheaders 2026-02-27 09:09:27 +01:00
AnanyaandRichard Schreiber 2066471086 Fix #1907 – Obfuscate contact email addresses in public HTML (#5477)
* Include nix development enviornment

* Obfuscate contact email addresses in shop HTML and deanonymize via JavaScript

This change addresses #1907: "hide contact e-mail address in source code
of a shop".

- Contact email addresses rendered in public-facing templates are now
obfuscated in the HTML source (e.g., replacing "@" with "[at]" and "."
with "[dot]").
- A new JavaScript file is included in the relevant templates to
automatically rewrite and restore the email address for users after the
page loads.
- This approach helps protect email addresses from basic harvesting bots
and reduces spam, while keeping them accessible and user-friendly for
human visitors.
- The obfuscation and deanonymization logic is only applied to web
templates, not to emails sent via pretix.

This implementation follows the recommendations discussed in #1907,
using a standardized, maintainable approach that’s compatible with
pretix's asset pipeline and template structure.

* Undo nix development environment for merge into main

* convert complete mailto-link to HTML entities

* remove gitignore noise

* Update .gitignore

* fix gitignore noise

* Update .gitignore

---------

Co-authored-by: Richard Schreiber <schreiber@rami.io>
2026-02-27 08:50:33 +01:00
Richard Schreiber a25bca7471 Fix static instance name in emails (Z#23224360) (#5914) 2026-02-25 13:19:53 +01:00
luelista da43984ad2 Add datasync logging (Z#23225588) (#5928)
* Fix inconsistent log messages

* Add logging for successfully synced orders

(debugging orders that might get silently skipped)
2026-02-25 09:49:52 +01:00
Martin Gross 7cce1c9219 PPv2: Handle paypal-payments/oders in 'created' status (Z#23225625) (#5929) 2026-02-25 09:21:58 +01:00
Martin Gross cb9c4466f9 Revert "PPv2: Do not put payments in pending-state if no capture has occured yet."
This reverts commit e5c8f19984.
2026-02-24 16:55:57 +01:00
Martin Gross 3398cda74b PPv2: properly check for pending-payments in pending-renderer 2026-02-24 16:16:22 +01:00
Martin Gross e5c8f19984 PPv2: Do not put payments in pending-state if no capture has occured yet. 2026-02-24 16:07:16 +01:00
Raphael Michel 5027f6dd59 Bump version to 2026.3.0.dev0 2026-02-24 13:37:15 +01:00
55 changed files with 5810 additions and 4663 deletions
-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 }}"
+50
View File
@@ -1719,6 +1719,56 @@ List of all order positions
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view this resource.
.. http:get:: /api/v1/organizers/(organizer)/orderpositions/
Returns a list of all order positions within all events of a given organizer (with sufficient access permissions).
The supported query parameters and output format of this endpoint are almost identical to those of the list endpoint
within an event.
The only changes are that responses also contain the ``event`` attribute in each result and that the 'pdf_data'
parameter is not supported.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/orderpositions/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
X-Page-Generated: 2017-12-01T10:00:00Z
{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"id:": 23442
"event": "sampleconf",
"order": "ABC12",
"positionid": 1,
"canceled": false,
"item": 1345,
...
}
]
}
:param organizer: The ``slug`` field of the organizer to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view this resource.
Fetching individual positions
-----------------------------
+2 -2
View File
@@ -77,7 +77,7 @@ dependencies = [
"phonenumberslite==9.0.*",
"Pillow==12.1.*",
"pretix-plugin-build",
"protobuf==6.33.*",
"protobuf==7.34.*",
"psycopg2-binary",
"pycountry",
"pycparser==3.0",
@@ -92,7 +92,7 @@ dependencies = [
"redis==7.1.*",
"reportlab==4.4.*",
"requests==2.32.*",
"sentry-sdk==2.53.*",
"sentry-sdk==2.54.*",
"sepaxml==2.7.*",
"stripe==7.9.*",
"text-unidecode==1.*",
+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.2.0"
__version__ = "2026.3.0.dev0"
+21
View File
@@ -19,6 +19,7 @@
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
# <https://www.gnu.org/licenses/>.
#
import json
import logging
import os
from collections import Counter, defaultdict
@@ -636,6 +637,14 @@ class OrderPositionSerializer(I18nAwareModelSerializer):
return entry
class OrganizerOrderPositionSerializer(OrderPositionSerializer):
event = SlugRelatedField(slug_field='slug', read_only=True)
class Meta(OrderPositionSerializer.Meta):
fields = OrderPositionSerializer.Meta.fields + ('event',)
read_only_fields = OrderPositionSerializer.Meta.read_only_fields + ('event',)
class RequireAttentionField(serializers.Field):
def to_representation(self, instance: OrderPosition):
return instance.require_checkin_attention
@@ -1215,6 +1224,18 @@ class OrderCreateSerializer(I18nAwareModelSerializer):
raise ValidationError('The given payment provider is not known.')
return pp
def validate_payment_info(self, info):
if info:
try:
obj = json.loads(info)
except ValueError:
raise ValidationError('payment_info must be valid JSON.')
if not isinstance(obj, dict):
# only objects are allowed
raise ValidationError('payment_info must be a JSON object.')
return info
def validate_expires(self, expires):
if expires < now():
raise ValidationError('Expiration date must be in the future.')
+2 -1
View File
@@ -365,9 +365,10 @@ class TeamInviteSerializer(serializers.ModelSerializer):
def _send_invite(self, instance):
mail(
instance.email,
_('pretix account invitation'),
_('Account invitation'),
'pretixcontrol/email/invitation.txt',
{
'instance': settings.PRETIX_INSTANCE_NAME,
'user': self,
'organizer': self.context['organizer'].name,
'team': instance.team.name,
+2 -1
View File
@@ -67,6 +67,7 @@ orga_router.register(r'invoices', order.InvoiceViewSet)
orga_router.register(r'scheduled_exports', exporters.ScheduledOrganizerExportViewSet)
orga_router.register(r'exporters', exporters.OrganizerExportersViewSet, basename='exporters')
orga_router.register(r'transactions', order.OrganizerTransactionViewSet)
orga_router.register(r'orderpositions', order.OrganizerOrderPositionViewSet, basename='orderpositions')
team_router = routers.DefaultRouter()
team_router.register(r'members', organizer.TeamMemberViewSet)
@@ -83,7 +84,7 @@ event_router.register(r'discounts', discount.DiscountViewSet)
event_router.register(r'quotas', item.QuotaViewSet)
event_router.register(r'vouchers', voucher.VoucherViewSet)
event_router.register(r'orders', order.EventOrderViewSet)
event_router.register(r'orderpositions', order.OrderPositionViewSet)
event_router.register(r'orderpositions', order.EventOrderPositionViewSet)
event_router.register(r'transactions', order.TransactionViewSet)
event_router.register(r'invoices', order.InvoiceViewSet)
event_router.register(r'revokedsecrets', order.RevokedSecretViewSet, basename='revokedsecrets')
+49 -12
View File
@@ -57,9 +57,10 @@ from pretix.api.serializers.order import (
BlockedTicketSecretSerializer, InvoiceSerializer, OrderCreateSerializer,
OrderPaymentCreateSerializer, OrderPaymentSerializer,
OrderPositionSerializer, OrderRefundCreateSerializer,
OrderRefundSerializer, OrderSerializer, OrganizerTransactionSerializer,
PriceCalcSerializer, PrintLogSerializer, RevokedTicketSecretSerializer,
SimulatedOrderSerializer, TransactionSerializer,
OrderRefundSerializer, OrderSerializer, OrganizerOrderPositionSerializer,
OrganizerTransactionSerializer, PriceCalcSerializer, PrintLogSerializer,
RevokedTicketSecretSerializer, SimulatedOrderSerializer,
TransactionSerializer,
)
from pretix.api.serializers.orderchange import (
BlockNameSerializer, OrderChangeOperationSerializer,
@@ -1065,8 +1066,7 @@ with scopes_disabled():
}
class OrderPositionViewSet(viewsets.ModelViewSet):
serializer_class = OrderPositionSerializer
class OrderPositionViewSetMixin:
queryset = OrderPosition.all.none()
filter_backends = (DjangoFilterBackend, RichOrderingFilter)
ordering = ('order__datetime', 'positionid')
@@ -1087,8 +1087,7 @@ class OrderPositionViewSet(viewsets.ModelViewSet):
def get_serializer_context(self):
ctx = super().get_serializer_context()
ctx['event'] = self.request.event
ctx['pdf_data'] = self.request.query_params.get('pdf_data', 'false').lower() == 'true'
ctx['pdf_data'] = False
ctx['check_quotas'] = self.request.query_params.get('check_quotas', 'true').lower() == 'true'
return ctx
@@ -1097,9 +1096,8 @@ class OrderPositionViewSet(viewsets.ModelViewSet):
qs = OrderPosition.all
else:
qs = OrderPosition.objects
qs = qs.filter(order__event=self.request.event)
if self.request.query_params.get('pdf_data', 'false').lower() == 'true':
qs = qs.filter(order__event__organizer=self.request.organizer)
if self.request.query_params.get('pdf_data', 'false').lower() == 'true' and getattr(self.request, 'event', None):
prefetch_related_objects([self.request.organizer], 'meta_properties')
prefetch_related_objects(
[self.request.event],
@@ -1154,9 +1152,9 @@ class OrderPositionViewSet(viewsets.ModelViewSet):
qs = qs.prefetch_related(
Prefetch('checkins', queryset=Checkin.objects.select_related("device")),
Prefetch('print_logs', queryset=PrintLog.objects.select_related('device')),
'answers', 'answers__options', 'answers__question',
'answers', 'answers__options', 'answers__question', 'order__event', 'order__event__organizer'
).select_related(
'item', 'order', 'order__event', 'order__event__organizer', 'seat'
'item', 'order', 'seat'
)
return qs
@@ -1168,6 +1166,45 @@ class OrderPositionViewSet(viewsets.ModelViewSet):
return prov
raise NotFound('Unknown output provider.')
class OrganizerOrderPositionViewSet(OrderPositionViewSetMixin, viewsets.ReadOnlyModelViewSet):
serializer_class = OrganizerOrderPositionSerializer
def get_queryset(self):
qs = super().get_queryset()
perm = self.permission if self.request.method in SAFE_METHODS else self.write_permission
if isinstance(self.request.auth, (TeamAPIToken, Device)):
auth_obj = self.request.auth
elif self.request.user.is_authenticated:
auth_obj = self.request.user
else:
raise PermissionDenied("Unknown authentication scheme")
qs = qs.filter(
order__event__in=auth_obj.get_events_with_permission(perm, request=self.request).filter(
organizer=self.request.organizer
)
)
return qs
class EventOrderPositionViewSet(OrderPositionViewSetMixin, viewsets.ModelViewSet):
serializer_class = OrderPositionSerializer
def get_serializer_context(self):
ctx = super().get_serializer_context()
ctx['event'] = self.request.event
ctx['pdf_data'] = self.request.query_params.get('pdf_data', 'false').lower() == 'true'
return ctx
def get_queryset(self):
qs = super().get_queryset()
qs = qs.filter(order__event=self.request.event)
return qs
@action(detail=True, methods=['POST'], url_name='price_calc')
def price_calc(self, request, *args, **kwargs):
"""
+5 -2
View File
@@ -216,7 +216,10 @@ class OutboundSyncProvider:
try:
mapped_objects = self.sync_order(sq.order)
if not all(all(not res or res.sync_info.get("action", "") == "nothing_to_do" for res in res_list) for res_list in mapped_objects.values()):
actions_taken = [res and res.sync_info.get("action", "") for res_list in mapped_objects.values() for res in res_list]
should_write_logentry = any(action not in (None, "nothing_to_do") for action in actions_taken)
logger.info('Synced order %s to %s, actions: %r, log: %r', sq.order.code, sq.sync_provider, actions_taken, should_write_logentry)
if should_write_logentry:
sq.order.log_action("pretix.event.order.data_sync.success", {
"provider": self.identifier,
"objects": {
@@ -237,7 +240,7 @@ class OutboundSyncProvider:
sq.set_sync_error("exceeded", e.messages, e.full_message)
else:
logger.info(
f"Could not sync order {sq.order.code} to {type(self).__name__} "
f"Could not sync order {sq.order.code} to {sq.sync_provider} "
f"(transient error, attempt #{sq.failed_attempts}, next {sq.not_before})",
exc_info=True,
)
-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
@@ -89,7 +89,7 @@ class OrderListExporter(MultiSheetListExporter):
description = gettext_lazy('Download a spreadsheet of all orders. The spreadsheet will include three sheets, one '
'with a line for every order, one with a line for every order position, and one with '
'a line for every additional fee charged in an order.')
featured = False
featured = True
repeatable_read = False
@cached_property
File diff suppressed because it is too large Load Diff
+10 -1
View File
@@ -42,6 +42,8 @@ from django.utils.html import escape
from django.utils.timezone import get_current_timezone, now
from django.utils.translation import gettext_lazy as _
from pretix.helpers.format import PlainHtmlAlternativeString
def replace_arabic_numbers(inp):
if not isinstance(inp, str):
@@ -61,11 +63,18 @@ def replace_arabic_numbers(inp):
return inp.translate(table)
def format_placeholder_help_text(placeholder_name, sample_value):
if isinstance(sample_value, PlainHtmlAlternativeString):
sample_value = sample_value.plain
title = (_("Sample: %s") % sample_value) if sample_value else ""
return ('<button type="button" class="content-placeholder" title="%s">{%s}</button>' % (escape(title), escape(placeholder_name)))
def format_placeholders_help_text(placeholders, event=None):
placeholders = [(k, v.render_sample(event) if event else v) for k, v in placeholders.items()]
placeholders.sort(key=lambda x: x[0])
phs = [
'<button type="button" class="content-placeholder" title="%s">{%s}</button>' % (escape(_("Sample: %s") % v) if v else "", escape(k))
format_placeholder_help_text(k, v)
for k, v in placeholders
]
return _('Available placeholders: {list}').format(
+4
View File
@@ -148,6 +148,10 @@ class NumberedCanvas(Canvas):
self.restoreState()
class InvoiceNotReadyException(Exception):
pass
class BaseInvoiceRenderer:
"""
This is the base class for all invoice renderers.
+4 -1
View File
@@ -346,7 +346,8 @@ class User(AbstractBaseUser, PermissionsMixin, LoggingMixin):
{
'user': self,
'messages': msg,
'url': build_absolute_uri('control:user.settings')
'url': build_absolute_uri('control:user.settings'),
'instance': settings.PRETIX_INSTANCE_NAME,
},
event=None,
user=self,
@@ -391,6 +392,7 @@ class User(AbstractBaseUser, PermissionsMixin, LoggingMixin):
'user': self,
'reason': msg,
'code': code,
'instance': settings.PRETIX_INSTANCE_NAME,
},
event=None,
user=self,
@@ -430,6 +432,7 @@ class User(AbstractBaseUser, PermissionsMixin, LoggingMixin):
mail(
self.email, _('Password recovery'), 'pretixcontrol/email/forgot.txt',
{
'instance': settings.PRETIX_INSTANCE_NAME,
'user': self,
'url': (build_absolute_uri('control:auth.forgot.recover')
+ '?id=%d&token=%s' % (self.id, default_token_generator.make_token(self)))
+1 -1
View File
@@ -86,7 +86,7 @@ class OrderSyncQueue(models.Model):
def set_sync_error(self, failure_mode, messages, full_message):
logger.exception(
f"Could not sync order {self.order.code} to {type(self).__name__} ({failure_mode})"
f"Could not sync order {self.order.code} to {self.sync_provider} ({failure_mode})"
)
self.order.log_action(f"pretix.event.order.data_sync.failed.{failure_mode}", {
"provider": self.sync_provider,
+3 -2
View File
@@ -181,10 +181,11 @@ class WaitingListEntry(LoggedModel):
block_quota=True,
item_id=self.item_id,
subevent_id=self.subevent_id,
waitinglistentries__isnull=False
waitinglistentries__isnull=False,
seat__isnull=True
).aggregate(free=Sum(F('max_usages') - F('redeemed')))['free'] or 0
free_seats = num_free_seats_for_product - num_valid_vouchers_for_product
if not free_seats:
if free_seats < 1:
raise WaitingListException(_('No seat with this product is currently available.'))
if '@' not in self.email:
+2 -1
View File
@@ -51,6 +51,7 @@ from django_scopes import scope, scopes_disabled
from i18nfield.strings import LazyI18nString
from pretix.base.i18n import language
from pretix.base.invoicing.pdf import InvoiceNotReadyException
from pretix.base.invoicing.transmission import (
get_transmission_types, transmission_providers,
)
@@ -504,7 +505,7 @@ def generate_invoice(order: Order, trigger_pdf=True):
return invoice
@app.task(base=TransactionAwareTask)
@app.task(base=TransactionAwareTask, throws=(InvoiceNotReadyException,))
def invoice_pdf_task(invoice: int):
with scopes_disabled():
i = Invoice.objects.get(pk=invoice)
+12
View File
@@ -409,6 +409,18 @@ def mail_send_task(self, **kwargs) -> bool:
outgoing_mail.inflight_since = now()
outgoing_mail.save(update_fields=["status", "inflight_since"])
# Performance optimization, saves database queries later on if we resolve the known relationships
if outgoing_mail.event_id:
assert outgoing_mail.event.organizer_id == outgoing_mail.organizer.pk
outgoing_mail.event.organizer = outgoing_mail.organizer
if outgoing_mail.order_id:
assert outgoing_mail.order.event_id == outgoing_mail.event_id
outgoing_mail.order.event = outgoing_mail.event
outgoing_mail.order.organizer = outgoing_mail.organizer
if outgoing_mail.orderposition_id:
assert outgoing_mail.orderposition.order_id == outgoing_mail.order_id
outgoing_mail.orderposition.order = outgoing_mail.order
headers = dict(outgoing_mail.headers)
headers.setdefault('X-PX-Correlation', str(outgoing_mail.guid))
email = CustomEmail(
+7
View File
@@ -24,6 +24,7 @@ import logging
from datetime import timedelta
from decimal import Decimal
from django.db.models import Prefetch, prefetch_related_objects
from django.dispatch import receiver
from django.utils.formats import date_format
from django.utils.html import escape, mark_safe
@@ -35,6 +36,7 @@ from pretix.base.forms.widgets import format_placeholders_help_text
from pretix.base.i18n import (
LazyCurrencyNumber, LazyDate, LazyExpiresDate, LazyNumber,
)
from pretix.base.models import EventMetaValue
from pretix.base.reldate import RelativeDateWrapper
from pretix.base.settings import PERSON_NAME_SCHEMES, get_name_parts_localized
from pretix.base.signals import (
@@ -752,6 +754,11 @@ def base_placeholders(sender, **kwargs):
name_scheme['sample'][f]
))
prefetch_related_objects(
[sender],
Prefetch('meta_values', queryset=EventMetaValue.objects.select_related("property"), to_attr="meta_values_cached")
)
prefetch_related_objects([sender.organizer], Prefetch('meta_properties'))
for k, v in sender.meta_data.items():
ph.append(MarkdownTextPlaceholder(
'meta_%s' % k, ['event'], lambda event, k=k: event.meta_data[k],
+1
View File
@@ -176,6 +176,7 @@ def shred(self, event: Event, fileid: str, confirm_code: str, user: int=None, lo
_('Data shredding completed'),
'pretixbase/email/shred_completed.txt',
{
'instance': settings.PRETIX_INSTANCE_NAME,
'user': user,
'organizer': event.organizer.name,
'event': str(event.name),
@@ -13,5 +13,5 @@ Start time: {{ start_time }} (new data added after this time might not have been
Best regards,
Your pretix team
Your {{ instance }} team
{% endblocktrans %}
@@ -0,0 +1,34 @@
#
# This file is part of pretix (Community Edition).
#
# Copyright (C) 2014-2020 Raphael Michel and contributors
# Copyright (C) 2020-today pretix GmbH and contributors
#
# This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General
# Public License as published by the Free Software Foundation in version 3 of the License.
#
# ADDITIONAL TERMS APPLY: Pursuant to Section 7 of the GNU Affero General Public License, additional terms are
# applicable granting you additional permissions and placing additional restrictions on your usage of this software.
# Please refer to the pretix LICENSE file to obtain the full terms applicable to this work. If you did not receive
# this file, see <https://pretix.eu/about/en/license>.
#
# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
# details.
#
# 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/>.
#
from django import template
from django.utils.html import mark_safe
register = template.Library()
@register.filter("anon_email")
def anon_email(value):
"""Replaces @ with [at] and . with [dot] for anonymization."""
if not isinstance(value, str):
return value
value = value.replace("@", "[at]").replace(".", "[dot]")
return mark_safe(''.join(['&#{0};'.format(ord(char)) for char in value]))
+1 -1
View File
@@ -423,7 +423,7 @@ def resolve_timeframe_to_dates_inclusive(ref_dt, frame, timezone) -> Tuple[Optio
raise ValueError(f"Invalid timeframe '{frame}'")
def resolve_timeframe_to_datetime_start_inclusive_end_exclusive(ref_dt, frame, timezone) -> Tuple[Optional[date], Optional[date]]:
def resolve_timeframe_to_datetime_start_inclusive_end_exclusive(ref_dt, frame, timezone) -> Tuple[Optional[datetime], Optional[datetime]]:
"""
Given a serialized timeframe, evaluate it relative to `ref_dt` and return a tuple of datetimes
where the first element ist the first possible datetime within the timeframe and the second
+1
View File
@@ -518,6 +518,7 @@ def pretixcontrol_orderposition_blocked_display(sender: Event, orderposition, bl
'The order requires approval before it can continue to be processed.'),
'pretix.event.order.approved': _('The order has been approved.'),
'pretix.event.order.denied': _('The order has been denied (comment: "{comment}").'),
'pretix.event.order.vatid.validated': _('The customer VAT ID has been verified.'),
'pretix.event.order.contact.changed': _('The email address has been changed from "{old_email}" '
'to "{new_email}".'),
'pretix.event.order.contact.confirmed': _(
@@ -9,5 +9,5 @@ Please do never give this code to another person. Our support team will never as
If this code was not requested by you, please contact us immediately.
Best regards,
Your pretix team
Your {{ instance }} team
{% endblocktrans %}
@@ -5,5 +5,5 @@ you requested a new password. Please go to the following page to reset your pass
{{ url }}
Best regards,
Your pretix team
{% endblocktrans %}
Your {{ instance }} team
{% endblocktrans %}
@@ -1,6 +1,6 @@
{% load i18n %}{% blocktrans with url=url|safe %}Hello,
you have been invited to a team on pretix, a platform to perform event
you have been invited to a team on {{ instance }}, a platform to perform event
ticket sales.
Organizer: {{ organizer }}
@@ -13,5 +13,5 @@ If you do not want to join, you can safely ignore or delete this email.
Best regards,
Your pretix team
Your {{ instance }} team
{% endblocktrans %}
@@ -1,6 +1,6 @@
{% load i18n %}{% blocktrans with url=url|safe messages=messages|safe %}Hello,
this is to inform you that the account information of your pretix account has been
this is to inform you that the account information of your {{ instance }} account has been
changed. In particular, the following changes have been performed:
{{ messages }}
@@ -12,5 +12,5 @@ You can review and change your account settings here:
{{ url }}
Best regards,
Your pretix team
Your {{ instance }} team
{% endblocktrans %}
+11 -3
View File
@@ -1641,9 +1641,17 @@ class OrderCheckVATID(OrderView):
try:
normalized_id = validate_vat_id(ia.vat_id, str(ia.country))
ia.vat_id_validated = True
ia.vat_id = normalized_id
ia.save()
with transaction.atomic():
ia.vat_id_validated = True
ia.vat_id = normalized_id
ia.save()
self.order.log_action(
'pretix.event.order.vatid.validated',
data={
'vat_id': normalized_id,
},
user=self.request.user,
)
except VATIDFinalError as e:
messages.error(self.request, e.message)
except VATIDTemporaryError:
+2 -1
View File
@@ -1039,9 +1039,10 @@ class TeamMemberView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin,
def _send_invite(self, instance):
mail(
instance.email,
_('pretix account invitation'),
_('Account invitation'),
'pretixcontrol/email/invitation.txt',
{
'instance': settings.PRETIX_INSTANCE_NAME,
'user': self,
'organizer': self.request.organizer.name,
'team': instance.team.name,
+1 -1
View File
@@ -131,7 +131,7 @@ class VoucherList(PaginationMixin, EventPermissionRequiredMixin, ListView):
elif v.quota:
prod = _('Any product in quota "{quota}"').format(quota=str(v.quota.name))
else:
prod = _('Any product')
prod = ""
row = [
v.code,
v.valid_until.isoformat() if v.valid_until else "",
+3 -2
View File
@@ -280,11 +280,12 @@ class WaitingListView(EventPermissionRequiredMixin, WaitingListQuerySetMixin, Pa
block_quota=True,
item_id=wle.item_id,
subevent=wle.subevent_id,
waitinglistentries__isnull=False
waitinglistentries__isnull=False,
seat__isnull=True
).aggregate(free=Sum(F('max_usages') - F('redeemed')))['free'] or 0
free_seats = num_free_seats_for_product - num_valid_vouchers_for_product
wle.availability = (
Quota.AVAILABILITY_GONE if free_seats == 0 else wle.availability[0],
Quota.AVAILABILITY_GONE if free_seats < 1 else wle.availability[0],
min(free_seats, wle.availability[1]) if wle.availability[1] is not None else free_seats,
)
+5 -5
View File
@@ -4,16 +4,16 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-02-24 11:50+0000\n"
"PO-Revision-Date: 2026-02-19 22:00+0000\n"
"PO-Revision-Date: 2026-03-05 20:00+0000\n"
"Last-Translator: Mie Frydensbjerg <mif@aarhus.dk>\n"
"Language-Team: Danish <https://translate.pretix.eu/projects/pretix/pretix/da/"
">\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 5.16\n"
"X-Generator: Weblate 5.16.1\n"
#: pretix/_base_settings.py:87
msgid "English"
@@ -34285,7 +34285,7 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/event/voucher.html:293
#, python-format
msgid "minimum amount to order: %(num)s"
msgstr ""
msgstr "Minimumsbestilling: %(num)s"
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:76
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:160
+76 -92
View File
@@ -5,8 +5,8 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-02-24 11:50+0000\n"
"PO-Revision-Date: 2026-02-24 12:07+0000\n"
"Last-Translator: Raphael Michel <michel@rami.io>\n"
"PO-Revision-Date: 2026-03-07 23:00+0000\n"
"Last-Translator: argonimos <jonas@pfeiffer-wagner.de>\n"
"Language-Team: German <https://translate.pretix.eu/projects/pretix/pretix/"
"de/>\n"
"Language: de\n"
@@ -14,7 +14,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\n"
"X-Generator: Weblate 5.16.2\n"
"X-Poedit-Bookmarks: -1,-1,904,-1,-1,-1,-1,-1,-1,-1\n"
#: pretix/_base_settings.py:87
@@ -846,7 +846,7 @@ msgstr "Details der Bestellposition"
#: pretix/base/datasync/sourcefields.py:129
msgid "Attendee details"
msgstr "Details Teilnehmer"
msgstr "Details Teilnehmer*in"
#: pretix/base/datasync/sourcefields.py:130 pretix/base/exporters/answers.py:66
#: pretix/base/models/items.py:1767 pretix/control/navigation.py:172
@@ -908,13 +908,13 @@ msgstr "Veranstaltungs- oder Termininformationen"
#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:50
#: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html:36
msgid "Attendee name"
msgstr "Name Teilnehmer"
msgstr "Name Teilnehmer*in"
#: pretix/base/datasync/sourcefields.py:187
#: pretix/base/datasync/sourcefields.py:604
#: pretix/base/datasync/sourcefields.py:628
msgid "Attendee"
msgstr "Teilnehmer"
msgstr "Teilnehmer*in"
#: pretix/base/datasync/sourcefields.py:207
#: pretix/base/exporters/orderlist.py:645 pretix/base/forms/questions.py:693
@@ -925,11 +925,11 @@ msgstr "Teilnehmer"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:172
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:175
msgid "Attendee email"
msgstr "E-Mail Teilnehmer"
msgstr "E-Mail Teilnehmer*in"
#: pretix/base/datasync/sourcefields.py:219
msgid "Attendee or order email"
msgstr "E-Mail Teilnehmer oder Bestellung"
msgstr "E-Mail Teilnehmer*in oder Bestellung"
#: pretix/base/datasync/sourcefields.py:232
#: pretix/base/exporters/orderlist.py:646 pretix/base/pdf.py:188
@@ -939,23 +939,23 @@ msgstr "E-Mail Teilnehmer oder Bestellung"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:182
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:185
msgid "Attendee company"
msgstr "Teilnehmer-Firma"
msgstr "Teilnehmer*innen-Firma"
#: pretix/base/datasync/sourcefields.py:241
msgid "Attendee address street"
msgstr "Teilnehmer-Adresse: Straße"
msgstr "Teilnehmer*innen-Adresse: Straße"
#: pretix/base/datasync/sourcefields.py:250
msgid "Attendee address ZIP code"
msgstr "Teilnehmer-Adresse: PLZ"
msgstr "Teilnehmer*innen-Adresse: PLZ"
#: pretix/base/datasync/sourcefields.py:259
msgid "Attendee address city"
msgstr "Teilnehmer-Adresse: Stadt"
msgstr "Teilnehmer*innen-Adresse: Stadt"
#: pretix/base/datasync/sourcefields.py:268
msgid "Attendee address country"
msgstr "Teilnehmer-Adresse: Land"
msgstr "Teilnehmer*innen-Adresse: Land"
#: pretix/base/datasync/sourcefields.py:279
#: pretix/base/exporters/orderlist.py:688 pretix/base/pdf.py:346
@@ -1233,7 +1233,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:76 pretix/base/exporters/orderlist.py:626
@@ -2188,10 +2188,6 @@ msgstr "Ohne gültige Mitgliedschaft verstecken"
msgid "Order data"
msgstr "Bestelldaten"
#: pretix/base/exporters/relevant_orderlist.py:86
msgid "Order data (sorted by relevance)"
msgstr "Bestelldaten (nach Relevanz sortiert)"
#: pretix/base/exporters/json.py:53
msgid ""
"Download a structured JSON representation of all orders. This might be "
@@ -2209,8 +2205,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:76 pretix/plugins/reports/exporters.py:502
#: pretix/plugins/reports/exporters.py:685
@@ -2228,18 +2224,6 @@ 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:337
#: pretix/control/navigation.py:255 pretix/control/navigation.py:362
#: pretix/control/templates/pretixcontrol/orders/index.html:8
@@ -3861,7 +3845,7 @@ msgstr "Restbetrag"
#, python-brace-format
msgctxt "invoice"
msgid "Invoice period: {daterange}"
msgstr "Rechungsperiode: {daterange}"
msgstr "Rechnungsperiode: {daterange}"
#: pretix/base/invoicing/pdf.py:1039
msgctxt "invoice"
@@ -4186,7 +4170,7 @@ msgstr "Bitte wählen Sie einen gültigen Staat aus."
#: pretix/base/modelimport_orders.py:359 pretix/control/forms/filter.py:688
msgid "Attendee email address"
msgstr "Teilnehmer-E-Mail-Adresse"
msgstr "Teilnehmer*innen-E-Mail-Adresse"
#: pretix/base/modelimport_orders.py:375 pretix/base/modelimport_orders.py:386
#: pretix/base/modelimport_orders.py:397 pretix/base/modelimport_orders.py:408
@@ -4198,7 +4182,7 @@ msgstr "Teilnehmer-E-Mail-Adresse"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:193
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:196
msgid "Attendee address"
msgstr "Teilnehmer-Adresse"
msgstr "Teilnehmer*innen-Adresse"
#: pretix/base/modelimport_orders.py:445
msgid "State"
@@ -8112,7 +8096,7 @@ msgstr "Musterfirma GmbH"
#: pretix/base/pdf.py:193
msgid "Full attendee address"
msgstr "Volle Teilnehmer-Adresse"
msgstr "Volle Teilnehmer*innen-Adresse"
#: pretix/base/pdf.py:194
msgid ""
@@ -8130,23 +8114,23 @@ msgstr ""
#: pretix/base/pdf.py:198
msgid "Attendee street"
msgstr "Teilnehmer-Straße"
msgstr "Teilnehmer*innen-Straße"
#: pretix/base/pdf.py:203
msgid "Attendee ZIP code"
msgstr "Teilnehmer-PLZ"
msgstr "Teilnehmer*innen-PLZ"
#: pretix/base/pdf.py:208
msgid "Attendee city"
msgstr "Teilnehmer-Stadt"
msgstr "Teilnehmer*innen-Stadt"
#: pretix/base/pdf.py:213
msgid "Attendee state"
msgstr "Teilnehmer-Bundesstaat"
msgstr "Teilnehmer*innen-Bundesstaat"
#: pretix/base/pdf.py:218
msgid "Attendee country"
msgstr "Teilnehmer-Land"
msgstr "Teilnehmer*innen-Land"
#: pretix/base/pdf.py:230
msgid "Pseudonymization ID (lead scanning)"
@@ -8439,7 +8423,7 @@ msgstr "Herr Mustermann"
#: pretix/plugins/ticketoutputpdf/exporters.py:99
#, python-brace-format
msgid "Attendee name: {part}"
msgstr "Teilnehmername: {part}"
msgstr "Teilnehmer*innenname: {part}"
#: pretix/base/pdf.py:688
msgid "Invoice address name for salutation"
@@ -9146,7 +9130,7 @@ msgstr "Veranstaltungsort: {location}"
#, python-brace-format
msgctxt "invoice"
msgid "Attendee: {name}"
msgstr "Teilnehmer: {name}"
msgstr "Teilnehmer*in: {name}"
#: pretix/base/services/invoices.py:278 pretix/plugins/reports/exporters.py:308
#, python-brace-format
@@ -10002,7 +9986,7 @@ msgstr ""
#: pretix/base/settings.py:361
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:362
msgid ""
@@ -10012,13 +9996,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:380
msgid "Ask for attendee names"
msgstr "Namen der Teilnehmer erfragen"
msgstr "Namen der Teilnehmer*innen erfragen"
#: pretix/base/settings.py:381
msgid "Ask for a name for all personalized tickets."
@@ -10027,11 +10011,11 @@ msgstr ""
#: pretix/base/settings.py:390
msgid "Require attendee names"
msgstr "Namen der Teilnehmer erfordern"
msgstr "Namen der Teilnehmer*innen erfordern"
#: pretix/base/settings.py:391
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:401
msgid "Ask for email addresses per ticket"
@@ -10554,8 +10538,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:1068
@@ -11053,7 +11037,7 @@ msgstr ""
#: pretix/base/settings.py:1688
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:1689
msgid ""
@@ -11064,12 +11048,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:1702
msgid "Allow users to download tickets"
@@ -11250,7 +11234,7 @@ msgstr ""
#: pretix/base/settings.py:1865 pretix/base/settings.py:1874
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:1869
msgid "Allow customers to modify their information"
@@ -11358,7 +11342,7 @@ msgstr ""
#: pretix/base/settings.py:1975
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:1976
msgid ""
@@ -11370,7 +11354,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."
@@ -11666,7 +11650,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 "
@@ -11907,8 +11891,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 "
@@ -15217,7 +15201,7 @@ msgstr "Check-in-Status"
#: pretix/control/forms/filter.py:2041
#: pretix/plugins/checkinlists/exporters.py:108
msgid "All attendees"
msgstr "Alle Teilnehmer"
msgstr "Alle Teilnehmer*innen"
#: pretix/control/forms/filter.py:2042
#: pretix/control/templates/pretixcontrol/checkin/index.html:183
@@ -15801,7 +15785,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."
@@ -16115,7 +16099,7 @@ msgstr ""
#: pretix/control/forms/orders.py:167 pretix/control/forms/orders.py:226
#: pretix/control/forms/orders.py:240
msgid "Notify customer by email"
msgstr "Kunde per E-Mail benachrichtigen"
msgstr "Kund*in per E-Mail benachrichtigen"
#: pretix/control/forms/orders.py:174
msgid "Keep a cancellation fee of"
@@ -17638,7 +17622,7 @@ msgstr "Eine individuelle E-Mail wurde verschickt."
#: pretix/control/logdisplay.py:553
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:554
msgid ""
@@ -19377,7 +19361,7 @@ msgstr "Terminal-ID"
#: pretix/control/templates/pretixcontrol/boxoffice/payment.html:104
msgid "Card holder"
msgstr "Karteninhaber"
msgstr "Karteninhaber*in"
#: pretix/control/templates/pretixcontrol/boxoffice/payment.html:108
msgid "Card expiration"
@@ -19682,7 +19666,7 @@ msgstr "CSV"
#: pretix/control/templates/pretixcontrol/checkin/index.html:73
msgid "No attendee record was found."
msgstr "Keine passenden Teilnehmer gefunden."
msgstr "Keine passenden Teilnehmer*innen gefunden."
#: pretix/control/templates/pretixcontrol/checkin/index.html:91
#: pretix/control/templates/pretixcontrol/datasync/failed_jobs.html:19
@@ -22513,7 +22497,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:39
@@ -22592,7 +22576,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."
@@ -24861,7 +24845,7 @@ msgstr "Sonstige Datenexporte"
#: pretix/control/templates/pretixcontrol/orders/export.html:107
#: pretix/control/templates/pretixcontrol/organizers/export.html:107
msgid "Recommended for new users"
msgstr "Empfohlen für neue Benutzer"
msgstr "Empfohlen für neue Benutzer*innen"
#: pretix/control/templates/pretixcontrol/orders/export_delete.html:4
#: pretix/control/templates/pretixcontrol/orders/export_delete.html:6
@@ -25834,7 +25818,7 @@ msgstr "Domains"
#: pretix/control/templates/pretixcontrol/organizers/edit.html:320
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:321
msgid ""
@@ -28222,7 +28206,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:36
@@ -28532,11 +28516,11 @@ msgstr "Das ausgewählte List wurde gelöscht."
#: pretix/control/views/dashboards.py:114
msgid "Attendees (ordered)"
msgstr "Teilnehmer (bestellt)"
msgstr "Teilnehmende (bestellt)"
#: pretix/control/views/dashboards.py:124
msgid "Attendees (paid)"
msgstr "Teilnehmer (bezahlt)"
msgstr "Teilnehmende (bezahlt)"
#: pretix/control/views/dashboards.py:136
#, python-brace-format
@@ -30595,7 +30579,7 @@ msgstr "PDF-Sammlungen"
#: pretix/plugins/badges/exporters.py:423
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:444
#: pretix/plugins/ticketoutputpdf/exporters.py:80
@@ -30870,7 +30854,7 @@ msgstr "Anderes Bankkonto"
#: pretix/plugins/banktransfer/payment.py:85
msgid "Name of account holder"
msgstr "Kontoinhaber"
msgstr "Kontoinhaber*in"
#: pretix/plugins/banktransfer/payment.py:87
msgid ""
@@ -31012,7 +30996,7 @@ msgstr "Bitte überweisen Sie den vollen Betrag auf das folgende Bankkonto:"
#: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_confirm.html:32
#: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_confirm.html:35
msgid "Account holder"
msgstr "Kontoinhaber"
msgstr "Kontoinhaber*in"
#: pretix/plugins/banktransfer/payment.py:304
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:20
@@ -31607,7 +31591,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:501
@@ -32786,7 +32770,7 @@ msgstr "Geplante E-Mails"
#: pretix/plugins/sendmail/signals.py:122
msgid "Mass email was sent to customers or attendees."
msgstr "Rundmail wurde an Kunden oder Teilnehmer verschickt."
msgstr "Rundmail wurde an Kunden oder Teilnehmer*innen verschickt."
#: pretix/plugins/sendmail/signals.py:123
msgid "Mass email was sent to waiting list entries."
@@ -32818,7 +32802,7 @@ msgstr "Eine automatisierte E-Mail wurde an den Besteller verschickt"
#: pretix/plugins/sendmail/signals.py:142
msgid "A scheduled email was sent to a ticket holder"
msgstr "Eine automatisierte E-Mail wurde an eine Teilnehmer verschickt."
msgstr "Eine automatisierte E-Mail wurde an eine Teilnehmer*in verschickt."
#: pretix/plugins/sendmail/signals.py:143
msgid "An email rule was deleted"
@@ -32851,7 +32835,7 @@ msgstr "Alle nicht eingecheckten Kunden"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/history_fragment_orders.html:23
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:25
msgid "All contact addresses"
@@ -33010,14 +32994,14 @@ msgstr ""
#: pretix/plugins/sendmail/views.py:250
msgid "Orders or attendees"
msgstr "Bestellungen oder Teilnehmer"
msgstr "Bestellungen oder Teilnehmer*innen"
#: pretix/plugins/sendmail/views.py:251
msgid ""
"Send an email to every customer, or to every person a ticket has been "
"purchased for, or a combination of both."
msgstr ""
"Senden Sie eine E-Mail an alle Ticketkäufer, 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:417
@@ -33599,23 +33583,23 @@ msgstr "SEPA-Lastschrift"
#: pretix/plugins/stripe/payment.py:1258
msgid "Account Holder Name"
msgstr "Kontoinhaber"
msgstr "Kontoinhaber*in"
#: pretix/plugins/stripe/payment.py:1263
msgid "Account Holder Street"
msgstr "Straße (Kontoinhaber)"
msgstr "Straße (Kontoinhaber*in)"
#: pretix/plugins/stripe/payment.py:1275
msgid "Account Holder Postal Code"
msgstr "PLZ (Kontoinhaber)"
msgstr "PLZ (Kontoinhaber*in)"
#: pretix/plugins/stripe/payment.py:1287
msgid "Account Holder City"
msgstr "Stadt (Kontoinhaber)"
msgstr "Stadt (Kontoinhaber*in)"
#: pretix/plugins/stripe/payment.py:1299
msgid "Account Holder Country"
msgstr "Land (Kontoinhaber)"
msgstr "Land (Kontoinhaber*in)"
#: pretix/plugins/stripe/payment.py:1343
msgid "Affirm via Stripe"
@@ -35455,7 +35439,7 @@ msgstr[1] "Das Ticket wurde %(count)s-mal eingelöst."
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:166
msgid "No attendee name provided"
msgstr "Name des Teilnehmenrs nicht angegeben"
msgstr "Name der teilnehmenden Person nicht angegeben"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:219
msgid "The image you previously uploaded"
@@ -37207,12 +37191,12 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/organizers/customer_profiles.html:11
#: pretix/presale/views/customer.py:386
msgid "Attendee profiles"
msgstr "Teilnehmer-Profile"
msgstr "Teilnehmer*innen-Profile"
#: pretix/presale/templates/pretixpresale/organizers/customer_profiles.html:37
msgid "You dont have any attendee profiles in your account yet."
msgstr ""
"In Ihrem Kundenkonto sind noch keine Teilnehmer-Profile gespeichert."
"In Ihrem Kundenkonto sind noch keine Teilnehmer*innen-Profile gespeichert."
#: pretix/presale/templates/pretixpresale/organizers/customer_registration.html:7
msgid "Registration"
@@ -38713,7 +38697,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"
@@ -848,7 +848,7 @@ msgstr "Details der Bestellposition"
#: pretix/base/datasync/sourcefields.py:129
msgid "Attendee details"
msgstr "Details Teilnehmer"
msgstr "Details Teilnehmer*in"
#: pretix/base/datasync/sourcefields.py:130 pretix/base/exporters/answers.py:66
#: pretix/base/models/items.py:1767 pretix/control/navigation.py:172
@@ -910,13 +910,13 @@ msgstr "Veranstaltungs- oder Termininformationen"
#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:50
#: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html:36
msgid "Attendee name"
msgstr "Name Teilnehmer"
msgstr "Name Teilnehmer*in"
#: pretix/base/datasync/sourcefields.py:187
#: pretix/base/datasync/sourcefields.py:604
#: pretix/base/datasync/sourcefields.py:628
msgid "Attendee"
msgstr "Teilnehmer"
msgstr "Teilnehmer*in"
#: pretix/base/datasync/sourcefields.py:207
#: pretix/base/exporters/orderlist.py:645 pretix/base/forms/questions.py:693
@@ -927,11 +927,11 @@ msgstr "Teilnehmer"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:172
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:175
msgid "Attendee email"
msgstr "E-Mail Teilnehmer"
msgstr "E-Mail Teilnehmer*in"
#: pretix/base/datasync/sourcefields.py:219
msgid "Attendee or order email"
msgstr "E-Mail Teilnehmer oder Bestellung"
msgstr "E-Mail Teilnehmer*in oder Bestellung"
#: pretix/base/datasync/sourcefields.py:232
#: pretix/base/exporters/orderlist.py:646 pretix/base/pdf.py:188
@@ -941,23 +941,23 @@ msgstr "E-Mail Teilnehmer oder Bestellung"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:182
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:185
msgid "Attendee company"
msgstr "Teilnehmer-Firma"
msgstr "Teilnehmer*innen-Firma"
#: pretix/base/datasync/sourcefields.py:241
msgid "Attendee address street"
msgstr "Teilnehmer-Adresse: Straße"
msgstr "Teilnehmer*innen-Adresse: Straße"
#: pretix/base/datasync/sourcefields.py:250
msgid "Attendee address ZIP code"
msgstr "Teilnehmer-Adresse: PLZ"
msgstr "Teilnehmer*innen-Adresse: PLZ"
#: pretix/base/datasync/sourcefields.py:259
msgid "Attendee address city"
msgstr "Teilnehmer-Adresse: Stadt"
msgstr "Teilnehmer*innen-Adresse: Stadt"
#: pretix/base/datasync/sourcefields.py:268
msgid "Attendee address country"
msgstr "Teilnehmer-Adresse: Land"
msgstr "Teilnehmer*innen-Adresse: Land"
#: pretix/base/datasync/sourcefields.py:279
#: pretix/base/exporters/orderlist.py:688 pretix/base/pdf.py:346
@@ -1235,7 +1235,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:76 pretix/base/exporters/orderlist.py:626
@@ -2207,8 +2207,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:76 pretix/plugins/reports/exporters.py:502
#: pretix/plugins/reports/exporters.py:685
@@ -4172,7 +4172,7 @@ msgstr "Bitte wähle einen gültigen Staat aus."
#: pretix/base/modelimport_orders.py:359 pretix/control/forms/filter.py:688
msgid "Attendee email address"
msgstr "Teilnehmer-E-Mail-Adresse"
msgstr "Teilnehmer*innen-E-Mail-Adresse"
#: pretix/base/modelimport_orders.py:375 pretix/base/modelimport_orders.py:386
#: pretix/base/modelimport_orders.py:397 pretix/base/modelimport_orders.py:408
@@ -4184,7 +4184,7 @@ msgstr "Teilnehmer-E-Mail-Adresse"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:193
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:196
msgid "Attendee address"
msgstr "Teilnehmer-Adresse"
msgstr "Teilnehmer*innen-Adresse"
#: pretix/base/modelimport_orders.py:445
msgid "State"
@@ -8089,7 +8089,7 @@ msgstr "Musterfirma"
#: pretix/base/pdf.py:193
msgid "Full attendee address"
msgstr "Volle Teilnehmer-Adresse"
msgstr "Volle Teilnehmer*innen-Adresse"
#: pretix/base/pdf.py:194
msgid ""
@@ -8107,23 +8107,23 @@ msgstr ""
#: pretix/base/pdf.py:198
msgid "Attendee street"
msgstr "Teilnehmer-Straße"
msgstr "Teilnehmer*innen-Straße"
#: pretix/base/pdf.py:203
msgid "Attendee ZIP code"
msgstr "Teilnehmer-PLZ"
msgstr "Teilnehmer*innen-PLZ"
#: pretix/base/pdf.py:208
msgid "Attendee city"
msgstr "Teilnehmer-Stadt"
msgstr "Teilnehmer*innen-Stadt"
#: pretix/base/pdf.py:213
msgid "Attendee state"
msgstr "Teilnehmer-Bundesstaat"
msgstr "Teilnehmer*innen-Bundesstaat"
#: pretix/base/pdf.py:218
msgid "Attendee country"
msgstr "Teilnehmer-Land"
msgstr "Teilnehmer*innen-Land"
#: pretix/base/pdf.py:230
msgid "Pseudonymization ID (lead scanning)"
@@ -8416,7 +8416,7 @@ msgstr "Herr Mustermann"
#: pretix/plugins/ticketoutputpdf/exporters.py:99
#, python-brace-format
msgid "Attendee name: {part}"
msgstr "Teilnehmer: {part}"
msgstr "Teilnehmer*innenname: {part}"
#: pretix/base/pdf.py:688
msgid "Invoice address name for salutation"
@@ -9120,7 +9120,7 @@ msgstr "Veranstaltungsort: {location}"
#, python-brace-format
msgctxt "invoice"
msgid "Attendee: {name}"
msgstr "Teilnehmer: {name}"
msgstr "Teilnehmer*in: {name}"
#: pretix/base/services/invoices.py:278 pretix/plugins/reports/exporters.py:308
#, python-brace-format
@@ -9974,7 +9974,7 @@ msgstr ""
#: pretix/base/settings.py:361
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:362
msgid ""
@@ -9984,13 +9984,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:380
msgid "Ask for attendee names"
msgstr "Namen der Teilnehmer erfragen"
msgstr "Namen der Teilnehmer*innen erfragen"
#: pretix/base/settings.py:381
msgid "Ask for a name for all personalized tickets."
@@ -9999,11 +9999,11 @@ msgstr ""
#: pretix/base/settings.py:390
msgid "Require attendee names"
msgstr "Namen der Teilnehmer erfordern"
msgstr "Namen der Teilnehmer*innen erfordern"
#: pretix/base/settings.py:391
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:401
msgid "Ask for email addresses per ticket"
@@ -10025,7 +10025,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."
@@ -10525,8 +10525,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:1068
@@ -11024,7 +11024,7 @@ msgstr ""
#: pretix/base/settings.py:1688
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:1689
msgid ""
@@ -11035,12 +11035,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:1702
msgid "Allow users to download tickets"
@@ -11221,7 +11221,7 @@ msgstr ""
#: pretix/base/settings.py:1865 pretix/base/settings.py:1874
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:1869
msgid "Allow customers to modify their information"
@@ -11329,7 +11329,7 @@ msgstr ""
#: pretix/base/settings.py:1975
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:1976
msgid ""
@@ -11341,7 +11341,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."
@@ -11525,7 +11525,7 @@ msgstr "Kontakt-E-Mail"
#: pretix/base/settings.py:2211 pretix/control/forms/event.py:1843
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:2219 pretix/control/forms/event.py:1835
@@ -11637,7 +11637,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 "
@@ -11877,8 +11877,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 "
@@ -13141,7 +13141,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:4066
@@ -14777,11 +14777,11 @@ msgstr "Ticket-Downloads"
#: pretix/control/forms/event.py:1825
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:1829
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:1830
msgid ""
@@ -14817,7 +14817,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."
@@ -15178,7 +15178,7 @@ msgstr "Check-in-Status"
#: pretix/control/forms/filter.py:2041
#: pretix/plugins/checkinlists/exporters.py:108
msgid "All attendees"
msgstr "Alle Teilnehmer"
msgstr "Alle Teilnehmer*innen"
#: pretix/control/forms/filter.py:2042
#: pretix/control/templates/pretixcontrol/checkin/index.html:183
@@ -15762,7 +15762,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."
@@ -17599,7 +17599,7 @@ msgstr "Eine individuelle E-Mail wurde verschickt."
#: pretix/control/logdisplay.py:553
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:554
msgid ""
@@ -19337,7 +19337,7 @@ msgstr "Terminal-ID"
#: pretix/control/templates/pretixcontrol/boxoffice/payment.html:104
msgid "Card holder"
msgstr "Karteninhaber"
msgstr "Karteninhaber*in"
#: pretix/control/templates/pretixcontrol/boxoffice/payment.html:108
msgid "Card expiration"
@@ -19642,7 +19642,7 @@ msgstr "CSV"
#: pretix/control/templates/pretixcontrol/checkin/index.html:73
msgid "No attendee record was found."
msgstr "Keine passenden Teilnehmer gefunden."
msgstr "Keine passenden Teilnehmer*innen gefunden."
#: pretix/control/templates/pretixcontrol/checkin/index.html:91
#: pretix/control/templates/pretixcontrol/datasync/failed_jobs.html:19
@@ -21468,7 +21468,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:7
#: pretix/control/templates/pretixcontrol/event/settings.html:13
@@ -22466,7 +22466,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:39
@@ -22545,7 +22545,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."
@@ -23238,9 +23238,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:14
msgid "Create a new question"
@@ -23379,7 +23379,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."
@@ -24811,7 +24811,7 @@ msgstr "Sonstige Datenexporte"
#: pretix/control/templates/pretixcontrol/orders/export.html:107
#: pretix/control/templates/pretixcontrol/organizers/export.html:107
msgid "Recommended for new users"
msgstr "Empfohlen für neue Benutzer"
msgstr "Empfohlen für neue Benutzer*innen"
#: pretix/control/templates/pretixcontrol/orders/export_delete.html:4
#: pretix/control/templates/pretixcontrol/orders/export_delete.html:6
@@ -25783,7 +25783,7 @@ msgstr "Domains"
#: pretix/control/templates/pretixcontrol/organizers/edit.html:320
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:321
msgid ""
@@ -28166,7 +28166,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:36
@@ -30534,7 +30534,7 @@ msgstr "PDF-Sammlungen"
#: pretix/plugins/badges/exporters.py:423
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:444
#: pretix/plugins/ticketoutputpdf/exporters.py:80
@@ -30808,7 +30808,7 @@ msgstr "Anderes Bankkonto"
#: pretix/plugins/banktransfer/payment.py:85
msgid "Name of account holder"
msgstr "Kontoinhaber"
msgstr "Kontoinhaber*in"
#: pretix/plugins/banktransfer/payment.py:87
msgid ""
@@ -30950,7 +30950,7 @@ msgstr "Bitte überweise den vollen Betrag auf das folgende Bankkonto:"
#: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_confirm.html:32
#: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_confirm.html:35
msgid "Account holder"
msgstr "Kontoinhaber"
msgstr "Kontoinhaber*in"
#: pretix/plugins/banktransfer/payment.py:304
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:20
@@ -31546,7 +31546,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:501
@@ -32722,7 +32722,7 @@ msgstr "Geplante E-Mails"
#: pretix/plugins/sendmail/signals.py:122
msgid "Mass email was sent to customers or attendees."
msgstr "Rundmail wurde an Kunden oder Teilnehmer verschickt."
msgstr "Rundmail wurde an Kunden oder Teilnehmer*innen verschickt."
#: pretix/plugins/sendmail/signals.py:123
msgid "Mass email was sent to waiting list entries."
@@ -32754,7 +32754,7 @@ msgstr "Eine automatisierte E-Mail wurde an den Besteller verschickt"
#: pretix/plugins/sendmail/signals.py:142
msgid "A scheduled email was sent to a ticket holder"
msgstr "Eine automatisierte E-Mail wurde an einen Teilnehmer verschickt."
msgstr "Eine automatisierte E-Mail wurde an eine Teilnehmer*in verschickt."
#: pretix/plugins/sendmail/signals.py:143
msgid "An email rule was deleted"
@@ -32787,7 +32787,7 @@ msgstr "Alle nicht eingecheckten Kunden"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/history_fragment_orders.html:23
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:25
msgid "All contact addresses"
@@ -32947,14 +32947,14 @@ msgstr ""
#: pretix/plugins/sendmail/views.py:250
msgid "Orders or attendees"
msgstr "Bestellungen oder Teilnehmer"
msgstr "Bestellungen oder Teilnehmer*innen"
#: pretix/plugins/sendmail/views.py:251
msgid ""
"Send an email to every customer, or to every person a ticket has been "
"purchased for, or a combination of both."
msgstr ""
"Sende eine E-Mail an alle Ticketkäufer, 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:417
@@ -33534,23 +33534,23 @@ msgstr "SEPA-Lastschrift"
#: pretix/plugins/stripe/payment.py:1258
msgid "Account Holder Name"
msgstr "Kontoinhaber"
msgstr "Kontoinhaber*in"
#: pretix/plugins/stripe/payment.py:1263
msgid "Account Holder Street"
msgstr "Straße (Kontoinhaber)"
msgstr "Straße (Kontoinhaber*in)"
#: pretix/plugins/stripe/payment.py:1275
msgid "Account Holder Postal Code"
msgstr "PLZ (Kontoinhaber)"
msgstr "PLZ (Kontoinhaber*in)"
#: pretix/plugins/stripe/payment.py:1287
msgid "Account Holder City"
msgstr "Stadt (Kontoinhaber)"
msgstr "Stadt (Kontoinhaber*in)"
#: pretix/plugins/stripe/payment.py:1299
msgid "Account Holder Country"
msgstr "Land (Kontoinhaber)"
msgstr "Land (Kontoinhaber*in)"
#: pretix/plugins/stripe/payment.py:1343
msgid "Affirm via Stripe"
@@ -35383,7 +35383,7 @@ msgstr[1] "Das Ticket wurde %(count)s-mal eingelöst."
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:166
msgid "No attendee name provided"
msgstr "Name des Teilnehmenrs nicht angegeben"
msgstr "Name der teilnehmenden Person nicht angegeben"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:219
msgid "The image you previously uploaded"
@@ -37133,12 +37133,12 @@ msgstr "Möchtest das folgende Profil wirklich aus deinem Kundenkonto löschen?"
#: pretix/presale/templates/pretixpresale/organizers/customer_profiles.html:11
#: pretix/presale/views/customer.py:386
msgid "Attendee profiles"
msgstr "Teilnehmer-Adresse"
msgstr "Teilnehmer*innen-Adresse"
#: pretix/presale/templates/pretixpresale/organizers/customer_profiles.html:37
msgid "You dont have any attendee profiles in your account yet."
msgstr ""
"In deinem Kundenkonto sind noch keine Teilnehmer-Profile gespeichert."
"In deinem Kundenkonto sind noch keine Teilnehmer*innen-Profile gespeichert."
#: pretix/presale/templates/pretixpresale/organizers/customer_registration.html:7
msgid "Registration"
@@ -38584,7 +38584,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"
@@ -39162,7 +39162,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"
@@ -39439,7 +39439,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"
+6 -6
View File
@@ -8,16 +8,16 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-02-24 11:50+0000\n"
"PO-Revision-Date: 2025-02-14 21:00+0000\n"
"Last-Translator: deborahfoell <deborah.foell@om.org>\n"
"Language-Team: Greek <https://translate.pretix.eu/projects/pretix/pretix/el/"
">\n"
"PO-Revision-Date: 2026-02-25 23:00+0000\n"
"Last-Translator: David Ibáñez Cerdeira <dibanez@gmail.com>\n"
"Language-Team: Greek <https://translate.pretix.eu/projects/pretix/pretix/el/>"
"\n"
"Language: el\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 5.9.2\n"
"X-Generator: Weblate 5.16\n"
#: pretix/_base_settings.py:87
msgid "English"
@@ -20467,7 +20467,7 @@ msgstr "Ορίστε νέο κωδικό πρόσβασης"
#: pretix/presale/templates/pretixpresale/organizers/customer_password.html:25
#: pretix/presale/templates/pretixpresale/organizers/customer_setpassword.html:25
msgid "Save"
msgstr "Αποθηκεύση"
msgstr "gardar"
#: pretix/control/templates/pretixcontrol/auth/register.html:7
msgid "Create a new account"
+35 -52
View File
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-02-24 11:50+0000\n"
"PO-Revision-Date: 2026-02-21 18:00+0000\n"
"PO-Revision-Date: 2026-03-03 20:00+0000\n"
"Last-Translator: CVZ-es <damien.bremont@casadevelazquez.org>\n"
"Language-Team: Spanish <https://translate.pretix.eu/projects/pretix/pretix/"
"es/>\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.16\n"
"X-Generator: Weblate 5.16.1\n"
#: pretix/_base_settings.py:87
msgid "English"
@@ -17058,28 +17058,20 @@ msgid "You need to specify as many seats as voucher codes."
msgstr "Debe especificar tantas butacas como vales de compra."
#: pretix/control/forms/waitinglist.py:39
#, fuzzy
#| msgid "Please select a valid seat."
msgid "Select a valid choice."
msgstr "Por favor seleccione una butaca válida."
msgstr "Seleccione una opción válida."
#: pretix/control/forms/waitinglist.py:107
#, fuzzy
#| msgid "Active products"
msgid "Only includes active products."
msgstr "Productos activos"
msgstr "Solo incluir productos activos."
#: pretix/control/forms/waitinglist.py:115
#, fuzzy
#| msgid "A voucher with this code already exists."
msgid "A voucher for this waiting list entry was already sent out."
msgstr "Ya existe un vale de compra con este código."
msgstr "Ya se ha enviado un vale para esta entrada en la lista de espera."
#: pretix/control/forms/waitinglist.py:125
#, fuzzy
#| msgid "The selected product has been deactivated."
msgid "The selected product is not active."
msgstr "El producto seleccionado ha sido desactivado."
msgstr "El producto seleccionado no esactivo."
#: pretix/control/logdisplay.py:73 pretix/control/logdisplay.py:83
msgid "The order has been changed:"
@@ -17729,7 +17721,7 @@ msgstr ""
#: pretix/control/logdisplay.py:589
msgid "The voucher has been changed."
msgstr "EL vale de compra ha sido cambiado."
msgstr "El vale de compra ha sido cambiado."
#: pretix/control/logdisplay.py:590
msgid "The voucher has been deleted."
@@ -18643,7 +18635,7 @@ msgstr "Entradas"
#: pretix/control/templates/pretixcontrol/order/index.html:764
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:457
msgid "Taxes"
msgstr "gravámenes"
msgstr "Impuestos"
#: pretix/control/navigation.py:97
msgid "Invoicing"
@@ -18883,6 +18875,10 @@ msgid ""
"in repeatedly. Please check if your browser is set to block cookies, or "
"delete all existing cookies and retry."
msgstr ""
"Parece que el navegador no acepta nuestras cookies y es necesario iniciar "
"sesión repetidamente. Por favor, compruebe si el navegador está configurado "
"para bloquear cookies o elimine todas las cookies existentes y vuelva a "
"intentarlo."
#: pretix/control/templates/pretixcontrol/auth/login.html:35
#: pretix/presale/templates/pretixpresale/fragment_login_status.html:19
@@ -18994,8 +18990,9 @@ msgid ""
"This application has <strong>not</strong> been reviewed by the pretix team. "
"Granting access to your pretix account happens at your own risk."
msgstr ""
"Esta aplicación<strong>no</strong> ha sido revisada por el equipo de pretix. "
"La concesión del acceso a su cuenta pretix se realiza bajo su propio riesgo."
"Esta aplicación <strong>no</strong> ha sido revisada por el equipo de "
"pretix. La concesión del acceso a su cuenta pretix se realiza bajo su propio "
"riesgo."
#: pretix/control/templates/pretixcontrol/auth/oauth_authorization.html:54
msgid "Error:"
@@ -19129,8 +19126,8 @@ msgid ""
"We've detected that you are using <strong>Microsoft Internet Explorer</"
"strong>."
msgstr ""
"Hemos detectado que estás usando <strong> Microsoft Internet Explorer </"
"strong>."
"Hemos detectado que estás usando <strong>Microsoft Internet Explorer</strong>"
"."
#: pretix/control/templates/pretixcontrol/base.html:332
#: pretix/presale/templates/pretixpresale/base.html:54
@@ -19169,7 +19166,7 @@ msgid ""
"people from actually buying tickets."
msgstr ""
"Tu evento contiene <strong>pedidos de modo de prueba</strong> a pesar de que "
"<strong> el modo de prueba se ha deshabilitado</strong>. Deberías eliminar "
"<strong>el modo de prueba se ha deshabilitado</strong>. Deberías eliminar "
"estes pedidos para asegurarte que no se muestren en tus reportes "
"estadísticos y bloquear la compra de entradas a las personas."
@@ -20764,7 +20761,7 @@ msgid ""
"duplicate payment attempts. You should review the cases and consider "
"refunding the overpaid amount to the user."
msgstr ""
"Este evento contiene <strong> pedidos pagados en exceso</strong>, por "
"Este evento contiene <strong>pedidos pagados en exceso</strong>, por "
"ejemplo, debido a que hay intentos de pago duplicados. Debe revisar los "
"casos y considerar la devolución de la cantidad pagada en exceso al usuario."
@@ -20777,7 +20774,7 @@ msgid ""
"This event contains <strong>pending refunds</strong> that you should take "
"care of."
msgstr ""
"Este evento contiene <strong>devoluciones pendientes </strong> sobre las que "
"Este evento contiene <strong>devoluciones pendientes</strong> sobre las que "
"debe prestar atención."
#: pretix/control/templates/pretixcontrol/event/index.html:50
@@ -20815,7 +20812,7 @@ msgid ""
"arrived. You should review the cases and consider either refunding the "
"customer or creating more space."
msgstr ""
"Este evento contiene <strong> pedidos completamente pagados</strong> que no "
"Este evento contiene <strong>pedidos completamente pagados</strong> que no "
"están marcadas como pagados, probablemente porque no se dejo ningún cupo al "
"momento que llegó el pago. Debería revisar estos casos y considerar, "
"devolver el dinero o crear más espacio."
@@ -21479,7 +21476,7 @@ msgid ""
"as examples, you can add more in the \"Settings\" part of your event."
msgstr ""
"pretix soporta un <a href=\"https://pretix.eu/about/en/features/payment\" "
"target=\"_blank\">amplio rango de proveedores de pago </a> permitiéndole "
"target=\"_blank\">amplio rango de proveedores de pago</a> permitiéndole "
"elegir los métodos de pago que mejor se adapten a su flujo de trabajo. Aquí "
"hay sólo dos de ellos a modo de ejemplo, puede añadir más en la parte "
"\"Configuración\" de su evento."
@@ -23891,8 +23888,8 @@ msgid ""
"Do you really want to delete this order? <strong>You really cannot revert "
"this action and we can't either.</strong>"
msgstr ""
"¿Realmente quieres eliminar este pedido? <strong> No puedes revertir esta "
"acción y tampoco nosotros. </strong>"
"¿Realmente quieres eliminar este pedido? <strong>No puedes revertir esta "
"acción y tampoco nosotros.</strong>"
#: pretix/control/templates/pretixcontrol/order/delete.html:25
msgid "Yes, delete order"
@@ -24516,9 +24513,8 @@ msgid ""
msgstr ""
"Hemos recibido la notificación de que <strong>%(amount)s</strong> ha sido "
"devuelto a través de <strong>%(method)s</strong>. Si este reembolso está "
"procesado, el pedido habrá sido pagado con un importe inferior "
"en<strong>%(pending)s</strong>. El total del pedido es <strong>%(total)s</"
"strong>."
"procesado, el pedido habrá sido pagado con un importe inferior en <strong>%"
"(pending)s</strong>. El total del pedido es <strong>%(total)s</strong>."
#: pretix/control/templates/pretixcontrol/order/refund_process.html:30
msgid "Since the order is already canceled, this will not affect its state."
@@ -27262,7 +27258,7 @@ msgid ""
"Using this option will <strong>delete all current quotas</strong> from "
"<strong>all selected dates</strong>."
msgstr ""
"Al utilizar esta opción se <strong> eliminarán todas las cuotas actuales </"
"Al utilizar esta opción se <strong>eliminarán todas las cuotas actuales</"
"strong> de <strong>todas las fechas seleccionadas</strong>."
#: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:277
@@ -27998,7 +27994,7 @@ msgstr "Borrar vale de compra"
msgid ""
"Are you sure you want to delete the voucher <strong>%(voucher)s</strong>?"
msgstr ""
"¿Está seguro de que desea borrar el vale de compra<strong>%(voucher)s</"
"¿Está seguro de que desea borrar el vale de compra <strong>%(voucher)s</"
"strong>?"
#: pretix/control/templates/pretixcontrol/vouchers/delete_bulk.html:4
@@ -28191,10 +28187,8 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/waitinglist/edit.html:4
#: pretix/control/templates/pretixcontrol/waitinglist/edit.html:6
#: pretix/control/templates/pretixcontrol/waitinglist/index.html:273
#, fuzzy
#| msgid "Entry"
msgid "Edit entry"
msgstr "Ingreso"
msgstr "Editar entrada"
#: pretix/control/templates/pretixcontrol/waitinglist/index.html:17
msgid ""
@@ -28256,7 +28250,7 @@ msgid ""
"quota is available) or you can press the big button below this text to send "
"out as many vouchers as currently possible to the persons who waited longest."
msgstr ""
"Ha configurado que los vales de compra se enviarán <strong>no </strong> "
"Ha configurado que los vales de compra se enviarán <strong>no</strong> "
"automáticamente. Puede enviarlos uno por uno en un orden de su elección "
"haciendo clic en los botones junto a una línea de esta tabla (si hay "
"suficiente cuota disponible) o puede presionar el botón grande debajo de "
@@ -30133,15 +30127,7 @@ msgstr ""
"La autenticación de dos factores ahora está desactivada para su cuenta."
#: pretix/control/views/user.py:635
#, fuzzy, python-brace-format
#| msgid ""
#| "Your emergency codes have been newly generated. Remember to store them in "
#| "a safe place in case you lose access to your devices. You will not be "
#| "able to view them again here.\n"
#| "\n"
#| "Your emergency codes:\n"
#| "- \n"
#| "- "
#, python-brace-format
msgid ""
"Your emergency codes have been newly generated. Remember to store them in a "
"safe place in case you lose access to your devices. You will not be able to "
@@ -30155,8 +30141,7 @@ msgstr ""
"verlos aquí.\n"
"\n"
"Sus códigos de emergencias:\n"
"- \n"
"- "
"{tokens}"
#: pretix/control/views/user.py:655
msgid "Your notifications have been disabled."
@@ -30326,10 +30311,8 @@ msgid "The selected entry has been deleted."
msgstr "Se ha borrado la entrada seleccionada."
#: pretix/control/views/waitinglist.py:417
#, fuzzy
#| msgid "The waitinglist entry has been transferred."
msgid "The waitinglist entry has been changed."
msgstr "Las entradas de la lista de espera han sido transferidas."
msgstr "Se ha modificado la entrada de la lista de espera."
#: pretix/helpers/countries.py:134
msgid "Belarus"
@@ -37011,8 +36994,8 @@ msgid ""
"If you're looking to buy a ticket, you need to follow a direct link to an "
"event or organizer profile."
msgstr ""
"SI buscas comprar una entrada, necesitar seguir un enlace directo a un "
"evento o a un perfil de organizador."
"Si busca comprar una entrada, necesita seguir un enlace directo a un evento "
"o a un perfil de organizador."
#: pretix/presale/templates/pretixpresale/index.html:20
#, python-format
+32 -47
View File
@@ -4,16 +4,16 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-02-24 11:50+0000\n"
"PO-Revision-Date: 2026-02-21 18:00+0000\n"
"PO-Revision-Date: 2026-03-03 20: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"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 5.16\n"
"X-Generator: Weblate 5.16.1\n"
#: pretix/_base_settings.py:87
msgid "English"
@@ -13011,7 +13011,9 @@ msgstr "Texte daide du champ email"
#: pretix/base/settings.py:3398
msgid "Allow creating a new team during event creation"
msgstr "Ancienne API de lappareil denregistrement"
msgstr ""
"Autoriser la création d'une nouvelle équipe lors de la création d'un "
"événement"
#: pretix/base/settings.py:3399
msgid ""
@@ -17204,28 +17206,20 @@ msgid "You need to specify as many seats as voucher codes."
msgstr "Vous devez spécifier autant de sièges que de codes promotionnels."
#: pretix/control/forms/waitinglist.py:39
#, fuzzy
#| msgid "Please select a valid seat."
msgid "Select a valid choice."
msgstr "Veuillez sélectionner un siège valide."
msgstr "Sélectionnez une option valide."
#: pretix/control/forms/waitinglist.py:107
#, fuzzy
#| msgid "Active products"
msgid "Only includes active products."
msgstr "Produits actifs"
msgstr "Comprend uniquement les produits actifs."
#: pretix/control/forms/waitinglist.py:115
#, fuzzy
#| msgid "A voucher with this code already exists."
msgid "A voucher for this waiting list entry was already sent out."
msgstr "Un bon de réduction avec ce code existe déjà."
msgstr "Un bon pour cette inscription sur la liste d'attente a déjà été envoyé."
#: pretix/control/forms/waitinglist.py:125
#, fuzzy
#| msgid "The selected product has been deactivated."
msgid "The selected product is not active."
msgstr "Le produit sélectionné a été désacti."
msgstr "Le produit sélectionné n'est pas actif."
#: pretix/control/logdisplay.py:73 pretix/control/logdisplay.py:83
msgid "The order has been changed:"
@@ -19021,6 +19015,10 @@ msgid ""
"in repeatedly. Please check if your browser is set to block cookies, or "
"delete all existing cookies and retry."
msgstr ""
"Il semble que votre navigateur n'accepte pas nos cookies et que vous deviez "
"vous connecter à plusieurs reprises. Veuillez vérifier si votre navigateur "
"est configuré pour bloquer les cookies, ou supprimez tous les cookies "
"existants et réessayez."
#: pretix/control/templates/pretixcontrol/auth/login.html:35
#: pretix/presale/templates/pretixpresale/fragment_login_status.html:19
@@ -19108,8 +19106,8 @@ msgid ""
"Do you really want to grant the application <strong>%(application)s</strong> "
"access to your pretix account?"
msgstr ""
"Voulez-vous vraiment accorder à l'application <strong>1%(application)s2</"
"strong>3 un accès à votre compte pretix ?"
"Voulez-vous vraiment accorder à l'application <strong>%(application)s</"
"strong> un accès à votre compte pretix ?"
#: pretix/control/templates/pretixcontrol/auth/oauth_authorization.html:24
#, python-format
@@ -19132,8 +19130,8 @@ msgid ""
"This application has <strong>not</strong> been reviewed by the pretix team. "
"Granting access to your pretix account happens at your own risk."
msgstr ""
"Cette application n'a <strong>1pas</strong>2 été véifiée par l'équipe "
"pretix. L'accès à votre compte Pretix se fait à vos propres risques."
"Cette application n'a <strong>pas</strong> été véifiée par l'équipe pretix. "
"L'accès à votre compte Pretix se fait à vos propres risques."
#: pretix/control/templates/pretixcontrol/auth/oauth_authorization.html:54
msgid "Error:"
@@ -19536,7 +19534,7 @@ msgstr[0] ""
"Êtes-vous sûr de vouloir supprimer l'enregistrement <strong>d'un billet</"
"strong>?"
msgstr[1] ""
"Êtes-vous sûr de vouloir supprimer l'enregistrement <strong>%(count)s "
"Êtes-vous sûr de vouloir supprimer l'enregistrement <strong>%(count)s "
"billets</strong>?"
#: pretix/control/templates/pretixcontrol/checkin/bulk_revert_confirm.html:24
@@ -21634,7 +21632,7 @@ msgid ""
"as examples, you can add more in the \"Settings\" part of your event."
msgstr ""
"pretix supporte une <a href=\"https://pretix.eu/about/en/features/payment\" "
"target=\"_blank\">large gamme de fournisseurs de paiement </a> vous "
"target=\"_blank\">large gamme de fournisseurs de paiement</a> vous "
"permettant de choisir les méthodes de paiement qui conviennent le mieux à "
"votre flux de travail. En voici deux à titre d'exemple, vous pouvez en "
"ajouter dans la partie \"Paramètres\" de votre événement."
@@ -23578,8 +23576,8 @@ msgid ""
msgstr ""
"Veuillez sélectionner les produits ou les variantes de produits auxquels ce "
"quota doit s'appliquer. Si vous appliquez deux quotas à un même produit, il "
"ne sera seulement disponible si les quotas <strong>1 et </strong>2 ont "
"encore de la place."
"ne sera seulement disponible si les quotas <strong>et</strong> ont encore de "
"la place."
#: pretix/control/templates/pretixcontrol/items/quota_edit.html:41
msgid "Advanced options"
@@ -23638,8 +23636,8 @@ msgid ""
"Are you sure you want to disable the application <strong>%(application)s</"
"strong> permanently?"
msgstr ""
"Êtes-vous sûr de vouloir désactiver l'application <strong>1%(application)s2</"
"strong>3 en permanence ?"
"Êtes-vous sûr de vouloir désactiver l'application <strong>%(application)s</"
"strong> de manière permanente ?"
#: pretix/control/templates/pretixcontrol/oauth/app_list.html:4
#: pretix/control/templates/pretixcontrol/oauth/app_list.html:6
@@ -27465,8 +27463,8 @@ msgid ""
"Using this option will <strong>delete all current quotas</strong> from "
"<strong>all selected dates</strong>."
msgstr ""
"Cette option permet de <strong> supprimer tous les quotas actuels</strong> "
"de <strong>toutes les dates sélectionnées</strong>."
"Cette option permet de <strong>supprimer tous les quotas actuels</strong> de "
"<strong>toutes les dates sélectionnées</strong>."
#: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:277
msgid ""
@@ -28399,10 +28397,8 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/waitinglist/edit.html:4
#: pretix/control/templates/pretixcontrol/waitinglist/edit.html:6
#: pretix/control/templates/pretixcontrol/waitinglist/index.html:273
#, fuzzy
#| msgid "Entry"
msgid "Edit entry"
msgstr "Entrée"
msgstr "Modifier l'entrée"
#: pretix/control/templates/pretixcontrol/waitinglist/index.html:17
msgid ""
@@ -28464,7 +28460,7 @@ msgid ""
"quota is available) or you can press the big button below this text to send "
"out as many vouchers as currently possible to the persons who waited longest."
msgstr ""
"Vous avez configuré que les bons <strong>1not</strong>2 seront envoyés "
"Vous avez configuré que les bons <strong>ne</strong> seront envoyés "
"automatiquement. Vous pouvez soit les envoyer un par un dans l'ordre de "
"votre choix en cliquant sur les boutons à côté d'une ligne dans ce tableau "
"(si un quota suffisant est disponible), soit vous pouvez appuyer sur le gros "
@@ -30368,15 +30364,7 @@ msgstr ""
"compte."
#: pretix/control/views/user.py:635
#, fuzzy, python-brace-format
#| msgid ""
#| "Your emergency codes have been newly generated. Remember to store them in "
#| "a safe place in case you lose access to your devices. You will not be "
#| "able to view them again here.\n"
#| "\n"
#| "Your emergency codes:\n"
#| "- \n"
#| "- "
#, python-brace-format
msgid ""
"Your emergency codes have been newly generated. Remember to store them in a "
"safe place in case you lose access to your devices. You will not be able to "
@@ -30390,8 +30378,7 @@ msgstr ""
"appareils. Vous ne pourrez plus les consulter ici.\n"
"\n"
"Vos codes d'urgence :\n"
"-\n"
"- "
"{tokens}"
#: pretix/control/views/user.py:655
msgid "Your notifications have been disabled."
@@ -30558,10 +30545,8 @@ msgid "The selected entry has been deleted."
msgstr "L'entrée sélectionnée a été supprimée."
#: pretix/control/views/waitinglist.py:417
#, fuzzy
#| msgid "The waitinglist entry has been transferred."
msgid "The waitinglist entry has been changed."
msgstr "Lentrée de la liste dattente a été transférée."
msgstr "L'entrée dans la liste d'attente a été modifiée."
#: pretix/helpers/countries.py:134
msgid "Belarus"
File diff suppressed because it is too large Load Diff
+7 -7
View File
@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-01-26 09:10+0000\n"
"PO-Revision-Date: 2025-12-03 23:00+0000\n"
"Last-Translator: sandra r <sandrarial@gestiontickets.online>\n"
"PO-Revision-Date: 2026-03-02 21:00+0000\n"
"Last-Translator: Sandra Rial Pérez <sandrarial@gestiontickets.online>\n"
"Language-Team: Galician <https://translate.pretix.eu/projects/pretix/pretix-"
"js/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.14.3\n"
"X-Generator: Weblate 5.16.1\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
@@ -162,12 +162,12 @@ msgstr "Pedidos pagados"
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:27
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:39
msgid "Attendees (ordered)"
msgstr ""
msgstr "Asistentes (ordenados)"
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:27
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:39
msgid "Attendees (paid)"
msgstr ""
msgstr "Asistentes (de pago)"
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:51
msgid "Total revenue"
@@ -732,8 +732,8 @@ msgid ""
"The items in your cart are no longer reserved for you. You can still "
"complete your order as long as theyre available."
msgstr ""
"Os artigos da túa cesta xa non están reservados para ti. Aínda podes "
"completar o teu pedido mentres estean dispoñibles."
"Os artigos do teu carro xa non están reservados para ti. Podes completar o "
"teu pedido sempre que estean dispoñibles."
#: pretix/static/pretixpresale/js/ui/cart.js:49
msgid "Cart expired"
+21 -39
View File
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-02-24 11:50+0000\n"
"PO-Revision-Date: 2026-02-24 11:49+0000\n"
"PO-Revision-Date: 2026-03-09 12:52+0000\n"
"Last-Translator: Hijiri Umemoto <hijiri@umemoto.org>\n"
"Language-Team: Japanese <https://translate.pretix.eu/projects/pretix/pretix/"
"ja/>\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 5.16\n"
"X-Generator: Weblate 5.16.2\n"
#: pretix/_base_settings.py:87
msgid "English"
@@ -6997,22 +6997,22 @@ msgstr "2006/112/EC号指令の第309条に基づいて免除"
#: pretix/base/models/tax.py:253
msgctxt "tax_code"
msgid "Intra-Community acquisition from second hand means of transport"
msgstr "中古輸送手段のEU域内取得"
msgstr "中古輸送手段の域内取得"
#: pretix/base/models/tax.py:255
msgctxt "tax_code"
msgid "Intra-Community acquisition of second hand goods"
msgstr "中古品のEU域内取得"
msgstr "中古品の域内取得"
#: pretix/base/models/tax.py:257
msgctxt "tax_code"
msgid "Intra-Community acquisition of works of art"
msgstr "芸術作品のEU域内取得"
msgstr "芸術作品の域内取得"
#: pretix/base/models/tax.py:259
msgctxt "tax_code"
msgid "Intra-Community acquisition of collectors items and antiques"
msgstr "コレクターアイテムおよび骨董品のEU域内取得"
msgstr "コレクターアイテムおよび骨董品の域内取得"
#: pretix/base/models/tax.py:261
msgctxt "tax_code"
@@ -11448,7 +11448,7 @@ msgstr ""
"{event}のご注文が完了しました。無料製品のみのご注文のため、\n"
"お支払いは不要です。\n"
"\n"
"注文の詳細の変更やステータス確認は、以下のURLから行えます\n"
"注文の詳細の変更やステータス確認は、以下のURLから行えます\n"
"{url}\n"
"\n"
"よろしくお願いいたします。\n"
@@ -11750,7 +11750,7 @@ msgstr ""
"{event}のご注文のお支払いを受け取りました。\n"
"\n"
"残念ながら、受け取った金額は必要な全額よりも少ないです。\n"
"したがって、追加の**{pending_sum}**の支払いが不足しているため、\n"
"したがって、追加の **{pending_sum}** の支払いが不足しているため、\n"
"ご注文は未払いと見なされます。\n"
"\n"
"お支払い情報やご注文の状況は、以下のURLでご確認いただけます。\n"
@@ -16579,28 +16579,20 @@ msgid "You need to specify as many seats as voucher codes."
msgstr "あなたはバウチャーコードの数と同じだけの席を指定する必要があります。"
#: pretix/control/forms/waitinglist.py:39
#, fuzzy
#| msgid "Please select a valid seat."
msgid "Select a valid choice."
msgstr "有効な座席を選択してください。"
msgstr "有効な選択肢を選んでください。"
#: pretix/control/forms/waitinglist.py:107
#, fuzzy
#| msgid "Active products"
msgid "Only includes active products."
msgstr "有効な製品"
msgstr "有効な製品のみを含みます。"
#: pretix/control/forms/waitinglist.py:115
#, fuzzy
#| msgid "A voucher with this code already exists."
msgid "A voucher for this waiting list entry was already sent out."
msgstr "このコードを持つバウチャーはすでに存在しています。"
msgstr "この空席待ちリストの内容を持つバウチャーはすでに発送済みです。"
#: pretix/control/forms/waitinglist.py:125
#, fuzzy
#| msgid "The selected product has been deactivated."
msgid "The selected product is not active."
msgstr "選択された製品無効化されました。"
msgstr "選択された製品無効です。"
#: pretix/control/logdisplay.py:73 pretix/control/logdisplay.py:83
msgid "The order has been changed:"
@@ -18348,6 +18340,9 @@ msgid ""
"in repeatedly. Please check if your browser is set to block cookies, or "
"delete all existing cookies and retry."
msgstr ""
"お使いのブラウザが私どものクッキーを受け入れていないようですので、繰り返し"
"ログインする必要があります。ブラウザがクッキーをブロックする設定になっている"
"か、既存のクッキーをすべて削除して再試行してください。"
#: pretix/control/templates/pretixcontrol/auth/login.html:35
#: pretix/presale/templates/pretixpresale/fragment_login_status.html:19
@@ -18433,7 +18428,7 @@ msgid ""
"Do you really want to grant the application <strong>%(application)s</strong> "
"access to your pretix account?"
msgstr ""
"本当にアプリケーション<strong>%(application)s</strong>にPretixアカウントへの"
"本当にアプリケーション<strong>%(application)s</strong>にpretixアカウントへの"
"アクセスを許可しますか?"
#: pretix/control/templates/pretixcontrol/auth/oauth_authorization.html:24
@@ -24697,7 +24692,7 @@ msgstr "顧客履歴"
#: pretix/control/templates/pretixcontrol/organizers/customer_anonymize.html:11
#, python-format
msgid "Anonymize customer #%(id)s"
msgstr "顧客のID #%(id)s を匿名化"
msgstr "顧客 #%(id)s を匿名化"
#: pretix/control/templates/pretixcontrol/organizers/customer_anonymize.html:16
msgid "Are you sure you want to anonymize this customer account?"
@@ -27400,10 +27395,8 @@ msgstr "次のエントリはすでにバウチャーが添付されているた
#: pretix/control/templates/pretixcontrol/waitinglist/edit.html:4
#: pretix/control/templates/pretixcontrol/waitinglist/edit.html:6
#: pretix/control/templates/pretixcontrol/waitinglist/index.html:273
#, fuzzy
#| msgid "Entry"
msgid "Edit entry"
msgstr "入場"
msgstr "エントリーを編集する"
#: pretix/control/templates/pretixcontrol/waitinglist/index.html:17
msgid ""
@@ -29283,15 +29276,7 @@ msgid "Two-factor authentication is now disabled for your account."
msgstr "アカウントの二要素認証が無効になりました。"
#: pretix/control/views/user.py:635
#, fuzzy, python-brace-format
#| msgid ""
#| "Your emergency codes have been newly generated. Remember to store them in "
#| "a safe place in case you lose access to your devices. You will not be "
#| "able to view them again here.\n"
#| "\n"
#| "Your emergency codes:\n"
#| "- \n"
#| "- "
#, python-brace-format
msgid ""
"Your emergency codes have been newly generated. Remember to store them in a "
"safe place in case you lose access to your devices. You will not be able to "
@@ -29305,8 +29290,7 @@ msgstr ""
"ことはできません。\n"
"\n"
"あなたの緊急コード:\n"
"-\n"
"- "
"{tokens}"
#: pretix/control/views/user.py:655
msgid "Your notifications have been disabled."
@@ -29471,10 +29455,8 @@ msgid "The selected entry has been deleted."
msgstr "選択されたエントリは削除されました。"
#: pretix/control/views/waitinglist.py:417
#, fuzzy
#| msgid "The waitinglist entry has been transferred."
msgid "The waitinglist entry has been changed."
msgstr "空席待ちリスト登録が転送されました。"
msgstr "空席待ちリスト登録が変更されました。"
#: pretix/helpers/countries.py:134
msgid "Belarus"
+22 -40
View File
@@ -7,16 +7,16 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-02-24 11:50+0000\n"
"PO-Revision-Date: 2026-02-21 03:00+0000\n"
"PO-Revision-Date: 2026-03-03 20:00+0000\n"
"Last-Translator: Ruud Hendrickx <ruud@leckxicon.eu>\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 5.16\n"
"X-Generator: Weblate 5.16.1\n"
#: pretix/_base_settings.py:87
msgid "English"
@@ -7996,7 +7996,7 @@ msgstr "Deze cadeaubon is in de tussentijd gebruikt. Probeer het opnieuw."
#: pretix/base/pdf.py:98
msgid "Ticket code (barcode content)"
msgstr "Ticketcode (waarde van QR-code)"
msgstr "Ticketcode (inhoud van QR-code)"
#: pretix/base/pdf.py:110
msgid "Order position number"
@@ -9664,7 +9664,7 @@ msgstr "Het bedrag is van uw kaart afgeschreven."
#: pretix/base/services/placeholders.py:699
msgid "Please transfer money to this bank account: 9999-9999-9999-9999"
msgstr "Maak het geld over naar deze bankrekening: NL13 TEST 0123 4567 89"
msgstr "Maak het geld over naar deze bankrekening: 9999-9999-9999-9999"
#: pretix/base/services/placeholders.py:799
#: pretix/control/views/organizer.py:349
@@ -11081,8 +11081,8 @@ msgid ""
"If turned off, ticket downloads are only possible after an order has been "
"marked as paid."
msgstr ""
"Als deze optie is uitgeschakeld, kunnen tickets alleen worden gedownload "
"nadat een bestelling als betaald is gemarkeerd."
"Indien uitgeschakeld, kunnen tickets alleen gedownload worden als de "
"bestelling als betaald gemarkeerd is."
#: pretix/base/settings.py:1763
msgid "Do not issue ticket before email address is validated"
@@ -13801,12 +13801,12 @@ msgstr "Altijd"
#: pretix/base/timeline.py:60
msgctxt "timeline"
msgid "Your event starts"
msgstr "Uw evenement start"
msgstr "Start van uw evenement"
#: pretix/base/timeline.py:68
msgctxt "timeline"
msgid "Your event ends"
msgstr "Uw evenement eindigt"
msgstr "Einde van uw evenement"
#: pretix/base/timeline.py:76
msgctxt "timeline"
@@ -17002,28 +17002,20 @@ msgid "You need to specify as many seats as voucher codes."
msgstr "U moet evenveel stoelnummers als vouchercodes opgeven."
#: pretix/control/forms/waitinglist.py:39
#, fuzzy
#| msgid "Please select a valid seat."
msgid "Select a valid choice."
msgstr "Kies een geldige beschikbare stoel."
msgstr "Maak een geldige keuze."
#: pretix/control/forms/waitinglist.py:107
#, fuzzy
#| msgid "Active products"
msgid "Only includes active products."
msgstr "Actieve producten"
msgstr "Bevat alleen actieve producten."
#: pretix/control/forms/waitinglist.py:115
#, fuzzy
#| msgid "A voucher with this code already exists."
msgid "A voucher for this waiting list entry was already sent out."
msgstr "Er bestaat al een voucher met deze code."
msgstr "Er is al een voucher verzonden naar deze inschrijver op de wachtlijst."
#: pretix/control/forms/waitinglist.py:125
#, fuzzy
#| msgid "The selected product has been deactivated."
msgid "The selected product is not active."
msgstr "Het gekozen product is uitgeschakeld."
msgstr "Het gekozen product is niet actief."
#: pretix/control/logdisplay.py:73 pretix/control/logdisplay.py:83
msgid "The order has been changed:"
@@ -18811,6 +18803,9 @@ msgid ""
"in repeatedly. Please check if your browser is set to block cookies, or "
"delete all existing cookies and retry."
msgstr ""
"Uw browser lijkt ons cookie niet te accepteren, waardoor u telkens opnieuw "
"moet inloggen. Controleer of uw browser cookies blokkeert of verwijder alle "
"opgeslagen cookies en probeer het opnieuw."
#: pretix/control/templates/pretixcontrol/auth/login.html:35
#: pretix/presale/templates/pretixpresale/fragment_login_status.html:19
@@ -22359,7 +22354,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/item/base.html:24
#: pretix/control/templates/pretixcontrol/item/include_variations.html:79
msgid "Manage quotas"
msgstr "Vragen quotums"
msgstr "Quota beheren"
#: pretix/control/templates/pretixcontrol/item/base.html:27
#: pretix/control/templates/pretixcontrol/item/include_variations.html:82
@@ -28077,10 +28072,8 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/waitinglist/edit.html:4
#: pretix/control/templates/pretixcontrol/waitinglist/edit.html:6
#: pretix/control/templates/pretixcontrol/waitinglist/index.html:273
#, fuzzy
#| msgid "Entry"
msgid "Edit entry"
msgstr "Binnenkomst"
msgstr "Inschrijving bewerken"
#: pretix/control/templates/pretixcontrol/waitinglist/index.html:17
msgid ""
@@ -30020,15 +30013,7 @@ msgid "Two-factor authentication is now disabled for your account."
msgstr "Twee-factor-authenticatie is nu uitgeschakeld voor uw account."
#: pretix/control/views/user.py:635
#, fuzzy, python-brace-format
#| msgid ""
#| "Your emergency codes have been newly generated. Remember to store them in "
#| "a safe place in case you lose access to your devices. You will not be "
#| "able to view them again here.\n"
#| "\n"
#| "Your emergency codes:\n"
#| "- \n"
#| "- "
#, python-brace-format
msgid ""
"Your emergency codes have been newly generated. Remember to store them in a "
"safe place in case you lose access to your devices. You will not be able to "
@@ -30042,8 +30027,7 @@ msgstr ""
"U kunt ze hier niet meer opnieuw laten tonen.\n"
"\n"
"Uw noodcodes: \n"
"-\n"
"- "
"{tokens}"
#: pretix/control/views/user.py:655
msgid "Your notifications have been disabled."
@@ -30210,10 +30194,8 @@ msgid "The selected entry has been deleted."
msgstr "De gekozen inschrijving is verwijderd."
#: pretix/control/views/waitinglist.py:417
#, fuzzy
#| msgid "The waitinglist entry has been transferred."
msgid "The waitinglist entry has been changed."
msgstr "De wachtlijstinschrijving is overgedragen."
msgstr "De inschrijving op de wachtlijst is veranderd."
#: pretix/helpers/countries.py:134
msgid "Belarus"
File diff suppressed because it is too large Load Diff
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-02-24 11:50+0000\n"
"PO-Revision-Date: 2026-02-21 03:00+0000\n"
"PO-Revision-Date: 2026-03-02 10:00+0000\n"
"Last-Translator: Ruud Hendrickx <ruud@leckxicon.eu>\n"
"Language-Team: Dutch (informal) <https://translate.pretix.eu/projects/pretix/"
"pretix/nl_Informal/>\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\n"
"X-Generator: Weblate 5.16.1\n"
#: pretix/_base_settings.py:87
msgid "English"
@@ -9673,7 +9673,7 @@ msgstr "Het bedrag is van je kaart afgeschreven."
#: pretix/base/services/placeholders.py:699
msgid "Please transfer money to this bank account: 9999-9999-9999-9999"
msgstr "Maak het geld over naar deze bankrekening: NL13 TEST 0123 4567 89"
msgstr "Maak het geld over naar deze bankrekening: 9999-9999-9999-9999"
#: pretix/base/services/placeholders.py:799
#: pretix/control/views/organizer.py:349
@@ -17032,28 +17032,20 @@ msgid "You need to specify as many seats as voucher codes."
msgstr "Je moet evenveel stoelnummers als vouchercodes opgeven."
#: pretix/control/forms/waitinglist.py:39
#, fuzzy
#| msgid "Please select a valid seat."
msgid "Select a valid choice."
msgstr "Kies een geldige beschikbare stoel."
msgstr "Maak een geldige keuze."
#: pretix/control/forms/waitinglist.py:107
#, fuzzy
#| msgid "Active products"
msgid "Only includes active products."
msgstr "Actieve producten"
msgstr "Bevat alleen actieve producten."
#: pretix/control/forms/waitinglist.py:115
#, fuzzy
#| msgid "A voucher with this code already exists."
msgid "A voucher for this waiting list entry was already sent out."
msgstr "Er bestaat al een voucher met deze code."
msgstr "Er is al een voucher verzonden naar deze inschrijver op de wachtlijst."
#: pretix/control/forms/waitinglist.py:125
#, fuzzy
#| msgid "The selected product has been deactivated."
msgid "The selected product is not active."
msgstr "Het gekozen product is uitgeschakeld."
msgstr "Het gekozen product is niet actief."
#: pretix/control/logdisplay.py:73 pretix/control/logdisplay.py:83
msgid "The order has been changed:"
@@ -18844,6 +18836,9 @@ msgid ""
"in repeatedly. Please check if your browser is set to block cookies, or "
"delete all existing cookies and retry."
msgstr ""
"Je browser lijkt ons cookie niet te accepteren, waardoor je telkens opnieuw "
"moet inloggen. Controleer of je browser cookies blokkeert of verwijder alle "
"opgeslagen cookies en probeer het opnieuw."
#: pretix/control/templates/pretixcontrol/auth/login.html:35
#: pretix/presale/templates/pretixpresale/fragment_login_status.html:19
@@ -28141,10 +28136,8 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/waitinglist/edit.html:4
#: pretix/control/templates/pretixcontrol/waitinglist/edit.html:6
#: pretix/control/templates/pretixcontrol/waitinglist/index.html:273
#, fuzzy
#| msgid "Entry"
msgid "Edit entry"
msgstr "Binnenkomst"
msgstr "Inschrijving bewerken"
#: pretix/control/templates/pretixcontrol/waitinglist/index.html:17
msgid ""
@@ -30080,15 +30073,7 @@ msgid "Two-factor authentication is now disabled for your account."
msgstr "Twee-factor-authenticatie is nu uitgeschakeld voor je account."
#: pretix/control/views/user.py:635
#, fuzzy, python-brace-format
#| msgid ""
#| "Your emergency codes have been newly generated. Remember to store them in "
#| "a safe place in case you lose access to your devices. You will not be "
#| "able to view them again here.\n"
#| "\n"
#| "Your emergency codes:\n"
#| "- \n"
#| "- "
#, python-brace-format
msgid ""
"Your emergency codes have been newly generated. Remember to store them in a "
"safe place in case you lose access to your devices. You will not be able to "
@@ -30102,8 +30087,7 @@ msgstr ""
"Je kunt ze hier niet meer opnieuw laten tonen.\n"
"\n"
"Je noodcodes:\n"
"-\n"
"- "
"{tokens}"
#: pretix/control/views/user.py:655
msgid "Your notifications have been disabled."
@@ -30270,10 +30254,8 @@ msgid "The selected entry has been deleted."
msgstr "De gekozen inschrijving is verwijderd."
#: pretix/control/views/waitinglist.py:417
#, fuzzy
#| msgid "The waitinglist entry has been transferred."
msgid "The waitinglist entry has been changed."
msgstr "De wachtlijstvermelding is overgedragen."
msgstr "De inschrijving op de wachtlijst is veranderd."
#: pretix/helpers/countries.py:134
msgid "Belarus"
@@ -34075,7 +34057,7 @@ msgid ""
"completed your payment, you can refresh this page."
msgstr ""
"Scan de QR-code hieronder om je WeChat-betaling uit te voeren. Als je de "
"betaling hebt afgerond kan je deze pagina verversen."
"betaling hebt afgerond, kan je deze pagina verversen."
#: pretix/plugins/stripe/templates/pretixplugins/stripe/pending.html:62
msgid ""
@@ -35249,7 +35231,7 @@ msgstr "incl. belasting"
#: pretix/presale/templates/pretixpresale/event/voucher.html:359
#, python-format
msgid "<strong>plus</strong> %(rate)s%% %(name)s"
msgstr "<strong>excl.</strong> %(rate)s%% %(name)s"
msgstr "<strong>plus</strong> %(rate)s%% %(name)s"
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:180
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:320
File diff suppressed because it is too large Load Diff
+23 -17
View File
@@ -802,31 +802,37 @@ class PaypalMethod(BasePaymentProvider):
all_captures_completed = False
else:
any_captures = True
if not (any_captures and all_captures_completed):
# Payment has at least one capture, but it is not yet completed
if any_captures and not all_captures_completed:
messages.warning(request, _('PayPal has not yet approved the payment. We will inform you as '
'soon as the payment completed.'))
payment.info = json.dumps(pp_captured_order.dict())
payment.state = OrderPayment.PAYMENT_STATE_PENDING
payment.save()
return
# Payment has at least one capture and all captures are completed
elif any_captures and all_captures_completed:
if pp_captured_order.status != 'COMPLETED':
payment.fail(info=pp_captured_order.dict())
logger.error('Invalid state: %s' % repr(pp_captured_order.dict()))
raise PaymentException(
_('We were unable to process your payment. See below for details on how to proceed.')
)
if pp_captured_order.status != 'COMPLETED':
payment.fail(info=pp_captured_order.dict())
logger.error('Invalid state: %s' % repr(pp_captured_order.dict()))
raise PaymentException(
_('We were unable to process your payment. See below for details on how to proceed.')
)
if payment.state == OrderPayment.PAYMENT_STATE_CONFIRMED:
logger.warning('PayPal success event even though order is already marked as paid')
return
if payment.state == OrderPayment.PAYMENT_STATE_CONFIRMED:
logger.warning('PayPal success event even though order is already marked as paid')
try:
payment.info = json.dumps(pp_captured_order.dict())
payment.save(update_fields=['info'])
payment.confirm()
except Quota.QuotaExceededException as e:
raise PaymentException(str(e))
# Payment has not any captures yet - so it's probably in created status
else:
return
try:
payment.info = json.dumps(pp_captured_order.dict())
payment.save(update_fields=['info'])
payment.confirm()
except Quota.QuotaExceededException as e:
raise PaymentException(str(e))
finally:
if 'payment_paypal_oid' in request.session:
del request.session['payment_paypal_oid']
@@ -836,7 +842,7 @@ class PaypalMethod(BasePaymentProvider):
try:
if (
payment.info
and payment.info_data['purchase_units'][0]['payments']['captures'][0]['status'] == 'pending'
and payment.info_data['purchase_units'][0]['payments']['captures'][0]['status'] == 'PENDING'
):
retry = False
except (KeyError, IndexError):
@@ -6,6 +6,7 @@
{% load eventurl %}
{% load safelink %}
{% load rich_text %}
{% load anonymize_email %}
{% block thetitle %}
{% if messages %}
{{ messages|join:" " }} ::
@@ -219,7 +220,7 @@
{% endblock %}
{% block footernav %}
{% if request.event.settings.contact_mail %}
<li><a href="mailto:{{ request.event.settings.contact_mail }}" target="_blank" rel="noopener">{% trans "Contact" %}</a></li>
<li><a href="{{ 'mailto:'|add:request.event.settings.contact_mail|anon_email }}" target="_blank" rel="noopener">{% trans "Contact" %}</a></li>
{% endif %}
{% if request.event.settings.privacy_url %}
<li><a href="{% safelink request.event.settings.privacy_url %}" target="_blank" rel="noopener">{% trans "Privacy policy" %}</a></li>
@@ -21,4 +21,5 @@
<script type="text/javascript" src="{% static "pretixpresale/js/ui/cart.js" %}"></script>
<script type="text/javascript" src="{% static "pretixpresale/js/ui/iframe.js" %}"></script>
<script type="text/javascript" src="{% static "pretixbase/js/addressform.js" %}"></script>
<script type="text/javascript" src="{% static "pretixbase/js/deanonymize_email.js" %}"></script>
{% endcompress %}
@@ -5,6 +5,7 @@
{% load thumb %}
{% load eventurl %}
{% load safelink %}
{% load anonymize_email %}
{% block thetitle %}
{% block title %}{% endblock %}{% if url_name != "organizer.index" %} :: {% endif %}{{ organizer.name }}
{% endblock %}
@@ -97,7 +98,7 @@
{% endblock %}
{% block footernav %}
{% if not request.event and request.organizer.settings.contact_mail %}
<li><a href="mailto:{{ request.organizer.settings.contact_mail }}" target="_blank" rel="noopener">{% trans "Contact" %}</a></li>
<li><a href="{{ 'mailto:'|add:request.organizer.settings.contact_mail|anon_email }}" target="_blank" rel="noopener">{% trans "Contact" %}</a></li>
{% endif %}
{% if not request.event and request.organizer.settings.privacy_url %}
<li><a href="{% safelink request.organizer.settings.privacy_url %}" target="_blank" rel="noopener">{% trans "Privacy policy" %}</a></li>
+6 -6
View File
@@ -2776,9 +2776,9 @@
}
},
"node_modules/minimatch": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
"integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
"optional": true,
"dependencies": {
"brace-expansion": "^1.1.7"
@@ -5642,9 +5642,9 @@
"optional": true
},
"minimatch": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
"integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
"optional": true,
"requires": {
"brace-expansion": "^1.1.7"
@@ -0,0 +1,7 @@
document.addEventListener('DOMContentLoaded', function() {
document.querySelectorAll('a[href^="mailto:"]').forEach(function(link) {
// Replace [at] with @ and the [dot] with . in both the href and the displayed text (if needed)
link.href = link.href.replace('[at]', '@').replace('[dot]', '.');
link.textContent = link.textContent.replace('[at]', '@').replace('[dot]', '.');
});
});
+35
View File
@@ -895,6 +895,41 @@ def test_order_create_payment_info_optional(token_client, organizer, event, item
assert json.loads(p.info) == res['payment_info']
@pytest.mark.django_db
def test_order_create_payment_info_valid_object(token_client, organizer, event, item, quota, question):
res = copy.deepcopy(ORDER_CREATE_PAYLOAD)
res['positions'][0]['item'] = item.pk
res['positions'][0]['answers'][0]['question'] = question.pk
res["payment_info"] = [{"should": "fail"}]
resp = token_client.post(
'/api/v1/organizers/{}/events/{}/orders/'.format(
organizer.slug, event.slug
), format='json', data=res
)
assert resp.status_code == 400
res['payment_info'] = {
'foo': {
'bar': [1, 2],
'test': False
}
}
resp = token_client.post(
'/api/v1/organizers/{}/events/{}/orders/'.format(
organizer.slug, event.slug
), format='json', data=res
)
assert resp.status_code == 201
with scopes_disabled():
o = Order.objects.get(code=resp.data['code'])
p = o.payments.first()
assert p.provider == "banktransfer"
assert p.amount == o.total
assert json.loads(p.info) == res['payment_info']
@pytest.mark.django_db
def test_order_create_position_secret_optional(token_client, organizer, event, item, quota, question):
res = copy.deepcopy(ORDER_CREATE_PAYLOAD)
+129 -67
View File
@@ -34,7 +34,7 @@ from stripe import error
from tests.plugins.stripe.test_checkout import apple_domain_create
from tests.plugins.stripe.test_provider import MockedCharge
from pretix.base.models import InvoiceAddress, Order, OrderPosition
from pretix.base.models import InvoiceAddress, Order, OrderPosition, Team
from pretix.base.models.orders import OrderFee, OrderPayment, OrderRefund
@@ -180,6 +180,41 @@ def order2(event2, item2):
return o
@pytest.fixture
@scopes_disabled()
def team2(organizer, event2):
team2 = Team.objects.create(
organizer=organizer,
name="Test-Team 2",
can_change_teams=True,
can_manage_gift_cards=True,
can_change_items=True,
can_create_events=True,
can_change_event_settings=True,
can_change_vouchers=True,
can_view_vouchers=True,
can_change_orders=True,
can_manage_customers=True,
can_manage_reusable_media=True,
can_change_organizer_settings=True,
)
team2.limit_events.add(event2)
team2.save()
return team2
@pytest.fixture
@scopes_disabled()
def limited_token_client(client, team2):
team2.can_view_orders = True
team2.can_view_vouchers = True
team2.save()
t = team2.tokens.create(name='Foo')
client.credentials(HTTP_AUTHORIZATION='Token ' + t.token)
return client
TEST_ORDERPOSITION_RES = {
"id": 1,
"order": "FOO",
@@ -987,8 +1022,64 @@ def test_refund_cancel(token_client, organizer, event, order):
assert resp.status_code == 400
@pytest.mark.parametrize(
"endpoint_template, response_code",
[('/api/v1/organizers/{}/events/{}/orderpositions/', 403), ('/api/v1/organizers/{}/orderpositions/', 200)]
)
@pytest.mark.django_db
def test_orderposition_list(token_client, organizer, device, event, order, item, subevent, subevent2, question, django_assert_num_queries):
def test_orderposition_list_limited_read(
endpoint_template, response_code, limited_token_client, organizer, device, event, order, item, subevent, subevent2, question
):
endpoint = endpoint_template.format(organizer.slug, event.slug)
i2 = copy.copy(item)
i2.pk = None
i2.save()
with scopes_disabled():
var = item.variations.create(value="Children")
res = copy.copy(TEST_ORDERPOSITION_RES)
op = order.positions.first()
op.variation = var
op.save()
res["id"] = op.pk
res["item"] = item.pk
res["variation"] = var.pk
res["answers"][0]["question"] = question.pk
res["print_logs"][0]["id"] = op.print_logs.first().pk
res["print_logs"][0]["device_id"] = device.device_id
resp = limited_token_client.get(endpoint)
assert resp.status_code == response_code
if response_code == 200:
assert resp.json() == {'count': 0, 'next': None, 'previous': None, 'results': []}
else:
assert resp.json() == {'detail': 'You do not have permission to perform this action.'}
@pytest.mark.parametrize(
("endpoint_template", "endpoint_type"),
[
('/api/v1/organizers/{}/events/{}/orderpositions/', "event"),
('/api/v1/organizers/{}/orderpositions/', "organizer")
],
)
@pytest.mark.django_db
def test_orderposition_list(
endpoint_template,
endpoint_type,
token_client,
organizer,
device,
event,
order,
item,
subevent,
subevent2,
question,
django_assert_num_queries
):
endpoint = endpoint_template.format(organizer.slug, event.slug)
i2 = copy.copy(item)
i2.pk = None
i2.save()
@@ -1005,88 +1096,64 @@ def test_orderposition_list(token_client, organizer, device, event, order, item,
res["answers"][0]["question"] = question.pk
res["print_logs"][0]["id"] = op.print_logs.first().pk
res["print_logs"][0]["device_id"] = device.device_id
if endpoint_type == "organizer":
res["event"] = event.slug
resp = token_client.get('/api/v1/organizers/{}/events/{}/orderpositions/'.format(organizer.slug, event.slug))
resp = token_client.get(endpoint)
assert resp.status_code == 200
assert [res] == resp.data['results']
resp = token_client.get(
'/api/v1/organizers/{}/events/{}/orderpositions/?order__status=n'.format(organizer.slug, event.slug))
resp = token_client.get(endpoint + '?order__status=n')
assert [res] == resp.data['results']
resp = token_client.get(
'/api/v1/organizers/{}/events/{}/orderpositions/?order__status=p'.format(organizer.slug, event.slug))
resp = token_client.get(endpoint + '?order__status=p')
assert [] == resp.data['results']
resp = token_client.get(
'/api/v1/organizers/{}/events/{}/orderpositions/?item={}'.format(organizer.slug, event.slug, item.pk))
resp = token_client.get(endpoint + '?item={}'.format(item.pk))
assert [res] == resp.data['results']
resp = token_client.get(
'/api/v1/organizers/{}/events/{}/orderpositions/?item__in={},{}'.format(
organizer.slug, event.slug, item.pk, i2.pk
))
resp = token_client.get(endpoint + '?item__in={},{}'.format(item.pk, i2.pk))
assert [res] == resp.data['results']
resp = token_client.get(
'/api/v1/organizers/{}/events/{}/orderpositions/?item={}'.format(organizer.slug, event.slug, i2.pk))
resp = token_client.get(endpoint + '?item={}'.format(i2.pk))
assert [] == resp.data['results']
resp = token_client.get(
'/api/v1/organizers/{}/events/{}/orderpositions/?variation={}'.format(organizer.slug, event.slug, var.pk))
resp = token_client.get(endpoint + '?variation={}'.format(var.pk))
assert [res] == resp.data['results']
resp = token_client.get(
'/api/v1/organizers/{}/events/{}/orderpositions/?variation={}'.format(organizer.slug, event.slug, var2.pk))
resp = token_client.get(endpoint + '?variation={}'.format(var2.pk))
assert [] == resp.data['results']
resp = token_client.get(
'/api/v1/organizers/{}/events/{}/orderpositions/?attendee_name=Peter'.format(organizer.slug, event.slug))
resp = token_client.get(endpoint + '?attendee_name=Peter')
assert [res] == resp.data['results']
resp = token_client.get(
'/api/v1/organizers/{}/events/{}/orderpositions/?attendee_name=peter'.format(organizer.slug, event.slug))
resp = token_client.get(endpoint + '?attendee_name=peter')
assert [res] == resp.data['results']
resp = token_client.get(
'/api/v1/organizers/{}/events/{}/orderpositions/?attendee_name=Mark'.format(organizer.slug, event.slug))
resp = token_client.get(endpoint + '?attendee_name=Mark')
assert [] == resp.data['results']
resp = token_client.get(
'/api/v1/organizers/{}/events/{}/orderpositions/?secret=z3fsn8jyufm5kpk768q69gkbyr5f4h6w'.format(
organizer.slug, event.slug))
resp = token_client.get(endpoint + '?secret=z3fsn8jyufm5kpk768q69gkbyr5f4h6w')
assert [res] == resp.data['results']
resp = token_client.get(
'/api/v1/organizers/{}/events/{}/orderpositions/?secret=abc123'.format(organizer.slug, event.slug))
resp = token_client.get(endpoint + '?secret=abc123')
assert [] == resp.data['results']
resp = token_client.get(
'/api/v1/organizers/{}/events/{}/orderpositions/?pseudonymization_id=ABCDEFGHKL'.format(
organizer.slug, event.slug))
resp = token_client.get(endpoint + '?pseudonymization_id=ABCDEFGHKL')
assert [res] == resp.data['results']
resp = token_client.get(
'/api/v1/organizers/{}/events/{}/orderpositions/?pseudonymization_id=FOO'.format(organizer.slug, event.slug))
resp = token_client.get(endpoint + '?pseudonymization_id=FOO')
assert [] == resp.data['results']
resp = token_client.get(
'/api/v1/organizers/{}/events/{}/orderpositions/?search=FO'.format(organizer.slug, event.slug))
resp = token_client.get(endpoint + '?search=FO')
assert [res] == resp.data['results']
resp = token_client.get(
'/api/v1/organizers/{}/events/{}/orderpositions/?search=z3fsn8j'.format(organizer.slug, event.slug))
resp = token_client.get(endpoint + '?search=z3fsn8j')
assert [res] == resp.data['results']
resp = token_client.get(
'/api/v1/organizers/{}/events/{}/orderpositions/?search=Peter'.format(organizer.slug, event.slug))
resp = token_client.get(endpoint + '?search=Peter')
assert [res] == resp.data['results']
resp = token_client.get(
'/api/v1/organizers/{}/events/{}/orderpositions/?search=5f4h6w'.format(organizer.slug, event.slug))
resp = token_client.get(endpoint + '?search=5f4h6w')
assert [] == resp.data['results']
resp = token_client.get(
'/api/v1/organizers/{}/events/{}/orderpositions/?order=FOO'.format(organizer.slug, event.slug))
resp = token_client.get(endpoint + '?order=FOO')
assert [res] == resp.data['results']
resp = token_client.get(
'/api/v1/organizers/{}/events/{}/orderpositions/?order=BAR'.format(organizer.slug, event.slug))
resp = token_client.get(endpoint + '?order=BAR')
assert [] == resp.data['results']
resp = token_client.get(
'/api/v1/organizers/{}/events/{}/orderpositions/?has_checkin=false'.format(organizer.slug, event.slug))
resp = token_client.get(endpoint + '?has_checkin=false')
assert [res] == resp.data['results']
resp = token_client.get(
'/api/v1/organizers/{}/events/{}/orderpositions/?has_checkin=true'.format(organizer.slug, event.slug))
resp = token_client.get(endpoint + '?has_checkin=true')
assert [] == resp.data['results']
with scopes_disabled():
@@ -1103,33 +1170,28 @@ def test_orderposition_list(token_client, organizer, device, event, order, item,
'gate': None,
'type': 'entry'
}]
with django_assert_num_queries(16):
resp = token_client.get(
'/api/v1/organizers/{}/events/{}/orderpositions/?has_checkin=true'.format(organizer.slug, event.slug)
)
if '/events/' in endpoint:
with django_assert_num_queries(18):
resp = token_client.get(endpoint + '?has_checkin=true')
else:
with django_assert_num_queries(17):
resp = token_client.get(endpoint + '?has_checkin=true')
assert [res] == resp.data['results']
op.subevent = subevent
op.save()
res['subevent'] = subevent.pk
resp = token_client.get(
'/api/v1/organizers/{}/events/{}/orderpositions/?subevent={}'.format(organizer.slug, event.slug, subevent.pk))
resp = token_client.get(endpoint + '?subevent={}'.format(subevent.pk))
assert [res] == resp.data['results']
resp = token_client.get(
'/api/v1/organizers/{}/events/{}/orderpositions/?subevent__in={},{}'.format(organizer.slug, event.slug,
subevent.pk, subevent2.pk))
resp = token_client.get(endpoint + '?subevent__in={},{}'.format(subevent.pk, subevent2.pk))
assert [res] == resp.data['results']
resp = token_client.get(
'/api/v1/organizers/{}/events/{}/orderpositions/?subevent={}'.format(organizer.slug, event.slug,
subevent.pk + 1))
resp = token_client.get(endpoint + '?subevent={}'.format(subevent.pk + 1))
assert [] == resp.data['results']
resp = token_client.get(
'/api/v1/organizers/{}/events/{}/orderpositions/?include_canceled_positions=false'.format(organizer.slug, event.slug))
resp = token_client.get(endpoint + '?include_canceled_positions=false')
assert len(resp.data['results']) == 1
resp = token_client.get(
'/api/v1/organizers/{}/events/{}/orderpositions/?include_canceled_positions=true'.format(organizer.slug, event.slug))
resp = token_client.get(endpoint + '?include_canceled_positions=true')
assert len(resp.data['results']) == 2
+75 -3
View File
@@ -29,6 +29,8 @@ from pretix.base.models import (
Event, Item, ItemVariation, Organizer, Quota, Team, User, Voucher,
WaitingListEntry,
)
from pretix.base.models.seating import Seat, SeatingPlan
from pretix.base.models.waitinglist import WaitingListException
from pretix.control.views.dashboards import waitinglist_widgets
@@ -55,11 +57,11 @@ def env():
WaitingListEntry.objects.create(
event=event, item=item1, email='success@example.org', voucher=v
)
v = Voucher.objects.create(item=item1, event=event, block_quota=True, redeemed=0, valid_until=now() - timedelta(days=5))
v = Voucher.objects.create(item=item2, event=event, block_quota=True, redeemed=0, valid_until=now() - timedelta(days=5))
WaitingListEntry.objects.create(
event=event, item=item2, email='expired@example.org', voucher=v
)
v = Voucher.objects.create(item=item1, event=event, block_quota=True, redeemed=0, valid_until=now() + timedelta(days=5))
v = Voucher.objects.create(item=item2, event=event, block_quota=True, redeemed=0, valid_until=now() + timedelta(days=5))
WaitingListEntry.objects.create(
event=event, item=item2, email='valid@example.org', voucher=v
)
@@ -345,5 +347,75 @@ def test_dashboard(client, env):
quota.items.add(env['item1'])
w = waitinglist_widgets(env['event'])
assert '1' in w[0]['content']
assert '2' in w[0]['content']
assert '5' in w[1]['content']
@pytest.mark.django_db
def test_waitinglist_seat_calc(client, env):
item = env['item1']
event = env['event']
wle = env['wle']
SeatingPlan.objects.create(
name="Plan", organizer=event.organizer, layout="{}"
)
event.seat_category_mappings.create(
layout_category='Stalls', product=item
)
for i in range(2):
event.seats.create(seat_number=f"A{i}", product=item, seat_guid=f"A{i}")
quota = Quota.objects.create(event=event, size=10)
quota.items.add(item)
client.login(email='dummy@dummy.dummy', password='dummy')
# Calculated availability should not be more than number of available seats
response = client.get('/control/event/dummy/dummy/waitinglist/')
assert len(response.context['entries']) == 5
for entry in response.context['entries']:
assert entry.availability == (Quota.AVAILABILITY_OK, 2)
# Sending out a voucher reduces availability by 1
with scopes_disabled():
wle.send_voucher()
voucher = wle.voucher
assert voucher
response = client.get('/control/event/dummy/dummy/waitinglist/')
assert len(response.context['entries']) == 4
for entry in response.context['entries']:
assert entry.availability == (Quota.AVAILABILITY_OK, 1)
# Assigning a seat to a voucher does not decrease availability further
with scopes_disabled():
voucher.seat = Seat.objects.get(seat_guid="A0")
voucher.save()
response = client.get('/control/event/dummy/dummy/waitinglist/')
assert len(response.context['entries']) == 4
for entry in response.context['entries']:
assert entry.availability == (Quota.AVAILABILITY_OK, 1)
with scopes_disabled():
wle2 = WaitingListEntry.objects.filter(item=item, voucher__isnull=True).first()
wle2.send_voucher()
# Overbooking is handled correctly
# Regression test for calculation that used `not free_seats` instead of `free_seats < 1`
with scopes_disabled():
# Block seat
seat = Seat.objects.get(seat_guid="A1")
seat.blocked = True
seat.save()
response = client.get('/control/event/dummy/dummy/waitinglist/')
assert len(response.context['entries']) == 3
for entry in response.context['entries']:
assert entry.availability == (Quota.AVAILABILITY_GONE, -1)
with scopes_disabled(), pytest.raises(WaitingListException):
wle3 = WaitingListEntry.objects.filter(item=item, voucher__isnull=True).first()
wle3.send_voucher()