Compare commits

..

20 Commits

Author SHA1 Message Date
Raphael Michel
4f36996a25 Do not double-call extend_expired_positions in tests, make it private 2025-12-11 20:10:18 +01:00
Raphael Michel
2833116b94 Fix typo in calculation 2025-12-11 20:10:04 +01:00
Raphael Michel
904aa807a3 Footer link form: Add placeholder (Z#23217115) 2025-12-10 16:49:09 +01:00
Praveen Kathirvasan
0e41353a0e Add "Pay by bank" option for UK customers via Stripe (#5648)
* Add support for 'Pay by bank (UK)' payment method via Stripe

* Add 'Pay by bank' payment provider to Stripe integration

* Enhance Stripe integration: Allow UK bank payments and update imports

* Remove UK-specific payment method options from StripePayByBank integration

* Remove some UK references

---------

Co-authored-by: Raphael Michel <michel@rami.io>
2025-12-09 13:25:52 +01:00
Raphael Michel
b895d9bbca Import large package lazily to speed up startup (#5636)
* Import large package lazily to speed up startup

* Make all jsonschema imports lazy
2025-12-09 09:52:53 +01:00
Raphael Michel
f214edaf34 Timeline: Fix incorrect string formatting (fixes #5614) (#5617) 2025-12-09 08:52:09 +01:00
Raphael Michel
165a47b593 Bank transfer: Auto-ignore all 0-valued transactions (fixes #5168) (#5620)
* Bank transfer: Auto-ignore all 0-valued transactions (fixes #5168)

* Fix failing test
2025-12-09 08:50:04 +01:00
Renne Rocha
e06f281f1e Translations: Update Portuguese (Brazil)
Currently translated at 90.3% (5575 of 6172 strings)

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

powered by weblate
2025-12-09 08:49:57 +01:00
Renne Rocha
203c7e660d Translations: Update Portuguese (Brazil)
Currently translated at 100.0% (254 of 254 strings)

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

powered by weblate
2025-12-09 08:49:57 +01:00
Renne Rocha
8c360b8754 Translations: Update Portuguese (Brazil)
Currently translated at 90.2% (5572 of 6172 strings)

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

powered by weblate
2025-12-09 08:49:57 +01:00
Ruud Hendrickx
90b6511d11 Translations: Update Dutch (informal) (nl_Informal)
Currently translated at 64.0% (3951 of 6172 strings)

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

powered by weblate
2025-12-09 08:49:57 +01:00
Ruud Hendrickx
bb356257cb Translations: Update Dutch
Currently translated at 96.3% (5945 of 6172 strings)

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

powered by weblate
2025-12-09 08:49:57 +01:00
sandra r
e1950e408e Translations: Update Galician
Currently translated at 15.5% (958 of 6172 strings)

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

powered by weblate
2025-12-09 08:49:57 +01:00
Yasunobu YesNo Kawaguchi
99d5722ce1 Translations: Update Japanese
Currently translated at 99.9% (6166 of 6172 strings)

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

powered by weblate
2025-12-09 08:49:57 +01:00
luelista
324eeb8d40 Fix crash when imported CSV has invalid syntax (#5702) 2025-12-09 08:09:34 +01:00
Raphael Michel
449e8dc905 Event cancel form: Add missing rich=True flag 2025-12-08 09:58:54 +01:00
Raphael Michel
c491c8232e Bank transfer: Allow dashes in event slug to be missing (Z#23216859) (#5682)
* Bank transfer: Allow dashes in event slug to be missing (Z#23216859)

* Update src/pretix/plugins/banktransfer/tasks.py

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

* Update src/pretix/plugins/banktransfer/tasks.py

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

* Apply suggestions from code review

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

---------

Co-authored-by: Richard Schreiber <schreiber@pretix.eu>
2025-12-05 10:54:03 +01:00
sandra r
aa02cc7968 Translations: Update Galician
Currently translated at 15.5% (961 of 6172 strings)

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

powered by weblate
2025-12-05 10:36:32 +01:00
Renne Rocha
cfa13d6b9d Translations: Update Portuguese (Brazil)
Currently translated at 90.2% (5572 of 6172 strings)

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

powered by weblate
2025-12-05 10:36:32 +01:00
Raphael Michel
af4eabc800 URL generation: Fix bug if plugins declare both event_urls and organizer_urls (#5688)
* URL generation: Fix bug if plugins declare both event_urls and organizer_urls

* Add missing file

* Add license header
2025-12-05 10:22:28 +01:00
34 changed files with 488 additions and 401 deletions

View File

@@ -3,7 +3,7 @@ name = "pretix"
dynamic = ["version"] dynamic = ["version"]
description = "Reinventing presales, one ticket at a time" description = "Reinventing presales, one ticket at a time"
readme = "README.rst" readme = "README.rst"
requires-python = ">=3.10" requires-python = ">=3.9"
license = {file = "LICENSE"} license = {file = "LICENSE"}
keywords = ["tickets", "web", "shop", "ecommerce"] keywords = ["tickets", "web", "shop", "ecommerce"]
authors = [ authors = [
@@ -22,7 +22,7 @@ classifiers = [
"Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.11",
"Framework :: Django :: 5.2", "Framework :: Django :: 4.2",
] ]
dependencies = [ dependencies = [
@@ -36,7 +36,7 @@ dependencies = [
"css-inline==0.18.*", "css-inline==0.18.*",
"defusedcsv>=1.1.0", "defusedcsv>=1.1.0",
"dnspython==2.*", "dnspython==2.*",
"Django[argon2]==5.2.*", "Django[argon2]==4.2.*,>=4.2.26",
"django-bootstrap3==25.2", "django-bootstrap3==25.2",
"django-compressor==4.5.1", "django-compressor==4.5.1",
"django-countries==7.6.*", "django-countries==7.6.*",

View File

@@ -53,7 +53,6 @@ from django.utils.timezone import now
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django_otp.models import Device from django_otp.models import Device
from django_scopes import scopes_disabled from django_scopes import scopes_disabled
from webauthn.helpers.structs import PublicKeyCredentialDescriptor
from pretix.base.i18n import language from pretix.base.i18n import language
from pretix.helpers.urls import build_absolute_uri from pretix.helpers.urls import build_absolute_uri
@@ -708,6 +707,8 @@ class U2FDevice(Device):
@property @property
def webauthndevice(self): def webauthndevice(self):
from webauthn.helpers.structs import PublicKeyCredentialDescriptor
d = json.loads(self.json_data) d = json.loads(self.json_data)
return PublicKeyCredentialDescriptor(websafe_decode(d['keyHandle'])) return PublicKeyCredentialDescriptor(websafe_decode(d['keyHandle']))
@@ -737,6 +738,8 @@ class WebAuthnDevice(Device):
@property @property
def webauthndevice(self): def webauthndevice(self):
from webauthn.helpers.structs import PublicKeyCredentialDescriptor
return PublicKeyCredentialDescriptor(websafe_decode(self.credential_id)) return PublicKeyCredentialDescriptor(websafe_decode(self.credential_id))
@property @property

View File

@@ -22,7 +22,6 @@
import json import json
from collections import namedtuple from collections import namedtuple
import jsonschema
from django.contrib.staticfiles import finders from django.contrib.staticfiles import finders
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.db import models from django.db import models
@@ -38,6 +37,8 @@ from pretix.base.models import Event, Item, LoggedModel, Organizer, SubEvent
@deconstructible @deconstructible
class SeatingPlanLayoutValidator: class SeatingPlanLayoutValidator:
def __call__(self, value): def __call__(self, value):
import jsonschema
if not isinstance(value, dict): if not isinstance(value, dict):
try: try:
val = json.loads(value) val = json.loads(value)

View File

@@ -23,7 +23,6 @@ import json
from decimal import Decimal from decimal import Decimal
from typing import Optional from typing import Optional
import jsonschema
from django.contrib.staticfiles import finders from django.contrib.staticfiles import finders
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.core.validators import MaxValueValidator, MinValueValidator from django.core.validators import MaxValueValidator, MinValueValidator
@@ -298,6 +297,8 @@ def cc_to_vat_prefix(country_code):
@deconstructible @deconstructible
class CustomRulesValidator: class CustomRulesValidator:
def __call__(self, value): def __call__(self, value):
import jsonschema
if not isinstance(value, dict): if not isinstance(value, dict):
try: try:
val = json.loads(value) val = json.loads(value)

View File

@@ -47,7 +47,6 @@ from collections import OrderedDict, defaultdict
from functools import partial from functools import partial
from io import BytesIO from io import BytesIO
import jsonschema
import pypdf import pypdf
import pypdf.generic import pypdf.generic
import reportlab.rl_config import reportlab.rl_config
@@ -1311,6 +1310,8 @@ def _correct_page_media_box(page: pypdf.PageObject):
@deconstructible @deconstructible
class PdfLayoutValidator: class PdfLayoutValidator:
def __call__(self, value): def __call__(self, value):
import jsonschema
if not isinstance(value, dict): if not isinstance(value, dict):
try: try:
val = json.loads(value) val = json.loads(value)

View File

@@ -541,7 +541,7 @@ class CartManager:
else: else:
raise e raise e
def extend_expired_positions(self): def _extend_expired_positions(self):
requires_seat = Exists( requires_seat = Exists(
SeatCategoryMapping.objects.filter( SeatCategoryMapping.objects.filter(
Q(product=OuterRef('item')) Q(product=OuterRef('item'))
@@ -607,7 +607,7 @@ class CartManager:
self._check_item_constraints(op) self._check_item_constraints(op)
if cp.voucher: if cp.voucher:
self._voucher_use_diff[cp.voucher] += 2 self._voucher_use_diff[cp.voucher] += 1
self._operations.append(op) self._operations.append(op)
return err return err
@@ -1449,7 +1449,7 @@ class CartManager:
self._check_max_cart_size() self._check_max_cart_size()
err = self._delete_out_of_timeframe() err = self._delete_out_of_timeframe()
err = self.extend_expired_positions() or err err = self._extend_expired_positions() or err
err = err or self._check_min_per_voucher() err = err or self._check_min_per_voucher()
self._extend_expiry_of_valid_existing_positions() self._extend_expiry_of_valid_existing_positions()

View File

@@ -47,7 +47,6 @@ from urllib.parse import urljoin, urlparse
from zoneinfo import ZoneInfo from zoneinfo import ZoneInfo
import requests import requests
from bs4 import BeautifulSoup
from celery import chain from celery import chain
from celery.exceptions import MaxRetriesExceededError from celery.exceptions import MaxRetriesExceededError
from django.conf import settings from django.conf import settings
@@ -764,6 +763,8 @@ def render_mail(template, context, placeholder_mode=SafeFormatter.MODE_RICH_TO_P
def replace_images_with_cid_paths(body_html): def replace_images_with_cid_paths(body_html):
from bs4 import BeautifulSoup
if body_html: if body_html:
email = BeautifulSoup(body_html, "lxml") email = BeautifulSoup(body_html, "lxml")
cid_images = [] cid_images = []

View File

@@ -60,25 +60,23 @@ def _populate_app_cache():
def get_defining_app(o): def get_defining_app(o):
# If sentry packed this in a wrapper, unpack that # If sentry packed this in a wrapper, unpack that
module = getattr(o, "__module__", None) if "sentry" in o.__module__:
if module and "sentry" in module:
o = o.__wrapped__ o = o.__wrapped__
if hasattr(o, "__mocked_app"): if hasattr(o, "__mocked_app"):
return o.__mocked_app return o.__mocked_app
# Find the Django application this belongs to # Find the Django application this belongs to
searchpath = module or getattr(o.__class__, "__module__", None) or "" searchpath = o.__module__
# Core modules are always active # Core modules are always active
if searchpath and any(searchpath.startswith(cm) for cm in settings.CORE_MODULES): if any(searchpath.startswith(cm) for cm in settings.CORE_MODULES):
return 'CORE' return 'CORE'
if not app_cache: if not app_cache:
_populate_app_cache() _populate_app_cache()
app = None while True:
while searchpath:
app = app_cache.get(searchpath) app = app_cache.get(searchpath)
if "." not in searchpath or app: if "." not in searchpath or app:
break break
@@ -159,11 +157,7 @@ class PluginSignal(Generic[T], django.dispatch.Signal):
if not app_cache: if not app_cache:
_populate_app_cache() _populate_app_cache()
for receiver in self._sorted_receivers(sender)[0]: for receiver in self._sorted_receivers(sender):
if self._is_receiver_active(sender, receiver):
response = receiver(signal=self, sender=sender, **named)
responses.append((receiver, response))
for receiver in self._sorted_receivers(sender)[1]:
if self._is_receiver_active(sender, receiver): if self._is_receiver_active(sender, receiver):
response = receiver(signal=self, sender=sender, **named) response = receiver(signal=self, sender=sender, **named)
responses.append((receiver, response)) responses.append((receiver, response))
@@ -185,11 +179,7 @@ class PluginSignal(Generic[T], django.dispatch.Signal):
if not app_cache: if not app_cache:
_populate_app_cache() _populate_app_cache()
for receiver in self._sorted_receivers(sender)[0]: for receiver in self._sorted_receivers(sender):
if self._is_receiver_active(sender, receiver):
named[chain_kwarg_name] = response
response = receiver(signal=self, sender=sender, **named)
for receiver in self._sorted_receivers(sender)[1]:
if self._is_receiver_active(sender, receiver): if self._is_receiver_active(sender, receiver):
named[chain_kwarg_name] = response named[chain_kwarg_name] = response
response = receiver(signal=self, sender=sender, **named) response = receiver(signal=self, sender=sender, **named)
@@ -214,15 +204,7 @@ class PluginSignal(Generic[T], django.dispatch.Signal):
if not app_cache: if not app_cache:
_populate_app_cache() _populate_app_cache()
for receiver in self._sorted_receivers(sender)[0]: for receiver in self._sorted_receivers(sender):
if self._is_receiver_active(sender, receiver):
try:
response = receiver(signal=self, sender=sender, **named)
except Exception as err:
responses.append((receiver, err))
else:
responses.append((receiver, response))
for receiver in self._sorted_receivers(sender)[1]:
if self._is_receiver_active(sender, receiver): if self._is_receiver_active(sender, receiver):
try: try:
response = receiver(signal=self, sender=sender, **named) response = receiver(signal=self, sender=sender, **named)
@@ -233,33 +215,16 @@ class PluginSignal(Generic[T], django.dispatch.Signal):
return responses return responses
def _sorted_receivers(self, sender): def _sorted_receivers(self, sender):
orig_list_sync = self._live_receivers(sender)[0] orig_list = self._live_receivers(sender)
# todo: _live_receivers changed return value from [] to [], [] sorted_list = sorted(
orig_list_async = self._live_receivers(sender)[1] orig_list,
def _receiver_module(receiver):
return getattr(receiver, "__module__", receiver.__class__.__module__)
def _receiver_name(receiver):
return getattr(receiver, "__name__", receiver.__class__.__name__)
sorted_list_sync = sorted(
orig_list_sync,
key=lambda receiver: ( key=lambda receiver: (
0 if any(_receiver_module(receiver).startswith(m) for m in settings.CORE_MODULES) else 1, 0 if any(receiver.__module__.startswith(m) for m in settings.CORE_MODULES) else 1,
_receiver_module(receiver), receiver.__module__,
_receiver_name(receiver), receiver.__name__,
) )
) )
sorted_list_async = sorted( return sorted_list
orig_list_async,
key=lambda receiver: (
0 if any(_receiver_module(receiver).startswith(m) for m in settings.CORE_MODULES) else 1,
_receiver_module(receiver),
_receiver_name(receiver),
)
)
return sorted_list_sync, sorted_list_async
class EventPluginSignal(PluginSignal[Event]): class EventPluginSignal(PluginSignal[Event]):

View File

@@ -93,7 +93,9 @@ def timeline_for_event(event, subevent=None):
description=format_lazy( description=format_lazy(
'{} ({})', '{} ({})',
pgettext_lazy('timeline', 'End of ticket sales'), pgettext_lazy('timeline', 'End of ticket sales'),
pgettext_lazy('timeline', 'automatically because the event is over and no end of presale has been configured') if not ev.presale_end else "" pgettext_lazy('timeline', 'automatically because the event is over and no end of presale has been configured')
) if not ev.presale_end else (
pgettext_lazy('timeline', 'End of ticket sales')
), ),
edit_url=ev_edit_url + '#id_presale_end_0' edit_url=ev_edit_url + '#id_presale_end_0'
)) ))

View File

@@ -1958,6 +1958,13 @@ class EventFooterLinkForm(I18nModelForm):
class Meta: class Meta:
model = EventFooterLink model = EventFooterLink
fields = ('label', 'url') fields = ('label', 'url')
widgets = {
"url": forms.URLInput(
attrs={
"placeholder": "https://..."
}
)
}
class BaseEventFooterLinkFormSet(I18nFormSetMixin, forms.BaseInlineFormSet): class BaseEventFooterLinkFormSet(I18nFormSetMixin, forms.BaseInlineFormSet):

View File

@@ -974,7 +974,7 @@ class EventCancelForm(FormPlaceholderMixin, forms.Form):
self._set_field_placeholders('send_subject', ['event_or_subevent', 'refund_amount', 'position_or_address', self._set_field_placeholders('send_subject', ['event_or_subevent', 'refund_amount', 'position_or_address',
'order', 'event']) 'order', 'event'])
self._set_field_placeholders('send_message', ['event_or_subevent', 'refund_amount', 'position_or_address', self._set_field_placeholders('send_message', ['event_or_subevent', 'refund_amount', 'position_or_address',
'order', 'event']) 'order', 'event'], rich=True)
self.fields['send_waitinglist_subject'] = I18nFormField( self.fields['send_waitinglist_subject'] = I18nFormField(
label=_("Subject"), label=_("Subject"),
required=True, required=True,
@@ -998,7 +998,7 @@ class EventCancelForm(FormPlaceholderMixin, forms.Form):
)) ))
) )
self._set_field_placeholders('send_waitinglist_subject', ['event_or_subevent', 'event']) self._set_field_placeholders('send_waitinglist_subject', ['event_or_subevent', 'event'])
self._set_field_placeholders('send_waitinglist_message', ['event_or_subevent', 'event']) self._set_field_placeholders('send_waitinglist_message', ['event_or_subevent', 'event'], rich=True)
if self.event.has_subevents: if self.event.has_subevents:
self.fields['subevent'].queryset = self.event.subevents.all() self.fields['subevent'].queryset = self.event.subevents.all()

View File

@@ -1024,6 +1024,13 @@ class OrganizerFooterLinkForm(I18nModelForm):
class Meta: class Meta:
model = OrganizerFooterLink model = OrganizerFooterLink
fields = ('label', 'url') fields = ('label', 'url')
widgets = {
"url": forms.URLInput(
attrs={
"placeholder": "https://..."
}
)
}
class BaseOrganizerFooterLinkFormSet(I18nFormSetMixin, forms.BaseInlineFormSet): class BaseOrganizerFooterLinkFormSet(I18nFormSetMixin, forms.BaseInlineFormSet):

View File

@@ -60,7 +60,6 @@ from pretix.base.models import (
) )
from pretix.base.services.quotas import QuotaAvailability from pretix.base.services.quotas import QuotaAvailability
from pretix.base.timeline import timeline_for_event from pretix.base.timeline import timeline_for_event
from pretix.control.forms.event import CommentForm
from pretix.control.signals import ( from pretix.control.signals import (
event_dashboard_widgets, user_dashboard_widgets, event_dashboard_widgets, user_dashboard_widgets,
) )
@@ -341,6 +340,8 @@ def welcome_wizard_widget(sender, **kwargs):
def event_index(request, organizer, event): def event_index(request, organizer, event):
from pretix.control.forms.event import CommentForm
subevent = None subevent = None
if request.GET.get("subevent", "") != "" and request.event.has_subevents: if request.GET.get("subevent", "") != "" and request.event.has_subevents:
i = request.GET.get("subevent", "") i = request.GET.get("subevent", "")

View File

@@ -98,7 +98,6 @@ from pretix.control.views.mailsetup import MailSettingsSetupView
from pretix.control.views.user import RecentAuthenticationRequiredMixin from pretix.control.views.user import RecentAuthenticationRequiredMixin
from pretix.helpers.database import rolledback_transaction from pretix.helpers.database import rolledback_transaction
from pretix.multidomain.urlreverse import build_absolute_uri, get_event_domain from pretix.multidomain.urlreverse import build_absolute_uri, get_event_domain
from pretix.plugins.stripe.payment import StripeSettingsHolder
from pretix.presale.views.widget import ( from pretix.presale.views.widget import (
version_default as widget_version_default, version_default as widget_version_default,
) )
@@ -1666,6 +1665,8 @@ class QuickSetupView(FormView):
'or take your event live to start selling!')) 'or take your event live to start selling!'))
if form.cleaned_data.get('payment_stripe__enabled', False): if form.cleaned_data.get('payment_stripe__enabled', False):
from pretix.plugins.stripe.payment import StripeSettingsHolder
self.request.session['payment_stripe_oauth_enable'] = True self.request.session['payment_stripe_oauth_enable'] = True
return redirect(StripeSettingsHolder(self.request.event).get_connect_url(self.request)) return redirect(StripeSettingsHolder(self.request.event).get_connect_url(self.request))

View File

@@ -156,7 +156,7 @@ class BaseProcessView(AsyncAction, FormView):
) )
) )
reader = parse_csv(self.file.file, 1024 * 1024, "replace", charset=charset) reader = parse_csv(self.file.file, 1024 * 1024, "replace", charset=charset)
if reader._had_duplicates: if reader and reader._had_duplicates:
messages.warning( messages.warning(
self.request, self.request,
_( _(

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: 2025-11-27 13:57+0000\n" "POT-Creation-Date: 2025-11-27 13:57+0000\n"
"PO-Revision-Date: 2025-12-03 23:00+0000\n" "PO-Revision-Date: 2025-12-05 18:00+0000\n"
"Last-Translator: sandra r <sandrarial@gestiontickets.online>\n" "Last-Translator: sandra r <sandrarial@gestiontickets.online>\n"
"Language-Team: Galician <https://translate.pretix.eu/projects/pretix/pretix/" "Language-Team: Galician <https://translate.pretix.eu/projects/pretix/pretix/"
"gl/>\n" "gl/>\n"
@@ -721,7 +721,7 @@ msgid_plural ""
msgstr[0] "O teu contrasinal non sexa o mesmo que o teu contrasinal anterior." msgstr[0] "O teu contrasinal non sexa o mesmo que o teu contrasinal anterior."
msgstr[1] "" msgstr[1] ""
"O teu contrasinal non sexa o mesmo que un dos teus contrasinais anteriores " "O teu contrasinal non sexa o mesmo que un dos teus contrasinais anteriores "
"de %(history_length)." "de %(history_length)s."
#: pretix/base/channels.py:168 #: pretix/base/channels.py:168
msgid "Online shop" msgid "Online shop"
@@ -3329,42 +3329,48 @@ msgid ""
"Upload a valid image. The file you uploaded was either not an image or a " "Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image." "corrupted image."
msgstr "" msgstr ""
"Carga unha imaxe válida. O ficheiro que cargaches ou non era unha imaxe ou "
"estaba danado."
#: pretix/base/forms/questions.py:653 pretix/base/forms/questions.py:662 #: pretix/base/forms/questions.py:653 pretix/base/forms/questions.py:662
msgid "" msgid ""
"If you keep this empty, the ticket will be valid starting at the time of " "If you keep this empty, the ticket will be valid starting at the time of "
"purchase." "purchase."
msgstr "" msgstr ""
"Se o deixas baleiro, o billete será válido a partir do momento da compra."
#: pretix/base/forms/questions.py:709 pretix/base/forms/questions.py:1102 #: pretix/base/forms/questions.py:709 pretix/base/forms/questions.py:1102
#, fuzzy
msgid "Street and Number" msgid "Street and Number"
msgstr "Calle y número" msgstr "Rúa e Número"
#: pretix/base/forms/questions.py:1166 #: pretix/base/forms/questions.py:1166
msgid "" msgid ""
"Optional, but depending on the country you reside in we might need to charge " "Optional, but depending on the country you reside in we might need to charge "
"you additional taxes if you do not enter it." "you additional taxes if you do not enter it."
msgstr "" msgstr ""
"Opcional, pero dependendo do país no que residas, pode que teñamos que "
"cobrarche impostos adicionais se non o introduces."
#: pretix/base/forms/questions.py:1168 pretix/base/forms/questions.py:1174 #: pretix/base/forms/questions.py:1168 pretix/base/forms/questions.py:1174
msgid "If you are registered in Switzerland, you can enter your UID instead." msgid "If you are registered in Switzerland, you can enter your UID instead."
msgstr "" msgstr ""
"Se estás rexistrado/a en Suíza, podes introducir o teu UID no seu lugar."
#: pretix/base/forms/questions.py:1172 #: pretix/base/forms/questions.py:1172
msgid "" msgid ""
"Optional, but it might be required for you to claim tax benefits on your " "Optional, but it might be required for you to claim tax benefits on your "
"invoice depending on your and the sellers country of residence." "invoice depending on your and the sellers country of residence."
msgstr "" msgstr ""
"Opcional, pero pode ser necesario para que solicites beneficios fiscais na "
"túa factura dependendo do teu país de residencia e do vendedor."
#: pretix/base/forms/questions.py:1181 #: pretix/base/forms/questions.py:1181
#, fuzzy
msgid "No invoice requested" msgid "No invoice requested"
msgstr "Tarifa de cancelación" msgstr "Non se solicitou factura"
#: pretix/base/forms/questions.py:1183 #: pretix/base/forms/questions.py:1183
msgid "Invoice transmission method" msgid "Invoice transmission method"
msgstr "" msgstr "Método de transmisión de facturas"
#: pretix/base/forms/questions.py:1329 #: pretix/base/forms/questions.py:1329
msgid "You need to provide a company name." msgid "You need to provide a company name."
@@ -3379,111 +3385,101 @@ msgid ""
"If you enter an invoice address, you also need to select an invoice " "If you enter an invoice address, you also need to select an invoice "
"transmission method." "transmission method."
msgstr "" msgstr ""
"Se introduces un enderezo de facturación, tamén debes seleccionar un método "
"de transmisión da factura."
#: pretix/base/forms/questions.py:1385 #: pretix/base/forms/questions.py:1385
#, fuzzy
msgid "" msgid ""
"The selected transmission type is not available in your country or for your " "The selected transmission type is not available in your country or for your "
"type of address." "type of address."
msgstr "El producto seleccionado no está activo o no tiene precio fijo." msgstr ""
"O tipo de transmisión seleccionado non está dispoñible no seu país nin para "
"o seu tipo de enderezo."
#: pretix/base/forms/questions.py:1394 #: pretix/base/forms/questions.py:1394
msgid "" msgid ""
"The selected type of invoice transmission requires a field that is currently " "The selected type of invoice transmission requires a field that is currently "
"not available, please reach out to the organizer." "not available, please reach out to the organizer."
msgstr "" msgstr ""
"O tipo de transmisión de factura seleccionado require un campo que non está "
"dispoñible actualmente. Ponte en contacto co organizador."
#: pretix/base/forms/questions.py:1398 #: pretix/base/forms/questions.py:1398
msgid "This field is required for the selected type of invoice transmission." msgid "This field is required for the selected type of invoice transmission."
msgstr "" msgstr ""
"Este campo é obrigatorio para o tipo de transmisión de factura seleccionado."
#: pretix/base/forms/user.py:54 pretix/control/forms/organizer.py:458 #: pretix/base/forms/user.py:54 pretix/control/forms/organizer.py:458
#: pretix/control/forms/users.py:58 #: pretix/control/forms/users.py:58
#, fuzzy
msgid "Default timezone" msgid "Default timezone"
msgstr "Zona horaria predefinida" msgstr "Fuso horario predeterminado"
#: pretix/base/forms/user.py:55 pretix/control/forms/users.py:59 #: pretix/base/forms/user.py:55 pretix/control/forms/users.py:59
#, fuzzy
msgid "" msgid ""
"Only used for views that are not bound to an event. For all event views, the " "Only used for views that are not bound to an event. For all event views, the "
"event timezone is used instead." "event timezone is used instead."
msgstr "" msgstr ""
"Sólo se utiliza para vistas que no están vinculadas a un evento. Para todas " "Só se usa para vistas que non están vinculadas a un evento. Para todas as "
"las vistas de eventos, se utiliza la zona horaria de eventos." "vistas de eventos, úsase o fuso horario do evento."
#: pretix/base/forms/user.py:77 #: pretix/base/forms/user.py:77
#, fuzzy
#| msgid "Attendee email address"
msgid "Change email address" msgid "Change email address"
msgstr "Correo electrónico do participante" msgstr "Cambiar enderezo de correo electrónico"
#: pretix/base/forms/user.py:83 #: pretix/base/forms/user.py:83
msgid "Device name" msgid "Device name"
msgstr "Nombre do dispositivo" msgstr "Nombre do dispositivo"
#: pretix/base/forms/user.py:84 #: pretix/base/forms/user.py:84
#, fuzzy
msgid "Device type" msgid "Device type"
msgstr "Tipo de dispositivo" msgstr "Tipo de dispositivo"
#: pretix/base/forms/user.py:85 #: pretix/base/forms/user.py:85
#, fuzzy
msgid "Smartphone with the Authenticator application" msgid "Smartphone with the Authenticator application"
msgstr "Celular con aplicación de autenticación" msgstr "Teléfono intelixente coa aplicación Authenticator"
#: pretix/base/forms/user.py:86 #: pretix/base/forms/user.py:86
#, fuzzy
msgid "WebAuthn-compatible hardware token (e.g. Yubikey)" msgid "WebAuthn-compatible hardware token (e.g. Yubikey)"
msgstr "Hardware compatible con token WebAuthn (p. ej. Yubikey)" msgstr "Token de hardware compatible con WebAuthn (por exemplo, Yubikey)"
#: pretix/base/forms/user.py:92 pretix/presale/forms/customer.py:383 #: pretix/base/forms/user.py:92 pretix/presale/forms/customer.py:383
#: pretix/presale/forms/customer.py:456 #: pretix/presale/forms/customer.py:456
#, fuzzy
msgid "The current password you entered was not correct." msgid "The current password you entered was not correct."
msgstr "La contraseña actual que ingresó no es correcta." msgstr "O contrasinal actual que introduciches non era correcto."
#: pretix/base/forms/user.py:95 #: pretix/base/forms/user.py:95
msgid "Please choose a password different to your current one." msgid "Please choose a password different to your current one."
msgstr "" msgstr "Escolle un contrasinal diferente ao teu actual."
#: pretix/base/forms/user.py:105 pretix/presale/forms/customer.py:392 #: pretix/base/forms/user.py:105 pretix/presale/forms/customer.py:392
#: pretix/presale/forms/customer.py:461 #: pretix/presale/forms/customer.py:461
#, fuzzy
msgid "Your current password" msgid "Your current password"
msgstr "Su contraseña actual" msgstr "O teu contrasinal actual"
#: pretix/base/forms/user.py:111 pretix/control/forms/users.py:50 #: pretix/base/forms/user.py:111 pretix/control/forms/users.py:50
#: pretix/presale/forms/customer.py:397 #: pretix/presale/forms/customer.py:397
#, fuzzy
msgid "New password" msgid "New password"
msgstr "Nueva contraseña" msgstr "New password"
#: pretix/base/forms/user.py:117 pretix/control/forms/users.py:54 #: pretix/base/forms/user.py:117 pretix/control/forms/users.py:54
#, fuzzy
msgid "Repeat new password" msgid "Repeat new password"
msgstr "Repetir la nueva contraseña" msgstr "Repita o novo contrasinal"
#: pretix/base/forms/user.py:176 pretix/control/forms/users.py:43 #: pretix/base/forms/user.py:176 pretix/control/forms/users.py:43
#, fuzzy
msgid "" msgid ""
"There already is an account associated with this email address. Please " "There already is an account associated with this email address. Please "
"choose a different one." "choose a different one."
msgstr "" msgstr ""
"Ya existe una cuenta asociada a este correo electrónico. Por favor, escoja " "Xa existe unha conta asociada a este enderezo de correo electrónico. Escolle "
"otro." "unha diferente."
#: pretix/base/forms/user.py:179 #: pretix/base/forms/user.py:179
#, fuzzy
#| msgid "Email address"
msgid "Old email address" msgid "Old email address"
msgstr "Correo electrónico" msgstr "Enderezo de correo electrónico antigo"
#: pretix/base/forms/user.py:180 #: pretix/base/forms/user.py:180
#, fuzzy
#| msgid "Email address"
msgid "New email address" msgid "New email address"
msgstr "Correo electrónico" msgstr "Novo enderezo de correo electrónico"
#: pretix/base/forms/validators.py:51 #: pretix/base/forms/validators.py:51
msgid "" msgid ""
@@ -3492,29 +3488,32 @@ msgid ""
"up. Please note: to use literal \"{\" or \"}\", you need to double them as " "up. Please note: to use literal \"{\" or \"}\", you need to double them as "
"\"{{\" and \"}}\"." "\"{{\" and \"}}\"."
msgstr "" msgstr ""
"Hai un erro coa sintaxe dos marcadores de posición. Comproba que as "
"corchetes de apertura \"{\" e de peche \"}\" dos marcadores de posición "
"coincidan. Ten en conta que para usar \"{\" ou \"}\" literal, debes "
"duplicalos como \"{{\" e \"}}\"."
#: pretix/base/forms/validators.py:72 pretix/control/views/event.py:870 #: pretix/base/forms/validators.py:72 pretix/control/views/event.py:870
#, fuzzy, python-format #, python-format
msgid "Invalid placeholder: {%(value)s}" msgid "Invalid placeholder: {%(value)s}"
msgstr "Persona(s) interesada(s) inválida(s): %(value)s" msgstr "Marcador de posición non válido: {%(value)s}"
#: pretix/base/forms/widgets.py:68 #: pretix/base/forms/widgets.py:68
#, fuzzy, python-format #, python-format
msgid "Sample: %s" msgid "Sample: %s"
msgstr "Ciudad de ejemplo" msgstr "Mostra: %s"
#: pretix/base/forms/widgets.py:71 #: pretix/base/forms/widgets.py:71
#, python-brace-format #, python-brace-format
msgid "Available placeholders: {list}" msgid "Available placeholders: {list}"
msgstr "" msgstr "Marcadores de posición dispoñibles: {list}"
#: pretix/base/forms/widgets.py:214 pretix/base/models/items.py:1655 #: pretix/base/forms/widgets.py:214 pretix/base/models/items.py:1655
#: pretix/plugins/checkinlists/exporters.py:757 #: pretix/plugins/checkinlists/exporters.py:757
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:40 #: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:40
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:54 #: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:54
#, fuzzy
msgid "Time" msgid "Time"
msgstr "Hora" msgstr "Tempo"
#: pretix/base/forms/widgets.py:234 pretix/base/forms/widgets.py:239 #: pretix/base/forms/widgets.py:234 pretix/base/forms/widgets.py:239
msgid "Business or institutional customer" msgid "Business or institutional customer"
@@ -3527,53 +3526,49 @@ msgstr "Cliente individual"
#: pretix/base/invoicing/email.py:50 #: pretix/base/invoicing/email.py:50
msgid "Email invoice directly to accounting department" msgid "Email invoice directly to accounting department"
msgstr "" msgstr ""
"Enviar factura por correo electrónico directamente ao departamento de "
"contabilidade"
#: pretix/base/invoicing/email.py:51 #: pretix/base/invoicing/email.py:51
#, fuzzy
#| msgid "Please enter the same email address twice."
msgid "" msgid ""
"If not selected, the invoice will be sent to you using the email address " "If not selected, the invoice will be sent to you using the email address "
"listed above." "listed above."
msgstr "Introduce o mesmo enderezo de correo electrónico dúas veces." msgstr ""
"Se non se selecciona, a factura enviaraseche usando o enderezo de correo "
"electrónico indicado anteriormente."
#: pretix/base/invoicing/email.py:55 #: pretix/base/invoicing/email.py:55
#, fuzzy
#| msgid "Email address verified"
msgid "Email address for invoice" msgid "Email address for invoice"
msgstr "Correo electrónico verificado" msgstr "Enderezo de correo electrónico para factura"
#: pretix/base/invoicing/email.py:91 #: pretix/base/invoicing/email.py:91
#, fuzzy
msgid "PDF via email" msgid "PDF via email"
msgstr "Vista previa del correo electrónico" msgstr "PDF por correo electrónico"
#: pretix/base/invoicing/national.py:37 #: pretix/base/invoicing/national.py:37
msgctxt "italian_invoice" msgctxt "italian_invoice"
msgid "Italian Exchange System (SdI)" msgid "Italian Exchange System (SdI)"
msgstr "" msgstr "Sistema de intercambio italiano (SdI)"
#: pretix/base/invoicing/national.py:38 #: pretix/base/invoicing/national.py:38
msgctxt "italian_invoice" msgctxt "italian_invoice"
msgid "Exchange System (SdI)" msgid "Exchange System (SdI)"
msgstr "" msgstr "Sistema de intercambio (SdI)"
#: pretix/base/invoicing/national.py:49 #: pretix/base/invoicing/national.py:49
#, fuzzy
#| msgid "Gift card code"
msgctxt "italian_invoice" msgctxt "italian_invoice"
msgid "Fiscal code" msgid "Fiscal code"
msgstr "Código da tarxeta de regalo" msgstr "Código fiscal"
#: pretix/base/invoicing/national.py:53 #: pretix/base/invoicing/national.py:53
msgctxt "italian_invoice" msgctxt "italian_invoice"
msgid "Address for certified electronic mail" msgid "Address for certified electronic mail"
msgstr "" msgstr "Enderezo para correo electrónico certificado"
#: pretix/base/invoicing/national.py:57 #: pretix/base/invoicing/national.py:57
#, fuzzy
msgctxt "italian_invoice" msgctxt "italian_invoice"
msgid "Recipient code" msgid "Recipient code"
msgstr "Destinatario" msgstr "Código do destinatario"
#: pretix/base/invoicing/national.py:81 #: pretix/base/invoicing/national.py:81
msgctxt "italian_invoice" msgctxt "italian_invoice"
@@ -3583,75 +3578,68 @@ msgid ""
"in accordance with the procedures and terms set forth in No. 89757/2018 of " "in accordance with the procedures and terms set forth in No. 89757/2018 of "
"April 30, 2018, issued by the Director of the Revenue Agency." "April 30, 2018, issued by the Director of the Revenue Agency."
msgstr "" msgstr ""
"Este documento PDF é unha copia visual da factura e non constitúe unha "
"factura para efectos do IVE. A factura emítese en formato XML, transmitida "
"de acordo cos procedementos e termos establecidos no Regulamento n.º 89757/"
"2018, do 30 de abril de 2018, emitido polo Director da Axencia Tributaria."
#: pretix/base/invoicing/pdf.py:143 #: pretix/base/invoicing/pdf.py:143
#, fuzzy, python-format #, python-format
msgctxt "invoice" msgctxt "invoice"
msgid "Page %d of %d" msgid "Page %d of %d"
msgstr "Página %d de %d" msgstr "Páxina %d de %d"
#: pretix/base/invoicing/pdf.py:384 #: pretix/base/invoicing/pdf.py:384
#, fuzzy
msgctxt "invoice" msgctxt "invoice"
msgid "Classic renderer (pretix 1.0)" msgid "Classic renderer (pretix 1.0)"
msgstr "Versión clásica (pretix 1.0)" msgstr "Renderizador clásico (pretix 1.0)"
#: pretix/base/invoicing/pdf.py:428 #: pretix/base/invoicing/pdf.py:428
#, fuzzy
msgctxt "invoice" msgctxt "invoice"
msgid "Invoice from" msgid "Invoice from"
msgstr "Factura de" msgstr "Factura dende"
#: pretix/base/invoicing/pdf.py:434 #: pretix/base/invoicing/pdf.py:434
#, fuzzy
msgctxt "invoice" msgctxt "invoice"
msgid "Invoice to" msgid "Invoice to"
msgstr "Factura para" msgstr "Factura ata"
#: pretix/base/invoicing/pdf.py:471 pretix/base/invoicing/pdf.py:1222 #: pretix/base/invoicing/pdf.py:471 pretix/base/invoicing/pdf.py:1222
#, fuzzy
msgctxt "invoice" msgctxt "invoice"
msgid "Order code" msgid "Order code"
msgstr "Código de la orden" msgstr "Código de pedido"
#: pretix/base/invoicing/pdf.py:480 pretix/base/invoicing/pdf.py:1235 #: pretix/base/invoicing/pdf.py:480 pretix/base/invoicing/pdf.py:1235
#, fuzzy
msgctxt "invoice" msgctxt "invoice"
msgid "Cancellation number" msgid "Cancellation number"
msgstr "Número de cancelación" msgstr "Número de cancelación"
#: pretix/base/invoicing/pdf.py:486 pretix/base/invoicing/pdf.py:1237 #: pretix/base/invoicing/pdf.py:486 pretix/base/invoicing/pdf.py:1237
#, fuzzy
msgctxt "invoice" msgctxt "invoice"
msgid "Original invoice" msgid "Original invoice"
msgstr "Factura original" msgstr "Factura orixinal"
#: pretix/base/invoicing/pdf.py:491 pretix/base/invoicing/pdf.py:1242 #: pretix/base/invoicing/pdf.py:491 pretix/base/invoicing/pdf.py:1242
#, fuzzy
msgctxt "invoice" msgctxt "invoice"
msgid "Invoice number" msgid "Invoice number"
msgstr "Número de factura" msgstr "Número de factura"
#: pretix/base/invoicing/pdf.py:499 pretix/base/invoicing/pdf.py:1257 #: pretix/base/invoicing/pdf.py:499 pretix/base/invoicing/pdf.py:1257
#, fuzzy
msgctxt "invoice" msgctxt "invoice"
msgid "Cancellation date" msgid "Cancellation date"
msgstr "Fecha de cancelación" msgstr "Data de cancelación"
#: pretix/base/invoicing/pdf.py:505 #: pretix/base/invoicing/pdf.py:505
#, fuzzy
msgctxt "invoice" msgctxt "invoice"
msgid "Original invoice date" msgid "Original invoice date"
msgstr "Fecha original de la factura" msgstr "Data orixinal da factura"
#: pretix/base/invoicing/pdf.py:512 pretix/base/invoicing/pdf.py:1259 #: pretix/base/invoicing/pdf.py:512 pretix/base/invoicing/pdf.py:1259
#, fuzzy
msgctxt "invoice" msgctxt "invoice"
msgid "Invoice date" msgid "Invoice date"
msgstr "Fecha de la factura" msgstr "Data da factura"
#: pretix/base/invoicing/pdf.py:528 #: pretix/base/invoicing/pdf.py:528
#, fuzzy
msgctxt "invoice" msgctxt "invoice"
msgid "Event" msgid "Event"
msgstr "Evento" msgstr "Evento"
@@ -3667,7 +3655,7 @@ msgstr ""
" ata {to_date}" " ata {to_date}"
#: pretix/base/invoicing/pdf.py:609 pretix/base/services/mail.py:512 #: pretix/base/invoicing/pdf.py:609 pretix/base/services/mail.py:512
#, fuzzy, python-brace-format #, python-brace-format
msgctxt "invoice" msgctxt "invoice"
msgid "Invoice {num}" msgid "Invoice {num}"
msgstr "Factura {num}" msgstr "Factura {num}"
@@ -3679,25 +3667,21 @@ msgid "Customer reference: {reference}"
msgstr "Referencia do cliente: {reference}" msgstr "Referencia do cliente: {reference}"
#: pretix/base/invoicing/pdf.py:669 #: pretix/base/invoicing/pdf.py:669
#, fuzzy
msgctxt "invoice" msgctxt "invoice"
msgid "Customer VAT ID" msgid "Customer VAT ID"
msgstr "Cliente VAT ID" msgstr "CIF do cliente"
#: pretix/base/invoicing/pdf.py:676 #: pretix/base/invoicing/pdf.py:676
#, fuzzy
msgctxt "invoice" msgctxt "invoice"
msgid "Beneficiary" msgid "Beneficiary"
msgstr "Beneficiario" msgstr "Beneficiario"
#: pretix/base/invoicing/pdf.py:709 #: pretix/base/invoicing/pdf.py:709
#, fuzzy
msgctxt "invoice" msgctxt "invoice"
msgid "Tax Invoice" msgid "Tax Invoice"
msgstr "Impuesto de la factura" msgstr "Factura fiscal"
#: pretix/base/invoicing/pdf.py:710 #: pretix/base/invoicing/pdf.py:710
#, fuzzy
msgctxt "invoice" msgctxt "invoice"
msgid "Invoice" msgid "Invoice"
msgstr "Factura" msgstr "Factura"
@@ -3706,7 +3690,6 @@ msgstr "Factura"
#: pretix/control/templates/pretixcontrol/order/index.html:272 #: pretix/control/templates/pretixcontrol/order/index.html:272
#: pretix/control/templates/pretixcontrol/order/mail_history.html:70 #: pretix/control/templates/pretixcontrol/order/mail_history.html:70
#: pretix/presale/templates/pretixpresale/event/order.html:244 #: pretix/presale/templates/pretixpresale/event/order.html:244
#, fuzzy
msgctxt "invoice" msgctxt "invoice"
msgid "Cancellation" msgid "Cancellation"
msgstr "Cancelación" msgstr "Cancelación"
@@ -3724,110 +3707,97 @@ msgid "Qty"
msgstr "Cant." msgstr "Cant."
#: pretix/base/invoicing/pdf.py:735 pretix/base/invoicing/pdf.py:1039 #: pretix/base/invoicing/pdf.py:735 pretix/base/invoicing/pdf.py:1039
#, fuzzy
msgctxt "invoice" msgctxt "invoice"
msgid "Tax rate" msgid "Tax rate"
msgstr "Tasa de impuestos" msgstr "Tipo impositivo"
#: pretix/base/invoicing/pdf.py:736 #: pretix/base/invoicing/pdf.py:736
#, fuzzy
msgctxt "invoice" msgctxt "invoice"
msgid "Net" msgid "Net"
msgstr "Neto" msgstr "Neto"
#: pretix/base/invoicing/pdf.py:737 #: pretix/base/invoicing/pdf.py:737
#, fuzzy
msgctxt "invoice" msgctxt "invoice"
msgid "Gross" msgid "Gross"
msgstr "Bruto" msgstr "Bruto"
#: pretix/base/invoicing/pdf.py:743 #: pretix/base/invoicing/pdf.py:743
#, fuzzy
msgctxt "invoice" msgctxt "invoice"
msgid "Amount" msgid "Amount"
msgstr "Monto" msgstr "Cantidade"
#: pretix/base/invoicing/pdf.py:870 #: pretix/base/invoicing/pdf.py:870
#, python-brace-format #, python-brace-format
msgctxt "invoice" msgctxt "invoice"
msgid "Single price: {net_price} net / {gross_price} gross" msgid "Single price: {net_price} net / {gross_price} gross"
msgstr "" msgstr "Prezo único: {net_price} neto / {gross_price} bruto"
#: pretix/base/invoicing/pdf.py:901 #: pretix/base/invoicing/pdf.py:901
#, fuzzy, python-brace-format #, python-brace-format
msgctxt "invoice" msgctxt "invoice"
msgid "Single price: {price}" msgid "Single price: {price}"
msgstr "Precio original" msgstr "Prezo único: {price}"
#: pretix/base/invoicing/pdf.py:944 pretix/base/invoicing/pdf.py:949 #: pretix/base/invoicing/pdf.py:944 pretix/base/invoicing/pdf.py:949
#, fuzzy
msgctxt "invoice" msgctxt "invoice"
msgid "Invoice total" msgid "Invoice total"
msgstr "Total de la factura" msgstr "Total da factura"
#: pretix/base/invoicing/pdf.py:958 #: pretix/base/invoicing/pdf.py:958
#, fuzzy
msgctxt "invoice" msgctxt "invoice"
msgid "Received payments" msgid "Received payments"
msgstr "Pagos recibidos" msgstr "Pagos recibidos"
#: pretix/base/invoicing/pdf.py:963 #: pretix/base/invoicing/pdf.py:963
#, fuzzy
msgctxt "invoice" msgctxt "invoice"
msgid "Outstanding payments" msgid "Outstanding payments"
msgstr "Pagos no válidos" msgstr "Pagos pendentes"
#: pretix/base/invoicing/pdf.py:980 #: pretix/base/invoicing/pdf.py:980
#, fuzzy
msgctxt "invoice" msgctxt "invoice"
msgid "Paid by gift card" msgid "Paid by gift card"
msgstr "Tarjeta de crédito" msgstr "Pago con tarxeta regalo"
#: pretix/base/invoicing/pdf.py:985 #: pretix/base/invoicing/pdf.py:985
#, fuzzy
msgctxt "invoice" msgctxt "invoice"
msgid "Remaining amount" msgid "Remaining amount"
msgstr "Monto pendiente" msgstr "Cantidade restante"
#: pretix/base/invoicing/pdf.py:1009 #: pretix/base/invoicing/pdf.py:1009
#, fuzzy, python-brace-format #, python-brace-format
msgctxt "invoice" msgctxt "invoice"
msgid "Invoice period: {daterange}" msgid "Invoice period: {daterange}"
msgstr "Rango de fechas de evento" msgstr "Período de facturación: {daterange}"
#: pretix/base/invoicing/pdf.py:1040 #: pretix/base/invoicing/pdf.py:1040
#, fuzzy
msgctxt "invoice" msgctxt "invoice"
msgid "Net value" msgid "Net value"
msgstr "Valor neto" msgstr "Valor neto"
#: pretix/base/invoicing/pdf.py:1041 #: pretix/base/invoicing/pdf.py:1041
#, fuzzy
msgctxt "invoice" msgctxt "invoice"
msgid "Gross value" msgid "Gross value"
msgstr "Valor bruto" msgstr "Valor bruto"
#: pretix/base/invoicing/pdf.py:1042 #: pretix/base/invoicing/pdf.py:1042
#, fuzzy
msgctxt "invoice" msgctxt "invoice"
msgid "Tax" msgid "Tax"
msgstr "Impuesto" msgstr "Imposto"
#: pretix/base/invoicing/pdf.py:1072 #: pretix/base/invoicing/pdf.py:1072
#, fuzzy
msgctxt "invoice" msgctxt "invoice"
msgid "Included taxes" msgid "Included taxes"
msgstr "Impuestos incluidos" msgstr "Impostos incluídos"
#: pretix/base/invoicing/pdf.py:1100 #: pretix/base/invoicing/pdf.py:1100
#, fuzzy, python-brace-format #, python-brace-format
msgctxt "invoice" msgctxt "invoice"
msgid "" msgid ""
"Using the conversion rate of 1:{rate} as published by the {authority} on " "Using the conversion rate of 1:{rate} as published by the {authority} on "
"{date}, this corresponds to:" "{date}, this corresponds to:"
msgstr "" msgstr ""
"Utilizando el tipo de conversión de 1:{rate} publicado por el Banco Central " "Usando a taxa de conversión de 1:{rate} tal e como a publicou {authority} o "
"Europeo el {date}, esto corresponde a:" "{date}, isto corresponde a:"
#: pretix/base/invoicing/pdf.py:1115 #: pretix/base/invoicing/pdf.py:1115
#, fuzzy, python-brace-format #, fuzzy, python-brace-format
@@ -3836,33 +3806,34 @@ msgid ""
"Using the conversion rate of 1:{rate} as published by the {authority} on " "Using the conversion rate of 1:{rate} as published by the {authority} on "
"{date}, the invoice total corresponds to {total}." "{date}, the invoice total corresponds to {total}."
msgstr "" msgstr ""
"Utilizando el tipo de conversión de 1:{rate} publicado por el Banco Central " "Usando a taxa de conversión de 1:{rate} publicada pola {authority} o {date}, "
"Europeo el {date}, el total de la factura corresponde a {total}." "o total da factura corresponde a {total}."
#: pretix/base/invoicing/pdf.py:1129 #: pretix/base/invoicing/pdf.py:1129
msgid "Default invoice renderer (European-style letter)" msgid "Default invoice renderer (European-style letter)"
msgstr "" msgstr "Renderizador de facturas predeterminado (carta de estilo europeo)"
#: pretix/base/invoicing/pdf.py:1218 #: pretix/base/invoicing/pdf.py:1218
#, fuzzy
msgctxt "invoice" msgctxt "invoice"
msgid "(Please quote at all times.)" msgid "(Please quote at all times.)"
msgstr "Por favor, seleccione una cuota." msgstr "(Por favor, cite en todo momento.)"
#: pretix/base/invoicing/pdf.py:1265 #: pretix/base/invoicing/pdf.py:1265
msgid "Simplified invoice renderer" msgid "Simplified invoice renderer"
msgstr "" msgstr "Renderizador de facturas simplificado"
#: pretix/base/invoicing/pdf.py:1284 #: pretix/base/invoicing/pdf.py:1284
#, fuzzy, python-brace-format #, fuzzy, python-brace-format
msgctxt "invoice" msgctxt "invoice"
msgid "Event date: {date_range}" msgid "Event date: {date_range}"
msgstr "Rango de fechas de evento" msgstr "Data do evento: {date_range}"
#: pretix/base/invoicing/peppol.py:128 #: pretix/base/invoicing/peppol.py:128
msgid "" msgid ""
"A Peppol participant ID always starts with a prefix, followed by a colon (:)." "A Peppol participant ID always starts with a prefix, followed by a colon (:)."
msgstr "" msgstr ""
"Un ID de participante de Peppol sempre comeza cun prefixo, seguido de dous "
"puntos (:)."
#: pretix/base/invoicing/peppol.py:132 #: pretix/base/invoicing/peppol.py:132
#, python-format #, python-format
@@ -3870,6 +3841,8 @@ msgid ""
"The Peppol participant ID prefix %(number)s is not known to our system. " "The Peppol participant ID prefix %(number)s is not known to our system. "
"Please reach out to us if you are sure this ID is correct." "Please reach out to us if you are sure this ID is correct."
msgstr "" msgstr ""
"O noso sistema descoñece o prefixo do ID de participante de Peppol %(number)"
"s. Ponte en contacto connosco se estás seguro de que este ID é correcto."
#: pretix/base/invoicing/peppol.py:136 #: pretix/base/invoicing/peppol.py:136
#, python-format #, python-format
@@ -3877,17 +3850,18 @@ msgid ""
"The Peppol participant ID does not match the validation rules for the prefix " "The Peppol participant ID does not match the validation rules for the prefix "
"%(number)s. Please reach out to us if you are sure this ID is correct." "%(number)s. Please reach out to us if you are sure this ID is correct."
msgstr "" msgstr ""
"O ID de participante de Peppol non coincide coas regras de validación para o "
"prefixo %(number)s. Ponte en contacto connosco se estás seguro de que este "
"ID é correcto."
#: pretix/base/invoicing/peppol.py:156 #: pretix/base/invoicing/peppol.py:156
msgid "Peppol participant ID" msgid "Peppol participant ID"
msgstr "" msgstr "Identificación de participante de Peppol"
#: pretix/base/invoicing/peppol.py:170 #: pretix/base/invoicing/peppol.py:170
#, fuzzy
#| msgid "Gift card code"
msgctxt "peppol_invoice" msgctxt "peppol_invoice"
msgid "Visual copy" msgid "Visual copy"
msgstr "Código da tarxeta de regalo" msgstr "Copia visual"
#: pretix/base/invoicing/peppol.py:175 #: pretix/base/invoicing/peppol.py:175
msgctxt "peppol_invoice" msgctxt "peppol_invoice"
@@ -3896,27 +3870,30 @@ msgid ""
"invoice for VAT purposes. The original invoice is issued in XML format and " "invoice for VAT purposes. The original invoice is issued in XML format and "
"transmitted through the Peppol network." "transmitted through the Peppol network."
msgstr "" msgstr ""
"Este documento PDF é unha copia visual da factura e non constitúe unha "
"factura para efectos do IVE. A factura orixinal emítese en formato XML e "
"transmítese a través da rede Peppol."
#: pretix/base/logentrytype_registry.py:43 #: pretix/base/logentrytype_registry.py:43
msgid "" msgid ""
"The relevant plugin is currently not active. To activate it, click here to " "The relevant plugin is currently not active. To activate it, click here to "
"go to the plugin settings." "go to the plugin settings."
msgstr "" msgstr ""
"O plugin relevante non está activo actualmente. Para activalo, fai clic aquí "
"para ir á configuración do plugin."
#: pretix/base/logentrytype_registry.py:53 #: pretix/base/logentrytype_registry.py:53
#, fuzzy
msgid "The relevant plugin is currently not active." msgid "The relevant plugin is currently not active."
msgstr "La taquilla seleccionada no está disponible en este momento." msgstr "O plugin relevante non está activo actualmente."
#: pretix/base/logentrytypes.py:49 #: pretix/base/logentrytypes.py:49
#, fuzzy
msgid "(deleted)" msgid "(deleted)"
msgstr "Eliminar" msgstr "(eliminado)"
#: pretix/base/logentrytypes.py:78 #: pretix/base/logentrytypes.py:78
#, fuzzy, python-brace-format #, python-brace-format
msgid "Order {val}" msgid "Order {val}"
msgstr "Orden {val}" msgstr "Orde {val}"
#: pretix/base/logentrytypes.py:90 #: pretix/base/logentrytypes.py:90
#, fuzzy, python-brace-format #, fuzzy, python-brace-format

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: 2025-11-27 13:57+0000\n" "POT-Creation-Date: 2025-11-27 13:57+0000\n"
"PO-Revision-Date: 2025-11-26 17:00+0000\n" "PO-Revision-Date: 2025-12-05 18:00+0000\n"
"Last-Translator: Yasunobu YesNo Kawaguchi <kawaguti@gmail.com>\n" "Last-Translator: Yasunobu YesNo Kawaguchi <kawaguti@gmail.com>\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"
@@ -2149,7 +2149,7 @@ msgstr "クライアントID"
#: pretix/base/exporters/items.py:91 pretix/base/models/items.py:667 #: pretix/base/exporters/items.py:91 pretix/base/models/items.py:667
#: pretix/base/models/items.py:1168 #: pretix/base/models/items.py:1168
msgid "Original price" msgid "Original price"
msgstr "元の価格" msgstr "通常価格"
#: pretix/base/exporters/items.py:92 pretix/base/models/items.py:684 #: pretix/base/exporters/items.py:92 pretix/base/models/items.py:684
msgid "This product is a gift card" msgid "This product is a gift card"
@@ -22741,9 +22741,8 @@ msgid ""
"This position has been created with a voucher with a limited budget. If you " "This position has been created with a voucher with a limited budget. If you "
"change the price or item, the discount will still be calculated from the " "change the price or item, the discount will still be calculated from the "
"original price at the time of purchase." "original price at the time of purchase."
msgstr "" msgstr "このポジションは限られた予算のバウチャーで作成されました。価格やアイテムを変"
"このポジションは限られた予算のバウチャーで作成されました。価格やアイテムを変" "更しても、割引は購入時の通常価格から計算されます。"
"更しても、割引は購入時の元の価格から計算されます。"
#: pretix/control/templates/pretixcontrol/order/change.html:101 #: pretix/control/templates/pretixcontrol/order/change.html:101
#: pretix/control/templates/pretixcontrol/order/change.html:413 #: pretix/control/templates/pretixcontrol/order/change.html:413
@@ -33770,7 +33769,7 @@ msgstr "バリエーションを表示する"
#: pretix/presale/templates/pretixpresale/event/voucher.html:147 #: pretix/presale/templates/pretixpresale/event/voucher.html:147
#: pretix/presale/templates/pretixpresale/event/voucher.html:304 #: pretix/presale/templates/pretixpresale/event/voucher.html:304
msgid "Original price:" msgid "Original price:"
msgstr "元の価格:" msgstr "通常価格:"
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:136 #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:136
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:278 #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:278

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: 2025-11-27 13:57+0000\n" "POT-Creation-Date: 2025-11-27 13:57+0000\n"
"PO-Revision-Date: 2025-10-26 18:00+0000\n" "PO-Revision-Date: 2025-12-08 07:00+0000\n"
"Last-Translator: Jan Van Haver <jan.van.haver@gmail.com>\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.14\n" "X-Generator: Weblate 5.14.3\n"
#: pretix/_base_settings.py:87 #: pretix/_base_settings.py:87
msgid "English" msgid "English"
@@ -44,7 +44,7 @@ msgstr "Catalaans"
#: pretix/_base_settings.py:93 #: pretix/_base_settings.py:93
msgid "Chinese (simplified)" msgid "Chinese (simplified)"
msgstr "Chinees (versimpeld)" msgstr "Chinees (vereenvoudigd)"
#: pretix/_base_settings.py:94 #: pretix/_base_settings.py:94
msgid "Chinese (traditional)" msgid "Chinese (traditional)"

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: 2025-11-27 13:57+0000\n" "POT-Creation-Date: 2025-11-27 13:57+0000\n"
"PO-Revision-Date: 2024-02-13 16:00+0000\n" "PO-Revision-Date: 2025-12-08 07:00+0000\n"
"Last-Translator: Wessel Stam <info@wesselstam.nl>\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"
"Language: nl_Informal\n" "Language: 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.3.1\n" "X-Generator: Weblate 5.14.3\n"
#: pretix/_base_settings.py:87 #: pretix/_base_settings.py:87
msgid "English" msgid "English"
@@ -37,15 +37,15 @@ msgstr "Arabisch"
#: pretix/_base_settings.py:91 #: pretix/_base_settings.py:91
msgid "Basque" msgid "Basque"
msgstr "" msgstr "Baskisch"
#: pretix/_base_settings.py:92 #: pretix/_base_settings.py:92
msgid "Catalan" msgid "Catalan"
msgstr "" msgstr "Catalaans"
#: pretix/_base_settings.py:93 #: pretix/_base_settings.py:93
msgid "Chinese (simplified)" msgid "Chinese (simplified)"
msgstr "Chinees (versimpeld)" msgstr "Chinees (vereenvoudigd)"
#: pretix/_base_settings.py:94 #: pretix/_base_settings.py:94
msgid "Chinese (traditional)" msgid "Chinese (traditional)"
@@ -57,7 +57,7 @@ msgstr "Tsjechisch"
#: pretix/_base_settings.py:96 #: pretix/_base_settings.py:96
msgid "Croatian" msgid "Croatian"
msgstr "" msgstr "Kroatisch"
#: pretix/_base_settings.py:97 #: pretix/_base_settings.py:97
msgid "Danish" msgid "Danish"
@@ -89,7 +89,7 @@ msgstr "Grieks"
#: pretix/_base_settings.py:104 #: pretix/_base_settings.py:104
msgid "Hebrew" msgid "Hebrew"
msgstr "" msgstr "Hebreeuws"
#: pretix/_base_settings.py:105 #: pretix/_base_settings.py:105
msgid "Indonesian" msgid "Indonesian"
@@ -101,7 +101,7 @@ msgstr "Italiaans"
#: pretix/_base_settings.py:107 #: pretix/_base_settings.py:107
msgid "Japanese" msgid "Japanese"
msgstr "" msgstr "Japans"
#: pretix/_base_settings.py:108 #: pretix/_base_settings.py:108
msgid "Latvian" msgid "Latvian"
@@ -133,11 +133,11 @@ msgstr "Russisch"
#: pretix/_base_settings.py:115 #: pretix/_base_settings.py:115
msgid "Slovak" msgid "Slovak"
msgstr "" msgstr "Slowaaks"
#: pretix/_base_settings.py:116 #: pretix/_base_settings.py:116
msgid "Swedish" msgid "Swedish"
msgstr "" msgstr "Zweeds"
#: pretix/_base_settings.py:117 #: pretix/_base_settings.py:117
msgid "Spanish" msgid "Spanish"
@@ -145,7 +145,7 @@ msgstr "Spaans"
#: pretix/_base_settings.py:118 #: pretix/_base_settings.py:118
msgid "Spanish (Latin America)" msgid "Spanish (Latin America)"
msgstr "" msgstr "Spaans (Latijns-Amerika)"
#: pretix/_base_settings.py:119 #: pretix/_base_settings.py:119
msgid "Turkish" msgid "Turkish"
@@ -261,7 +261,7 @@ msgstr ""
#: pretix/api/serializers/event.py:234 pretix/api/serializers/event.py:554 #: pretix/api/serializers/event.py:234 pretix/api/serializers/event.py:554
#, python-brace-format #, python-brace-format
msgid "Meta data property '{name}' does not exist." msgid "Meta data property '{name}' does not exist."
msgstr "Metadataeigenschap '{name}' bestaat niet." msgstr "Metadata-eigenschap '{name}' bestaat niet."
#: pretix/api/serializers/event.py:237 pretix/api/serializers/event.py:557 #: pretix/api/serializers/event.py:237 pretix/api/serializers/event.py:557
#, python-brace-format #, python-brace-format
@@ -32970,7 +32970,7 @@ msgstr ""
#: pretix/plugins/reports/exporters.py:257 #: pretix/plugins/reports/exporters.py:257
msgctxt "export_category" msgctxt "export_category"
msgid "Analysis" msgid "Analysis"
msgstr "" msgstr "Analyse"
#: pretix/plugins/reports/accountingreport.py:83 #: pretix/plugins/reports/accountingreport.py:83
#, fuzzy #, fuzzy

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: 2025-11-27 13:57+0000\n" "POT-Creation-Date: 2025-11-27 13:57+0000\n"
"PO-Revision-Date: 2025-09-10 05:00+0000\n" "PO-Revision-Date: 2025-12-09 07:09+0000\n"
"Last-Translator: Renne Rocha <renne@rocha.dev.br>\n" "Last-Translator: Renne Rocha <renne@rocha.dev.br>\n"
"Language-Team: Portuguese (Brazil) <https://translate.pretix.eu/projects/" "Language-Team: Portuguese (Brazil) <https://translate.pretix.eu/projects/"
"pretix/pretix/pt_BR/>\n" "pretix/pretix/pt_BR/>\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.13.2\n" "X-Generator: Weblate 5.14.3\n"
#: pretix/_base_settings.py:87 #: pretix/_base_settings.py:87
msgid "English" msgid "English"
@@ -253,9 +253,8 @@ msgid ""
"Events cannot be created as 'live'. Quotas and payment must be added to the " "Events cannot be created as 'live'. Quotas and payment must be added to the "
"event before sales can go live." "event before sales can go live."
msgstr "" msgstr ""
"Os eventos não podem ser criados como 'ativo'. As cotas e métodos de " "Eventos não podem ser criados como 'ativo'. Cotas e métodos de pagamento "
"pagamento devem ser adicionados ao evento antes que as vendas possam ser " "devem ser adicionados ao evento antes que as vendas se iniciem."
"iniciadas."
#: pretix/api/serializers/event.py:234 pretix/api/serializers/event.py:554 #: pretix/api/serializers/event.py:234 pretix/api/serializers/event.py:554
#, python-brace-format #, python-brace-format
@@ -358,7 +357,8 @@ msgstr ""
#: pretix/api/serializers/item.py:587 pretix/control/forms/item.py:177 #: pretix/api/serializers/item.py:587 pretix/control/forms/item.py:177
msgid "Question cannot depend on a question asked during check-in." msgid "Question cannot depend on a question asked during check-in."
msgstr "A pergunta não pode depender de uma pergunta feita durante o check-in." msgstr ""
"A pergunta não pode depender de outra pergunta feita durante o check-in."
#: pretix/api/serializers/item.py:592 pretix/control/forms/item.py:182 #: pretix/api/serializers/item.py:592 pretix/control/forms/item.py:182
msgid "Circular dependency between questions detected." msgid "Circular dependency between questions detected."
@@ -3286,10 +3286,8 @@ msgid "Repeat password"
msgstr "Repita a senha" msgstr "Repita a senha"
#: pretix/base/forms/auth.py:220 pretix/base/forms/user.py:99 #: pretix/base/forms/auth.py:220 pretix/base/forms/user.py:99
#, fuzzy
#| msgid "Email address"
msgid "Your email address" msgid "Your email address"
msgstr "Endereço de email" msgstr "Seu endereço de e-mail"
#: pretix/base/forms/auth.py:327 pretix/control/forms/orders.py:1041 #: pretix/base/forms/auth.py:327 pretix/control/forms/orders.py:1041
#: pretix/control/templates/pretixcontrol/shredder/download.html:53 #: pretix/control/templates/pretixcontrol/shredder/download.html:53
@@ -3433,10 +3431,8 @@ msgstr ""
"as exibições de eventos, o fuso horário do evento é usado." "as exibições de eventos, o fuso horário do evento é usado."
#: pretix/base/forms/user.py:77 #: pretix/base/forms/user.py:77
#, fuzzy
#| msgid "Attendee email address"
msgid "Change email address" msgid "Change email address"
msgstr "Email do participante" msgstr "Alterar endereço de e-mail"
#: pretix/base/forms/user.py:83 #: pretix/base/forms/user.py:83
msgid "Device name" msgid "Device name"
@@ -3486,16 +3482,12 @@ msgstr ""
"um diferente." "um diferente."
#: pretix/base/forms/user.py:179 #: pretix/base/forms/user.py:179
#, fuzzy
#| msgid "Email address"
msgid "Old email address" msgid "Old email address"
msgstr "Endereço de email" msgstr "Endereço de e-mail antigo"
#: pretix/base/forms/user.py:180 #: pretix/base/forms/user.py:180
#, fuzzy
#| msgid "Email address"
msgid "New email address" msgid "New email address"
msgstr "Endereço de email" msgstr "Endereço de e-mail novo"
#: pretix/base/forms/validators.py:51 #: pretix/base/forms/validators.py:51
msgid "" msgid ""
@@ -3540,22 +3532,17 @@ msgid "Individual customer"
msgstr "Cliente pessoa física" msgstr "Cliente pessoa física"
#: pretix/base/invoicing/email.py:50 #: pretix/base/invoicing/email.py:50
#, fuzzy
#| msgid ""
#| "To send the invoice directly to your accounting department, please enter "
#| "their email address:"
msgid "Email invoice directly to accounting department" msgid "Email invoice directly to accounting department"
msgstr "" msgstr ""
"Para enviar a fatura diretamente ao seu departamento de contabilidade, " "Enviar e-mail com a fatura diretamente para departamento de contabilidade"
"insira o endereço de e-mail:"
#: pretix/base/invoicing/email.py:51 #: pretix/base/invoicing/email.py:51
#, fuzzy
#| msgid "The invoice was sent to the designated email address."
msgid "" msgid ""
"If not selected, the invoice will be sent to you using the email address " "If not selected, the invoice will be sent to you using the email address "
"listed above." "listed above."
msgstr "A fatura foi enviada para o endereço de e-mail designado." msgstr ""
"Se não selecionado, a fatura será enviada para o endereço de e-mail listado "
"a seguir."
#: pretix/base/invoicing/email.py:55 #: pretix/base/invoicing/email.py:55
msgid "Email address for invoice" msgid "Email address for invoice"
@@ -3778,12 +3765,10 @@ msgid "Remaining amount"
msgstr "Valor restante" msgstr "Valor restante"
#: pretix/base/invoicing/pdf.py:1009 #: pretix/base/invoicing/pdf.py:1009
#, fuzzy, python-brace-format #, python-brace-format
#| msgctxt "invoice"
#| msgid "Event date: {date_range}"
msgctxt "invoice" msgctxt "invoice"
msgid "Invoice period: {daterange}" msgid "Invoice period: {daterange}"
msgstr "Data do evento: {date_range}" msgstr "Período da fatura: {daterange}"
#: pretix/base/invoicing/pdf.py:1040 #: pretix/base/invoicing/pdf.py:1040
msgctxt "invoice" msgctxt "invoice"
@@ -3868,12 +3853,9 @@ msgid "Peppol participant ID"
msgstr "" msgstr ""
#: pretix/base/invoicing/peppol.py:170 #: pretix/base/invoicing/peppol.py:170
#, fuzzy
#| msgctxt "italian_invoice"
#| msgid "Fiscal code"
msgctxt "peppol_invoice" msgctxt "peppol_invoice"
msgid "Visual copy" msgid "Visual copy"
msgstr "Código fiscal" msgstr "Cópia visual"
#: pretix/base/invoicing/peppol.py:175 #: pretix/base/invoicing/peppol.py:175
msgctxt "peppol_invoice" msgctxt "peppol_invoice"
@@ -4357,10 +4339,8 @@ msgid ""
msgstr "" msgstr ""
#: pretix/base/models/auth.py:392 #: pretix/base/models/auth.py:392
#, fuzzy
#| msgid "Confirmation code"
msgid "pretix confirmation code" msgid "pretix confirmation code"
msgstr "Código de confirmação" msgstr "código de confirmação do pretix"
#: pretix/base/models/auth.py:435 #: pretix/base/models/auth.py:435
#: pretix/control/templates/pretixcontrol/auth/forgot.html:7 #: pretix/control/templates/pretixcontrol/auth/forgot.html:7
@@ -4862,11 +4842,11 @@ msgid ""
"you can also choose to use a random value. This will be used in URLs, order " "you can also choose to use a random value. This will be used in URLs, order "
"codes, invoice numbers, and bank transfer references." "codes, invoice numbers, and bank transfer references."
msgstr "" msgstr ""
"Deve ser curts, conter apenas letras minúsculas, números, pontos e traços, e " "Deve conter apenas letras minúsculas, números, pontos e traços, sendo "
"ser exclusiva entre seus eventos. Recomendamos algum tipo de abreviação ou " "exclusiva para suas eventos. Recomendamos uma abreviação ou data com menos "
"uma data com menos de 10 caracteres que sejam facilmente lembradas, mas você " "de 10 caracteres e que seja facilmente lembrada, mas você também pode usar "
"também pode usar um valor aleatório. Esta informação será usada em URLs, " "um valor aleatório. Esta informação será usada em URLs, códigos de pedido, "
"códigos de pedido, números de fatura e referências de transferência bancária." "número de faturas e referências de transações bancárias."
#: pretix/base/models/event.py:607 pretix/base/models/organizer.py:89 #: pretix/base/models/event.py:607 pretix/base/models/organizer.py:89
msgid "The slug may only contain letters, numbers, dots and dashes." msgid "The slug may only contain letters, numbers, dots and dashes."
@@ -5394,24 +5374,16 @@ msgstr ""
"não tiver variações, este preço será usado." "não tiver variações, este preço será usado."
#: pretix/base/models/items.py:506 #: pretix/base/models/items.py:506
#, fuzzy
#| msgid ""
#| "If this option is active, your users can choose the price themselves. The "
#| "price configured above is then interpreted as the minimum price a user "
#| "has to enter. You could use this e.g. to collect additional donations for "
#| "your event. This is currently not supported for products that are bought "
#| "as an add-on to other products."
msgid "" msgid ""
"If this option is active, your users can choose the price themselves. The " "If this option is active, your users can choose the price themselves. The "
"price configured above is then interpreted as the minimum price a user has " "price configured above is then interpreted as the minimum price a user has "
"to enter. You could use this e.g. to collect additional donations for your " "to enter. You could use this e.g. to collect additional donations for your "
"event." "event."
msgstr "" msgstr ""
"Se esta opção estiver ativa, seus usuários podem escolher o próprio preço. O " "Se esta opção está selecionada, os usuários poderão pagar o preço que "
"preço configurado acima é então interpretado como o preço mínimo que um " "desejarem. O preço padrão acima será interpretado como o preço mínimo que o "
"usuário deve inserir. Você pode usar isso, por exemplo, para coletar doações " "usuário deverá pagar. Você pode usar esta opção, por exemplo, para coletar "
"adicionais para o seu evento. No momento, isto não é suportado por produtos " "doações adicionais para o seu evento."
"comprados como um complemento de outros produtos."
#: pretix/base/models/items.py:511 pretix/base/models/items.py:1175 #: pretix/base/models/items.py:511 pretix/base/models/items.py:1175
msgid "Suggested price" msgid "Suggested price"
@@ -6298,9 +6270,6 @@ msgstr ""
"insira um valor possível por linha." "insira um valor possível por linha."
#: pretix/base/models/items.py:2310 #: pretix/base/models/items.py:2310
#, fuzzy
#| msgctxt "timeframe"
#| msgid "Start"
msgid "Start" msgid "Start"
msgstr "Início" msgstr "Início"
@@ -7912,10 +7881,8 @@ msgid "123.45 EUR"
msgstr "123.45 BRL" msgstr "123.45 BRL"
#: pretix/base/pdf.py:166 #: pretix/base/pdf.py:166
#, fuzzy
#| msgid "Price including add-ons"
msgid "Price including bundled products" msgid "Price including bundled products"
msgstr "Preço incluindo complementos" msgstr "Preços incluindo produtos empacotados"
#: pretix/base/pdf.py:175 #: pretix/base/pdf.py:175
#, fuzzy #, fuzzy
@@ -9878,10 +9845,8 @@ msgid "Require a phone number per order"
msgstr "Exigir um número de telefone por pedido" msgstr "Exigir um número de telefone por pedido"
#: pretix/base/settings.py:482 #: pretix/base/settings.py:482
#, fuzzy
#| msgid "including all taxes"
msgid "Rounding of taxes" msgid "Rounding of taxes"
msgstr "incluindo todos os impostos" msgstr "Arredondamento dos impostos"
#: pretix/base/settings.py:486 #: pretix/base/settings.py:486
msgid "" msgid ""
@@ -10424,18 +10389,12 @@ msgid "Automatic, but prefer invoice date over event date"
msgstr "" msgstr ""
#: pretix/base/settings.py:1142 pretix/base/settings.py:1153 #: pretix/base/settings.py:1142 pretix/base/settings.py:1153
#, fuzzy
#| msgctxt "invoice"
#| msgid "Invoice date"
msgid "Invoice date" msgid "Invoice date"
msgstr "Data da fatura" msgstr "Data da fatura"
#: pretix/base/settings.py:1146 #: pretix/base/settings.py:1146
#, fuzzy
#| msgctxt "subevent"
#| msgid "Date ordering"
msgid "Date of service" msgid "Date of service"
msgstr "Ordenação de datas" msgstr "Data do serviço"
#: pretix/base/settings.py:1155 #: pretix/base/settings.py:1155
msgid "" msgid ""
@@ -11299,8 +11258,8 @@ msgstr "Endereço de contato"
#: pretix/base/settings.py:2161 pretix/control/forms/event.py:1824 #: pretix/base/settings.py:2161 pretix/control/forms/event.py:1824
msgid "We'll show this publicly to allow attendees to contact you." msgid "We'll show this publicly to allow attendees to contact you."
msgstr "" msgstr ""
"Mostraremos isso publicamente para permitir que os participantes entrem em " "Será exibido publicamente para que participantes possam entrar em contato "
"contato com você." "com você."
#: pretix/base/settings.py:2169 pretix/control/forms/event.py:1816 #: pretix/base/settings.py:2169 pretix/control/forms/event.py:1816
msgid "Imprint URL" msgid "Imprint URL"
@@ -12166,17 +12125,7 @@ msgid "Invoice {invoice_number}"
msgstr "Fatura {invoice_number}" msgstr "Fatura {invoice_number}"
#: pretix/base/settings.py:2789 #: pretix/base/settings.py:2789
#, fuzzy, python-brace-format #, python-brace-format
#| msgid ""
#| "Hello,\n"
#| "\n"
#| "somebody requested a list of your orders for {event}.\n"
#| "The list is as follows:\n"
#| "\n"
#| "{orders}\n"
#| "\n"
#| "Best regards, \n"
#| "Your {event} team"
msgid "" msgid ""
"Hello,\n" "Hello,\n"
"\n" "\n"
@@ -12189,12 +12138,12 @@ msgid ""
msgstr "" msgstr ""
"Olá,\n" "Olá,\n"
"\n" "\n"
"Segue anexo uma nova fatura para o pedido {code} para {evento} . Este pedido " "Em anexo você encontrará uma nova fatura para o pedido {code} para {event}. "
"foi feito por {order_email}.\n" "Este pedido foi feito por {order_email}.\n"
"\n" "\n"
"Atenciosamente, \n" "Atenciosamente, \n"
"\n" "\n"
"Equipe organizadora de {event}" "Organização {event}"
#: pretix/base/settings.py:2807 pretix/base/settings.py:2823 #: pretix/base/settings.py:2807 pretix/base/settings.py:2823
#, python-brace-format #, python-brace-format
@@ -13937,7 +13886,7 @@ msgstr "Padrão ({value})"
#: pretix/control/forms/event.py:380 #: pretix/control/forms/event.py:380
msgid "The currency cannot be changed because orders already exist." msgid "The currency cannot be changed because orders already exist."
msgstr "" msgstr "A moeda não pode ser alterada pois já foram realizados pedidos."
#: pretix/control/forms/event.py:391 pretix/control/forms/event.py:404 #: pretix/control/forms/event.py:391 pretix/control/forms/event.py:404
msgid "Domain" msgid "Domain"
@@ -14023,21 +13972,16 @@ msgstr ""
"que o cartão-presente é emitido." "que o cartão-presente é emitido."
#: pretix/control/forms/event.py:813 #: pretix/control/forms/event.py:813
#, fuzzy
#| msgid "including all taxes"
msgid "Prices including tax" msgid "Prices including tax"
msgstr "incluindo todos os impostos" msgstr "Preços incluindo impostos"
#: pretix/control/forms/event.py:814 #: pretix/control/forms/event.py:814
msgid "Recommended if you sell tickets at least partly to consumers." msgid "Recommended if you sell tickets at least partly to consumers."
msgstr "" msgstr ""
#: pretix/control/forms/event.py:818 #: pretix/control/forms/event.py:818
#, fuzzy
#| msgctxt "reporting_timeframe"
#| msgid "All future (excluding today)"
msgid "Prices excluding tax" msgid "Prices excluding tax"
msgstr "Todos os futuros (excluindo hoje)" msgstr "Preços excluindo impostos"
#: pretix/control/forms/event.py:819 #: pretix/control/forms/event.py:819
msgid "Recommended only if you sell tickets primarily to business customers." msgid "Recommended only if you sell tickets primarily to business customers."
@@ -17410,10 +17354,9 @@ msgstr ""
"O endereço de e-mail foi alterado de \"{old_email}\" para \"{new_email}\"." "O endereço de e-mail foi alterado de \"{old_email}\" para \"{new_email}\"."
#: pretix/control/logdisplay.py:673 #: pretix/control/logdisplay.py:673
#, fuzzy, python-brace-format #, python-brace-format
#| msgid "Your email address has been updated."
msgid "Your email address {email} has been confirmed." msgid "Your email address {email} has been confirmed."
msgstr "Seu endereço de email foi atualizado." msgstr "Seu endereço de e-mail {email} foi confirmado."
#: pretix/control/logdisplay.py:685 #: pretix/control/logdisplay.py:685
#, python-brace-format #, python-brace-format
@@ -19690,6 +19633,20 @@ msgid ""
"Best regards,\n" "Best regards,\n"
"Your pretix team\n" "Your pretix team\n"
msgstr "" msgstr ""
"Olá,\n"
"\n"
"%(reason)s\n"
"\n"
" %(code)s\n"
"\n"
"Por favor, nunca forneça este código para outra pessoa. Nosso time de "
"suporte nunca irá solicitar este código.\n"
"\n"
"Se você não solicitou este código, por favor entre em contato conosco "
"imediatamente.\n"
"\n"
"Atenciosamente,\n"
"Time pretix\n"
#: pretix/control/templates/pretixcontrol/email/email_setup.txt:1 #: pretix/control/templates/pretixcontrol/email/email_setup.txt:1
#, python-format #, python-format
@@ -21314,10 +21271,8 @@ msgid "with custom rules"
msgstr "Regras personalizadas" msgstr "Regras personalizadas"
#: pretix/control/templates/pretixcontrol/event/tax.html:110 #: pretix/control/templates/pretixcontrol/event/tax.html:110
#, fuzzy
#| msgid "Base settings"
msgid "Tax settings" msgid "Tax settings"
msgstr "Configurações base" msgstr "Configurações de impostos"
#: pretix/control/templates/pretixcontrol/event/tax_delete.html:4 #: pretix/control/templates/pretixcontrol/event/tax_delete.html:4
#: pretix/control/templates/pretixcontrol/event/tax_delete.html:6 #: pretix/control/templates/pretixcontrol/event/tax_delete.html:6
@@ -21980,6 +21935,9 @@ msgid ""
"your event. By default, we will only offer ticket downloads for these " "your event. By default, we will only offer ticket downloads for these "
"products." "products."
msgstr "" msgstr ""
"Cada compra deste produto representa uma pessoa que terá permissão de entrar "
"no seu evento. Por padrão, só oferecemos o download de ingressos para estes "
"produtos."
#: pretix/control/templates/pretixcontrol/item/create.html:33 #: pretix/control/templates/pretixcontrol/item/create.html:33
#: pretix/control/templates/pretixcontrol/item/index.html:41 #: pretix/control/templates/pretixcontrol/item/index.html:41
@@ -26144,7 +26102,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/shredder/download.html:29 #: pretix/control/templates/pretixcontrol/shredder/download.html:29
msgid "Download data" msgid "Download data"
msgstr "" msgstr "Baixar dados"
#: pretix/control/templates/pretixcontrol/shredder/download.html:34 #: pretix/control/templates/pretixcontrol/shredder/download.html:34
msgid "Step 2: Confirm deletion" msgid "Step 2: Confirm deletion"
@@ -26475,7 +26433,7 @@ msgstr "Adicionar um dispositivo de autenticação de dois fatores"
#: pretix/control/templates/pretixcontrol/user/2fa_confirm_totp.html:8 #: pretix/control/templates/pretixcontrol/user/2fa_confirm_totp.html:8
msgid "To set up this device, please follow the following steps:" msgid "To set up this device, please follow the following steps:"
msgstr "" msgstr "Para configurar este dispositivo, por favor siga os passos a seguir:"
#: pretix/control/templates/pretixcontrol/user/2fa_confirm_totp.html:12 #: pretix/control/templates/pretixcontrol/user/2fa_confirm_totp.html:12
msgid "Download the Google Authenticator application to your phone:" msgid "Download the Google Authenticator application to your phone:"
@@ -26901,11 +26859,11 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/user/staff_session_edit.html:6 #: pretix/control/templates/pretixcontrol/user/staff_session_edit.html:6
msgid "Session notes" msgid "Session notes"
msgstr "" msgstr "Notas de sessão"
#: pretix/control/templates/pretixcontrol/user/staff_session_edit.html:17 #: pretix/control/templates/pretixcontrol/user/staff_session_edit.html:17
msgid "Audit log" msgid "Audit log"
msgstr "" msgstr "Log de auditoria"
#: pretix/control/templates/pretixcontrol/user/staff_session_edit.html:30 #: pretix/control/templates/pretixcontrol/user/staff_session_edit.html:30
msgid "Method" msgid "Method"
@@ -27949,7 +27907,7 @@ msgstr ""
#: pretix/control/views/item.py:237 #: pretix/control/views/item.py:237
msgid "The selected category has been deleted." msgid "The selected category has been deleted."
msgstr "" msgstr "A categoria selecionada foi excluída"
#: pretix/control/views/item.py:322 #: pretix/control/views/item.py:322
msgid "The new category has been created." msgid "The new category has been created."
@@ -29874,7 +29832,7 @@ msgstr ""
#: pretix/plugins/banktransfer/payment.py:239 #: pretix/plugins/banktransfer/payment.py:239
msgid "Please fill out your bank account details." msgid "Please fill out your bank account details."
msgstr "" msgstr "Por favor, preencha os detalhes da sua conta bancária."
#: pretix/plugins/banktransfer/payment.py:243 #: pretix/plugins/banktransfer/payment.py:243
msgid "Please enter your bank account details." msgid "Please enter your bank account details."
@@ -30175,7 +30133,7 @@ msgstr ""
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:122 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:122
msgid "Scan the QR code with your banking app" msgid "Scan the QR code with your banking app"
msgstr "" msgstr "Escanear o QR Code com o seu aplicativo bancário"
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/refund_export.html:5 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/refund_export.html:5
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/refund_export.html:7 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/refund_export.html:7
@@ -30746,6 +30704,8 @@ msgid ""
"We're waiting for an answer from PayPal regarding your payment. Please " "We're waiting for an answer from PayPal regarding your payment. Please "
"contact us, if this takes more than a few hours." "contact us, if this takes more than a few hours."
msgstr "" msgstr ""
"Estamos aguardando por informações do PayPal referentes ao seu pagamento. "
"Por favor, entre em contato conosco se isso demorar mais que algumas horas."
#: pretix/plugins/paypal/templates/pretixplugins/paypal/redirect.html:17 #: pretix/plugins/paypal/templates/pretixplugins/paypal/redirect.html:17
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/redirect.html:17 #: pretix/plugins/paypal2/templates/pretixplugins/paypal2/redirect.html:17
@@ -33370,19 +33330,17 @@ msgstr "Organizador: {organizer}"
#: pretix/presale/ical.py:139 #: pretix/presale/ical.py:139
#, python-brace-format #, python-brace-format
msgid "{event} - {item}" msgid "{event} - {item}"
msgstr "" msgstr "{event} - {item}"
#: pretix/presale/ical.py:147 #: pretix/presale/ical.py:147
#, fuzzy, python-brace-format #, python-brace-format
#| msgid "Start date"
msgid "Start: {datetime}" msgid "Start: {datetime}"
msgstr "Data inicial" msgstr "Início: {datetime}"
#: pretix/presale/ical.py:150 #: pretix/presale/ical.py:150
#, fuzzy, python-brace-format #, python-brace-format
#| msgid "Admission: {datetime}"
msgid "End: {datetime}" msgid "End: {datetime}"
msgstr "Admissão: {datetime}" msgstr "Término: {datetime}"
#: pretix/presale/templates/pretixpresale/base.html:44 #: pretix/presale/templates/pretixpresale/base.html:44
#, fuzzy #, fuzzy
@@ -35632,10 +35590,8 @@ msgid "The following gift cards are available in your customer account:"
msgstr "" msgstr ""
#: pretix/presale/templates/pretixpresale/giftcard/checkout.html:24 #: pretix/presale/templates/pretixpresale/giftcard/checkout.html:24
#, fuzzy
#| msgid "Issued gift cards"
msgid "Use gift card" msgid "Use gift card"
msgstr "Cartões-presente emitidos" msgstr "Usar cartão-presente"
#: pretix/presale/templates/pretixpresale/giftcard/checkout_confirm.html:4 #: pretix/presale/templates/pretixpresale/giftcard/checkout_confirm.html:4
#, python-format #, python-format
@@ -35754,10 +35710,9 @@ msgid "Expired since %(date)s"
msgstr "Expirado desde" msgstr "Expirado desde"
#: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:46 #: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:46
#, fuzzy, python-format #, python-format
#| msgid "Valid until %(datetime)s"
msgid "Valid until %(date)s" msgid "Valid until %(date)s"
msgstr "Válido até %(datetime)s" msgstr "Válido até %(date)s"
#: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:66 #: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:66
#, fuzzy #, fuzzy
@@ -36287,10 +36242,8 @@ msgid "The selected date does not exist in this event series."
msgstr "A data selecionada não existe nesta série de eventos." msgstr "A data selecionada não existe nesta série de eventos."
#: pretix/presale/views/widget.py:412 #: pretix/presale/views/widget.py:412
#, fuzzy
#| msgid "The selected seat \"{seat}\" is not available."
msgid "The selected date is not available." msgid "The selected date is not available."
msgstr "O assento selecionado \"{seat}\" não está disponível." msgstr "A data selecionada não está disponível."
#: pretix/presale/views/widget.py:476 #: pretix/presale/views/widget.py:476
#, python-format #, python-format

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: 2025-11-20 10:37+0000\n" "POT-Creation-Date: 2025-11-20 10:37+0000\n"
"PO-Revision-Date: 2025-08-28 13:43+0000\n" "PO-Revision-Date: 2025-12-09 00:47+0000\n"
"Last-Translator: Renne Rocha <renne@rocha.dev.br>\n" "Last-Translator: Renne Rocha <renne@rocha.dev.br>\n"
"Language-Team: Portuguese (Brazil) <https://translate.pretix.eu/projects/" "Language-Team: Portuguese (Brazil) <https://translate.pretix.eu/projects/"
"pretix/pretix-js/pt_BR/>\n" "pretix/pretix-js/pt_BR/>\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.13\n" "X-Generator: Weblate 5.14.3\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
@@ -566,11 +566,11 @@ msgstr "ausente"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:289 #: pretix/static/pretixcontrol/js/ui/checkinrules.js:289
msgid "Error: Product not found!" msgid "Error: Product not found!"
msgstr "" msgstr "Erro: Produto não encontrado!"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:296 #: pretix/static/pretixcontrol/js/ui/checkinrules.js:296
msgid "Error: Variation not found!" msgid "Error: Variation not found!"
msgstr "" msgstr "Erro: Variação não encontrada!"
#: pretix/static/pretixcontrol/js/ui/editor.js:171 #: pretix/static/pretixcontrol/js/ui/editor.js:171
msgid "Check-in QR" msgid "Check-in QR"

View File

@@ -41,15 +41,20 @@ for app in apps.get_app_configs():
if hasattr(app, 'PretixPluginMeta'): if hasattr(app, 'PretixPluginMeta'):
if importlib.util.find_spec(app.name + '.urls'): if importlib.util.find_spec(app.name + '.urls'):
urlmod = importlib.import_module(app.name + '.urls') urlmod = importlib.import_module(app.name + '.urls')
single_plugin_patterns = []
if hasattr(urlmod, 'event_patterns'): if hasattr(urlmod, 'event_patterns'):
patterns = plugin_event_urls(urlmod.event_patterns, plugin=app.name) patterns = plugin_event_urls(urlmod.event_patterns, plugin=app.name)
raw_plugin_patterns.append( single_plugin_patterns.append(
re_path(r'^(?P<event>[^/]+)/', include((patterns, app.label))) re_path(r'^(?P<event>[^/]+)/', include(patterns))
) )
if hasattr(urlmod, 'organizer_patterns'): if hasattr(urlmod, 'organizer_patterns'):
patterns = plugin_event_urls(urlmod.organizer_patterns, plugin=app.name) single_plugin_patterns += plugin_event_urls(urlmod.organizer_patterns, plugin=app.name)
if single_plugin_patterns:
raw_plugin_patterns.append( raw_plugin_patterns.append(
re_path(r'', include((patterns, app.label))) re_path(r'', include((single_plugin_patterns, app.label)))
) )
plugin_patterns = [ plugin_patterns = [

View File

@@ -42,15 +42,20 @@ for app in apps.get_app_configs():
if hasattr(app, 'PretixPluginMeta'): if hasattr(app, 'PretixPluginMeta'):
if importlib.util.find_spec(app.name + '.urls'): if importlib.util.find_spec(app.name + '.urls'):
urlmod = importlib.import_module(app.name + '.urls') urlmod = importlib.import_module(app.name + '.urls')
if hasattr(urlmod, 'event_patterns'): single_plugin_patterns = []
patterns = plugin_event_urls(urlmod.event_patterns, plugin=app.name)
raw_plugin_patterns.append(
re_path(r'^(?P<event>[^/]+)/', include((patterns, app.label)))
)
if hasattr(urlmod, 'organizer_patterns'): if hasattr(urlmod, 'organizer_patterns'):
patterns = plugin_event_urls(urlmod.organizer_patterns, plugin=app.name) single_plugin_patterns += plugin_event_urls(urlmod.organizer_patterns, plugin=app.name)
if hasattr(urlmod, 'event_patterns'):
plugin_event_patterns = plugin_event_urls(urlmod.event_patterns, plugin=app.name)
single_plugin_patterns.append(
re_path(r'^(?P<event>[^/]+)/', include(plugin_event_patterns))
)
if single_plugin_patterns:
raw_plugin_patterns.append( raw_plugin_patterns.append(
re_path(r'', include((patterns, app.label))) re_path(r'', include((single_plugin_patterns, app.label)))
) )
plugin_patterns = [ plugin_patterns = [

View File

@@ -34,8 +34,10 @@
import json import json
import logging import logging
import operator
import re import re
from decimal import Decimal from decimal import Decimal
from functools import reduce
import dateutil.parser import dateutil.parser
from celery.exceptions import MaxRetriesExceededError from celery.exceptions import MaxRetriesExceededError
@@ -117,20 +119,26 @@ def _find_order_for_code(base_qs, code):
pass pass
def _find_order_for_invoice_id(base_qs, prefix, number): def _find_order_for_invoice_id(base_qs, prefixes, number):
try: try:
# Working with __iregex here is an experiment, if this turns out to be too slow in production # Working with __iregex here is an experiment, if this turns out to be too slow in production
# we might need to switch to a different approach. # we might need to switch to a different approach.
return base_qs.select_related('order').get( r = [
Q(
prefix__istartswith=prefix, # redundant, but hopefully makes it a little faster prefix__istartswith=prefix, # redundant, but hopefully makes it a little faster
full_invoice_no__iregex=prefix + r'[\- ]*0*' + number full_invoice_no__iregex=prefix + r'[\- ]*0*' + number
)
for prefix in set(prefixes)
]
return base_qs.select_related('order').get(
reduce(operator.or_, r)
).order ).order
except (Invoice.DoesNotExist, Invoice.MultipleObjectsReturned): except (Invoice.DoesNotExist, Invoice.MultipleObjectsReturned):
pass pass
@transaction.atomic @transaction.atomic
def _handle_transaction(trans: BankTransaction, matches: tuple, event: Event = None, organizer: Organizer = None): def _handle_transaction(trans: BankTransaction, matches: tuple, regex_match_to_slug, event: Event = None, organizer: Organizer = None):
orders = [] orders = []
if event: if event:
for slug, code in matches: for slug, code in matches:
@@ -139,18 +147,19 @@ def _handle_transaction(trans: BankTransaction, matches: tuple, event: Event = N
if order.code not in {o.code for o in orders}: if order.code not in {o.code for o in orders}:
orders.append(order) orders.append(order)
else: else:
order = _find_order_for_invoice_id(Invoice.objects.filter(event=event), slug, code) order = _find_order_for_invoice_id(Invoice.objects.filter(event=event), (slug, regex_match_to_slug.get(slug, slug)), code)
if order and order.code not in {o.code for o in orders}: if order and order.code not in {o.code for o in orders}:
orders.append(order) orders.append(order)
else: else:
qs = Order.objects.filter(event__organizer=organizer) qs = Order.objects.filter(event__organizer=organizer)
for slug, code in matches: for slug, code in matches:
order = _find_order_for_code(qs.filter(event__slug__iexact=slug), code) original_slug = regex_match_to_slug.get(slug, slug)
order = _find_order_for_code(qs.filter(Q(event__slug__iexact=slug) | Q(event__slug__iexact=original_slug)), code)
if order: if order:
if order.code not in {o.code for o in orders}: if order.code not in {o.code for o in orders}:
orders.append(order) orders.append(order)
else: else:
order = _find_order_for_invoice_id(Invoice.objects.filter(event__organizer=organizer), slug, code) order = _find_order_for_invoice_id(Invoice.objects.filter(event__organizer=organizer), (slug, original_slug), code)
if order and order.code not in {o.code for o in orders}: if order and order.code not in {o.code for o in orders}:
orders.append(order) orders.append(order)
@@ -366,22 +375,37 @@ def process_banktransfers(self, job: int, data: list) -> None:
transactions = _get_unknown_transactions(job, data, **job.owner_kwargs) transactions = _get_unknown_transactions(job, data, **job.owner_kwargs)
# Match order codes # Match order codes
regex_match_to_slug = {}
code_len_agg = Order.objects.filter(event__organizer=job.organizer).annotate( code_len_agg = Order.objects.filter(event__organizer=job.organizer).annotate(
clen=Length('code') clen=Length('code')
).aggregate(min=Min('clen'), max=Max('clen')) ).aggregate(min=Min('clen'), max=Max('clen'))
if job.event: if job.event:
prefixes = {job.event.slug.upper()} prefixes = {job.event.slug.upper(), job.event.slug.upper().replace("-", "")}
if "-" in job.event.slug:
regex_match_to_slug[job.event.slug.upper().replace("-", "")] = job.event.slug
else: else:
prefixes = {e.slug.upper() for e in job.organizer.events.all()} prefixes = set()
for e in job.organizer.events.all():
prefixes.add(e.slug.upper())
if "-" in e.slug:
prefixes.add(e.slug.upper().replace("-", ""))
regex_match_to_slug[e.slug.upper().replace("-", "")] = e.slug
# Match invoice numbers # Match invoice numbers
inr_len_agg = Invoice.objects.filter(event__organizer=job.organizer).annotate( inr_len_agg = Invoice.objects.filter(event__organizer=job.organizer).annotate(
clen=Length('invoice_no') clen=Length('invoice_no')
).aggregate(min=Min('clen'), max=Max('clen')) ).aggregate(min=Min('clen'), max=Max('clen'))
if job.event: if job.event:
prefixes |= {p.rstrip(' -') for p in Invoice.objects.filter(event=job.event).distinct().values_list('prefix', flat=True)} invoice_prefixes = Invoice.objects.filter(event=job.event)
else: else:
prefixes |= {p.rstrip(' -') for p in Invoice.objects.filter(event__organizer=job.organizer).distinct().values_list('prefix', flat=True)} invoice_prefixes = Invoice.objects.filter(event__organizer=job.organizer)
for p in invoice_prefixes.order_by().distinct().values_list('prefix', flat=True):
prefix = p.rstrip(" -")
prefixes.add(prefix)
if "-" in prefix:
prefix_nodash = prefix.replace("-", "")
prefixes.add(prefix_nodash)
regex_match_to_slug[prefix_nodash] = prefix
pattern = re.compile( pattern = re.compile(
"(%s)[ \\-_]*([A-Z0-9]{%s,%s})" % ( "(%s)[ \\-_]*([A-Z0-9]{%s,%s})" % (
@@ -395,6 +419,11 @@ def process_banktransfers(self, job: int, data: list) -> None:
) )
for trans in transactions: for trans in transactions:
if trans.amount == Decimal("0.00"):
# Ignore all zero-valued transactions
trans.state = BankTransaction.STATE_DISCARDED
trans.save()
continue
# Whitespace in references is unreliable since linebreaks and spaces can occur almost anywhere, e.g. # Whitespace in references is unreliable since linebreaks and spaces can occur almost anywhere, e.g.
# DEMOCON-123\n45 should be matched to DEMOCON-12345. However, sometimes whitespace is important, # DEMOCON-123\n45 should be matched to DEMOCON-12345. However, sometimes whitespace is important,
# e.g. when there are two references. "DEMOCON-12345 DEMOCON-45678" would otherwise be parsed as # e.g. when there are two references. "DEMOCON-12345 DEMOCON-45678" would otherwise be parsed as
@@ -409,9 +438,9 @@ def process_banktransfers(self, job: int, data: list) -> None:
if matches: if matches:
if job.event: if job.event:
_handle_transaction(trans, matches, event=job.event) _handle_transaction(trans, matches, regex_match_to_slug, event=job.event)
else: else:
_handle_transaction(trans, matches, organizer=job.organizer) _handle_transaction(trans, matches, regex_match_to_slug, organizer=job.organizer)
else: else:
trans.state = BankTransaction.STATE_NOMATCH trans.state = BankTransaction.STATE_NOMATCH
trans.save() trans.save()

View File

@@ -412,6 +412,18 @@ class StripeSettingsHolder(BasePaymentProvider):
'before they work properly.'), 'before they work properly.'),
required=False, required=False,
)), )),
('method_pay_by_bank',
forms.BooleanField(
label=_('Pay by bank'),
disabled=self.event.currency not in ['EUR', 'GBP'],
help_text=' '.join([
str(_('Some payment methods might need to be enabled in the settings of your Stripe account '
'before they work properly.')),
str(_('Currently only available for charges in GBP and customers with UK bank accounts, and '
'in private preview for France and Germany.'))
]),
required=False,
)),
('method_wechatpay', ('method_wechatpay',
forms.BooleanField( forms.BooleanField(
label=_('WeChat Pay'), label=_('WeChat Pay'),
@@ -1810,6 +1822,32 @@ class StripeRevolutPay(StripeRedirectMethod):
} }
class StripePayByBank(StripeRedirectMethod):
identifier = 'stripe_pay_by_bank'
verbose_name = _('Pay by bank via Stripe')
public_name = _('Pay by bank')
method = 'pay_by_bank'
redirect_in_widget_allowed = False
confirmation_method = 'automatic'
explanation = _(
'Pay by bank allows you to authorize a secure Open Banking payment from your banking app. Currently available '
'only with a UK bank account.'
)
def is_allowed(self, request: HttpRequest, total: Decimal=None) -> bool:
return super().is_allowed(request, total) and self.event.currency == 'GBP'
def _payment_intent_kwargs(self, request, payment):
return {
"payment_method_data": {
"type": "pay_by_bank",
"billing_details": {
"email": payment.order.email,
},
},
}
class StripePayPal(StripeRedirectMethod): class StripePayPal(StripeRedirectMethod):
identifier = 'stripe_paypal' identifier = 'stripe_paypal'
verbose_name = _('PayPal via Stripe') verbose_name = _('PayPal via Stripe')

View File

@@ -38,7 +38,6 @@ from pretix.base.signals import (
) )
from pretix.control.signals import nav_organizer from pretix.control.signals import nav_organizer
from pretix.plugins.stripe.forms import StripeKeyValidator from pretix.plugins.stripe.forms import StripeKeyValidator
from pretix.plugins.stripe.payment import StripeMethod
from pretix.presale.signals import html_head, process_response from pretix.presale.signals import html_head, process_response
@@ -47,15 +46,15 @@ def register_payment_provider(sender, **kwargs):
from .payment import ( from .payment import (
StripeAffirm, StripeAlipay, StripeBancontact, StripeCC, StripeEPS, StripeAffirm, StripeAlipay, StripeBancontact, StripeCC, StripeEPS,
StripeGiropay, StripeIdeal, StripeKlarna, StripeMobilePay, StripeGiropay, StripeIdeal, StripeKlarna, StripeMobilePay,
StripeMultibanco, StripePayPal, StripePrzelewy24, StripeRevolutPay, StripeMultibanco, StripePayByBank, StripePayPal, StripePrzelewy24,
StripeSEPADirectDebit, StripeSettingsHolder, StripeSofort, StripeSwish, StripeRevolutPay, StripeSEPADirectDebit, StripeSettingsHolder,
StripeTwint, StripeWeChatPay, StripeSofort, StripeSwish, StripeTwint, StripeWeChatPay,
) )
return [ return [
StripeSettingsHolder, StripeCC, StripeGiropay, StripeIdeal, StripeAlipay, StripeBancontact, StripeSettingsHolder, StripeCC, StripeGiropay, StripeIdeal, StripeAlipay, StripeBancontact,
StripeSofort, StripeEPS, StripeMultibanco, StripePrzelewy24, StripeRevolutPay, StripeWeChatPay, StripeSofort, StripeEPS, StripeMultibanco, StripePrzelewy24, StripeRevolutPay, StripeWeChatPay,
StripeSEPADirectDebit, StripeAffirm, StripeKlarna, StripePayPal, StripeSwish, StripeTwint, StripeMobilePay StripeSEPADirectDebit, StripeAffirm, StripeKlarna, StripePayByBank, StripePayPal, StripeSwish, StripeTwint, StripeMobilePay
] ]
@@ -189,6 +188,8 @@ def nav_o(sender, request, organizer, **kwargs):
@receiver(signal=process_response, dispatch_uid="stripe_middleware_resp") @receiver(signal=process_response, dispatch_uid="stripe_middleware_resp")
def signal_process_response(sender, request: HttpRequest, response: HttpResponse, **kwargs): def signal_process_response(sender, request: HttpRequest, response: HttpResponse, **kwargs):
from pretix.plugins.stripe.payment import StripeMethod
provider = StripeMethod(sender) provider = StripeMethod(sender)
url = resolve(request.path_info) url = resolve(request.path_info)

View File

@@ -22,7 +22,6 @@
import logging import logging
from urllib.parse import urlsplit from urllib.parse import urlsplit
import stripe
from django.conf import settings from django.conf import settings
from pretix.base.services.tasks import EventTask from pretix.base.services.tasks import EventTask
@@ -50,7 +49,10 @@ def get_stripe_account_key(prov):
@app.task(base=EventTask, max_retries=5, default_retry_delay=1) @app.task(base=EventTask, max_retries=5, default_retry_delay=1)
def stripe_verify_domain(event, domain): def stripe_verify_domain(event, domain):
import stripe
from pretix.plugins.stripe.payment import StripeCC from pretix.plugins.stripe.payment import StripeCC
prov = StripeCC(event) prov = StripeCC(event)
account = get_stripe_account_key(prov) account = get_stripe_account_key(prov)

View File

@@ -37,7 +37,6 @@ import logging
import urllib.parse import urllib.parse
import requests import requests
import stripe
from django.contrib import messages from django.contrib import messages
from django.core import signing from django.core import signing
from django.db import transaction from django.db import transaction
@@ -68,7 +67,6 @@ from pretix.helpers.http import redirect_to_url
from pretix.multidomain.urlreverse import build_absolute_uri, eventreverse from pretix.multidomain.urlreverse import build_absolute_uri, eventreverse
from pretix.plugins.stripe.forms import OrganizerStripeSettingsForm from pretix.plugins.stripe.forms import OrganizerStripeSettingsForm
from pretix.plugins.stripe.models import ReferencedStripeObject from pretix.plugins.stripe.models import ReferencedStripeObject
from pretix.plugins.stripe.payment import StripeCC, StripeSettingsHolder
from pretix.plugins.stripe.tasks import ( from pretix.plugins.stripe.tasks import (
get_domain_for_event, stripe_verify_domain, get_domain_for_event, stripe_verify_domain,
) )
@@ -100,6 +98,8 @@ def redirect_view(request, *args, **kwargs):
@scopes_disabled() @scopes_disabled()
def oauth_return(request, *args, **kwargs): def oauth_return(request, *args, **kwargs):
import stripe
if 'payment_stripe_oauth_event' not in request.session: if 'payment_stripe_oauth_event' not in request.session:
messages.error(request, _('An error occurred during connecting with Stripe, please try again.')) messages.error(request, _('An error occurred during connecting with Stripe, please try again.'))
return redirect('control:index') return redirect('control:index')
@@ -268,6 +268,10 @@ SOURCE_TYPES = {
def charge_webhook(event, event_json, charge_id, rso): def charge_webhook(event, event_json, charge_id, rso):
import stripe
from pretix.plugins.stripe.payment import StripeCC
prov = StripeCC(event) prov = StripeCC(event)
prov._init_api() prov._init_api()
@@ -371,6 +375,10 @@ def charge_webhook(event, event_json, charge_id, rso):
def source_webhook(event, event_json, source_id, rso): def source_webhook(event, event_json, source_id, rso):
import stripe
from pretix.plugins.stripe.payment import StripeCC
prov = StripeCC(event) prov = StripeCC(event)
prov._init_api() prov._init_api()
try: try:
@@ -440,6 +448,10 @@ def source_webhook(event, event_json, source_id, rso):
def paymentintent_webhook(event, event_json, paymentintent_id, rso): def paymentintent_webhook(event, event_json, paymentintent_id, rso):
import stripe
from pretix.plugins.stripe.payment import StripeCC
prov = StripeCC(event) prov = StripeCC(event)
prov._init_api() prov._init_api()
@@ -516,6 +528,8 @@ class StripeOrderView:
@method_decorator(xframe_options_exempt, 'dispatch') @method_decorator(xframe_options_exempt, 'dispatch')
class ReturnView(StripeOrderView, View): class ReturnView(StripeOrderView, View):
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
import stripe
prov = self.pprov prov = self.pprov
prov._init_api() prov._init_api()
try: try:
@@ -568,6 +582,10 @@ class ReturnView(StripeOrderView, View):
class ScaView(StripeOrderView, View): class ScaView(StripeOrderView, View):
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
import stripe
from pretix.plugins.stripe.payment import StripeSettingsHolder
prov = self.pprov prov = self.pprov
prov._init_api() prov._init_api()

View File

@@ -49,7 +49,7 @@ from django.views.decorators.cache import cache_page
from django.views.decorators.gzip import gzip_page from django.views.decorators.gzip import gzip_page
from django.views.decorators.http import condition from django.views.decorators.http import condition
from django.views.i18n import ( from django.views.i18n import (
JavaScriptCatalog, get_formats, builtin_template_path, JavaScriptCatalog, get_formats, js_catalog_template,
) )
from lxml import html from lxml import html
@@ -168,8 +168,7 @@ def generate_widget_js(version, lang):
'September', 'October', 'November', 'December' 'September', 'October', 'November', 'December'
) )
catalog = dict((k, v) for k, v in catalog.items() if k.startswith('widget\u0004') or k in str_wl) catalog = dict((k, v) for k, v in catalog.items() if k.startswith('widget\u0004') or k in str_wl)
with builtin_template_path("i18n_catalog.js").open(encoding="utf-8") as fh: template = Engine().from_string(js_catalog_template)
template = Engine().from_string(fh.read())
context = Context({ context = Context({
'catalog_str': indent(json.dumps( 'catalog_str': indent(json.dumps(
catalog, sort_keys=True, indent=2)) if catalog else None, catalog, sort_keys=True, indent=2)) if catalog else None,

View File

@@ -530,7 +530,6 @@ X_FRAME_OPTIONS = 'DENY'
# URL settings # URL settings
ROOT_URLCONF = 'pretix.multidomain.maindomain_urlconf' ROOT_URLCONF = 'pretix.multidomain.maindomain_urlconf'
FORMS_URLFIELD_ASSUME_HTTPS = True # transitional for django 6.0
WSGI_APPLICATION = 'pretix.wsgi.application' WSGI_APPLICATION = 'pretix.wsgi.application'

View File

@@ -45,6 +45,8 @@ def env():
def test_event_main_domain_front_page(env): def test_event_main_domain_front_page(env):
assert eventreverse(env[1], 'presale:event.index') == '/mrmcd/2015/' assert eventreverse(env[1], 'presale:event.index') == '/mrmcd/2015/'
assert eventreverse(env[0], 'presale:organizer.index') == '/mrmcd/' assert eventreverse(env[0], 'presale:organizer.index') == '/mrmcd/'
assert eventreverse(env[1], 'plugins:testdummy:view') == '/mrmcd/2015/testdummy'
assert eventreverse(env[0], 'plugins:testdummy:view') == '/mrmcd/testdummy'
@pytest.mark.django_db @pytest.mark.django_db
@@ -52,12 +54,16 @@ def test_event_custom_domain_kwargs(env):
KnownDomain.objects.create(domainname='foobar', organizer=env[0]) KnownDomain.objects.create(domainname='foobar', organizer=env[0])
KnownDomain.objects.create(domainname='barfoo', organizer=env[0], event=env[1]) KnownDomain.objects.create(domainname='barfoo', organizer=env[0], event=env[1])
assert eventreverse(env[1], 'presale:event.checkout', {'step': 'payment'}) == 'http://barfoo/checkout/payment/' assert eventreverse(env[1], 'presale:event.checkout', {'step': 'payment'}) == 'http://barfoo/checkout/payment/'
assert eventreverse(env[0], 'plugins:testdummy:view') == 'http://foobar/testdummy'
assert eventreverse(env[1], 'plugins:testdummy:view') == 'http://barfoo/testdummy'
@pytest.mark.django_db @pytest.mark.django_db
def test_event_org_domain_kwargs(env): def test_event_org_domain_kwargs(env):
KnownDomain.objects.create(domainname='foobar', organizer=env[0]) KnownDomain.objects.create(domainname='foobar', organizer=env[0])
assert eventreverse(env[1], 'presale:event.checkout', {'step': 'payment'}) == 'http://foobar/2015/checkout/payment/' assert eventreverse(env[1], 'presale:event.checkout', {'step': 'payment'}) == 'http://foobar/2015/checkout/payment/'
assert eventreverse(env[0], 'plugins:testdummy:view') == 'http://foobar/testdummy'
assert eventreverse(env[1], 'plugins:testdummy:view') == 'http://foobar/2015/testdummy'
@pytest.mark.django_db @pytest.mark.django_db
@@ -65,9 +71,13 @@ def test_event_org_alt_domain_kwargs(env):
KnownDomain.objects.create(domainname='foobar', organizer=env[0]) KnownDomain.objects.create(domainname='foobar', organizer=env[0])
d = KnownDomain.objects.create(domainname='altfoo', organizer=env[0], mode=KnownDomain.MODE_ORG_ALT_DOMAIN) d = KnownDomain.objects.create(domainname='altfoo', organizer=env[0], mode=KnownDomain.MODE_ORG_ALT_DOMAIN)
assert eventreverse(env[1], 'presale:event.checkout', {'step': 'payment'}) == 'http://foobar/2015/checkout/payment/' assert eventreverse(env[1], 'presale:event.checkout', {'step': 'payment'}) == 'http://foobar/2015/checkout/payment/'
assert eventreverse(env[1], 'plugins:testdummy:view') == 'http://foobar/2015/testdummy'
d.event_assignments.create(event=env[1]) d.event_assignments.create(event=env[1])
with scopes_disabled(): with scopes_disabled():
assert eventreverse(Event.objects.get(pk=env[1].pk), 'presale:event.checkout', {'step': 'payment'}) == 'http://altfoo/2015/checkout/payment/' event = Event.objects.get(pk=env[1].pk)
assert eventreverse(event, 'presale:event.checkout', {'step': 'payment'}) == 'http://altfoo/2015/checkout/payment/'
assert eventreverse(env[0], 'plugins:testdummy:view') == 'http://foobar/testdummy'
assert eventreverse(event, 'plugins:testdummy:view') == 'http://altfoo/2015/testdummy'
@pytest.mark.django_db @pytest.mark.django_db

View File

@@ -385,6 +385,20 @@ def test_mark_paid_organizer_dash_in_slug(env, orga_job):
assert env[2].status == Order.STATUS_PAID assert env[2].status == Order.STATUS_PAID
@pytest.mark.django_db
def test_mark_paid_organizer_dash_in_slug_missing(env, orga_job):
env[0].slug = "foo-bar"
env[0].save()
process_banktransfers(orga_job, [{
'payer': 'Karla Kundin',
'reference': 'Bestellung FOOBAR1234S',
'date': '2016-01-26',
'amount': '23.00'
}])
env[2].refresh_from_db()
assert env[2].status == Order.STATUS_PAID
@pytest.mark.django_db @pytest.mark.django_db
def test_mark_paid_organizer_varying_order_code_length(env, orga_job): def test_mark_paid_organizer_varying_order_code_length(env, orga_job):
env[2].code = "123412341234" env[2].code = "123412341234"
@@ -490,7 +504,7 @@ def test_valid_plus_invalid_match(env, orga_job):
'payer': 'Karla Kundin', 'payer': 'Karla Kundin',
'reference': 'Bestellungen DUMMY-1Z3AS DUMMY-99999', 'reference': 'Bestellungen DUMMY-1Z3AS DUMMY-99999',
'date': '2016-01-26', 'date': '2016-01-26',
'amount': '.00' 'amount': '2.00'
}]) }])
with scopes_disabled(): with scopes_disabled():
job = BankImportJob.objects.last() job = BankImportJob.objects.last()

View File

@@ -2709,7 +2709,6 @@ class CartAddonTest(CartTestMixin, TestCase):
item=self.workshop1, price=Decimal('0.00'), item=self.workshop1, price=Decimal('0.00'),
event=self.event, cart_id=self.session_key, addon_to=cp1 event=self.event, cart_id=self.session_key, addon_to=cp1
) )
self.cm.extend_expired_positions()
self.cm.commit() self.cm.commit()
cp2.refresh_from_db() cp2.refresh_from_db()
assert cp2.expires > now() assert cp2.expires > now()
@@ -2732,7 +2731,6 @@ class CartAddonTest(CartTestMixin, TestCase):
item=self.workshop1, price=Decimal('0.00'), item=self.workshop1, price=Decimal('0.00'),
event=self.event, cart_id=self.session_key, addon_to=cp1 event=self.event, cart_id=self.session_key, addon_to=cp1
) )
self.cm.extend_expired_positions()
with self.assertRaises(CartError): with self.assertRaises(CartError):
self.cm.commit() self.cm.commit()
assert CartPosition.objects.count() == 0 assert CartPosition.objects.count() == 0
@@ -3400,7 +3398,6 @@ class CartAddonTest(CartTestMixin, TestCase):
item=self.workshop1, price=Decimal('12.00'), item=self.workshop1, price=Decimal('12.00'),
event=self.event, cart_id=self.session_key, addon_to=cp1 event=self.event, cart_id=self.session_key, addon_to=cp1
) )
self.cm.extend_expired_positions()
self.cm.commit() self.cm.commit()
cp1.refresh_from_db() cp1.refresh_from_db()
cp2.refresh_from_db() cp2.refresh_from_db()
@@ -3411,13 +3408,12 @@ class CartAddonTest(CartTestMixin, TestCase):
@classscope(attr='orga') @classscope(attr='orga')
def test_expand_expired_refresh_voucher(self): def test_expand_expired_refresh_voucher(self):
v = Voucher.objects.create(item=self.ticket, value=Decimal('20.00'), event=self.event, price_mode='set', v = Voucher.objects.create(item=self.ticket, value=Decimal('20.00'), event=self.event, price_mode='set',
valid_until=now() + timedelta(days=2), max_usages=999, redeemed=0) valid_until=now() + timedelta(days=2), max_usages=1, redeemed=0)
cp1 = CartPosition.objects.create( cp1 = CartPosition.objects.create(
expires=now() - timedelta(minutes=10), max_extend=now() + 10 * self.cart_reservation_time, expires=now() - timedelta(minutes=10), max_extend=now() + 10 * self.cart_reservation_time,
item=self.ticket, price=Decimal('21.50'), item=self.ticket, price=Decimal('21.50'),
event=self.event, cart_id=self.session_key, voucher=v event=self.event, cart_id=self.session_key, voucher=v
) )
self.cm.extend_expired_positions()
self.cm.commit() self.cm.commit()
cp1.refresh_from_db() cp1.refresh_from_db()
assert cp1.expires > now() assert cp1.expires > now()

View File

@@ -0,0 +1,52 @@
#
# 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.http import HttpResponse
from django.urls import path
def view(request):
return HttpResponse("")
urlpatterns = [
path(
"testdummy",
view,
name="view",
),
]
organizer_patterns = [
path(
"testdummy",
view,
name="view",
),
]
event_patterns = [
path(
"testdummy",
view,
name="view",
),
]