Compare commits

...

53 Commits

Author SHA1 Message Date
Mira Weller
12ba49e263 remove stray word 2026-03-06 11:09:18 +01:00
Mira Weller
e37b032d4e Always check voucher validity against real time, not time machine time 2026-03-06 10:56:42 +01:00
Mira Weller
3c3b5529bf Add note about limits of the time machine feature 2026-03-05 13:46:13 +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 Schreiber
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
Ananya
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
35 changed files with 5266 additions and 3138 deletions

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 # 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/>. # <https://www.gnu.org/licenses/>.
# #
__version__ = "2026.2.0" __version__ = "2026.3.0.dev0"

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 # 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/>. # <https://www.gnu.org/licenses/>.
# #
import json
import logging import logging
import os import os
from collections import Counter, defaultdict from collections import Counter, defaultdict
@@ -1215,6 +1216,18 @@ class OrderCreateSerializer(I18nAwareModelSerializer):
raise ValidationError('The given payment provider is not known.') raise ValidationError('The given payment provider is not known.')
return pp 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): def validate_expires(self, expires):
if expires < now(): if expires < now():
raise ValidationError('Expiration date must be in the future.') raise ValidationError('Expiration date must be in the future.')

View File

@@ -365,9 +365,10 @@ class TeamInviteSerializer(serializers.ModelSerializer):
def _send_invite(self, instance): def _send_invite(self, instance):
mail( mail(
instance.email, instance.email,
_('pretix account invitation'), _('Account invitation'),
'pretixcontrol/email/invitation.txt', 'pretixcontrol/email/invitation.txt',
{ {
'instance': settings.PRETIX_INSTANCE_NAME,
'user': self, 'user': self,
'organizer': self.context['organizer'].name, 'organizer': self.context['organizer'].name,
'team': instance.team.name, 'team': instance.team.name,

View File

@@ -216,7 +216,10 @@ class OutboundSyncProvider:
try: try:
mapped_objects = self.sync_order(sq.order) 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", { sq.order.log_action("pretix.event.order.data_sync.success", {
"provider": self.identifier, "provider": self.identifier,
"objects": { "objects": {
@@ -237,7 +240,7 @@ class OutboundSyncProvider:
sq.set_sync_error("exceeded", e.messages, e.full_message) sq.set_sync_error("exceeded", e.messages, e.full_message)
else: else:
logger.info( 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})", f"(transient error, attempt #{sq.failed_attempts}, next {sq.not_before})",
exc_info=True, exc_info=True,
) )

View File

@@ -42,6 +42,8 @@ from django.utils.html import escape
from django.utils.timezone import get_current_timezone, now from django.utils.timezone import get_current_timezone, now
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from pretix.helpers.format import PlainHtmlAlternativeString
def replace_arabic_numbers(inp): def replace_arabic_numbers(inp):
if not isinstance(inp, str): if not isinstance(inp, str):
@@ -61,11 +63,18 @@ def replace_arabic_numbers(inp):
return inp.translate(table) 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): 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 = [(k, v.render_sample(event) if event else v) for k, v in placeholders.items()]
placeholders.sort(key=lambda x: x[0]) placeholders.sort(key=lambda x: x[0])
phs = [ 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 for k, v in placeholders
] ]
return _('Available placeholders: {list}').format( return _('Available placeholders: {list}').format(

View File

@@ -346,7 +346,8 @@ class User(AbstractBaseUser, PermissionsMixin, LoggingMixin):
{ {
'user': self, 'user': self,
'messages': msg, 'messages': msg,
'url': build_absolute_uri('control:user.settings') 'url': build_absolute_uri('control:user.settings'),
'instance': settings.PRETIX_INSTANCE_NAME,
}, },
event=None, event=None,
user=self, user=self,
@@ -391,6 +392,7 @@ class User(AbstractBaseUser, PermissionsMixin, LoggingMixin):
'user': self, 'user': self,
'reason': msg, 'reason': msg,
'code': code, 'code': code,
'instance': settings.PRETIX_INSTANCE_NAME,
}, },
event=None, event=None,
user=self, user=self,
@@ -430,6 +432,7 @@ class User(AbstractBaseUser, PermissionsMixin, LoggingMixin):
mail( mail(
self.email, _('Password recovery'), 'pretixcontrol/email/forgot.txt', self.email, _('Password recovery'), 'pretixcontrol/email/forgot.txt',
{ {
'instance': settings.PRETIX_INSTANCE_NAME,
'user': self, 'user': self,
'url': (build_absolute_uri('control:auth.forgot.recover') 'url': (build_absolute_uri('control:auth.forgot.recover')
+ '?id=%d&token=%s' % (self.id, default_token_generator.make_token(self))) + '?id=%d&token=%s' % (self.id, default_token_generator.make_token(self)))

View File

@@ -86,7 +86,7 @@ class OrderSyncQueue(models.Model):
def set_sync_error(self, failure_mode, messages, full_message): def set_sync_error(self, failure_mode, messages, full_message):
logger.exception( 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}", { self.order.log_action(f"pretix.event.order.data_sync.failed.{failure_mode}", {
"provider": self.sync_provider, "provider": self.sync_provider,

View File

@@ -334,7 +334,8 @@ def _check_position_constraints(
raise CartPositionError(error_messages['voucher_invalid_subevent']) raise CartPositionError(error_messages['voucher_invalid_subevent'])
# Voucher expired # Voucher expired
if voucher and voucher.valid_until and voucher.valid_until < time_machine_now_dt: # (checked using real_now_dt as vouchers influence quota calculations)
if voucher and voucher.valid_until and voucher.valid_until < real_now_dt:
raise CartPositionError(error_messages['voucher_expired']) raise CartPositionError(error_messages['voucher_expired'])
# Subevent has been disabled # Subevent has been disabled

View File

@@ -176,6 +176,7 @@ def shred(self, event: Event, fileid: str, confirm_code: str, user: int=None, lo
_('Data shredding completed'), _('Data shredding completed'),
'pretixbase/email/shred_completed.txt', 'pretixbase/email/shred_completed.txt',
{ {
'instance': settings.PRETIX_INSTANCE_NAME,
'user': user, 'user': user,
'organizer': event.organizer.name, 'organizer': event.organizer.name,
'event': str(event.name), 'event': str(event.name),

View File

@@ -13,5 +13,5 @@ Start time: {{ start_time }} (new data added after this time might not have been
Best regards, Best regards,
Your pretix team Your {{ instance }} team
{% endblocktrans %} {% endblocktrans %}

View File

@@ -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]))

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.'), 'The order requires approval before it can continue to be processed.'),
'pretix.event.order.approved': _('The order has been approved.'), 'pretix.event.order.approved': _('The order has been approved.'),
'pretix.event.order.denied': _('The order has been denied (comment: "{comment}").'), '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}" ' 'pretix.event.order.contact.changed': _('The email address has been changed from "{old_email}" '
'to "{new_email}".'), 'to "{new_email}".'),
'pretix.event.order.contact.confirmed': _( 'pretix.event.order.contact.confirmed': _(

View File

@@ -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. If this code was not requested by you, please contact us immediately.
Best regards, Best regards,
Your pretix team Your {{ instance }} team
{% endblocktrans %} {% endblocktrans %}

View File

@@ -5,5 +5,5 @@ you requested a new password. Please go to the following page to reset your pass
{{ url }} {{ url }}
Best regards, Best regards,
Your pretix team Your {{ instance }} team
{% endblocktrans %} {% endblocktrans %}

View File

@@ -1,6 +1,6 @@
{% load i18n %}{% blocktrans with url=url|safe %}Hello, {% 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. ticket sales.
Organizer: {{ organizer }} Organizer: {{ organizer }}
@@ -13,5 +13,5 @@ If you do not want to join, you can safely ignore or delete this email.
Best regards, Best regards,
Your pretix team Your {{ instance }} team
{% endblocktrans %} {% endblocktrans %}

View File

@@ -1,6 +1,6 @@
{% load i18n %}{% blocktrans with url=url|safe messages=messages|safe %}Hello, {% 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: changed. In particular, the following changes have been performed:
{{ messages }} {{ messages }}
@@ -12,5 +12,5 @@ You can review and change your account settings here:
{{ url }} {{ url }}
Best regards, Best regards,
Your pretix team Your {{ instance }} team
{% endblocktrans %} {% endblocktrans %}

View File

@@ -1641,9 +1641,17 @@ class OrderCheckVATID(OrderView):
try: try:
normalized_id = validate_vat_id(ia.vat_id, str(ia.country)) normalized_id = validate_vat_id(ia.vat_id, str(ia.country))
ia.vat_id_validated = True with transaction.atomic():
ia.vat_id = normalized_id ia.vat_id_validated = True
ia.save() 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: except VATIDFinalError as e:
messages.error(self.request, e.message) messages.error(self.request, e.message)
except VATIDTemporaryError: except VATIDTemporaryError:

View File

@@ -1039,9 +1039,10 @@ class TeamMemberView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin,
def _send_invite(self, instance): def _send_invite(self, instance):
mail( mail(
instance.email, instance.email,
_('pretix account invitation'), _('Account invitation'),
'pretixcontrol/email/invitation.txt', 'pretixcontrol/email/invitation.txt',
{ {
'instance': settings.PRETIX_INSTANCE_NAME,
'user': self, 'user': self,
'organizer': self.request.organizer.name, 'organizer': self.request.organizer.name,
'team': instance.team.name, 'team': instance.team.name,

View File

@@ -8,16 +8,16 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-02-24 11:50+0000\n" "POT-Creation-Date: 2026-02-24 11:50+0000\n"
"PO-Revision-Date: 2025-02-14 21:00+0000\n" "PO-Revision-Date: 2026-02-25 23:00+0000\n"
"Last-Translator: deborahfoell <deborah.foell@om.org>\n" "Last-Translator: David Ibáñez Cerdeira <dibanez@gmail.com>\n"
"Language-Team: Greek <https://translate.pretix.eu/projects/pretix/pretix/el/" "Language-Team: Greek <https://translate.pretix.eu/projects/pretix/pretix/el/>"
">\n" "\n"
"Language: el\n" "Language: el\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\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 #: pretix/_base_settings.py:87
msgid "English" msgid "English"
@@ -20467,7 +20467,7 @@ msgstr "Ορίστε νέο κωδικό πρόσβασης"
#: pretix/presale/templates/pretixpresale/organizers/customer_password.html:25 #: pretix/presale/templates/pretixpresale/organizers/customer_password.html:25
#: pretix/presale/templates/pretixpresale/organizers/customer_setpassword.html:25 #: pretix/presale/templates/pretixpresale/organizers/customer_setpassword.html:25
msgid "Save" msgid "Save"
msgstr "Αποθηκεύση" msgstr "gardar"
#: pretix/control/templates/pretixcontrol/auth/register.html:7 #: pretix/control/templates/pretixcontrol/auth/register.html:7
msgid "Create a new account" msgid "Create a new account"

View File

@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-02-24 11:50+0000\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" "Last-Translator: CVZ-es <damien.bremont@casadevelazquez.org>\n"
"Language-Team: Spanish <https://translate.pretix.eu/projects/pretix/pretix/" "Language-Team: Spanish <https://translate.pretix.eu/projects/pretix/pretix/"
"es/>\n" "es/>\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\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 #: pretix/_base_settings.py:87
msgid "English" 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." msgstr "Debe especificar tantas butacas como vales de compra."
#: pretix/control/forms/waitinglist.py:39 #: pretix/control/forms/waitinglist.py:39
#, fuzzy
#| msgid "Please select a valid seat."
msgid "Select a valid choice." 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 #: pretix/control/forms/waitinglist.py:107
#, fuzzy
#| msgid "Active products"
msgid "Only includes active products." msgid "Only includes active products."
msgstr "Productos activos" msgstr "Solo incluir productos activos."
#: pretix/control/forms/waitinglist.py:115 #: 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." 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 #: pretix/control/forms/waitinglist.py:125
#, fuzzy
#| msgid "The selected product has been deactivated."
msgid "The selected product is not active." 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 #: pretix/control/logdisplay.py:73 pretix/control/logdisplay.py:83
msgid "The order has been changed:" msgid "The order has been changed:"
@@ -17729,7 +17721,7 @@ msgstr ""
#: pretix/control/logdisplay.py:589 #: pretix/control/logdisplay.py:589
msgid "The voucher has been changed." 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 #: pretix/control/logdisplay.py:590
msgid "The voucher has been deleted." msgid "The voucher has been deleted."
@@ -18643,7 +18635,7 @@ msgstr "Entradas"
#: pretix/control/templates/pretixcontrol/order/index.html:764 #: pretix/control/templates/pretixcontrol/order/index.html:764
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:457 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:457
msgid "Taxes" msgid "Taxes"
msgstr "gravámenes" msgstr "Impuestos"
#: pretix/control/navigation.py:97 #: pretix/control/navigation.py:97
msgid "Invoicing" msgid "Invoicing"
@@ -18883,6 +18875,10 @@ msgid ""
"in repeatedly. Please check if your browser is set to block cookies, or " "in repeatedly. Please check if your browser is set to block cookies, or "
"delete all existing cookies and retry." "delete all existing cookies and retry."
msgstr "" 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/control/templates/pretixcontrol/auth/login.html:35
#: pretix/presale/templates/pretixpresale/fragment_login_status.html:19 #: 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. " "This application has <strong>not</strong> been reviewed by the pretix team. "
"Granting access to your pretix account happens at your own risk." "Granting access to your pretix account happens at your own risk."
msgstr "" msgstr ""
"Esta aplicación<strong>no</strong> ha sido revisada por el equipo de pretix. " "Esta aplicación <strong>no</strong> ha sido revisada por el equipo de "
"La concesión del acceso a su cuenta pretix se realiza bajo su propio riesgo." "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 #: pretix/control/templates/pretixcontrol/auth/oauth_authorization.html:54
msgid "Error:" msgid "Error:"
@@ -19129,8 +19126,8 @@ msgid ""
"We've detected that you are using <strong>Microsoft Internet Explorer</" "We've detected that you are using <strong>Microsoft Internet Explorer</"
"strong>." "strong>."
msgstr "" msgstr ""
"Hemos detectado que estás usando <strong> Microsoft Internet Explorer </" "Hemos detectado que estás usando <strong>Microsoft Internet Explorer</strong>"
"strong>." "."
#: pretix/control/templates/pretixcontrol/base.html:332 #: pretix/control/templates/pretixcontrol/base.html:332
#: pretix/presale/templates/pretixpresale/base.html:54 #: pretix/presale/templates/pretixpresale/base.html:54
@@ -19169,7 +19166,7 @@ msgid ""
"people from actually buying tickets." "people from actually buying tickets."
msgstr "" msgstr ""
"Tu evento contiene <strong>pedidos de modo de prueba</strong> a pesar de que " "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 " "estes pedidos para asegurarte que no se muestren en tus reportes "
"estadísticos y bloquear la compra de entradas a las personas." "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 " "duplicate payment attempts. You should review the cases and consider "
"refunding the overpaid amount to the user." "refunding the overpaid amount to the user."
msgstr "" 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 " "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." "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 " "This event contains <strong>pending refunds</strong> that you should take "
"care of." "care of."
msgstr "" 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." "debe prestar atención."
#: pretix/control/templates/pretixcontrol/event/index.html:50 #: pretix/control/templates/pretixcontrol/event/index.html:50
@@ -20815,7 +20812,7 @@ msgid ""
"arrived. You should review the cases and consider either refunding the " "arrived. You should review the cases and consider either refunding the "
"customer or creating more space." "customer or creating more space."
msgstr "" 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 " "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, " "momento que llegó el pago. Debería revisar estos casos y considerar, "
"devolver el dinero o crear más espacio." "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." "as examples, you can add more in the \"Settings\" part of your event."
msgstr "" msgstr ""
"pretix soporta un <a href=\"https://pretix.eu/about/en/features/payment\" " "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í " "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 " "hay sólo dos de ellos a modo de ejemplo, puede añadir más en la parte "
"\"Configuración\" de su evento." "\"Configuración\" de su evento."
@@ -23891,8 +23888,8 @@ msgid ""
"Do you really want to delete this order? <strong>You really cannot revert " "Do you really want to delete this order? <strong>You really cannot revert "
"this action and we can't either.</strong>" "this action and we can't either.</strong>"
msgstr "" msgstr ""
"¿Realmente quieres eliminar este pedido? <strong> No puedes revertir esta " "¿Realmente quieres eliminar este pedido? <strong>No puedes revertir esta "
"acción y tampoco nosotros. </strong>" "acción y tampoco nosotros.</strong>"
#: pretix/control/templates/pretixcontrol/order/delete.html:25 #: pretix/control/templates/pretixcontrol/order/delete.html:25
msgid "Yes, delete order" msgid "Yes, delete order"
@@ -24516,9 +24513,8 @@ msgid ""
msgstr "" msgstr ""
"Hemos recibido la notificación de que <strong>%(amount)s</strong> ha sido " "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á " "devuelto a través de <strong>%(method)s</strong>. Si este reembolso está "
"procesado, el pedido habrá sido pagado con un importe inferior " "procesado, el pedido habrá sido pagado con un importe inferior en <strong>%"
"en<strong>%(pending)s</strong>. El total del pedido es <strong>%(total)s</" "(pending)s</strong>. El total del pedido es <strong>%(total)s</strong>."
"strong>."
#: pretix/control/templates/pretixcontrol/order/refund_process.html:30 #: pretix/control/templates/pretixcontrol/order/refund_process.html:30
msgid "Since the order is already canceled, this will not affect its state." 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 " "Using this option will <strong>delete all current quotas</strong> from "
"<strong>all selected dates</strong>." "<strong>all selected dates</strong>."
msgstr "" 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>." "strong> de <strong>todas las fechas seleccionadas</strong>."
#: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:277 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:277
@@ -27998,7 +27994,7 @@ msgstr "Borrar vale de compra"
msgid "" msgid ""
"Are you sure you want to delete the voucher <strong>%(voucher)s</strong>?" "Are you sure you want to delete the voucher <strong>%(voucher)s</strong>?"
msgstr "" 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>?" "strong>?"
#: pretix/control/templates/pretixcontrol/vouchers/delete_bulk.html:4 #: 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:4
#: pretix/control/templates/pretixcontrol/waitinglist/edit.html:6 #: pretix/control/templates/pretixcontrol/waitinglist/edit.html:6
#: pretix/control/templates/pretixcontrol/waitinglist/index.html:273 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:273
#, fuzzy
#| msgid "Entry"
msgid "Edit entry" msgid "Edit entry"
msgstr "Ingreso" msgstr "Editar entrada"
#: pretix/control/templates/pretixcontrol/waitinglist/index.html:17 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:17
msgid "" msgid ""
@@ -28256,7 +28250,7 @@ msgid ""
"quota is available) or you can press the big button below this text to send " "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." "out as many vouchers as currently possible to the persons who waited longest."
msgstr "" 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 " "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 " "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 " "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." "La autenticación de dos factores ahora está desactivada para su cuenta."
#: pretix/control/views/user.py:635 #: pretix/control/views/user.py:635
#, fuzzy, python-brace-format #, 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"
#| "- "
msgid "" msgid ""
"Your emergency codes have been newly generated. Remember to store them in a " "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 " "safe place in case you lose access to your devices. You will not be able to "
@@ -30155,8 +30141,7 @@ msgstr ""
"verlos aquí.\n" "verlos aquí.\n"
"\n" "\n"
"Sus códigos de emergencias:\n" "Sus códigos de emergencias:\n"
"- \n" "{tokens}"
"- "
#: pretix/control/views/user.py:655 #: pretix/control/views/user.py:655
msgid "Your notifications have been disabled." msgid "Your notifications have been disabled."
@@ -30326,10 +30311,8 @@ msgid "The selected entry has been deleted."
msgstr "Se ha borrado la entrada seleccionada." msgstr "Se ha borrado la entrada seleccionada."
#: pretix/control/views/waitinglist.py:417 #: pretix/control/views/waitinglist.py:417
#, fuzzy
#| msgid "The waitinglist entry has been transferred."
msgid "The waitinglist entry has been changed." 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 #: pretix/helpers/countries.py:134
msgid "Belarus" msgid "Belarus"
@@ -37011,8 +36994,8 @@ msgid ""
"If you're looking to buy a ticket, you need to follow a direct link to an " "If you're looking to buy a ticket, you need to follow a direct link to an "
"event or organizer profile." "event or organizer profile."
msgstr "" msgstr ""
"SI buscas comprar una entrada, necesitar seguir un enlace directo a un " "Si busca comprar una entrada, necesita seguir un enlace directo a un evento "
"evento o a un perfil de organizador." "o a un perfil de organizador."
#: pretix/presale/templates/pretixpresale/index.html:20 #: pretix/presale/templates/pretixpresale/index.html:20
#, python-format #, python-format

View File

@@ -4,16 +4,16 @@ msgstr ""
"Project-Id-Version: 1\n" "Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-02-24 11:50+0000\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" "Last-Translator: CVZ-es <damien.bremont@casadevelazquez.org>\n"
"Language-Team: French <https://translate.pretix.eu/projects/pretix/pretix/fr/" "Language-Team: French <https://translate.pretix.eu/projects/pretix/pretix/"
">\n" "fr/>\n"
"Language: fr\n" "Language: fr\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\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 #: pretix/_base_settings.py:87
msgid "English" msgid "English"
@@ -13011,7 +13011,9 @@ msgstr "Texte daide du champ email"
#: pretix/base/settings.py:3398 #: pretix/base/settings.py:3398
msgid "Allow creating a new team during event creation" 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 #: pretix/base/settings.py:3399
msgid "" 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." msgstr "Vous devez spécifier autant de sièges que de codes promotionnels."
#: pretix/control/forms/waitinglist.py:39 #: pretix/control/forms/waitinglist.py:39
#, fuzzy
#| msgid "Please select a valid seat."
msgid "Select a valid choice." 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 #: pretix/control/forms/waitinglist.py:107
#, fuzzy
#| msgid "Active products"
msgid "Only includes active products." msgid "Only includes active products."
msgstr "Produits actifs" msgstr "Comprend uniquement les produits actifs."
#: pretix/control/forms/waitinglist.py:115 #: 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." 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 #: pretix/control/forms/waitinglist.py:125
#, fuzzy
#| msgid "The selected product has been deactivated."
msgid "The selected product is not active." 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 #: pretix/control/logdisplay.py:73 pretix/control/logdisplay.py:83
msgid "The order has been changed:" msgid "The order has been changed:"
@@ -19021,6 +19015,10 @@ msgid ""
"in repeatedly. Please check if your browser is set to block cookies, or " "in repeatedly. Please check if your browser is set to block cookies, or "
"delete all existing cookies and retry." "delete all existing cookies and retry."
msgstr "" 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/control/templates/pretixcontrol/auth/login.html:35
#: pretix/presale/templates/pretixpresale/fragment_login_status.html:19 #: 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> " "Do you really want to grant the application <strong>%(application)s</strong> "
"access to your pretix account?" "access to your pretix account?"
msgstr "" msgstr ""
"Voulez-vous vraiment accorder à l'application <strong>1%(application)s2</" "Voulez-vous vraiment accorder à l'application <strong>%(application)s</"
"strong>3 un accès à votre compte pretix ?" "strong> un accès à votre compte pretix ?"
#: pretix/control/templates/pretixcontrol/auth/oauth_authorization.html:24 #: pretix/control/templates/pretixcontrol/auth/oauth_authorization.html:24
#, python-format #, python-format
@@ -19132,8 +19130,8 @@ msgid ""
"This application has <strong>not</strong> been reviewed by the pretix team. " "This application has <strong>not</strong> been reviewed by the pretix team. "
"Granting access to your pretix account happens at your own risk." "Granting access to your pretix account happens at your own risk."
msgstr "" msgstr ""
"Cette application n'a <strong>1pas</strong>2 été véifiée par l'équipe " "Cette application n'a <strong>pas</strong> été véifiée par l'équipe pretix. "
"pretix. L'accès à votre compte Pretix se fait à vos propres risques." "L'accès à votre compte Pretix se fait à vos propres risques."
#: pretix/control/templates/pretixcontrol/auth/oauth_authorization.html:54 #: pretix/control/templates/pretixcontrol/auth/oauth_authorization.html:54
msgid "Error:" msgid "Error:"
@@ -19536,7 +19534,7 @@ msgstr[0] ""
"Êtes-vous sûr de vouloir supprimer l'enregistrement <strong>d'un billet</" "Êtes-vous sûr de vouloir supprimer l'enregistrement <strong>d'un billet</"
"strong>?" "strong>?"
msgstr[1] "" 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>?" "billets</strong>?"
#: pretix/control/templates/pretixcontrol/checkin/bulk_revert_confirm.html:24 #: 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." "as examples, you can add more in the \"Settings\" part of your event."
msgstr "" msgstr ""
"pretix supporte une <a href=\"https://pretix.eu/about/en/features/payment\" " "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 à " "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 " "votre flux de travail. En voici deux à titre d'exemple, vous pouvez en "
"ajouter dans la partie \"Paramètres\" de votre événement." "ajouter dans la partie \"Paramètres\" de votre événement."
@@ -23578,8 +23576,8 @@ msgid ""
msgstr "" msgstr ""
"Veuillez sélectionner les produits ou les variantes de produits auxquels ce " "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 " "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 " "ne sera seulement disponible si les quotas <strong>et</strong> ont encore de "
"encore de la place." "la place."
#: pretix/control/templates/pretixcontrol/items/quota_edit.html:41 #: pretix/control/templates/pretixcontrol/items/quota_edit.html:41
msgid "Advanced options" msgid "Advanced options"
@@ -23638,8 +23636,8 @@ msgid ""
"Are you sure you want to disable the application <strong>%(application)s</" "Are you sure you want to disable the application <strong>%(application)s</"
"strong> permanently?" "strong> permanently?"
msgstr "" msgstr ""
"Êtes-vous sûr de vouloir désactiver l'application <strong>1%(application)s2</" "Êtes-vous sûr de vouloir désactiver l'application <strong>%(application)s</"
"strong>3 en permanence ?" "strong> de manière permanente ?"
#: pretix/control/templates/pretixcontrol/oauth/app_list.html:4 #: pretix/control/templates/pretixcontrol/oauth/app_list.html:4
#: pretix/control/templates/pretixcontrol/oauth/app_list.html:6 #: 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 " "Using this option will <strong>delete all current quotas</strong> from "
"<strong>all selected dates</strong>." "<strong>all selected dates</strong>."
msgstr "" msgstr ""
"Cette option permet de <strong> supprimer tous les quotas actuels</strong> " "Cette option permet de <strong>supprimer tous les quotas actuels</strong> de "
"de <strong>toutes les dates sélectionnées</strong>." "<strong>toutes les dates sélectionnées</strong>."
#: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:277 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:277
msgid "" msgid ""
@@ -28399,10 +28397,8 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/waitinglist/edit.html:4 #: pretix/control/templates/pretixcontrol/waitinglist/edit.html:4
#: pretix/control/templates/pretixcontrol/waitinglist/edit.html:6 #: pretix/control/templates/pretixcontrol/waitinglist/edit.html:6
#: pretix/control/templates/pretixcontrol/waitinglist/index.html:273 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:273
#, fuzzy
#| msgid "Entry"
msgid "Edit entry" msgid "Edit entry"
msgstr "Entrée" msgstr "Modifier l'entrée"
#: pretix/control/templates/pretixcontrol/waitinglist/index.html:17 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:17
msgid "" msgid ""
@@ -28464,7 +28460,7 @@ msgid ""
"quota is available) or you can press the big button below this text to send " "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." "out as many vouchers as currently possible to the persons who waited longest."
msgstr "" 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 " "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 " "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 " "(si un quota suffisant est disponible), soit vous pouvez appuyer sur le gros "
@@ -30368,15 +30364,7 @@ msgstr ""
"compte." "compte."
#: pretix/control/views/user.py:635 #: pretix/control/views/user.py:635
#, fuzzy, python-brace-format #, 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"
#| "- "
msgid "" msgid ""
"Your emergency codes have been newly generated. Remember to store them in a " "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 " "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" "appareils. Vous ne pourrez plus les consulter ici.\n"
"\n" "\n"
"Vos codes d'urgence :\n" "Vos codes d'urgence :\n"
"-\n" "{tokens}"
"- "
#: pretix/control/views/user.py:655 #: pretix/control/views/user.py:655
msgid "Your notifications have been disabled." 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." msgstr "L'entrée sélectionnée a été supprimée."
#: pretix/control/views/waitinglist.py:417 #: pretix/control/views/waitinglist.py:417
#, fuzzy
#| msgid "The waitinglist entry has been transferred."
msgid "The waitinglist entry has been changed." 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 #: pretix/helpers/countries.py:134
msgid "Belarus" msgid "Belarus"

File diff suppressed because it is too large Load Diff

View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-01-26 09:10+0000\n" "POT-Creation-Date: 2026-01-26 09:10+0000\n"
"PO-Revision-Date: 2025-12-03 23:00+0000\n" "PO-Revision-Date: 2026-03-02 21:00+0000\n"
"Last-Translator: sandra r <sandrarial@gestiontickets.online>\n" "Last-Translator: Sandra Rial Pérez <sandrarial@gestiontickets.online>\n"
"Language-Team: Galician <https://translate.pretix.eu/projects/pretix/pretix-" "Language-Team: Galician <https://translate.pretix.eu/projects/pretix/pretix-"
"js/gl/>\n" "js/gl/>\n"
"Language: gl\n" "Language: gl\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\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:56
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62 #: 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:27
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:39 #: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:39
msgid "Attendees (ordered)" msgid "Attendees (ordered)"
msgstr "" msgstr "Asistentes (ordenados)"
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:27 #: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:27
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:39 #: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:39
msgid "Attendees (paid)" msgid "Attendees (paid)"
msgstr "" msgstr "Asistentes (de pago)"
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:51 #: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:51
msgid "Total revenue" msgid "Total revenue"
@@ -732,8 +732,8 @@ msgid ""
"The items in your cart are no longer reserved for you. You can still " "The items in your cart are no longer reserved for you. You can still "
"complete your order as long as theyre available." "complete your order as long as theyre available."
msgstr "" msgstr ""
"Os artigos da túa cesta xa non están reservados para ti. Aínda podes " "Os artigos do teu carro xa non están reservados para ti. Podes completar o "
"completar o teu pedido mentres estean dispoñibles." "teu pedido sempre que estean dispoñibles."
#: pretix/static/pretixpresale/js/ui/cart.js:49 #: pretix/static/pretixpresale/js/ui/cart.js:49
msgid "Cart expired" msgid "Cart expired"

View File

@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-02-24 11:50+0000\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-02 10:00+0000\n"
"Last-Translator: Hijiri Umemoto <hijiri@umemoto.org>\n" "Last-Translator: Hijiri Umemoto <hijiri@umemoto.org>\n"
"Language-Team: Japanese <https://translate.pretix.eu/projects/pretix/pretix/" "Language-Team: Japanese <https://translate.pretix.eu/projects/pretix/pretix/"
"ja/>\n" "ja/>\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n" "Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 5.16\n" "X-Generator: Weblate 5.16.1\n"
#: pretix/_base_settings.py:87 #: pretix/_base_settings.py:87
msgid "English" msgid "English"
@@ -6997,22 +6997,22 @@ msgstr "2006/112/EC号指令の第309条に基づいて免除"
#: pretix/base/models/tax.py:253 #: pretix/base/models/tax.py:253
msgctxt "tax_code" msgctxt "tax_code"
msgid "Intra-Community acquisition from second hand means of transport" msgid "Intra-Community acquisition from second hand means of transport"
msgstr "中古輸送手段のEU域内取得" msgstr "中古輸送手段の域内取得"
#: pretix/base/models/tax.py:255 #: pretix/base/models/tax.py:255
msgctxt "tax_code" msgctxt "tax_code"
msgid "Intra-Community acquisition of second hand goods" msgid "Intra-Community acquisition of second hand goods"
msgstr "中古品のEU域内取得" msgstr "中古品の域内取得"
#: pretix/base/models/tax.py:257 #: pretix/base/models/tax.py:257
msgctxt "tax_code" msgctxt "tax_code"
msgid "Intra-Community acquisition of works of art" msgid "Intra-Community acquisition of works of art"
msgstr "芸術作品のEU域内取得" msgstr "芸術作品の域内取得"
#: pretix/base/models/tax.py:259 #: pretix/base/models/tax.py:259
msgctxt "tax_code" msgctxt "tax_code"
msgid "Intra-Community acquisition of collectors items and antiques" msgid "Intra-Community acquisition of collectors items and antiques"
msgstr "コレクターアイテムおよび骨董品のEU域内取得" msgstr "コレクターアイテムおよび骨董品の域内取得"
#: pretix/base/models/tax.py:261 #: pretix/base/models/tax.py:261
msgctxt "tax_code" msgctxt "tax_code"
@@ -16579,28 +16579,20 @@ msgid "You need to specify as many seats as voucher codes."
msgstr "あなたはバウチャーコードの数と同じだけの席を指定する必要があります。" msgstr "あなたはバウチャーコードの数と同じだけの席を指定する必要があります。"
#: pretix/control/forms/waitinglist.py:39 #: pretix/control/forms/waitinglist.py:39
#, fuzzy
#| msgid "Please select a valid seat."
msgid "Select a valid choice." msgid "Select a valid choice."
msgstr "有効な座席を選択してください。" msgstr "有効な選択肢を選んでください。"
#: pretix/control/forms/waitinglist.py:107 #: pretix/control/forms/waitinglist.py:107
#, fuzzy
#| msgid "Active products"
msgid "Only includes active products." msgid "Only includes active products."
msgstr "有効な製品" msgstr "有効な製品のみを含みます。"
#: pretix/control/forms/waitinglist.py:115 #: 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." msgid "A voucher for this waiting list entry was already sent out."
msgstr "このコードを持つバウチャーはすでに存在しています。" msgstr "この空席待ちリストの内容を持つバウチャーはすでに発送済みです。"
#: pretix/control/forms/waitinglist.py:125 #: pretix/control/forms/waitinglist.py:125
#, fuzzy
#| msgid "The selected product has been deactivated."
msgid "The selected product is not active." msgid "The selected product is not active."
msgstr "選択された製品無効化されました。" msgstr "選択された製品無効です。"
#: pretix/control/logdisplay.py:73 pretix/control/logdisplay.py:83 #: pretix/control/logdisplay.py:73 pretix/control/logdisplay.py:83
msgid "The order has been changed:" msgid "The order has been changed:"
@@ -18348,6 +18340,9 @@ msgid ""
"in repeatedly. Please check if your browser is set to block cookies, or " "in repeatedly. Please check if your browser is set to block cookies, or "
"delete all existing cookies and retry." "delete all existing cookies and retry."
msgstr "" msgstr ""
"お使いのブラウザが私どものクッキーを受け入れていないようですので、繰り返し"
"ログインする必要があります。ブラウザがクッキーをブロックする設定になっている"
"か、既存のクッキーをすべて削除して再試行してください。"
#: pretix/control/templates/pretixcontrol/auth/login.html:35 #: pretix/control/templates/pretixcontrol/auth/login.html:35
#: pretix/presale/templates/pretixpresale/fragment_login_status.html:19 #: pretix/presale/templates/pretixpresale/fragment_login_status.html:19
@@ -27400,10 +27395,8 @@ msgstr "次のエントリはすでにバウチャーが添付されているた
#: pretix/control/templates/pretixcontrol/waitinglist/edit.html:4 #: pretix/control/templates/pretixcontrol/waitinglist/edit.html:4
#: pretix/control/templates/pretixcontrol/waitinglist/edit.html:6 #: pretix/control/templates/pretixcontrol/waitinglist/edit.html:6
#: pretix/control/templates/pretixcontrol/waitinglist/index.html:273 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:273
#, fuzzy
#| msgid "Entry"
msgid "Edit entry" msgid "Edit entry"
msgstr "入場" msgstr "エントリーを編集する"
#: pretix/control/templates/pretixcontrol/waitinglist/index.html:17 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:17
msgid "" msgid ""
@@ -29283,15 +29276,7 @@ msgid "Two-factor authentication is now disabled for your account."
msgstr "アカウントの二要素認証が無効になりました。" msgstr "アカウントの二要素認証が無効になりました。"
#: pretix/control/views/user.py:635 #: pretix/control/views/user.py:635
#, fuzzy, python-brace-format #, 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"
#| "- "
msgid "" msgid ""
"Your emergency codes have been newly generated. Remember to store them in a " "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 " "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"
"あなたの緊急コード:\n" "あなたの緊急コード:\n"
"-\n" "{tokens}"
"- "
#: pretix/control/views/user.py:655 #: pretix/control/views/user.py:655
msgid "Your notifications have been disabled." msgid "Your notifications have been disabled."
@@ -29471,10 +29455,8 @@ msgid "The selected entry has been deleted."
msgstr "選択されたエントリは削除されました。" msgstr "選択されたエントリは削除されました。"
#: pretix/control/views/waitinglist.py:417 #: pretix/control/views/waitinglist.py:417
#, fuzzy
#| msgid "The waitinglist entry has been transferred."
msgid "The waitinglist entry has been changed." msgid "The waitinglist entry has been changed."
msgstr "空席待ちリスト登録が転送されました。" msgstr "空席待ちリスト登録が変更されました。"
#: pretix/helpers/countries.py:134 #: pretix/helpers/countries.py:134
msgid "Belarus" msgid "Belarus"

View File

@@ -7,16 +7,16 @@ msgstr ""
"Project-Id-Version: 1\n" "Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-02-24 11:50+0000\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" "Last-Translator: Ruud Hendrickx <ruud@leckxicon.eu>\n"
"Language-Team: Dutch <https://translate.pretix.eu/projects/pretix/pretix/nl/" "Language-Team: Dutch <https://translate.pretix.eu/projects/pretix/pretix/nl/>"
">\n" "\n"
"Language: nl\n" "Language: nl\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\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 #: pretix/_base_settings.py:87
msgid "English" msgid "English"
@@ -7996,7 +7996,7 @@ msgstr "Deze cadeaubon is in de tussentijd gebruikt. Probeer het opnieuw."
#: pretix/base/pdf.py:98 #: pretix/base/pdf.py:98
msgid "Ticket code (barcode content)" msgid "Ticket code (barcode content)"
msgstr "Ticketcode (waarde van QR-code)" msgstr "Ticketcode (inhoud van QR-code)"
#: pretix/base/pdf.py:110 #: pretix/base/pdf.py:110
msgid "Order position number" msgid "Order position number"
@@ -9664,7 +9664,7 @@ msgstr "Het bedrag is van uw kaart afgeschreven."
#: pretix/base/services/placeholders.py:699 #: pretix/base/services/placeholders.py:699
msgid "Please transfer money to this bank account: 9999-9999-9999-9999" 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/base/services/placeholders.py:799
#: pretix/control/views/organizer.py:349 #: pretix/control/views/organizer.py:349
@@ -11081,8 +11081,8 @@ msgid ""
"If turned off, ticket downloads are only possible after an order has been " "If turned off, ticket downloads are only possible after an order has been "
"marked as paid." "marked as paid."
msgstr "" msgstr ""
"Als deze optie is uitgeschakeld, kunnen tickets alleen worden gedownload " "Indien uitgeschakeld, kunnen tickets alleen gedownload worden als de "
"nadat een bestelling als betaald is gemarkeerd." "bestelling als betaald gemarkeerd is."
#: pretix/base/settings.py:1763 #: pretix/base/settings.py:1763
msgid "Do not issue ticket before email address is validated" msgid "Do not issue ticket before email address is validated"
@@ -13801,12 +13801,12 @@ msgstr "Altijd"
#: pretix/base/timeline.py:60 #: pretix/base/timeline.py:60
msgctxt "timeline" msgctxt "timeline"
msgid "Your event starts" msgid "Your event starts"
msgstr "Uw evenement start" msgstr "Start van uw evenement"
#: pretix/base/timeline.py:68 #: pretix/base/timeline.py:68
msgctxt "timeline" msgctxt "timeline"
msgid "Your event ends" msgid "Your event ends"
msgstr "Uw evenement eindigt" msgstr "Einde van uw evenement"
#: pretix/base/timeline.py:76 #: pretix/base/timeline.py:76
msgctxt "timeline" 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." msgstr "U moet evenveel stoelnummers als vouchercodes opgeven."
#: pretix/control/forms/waitinglist.py:39 #: pretix/control/forms/waitinglist.py:39
#, fuzzy
#| msgid "Please select a valid seat."
msgid "Select a valid choice." msgid "Select a valid choice."
msgstr "Kies een geldige beschikbare stoel." msgstr "Maak een geldige keuze."
#: pretix/control/forms/waitinglist.py:107 #: pretix/control/forms/waitinglist.py:107
#, fuzzy
#| msgid "Active products"
msgid "Only includes active products." msgid "Only includes active products."
msgstr "Actieve producten" msgstr "Bevat alleen actieve producten."
#: pretix/control/forms/waitinglist.py:115 #: 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." 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 #: pretix/control/forms/waitinglist.py:125
#, fuzzy
#| msgid "The selected product has been deactivated."
msgid "The selected product is not active." 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 #: pretix/control/logdisplay.py:73 pretix/control/logdisplay.py:83
msgid "The order has been changed:" msgid "The order has been changed:"
@@ -18811,6 +18803,9 @@ msgid ""
"in repeatedly. Please check if your browser is set to block cookies, or " "in repeatedly. Please check if your browser is set to block cookies, or "
"delete all existing cookies and retry." "delete all existing cookies and retry."
msgstr "" 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/control/templates/pretixcontrol/auth/login.html:35
#: pretix/presale/templates/pretixpresale/fragment_login_status.html:19 #: 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/base.html:24
#: pretix/control/templates/pretixcontrol/item/include_variations.html:79 #: pretix/control/templates/pretixcontrol/item/include_variations.html:79
msgid "Manage quotas" msgid "Manage quotas"
msgstr "Vragen quotums" msgstr "Quota beheren"
#: pretix/control/templates/pretixcontrol/item/base.html:27 #: pretix/control/templates/pretixcontrol/item/base.html:27
#: pretix/control/templates/pretixcontrol/item/include_variations.html:82 #: 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:4
#: pretix/control/templates/pretixcontrol/waitinglist/edit.html:6 #: pretix/control/templates/pretixcontrol/waitinglist/edit.html:6
#: pretix/control/templates/pretixcontrol/waitinglist/index.html:273 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:273
#, fuzzy
#| msgid "Entry"
msgid "Edit entry" msgid "Edit entry"
msgstr "Binnenkomst" msgstr "Inschrijving bewerken"
#: pretix/control/templates/pretixcontrol/waitinglist/index.html:17 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:17
msgid "" 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." msgstr "Twee-factor-authenticatie is nu uitgeschakeld voor uw account."
#: pretix/control/views/user.py:635 #: pretix/control/views/user.py:635
#, fuzzy, python-brace-format #, 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"
#| "- "
msgid "" msgid ""
"Your emergency codes have been newly generated. Remember to store them in a " "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 " "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" "U kunt ze hier niet meer opnieuw laten tonen.\n"
"\n" "\n"
"Uw noodcodes: \n" "Uw noodcodes: \n"
"-\n" "{tokens}"
"- "
#: pretix/control/views/user.py:655 #: pretix/control/views/user.py:655
msgid "Your notifications have been disabled." msgid "Your notifications have been disabled."
@@ -30210,10 +30194,8 @@ msgid "The selected entry has been deleted."
msgstr "De gekozen inschrijving is verwijderd." msgstr "De gekozen inschrijving is verwijderd."
#: pretix/control/views/waitinglist.py:417 #: pretix/control/views/waitinglist.py:417
#, fuzzy
#| msgid "The waitinglist entry has been transferred."
msgid "The waitinglist entry has been changed." 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 #: pretix/helpers/countries.py:134
msgid "Belarus" msgid "Belarus"

File diff suppressed because it is too large Load Diff

View File

@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-02-24 11:50+0000\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" "Last-Translator: Ruud Hendrickx <ruud@leckxicon.eu>\n"
"Language-Team: Dutch (informal) <https://translate.pretix.eu/projects/pretix/" "Language-Team: Dutch (informal) <https://translate.pretix.eu/projects/pretix/"
"pretix/nl_Informal/>\n" "pretix/nl_Informal/>\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\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 #: pretix/_base_settings.py:87
msgid "English" msgid "English"
@@ -9673,7 +9673,7 @@ msgstr "Het bedrag is van je kaart afgeschreven."
#: pretix/base/services/placeholders.py:699 #: pretix/base/services/placeholders.py:699
msgid "Please transfer money to this bank account: 9999-9999-9999-9999" 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/base/services/placeholders.py:799
#: pretix/control/views/organizer.py:349 #: 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." msgstr "Je moet evenveel stoelnummers als vouchercodes opgeven."
#: pretix/control/forms/waitinglist.py:39 #: pretix/control/forms/waitinglist.py:39
#, fuzzy
#| msgid "Please select a valid seat."
msgid "Select a valid choice." msgid "Select a valid choice."
msgstr "Kies een geldige beschikbare stoel." msgstr "Maak een geldige keuze."
#: pretix/control/forms/waitinglist.py:107 #: pretix/control/forms/waitinglist.py:107
#, fuzzy
#| msgid "Active products"
msgid "Only includes active products." msgid "Only includes active products."
msgstr "Actieve producten" msgstr "Bevat alleen actieve producten."
#: pretix/control/forms/waitinglist.py:115 #: 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." 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 #: pretix/control/forms/waitinglist.py:125
#, fuzzy
#| msgid "The selected product has been deactivated."
msgid "The selected product is not active." 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 #: pretix/control/logdisplay.py:73 pretix/control/logdisplay.py:83
msgid "The order has been changed:" msgid "The order has been changed:"
@@ -18844,6 +18836,9 @@ msgid ""
"in repeatedly. Please check if your browser is set to block cookies, or " "in repeatedly. Please check if your browser is set to block cookies, or "
"delete all existing cookies and retry." "delete all existing cookies and retry."
msgstr "" 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/control/templates/pretixcontrol/auth/login.html:35
#: pretix/presale/templates/pretixpresale/fragment_login_status.html:19 #: 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:4
#: pretix/control/templates/pretixcontrol/waitinglist/edit.html:6 #: pretix/control/templates/pretixcontrol/waitinglist/edit.html:6
#: pretix/control/templates/pretixcontrol/waitinglist/index.html:273 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:273
#, fuzzy
#| msgid "Entry"
msgid "Edit entry" msgid "Edit entry"
msgstr "Binnenkomst" msgstr "Inschrijving bewerken"
#: pretix/control/templates/pretixcontrol/waitinglist/index.html:17 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:17
msgid "" 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." msgstr "Twee-factor-authenticatie is nu uitgeschakeld voor je account."
#: pretix/control/views/user.py:635 #: pretix/control/views/user.py:635
#, fuzzy, python-brace-format #, 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"
#| "- "
msgid "" msgid ""
"Your emergency codes have been newly generated. Remember to store them in a " "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 " "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" "Je kunt ze hier niet meer opnieuw laten tonen.\n"
"\n" "\n"
"Je noodcodes:\n" "Je noodcodes:\n"
"-\n" "{tokens}"
"- "
#: pretix/control/views/user.py:655 #: pretix/control/views/user.py:655
msgid "Your notifications have been disabled." msgid "Your notifications have been disabled."
@@ -30270,10 +30254,8 @@ msgid "The selected entry has been deleted."
msgstr "De gekozen inschrijving is verwijderd." msgstr "De gekozen inschrijving is verwijderd."
#: pretix/control/views/waitinglist.py:417 #: pretix/control/views/waitinglist.py:417
#, fuzzy
#| msgid "The waitinglist entry has been transferred."
msgid "The waitinglist entry has been changed." 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 #: pretix/helpers/countries.py:134
msgid "Belarus" msgid "Belarus"
@@ -34075,7 +34057,7 @@ msgid ""
"completed your payment, you can refresh this page." "completed your payment, you can refresh this page."
msgstr "" msgstr ""
"Scan de QR-code hieronder om je WeChat-betaling uit te voeren. Als je de " "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 #: pretix/plugins/stripe/templates/pretixplugins/stripe/pending.html:62
msgid "" msgid ""
@@ -35249,7 +35231,7 @@ msgstr "incl. belasting"
#: pretix/presale/templates/pretixpresale/event/voucher.html:359 #: pretix/presale/templates/pretixpresale/event/voucher.html:359
#, python-format #, python-format
msgid "<strong>plus</strong> %(rate)s%% %(name)s" 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:180
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:320 #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:320

File diff suppressed because it is too large Load Diff

View File

@@ -802,31 +802,37 @@ class PaypalMethod(BasePaymentProvider):
all_captures_completed = False all_captures_completed = False
else: else:
any_captures = True 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 ' messages.warning(request, _('PayPal has not yet approved the payment. We will inform you as '
'soon as the payment completed.')) 'soon as the payment completed.'))
payment.info = json.dumps(pp_captured_order.dict()) payment.info = json.dumps(pp_captured_order.dict())
payment.state = OrderPayment.PAYMENT_STATE_PENDING payment.state = OrderPayment.PAYMENT_STATE_PENDING
payment.save() payment.save()
return 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': if payment.state == OrderPayment.PAYMENT_STATE_CONFIRMED:
payment.fail(info=pp_captured_order.dict()) logger.warning('PayPal success event even though order is already marked as paid')
logger.error('Invalid state: %s' % repr(pp_captured_order.dict())) return
raise PaymentException(
_('We were unable to process your payment. See below for details on how to proceed.')
)
if payment.state == OrderPayment.PAYMENT_STATE_CONFIRMED: try:
logger.warning('PayPal success event even though order is already marked as paid') 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 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: finally:
if 'payment_paypal_oid' in request.session: if 'payment_paypal_oid' in request.session:
del request.session['payment_paypal_oid'] del request.session['payment_paypal_oid']
@@ -836,7 +842,7 @@ class PaypalMethod(BasePaymentProvider):
try: try:
if ( if (
payment.info 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 retry = False
except (KeyError, IndexError): except (KeyError, IndexError):

View File

@@ -6,6 +6,7 @@
{% load eventurl %} {% load eventurl %}
{% load safelink %} {% load safelink %}
{% load rich_text %} {% load rich_text %}
{% load anonymize_email %}
{% block thetitle %} {% block thetitle %}
{% if messages %} {% if messages %}
{{ messages|join:" " }} :: {{ messages|join:" " }} ::
@@ -219,7 +220,7 @@
{% endblock %} {% endblock %}
{% block footernav %} {% block footernav %}
{% if request.event.settings.contact_mail %} {% 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 %} {% endif %}
{% if request.event.settings.privacy_url %} {% if request.event.settings.privacy_url %}
<li><a href="{% safelink request.event.settings.privacy_url %}" target="_blank" rel="noopener">{% trans "Privacy policy" %}</a></li> <li><a href="{% safelink request.event.settings.privacy_url %}" target="_blank" rel="noopener">{% trans "Privacy policy" %}</a></li>

View File

@@ -20,6 +20,7 @@
{% bootstrap_form_errors timemachine_form "all" %} {% bootstrap_form_errors timemachine_form "all" %}
<p>{% trans "Test your shop as if it were a different date and time." %}</p> <p>{% trans "Test your shop as if it were a different date and time." %}</p>
<p>{% trans "Please note that the changed time is not taken into account for aspects of the shop that affect quotas, such as the validity period of carts and vouchers." %}</p>
<div class="row"> <div class="row">
<div class="col-md-6"> <div class="col-md-6">
@@ -44,4 +45,4 @@
<div class="clear"></div> <div class="clear"></div>
</div> </div>
</div> </div>
{% endblock %} {% endblock %}

View File

@@ -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/cart.js" %}"></script>
<script type="text/javascript" src="{% static "pretixpresale/js/ui/iframe.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/addressform.js" %}"></script>
<script type="text/javascript" src="{% static "pretixbase/js/deanonymize_email.js" %}"></script>
{% endcompress %} {% endcompress %}

View File

@@ -5,6 +5,7 @@
{% load thumb %} {% load thumb %}
{% load eventurl %} {% load eventurl %}
{% load safelink %} {% load safelink %}
{% load anonymize_email %}
{% block thetitle %} {% block thetitle %}
{% block title %}{% endblock %}{% if url_name != "organizer.index" %} :: {% endif %}{{ organizer.name }} {% block title %}{% endblock %}{% if url_name != "organizer.index" %} :: {% endif %}{{ organizer.name }}
{% endblock %} {% endblock %}
@@ -97,7 +98,7 @@
{% endblock %} {% endblock %}
{% block footernav %} {% block footernav %}
{% if not request.event and request.organizer.settings.contact_mail %} {% 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 %} {% endif %}
{% if not request.event and request.organizer.settings.privacy_url %} {% 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> <li><a href="{% safelink request.organizer.settings.privacy_url %}" target="_blank" rel="noopener">{% trans "Privacy policy" %}</a></li>

View File

@@ -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]', '.');
});
});

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'] 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 @pytest.mark.django_db
def test_order_create_position_secret_optional(token_client, organizer, event, item, quota, question): def test_order_create_position_secret_optional(token_client, organizer, event, item, quota, question):
res = copy.deepcopy(ORDER_CREATE_PAYLOAD) res = copy.deepcopy(ORDER_CREATE_PAYLOAD)