Compare commits

..

39 Commits

Author SHA1 Message Date
Raphael Michel
d0d7670ca5 Data sync: Allow more flexibility on list separators (#5718) 2025-12-17 16:23:07 +01:00
Richard Schreiber
a17a098b15 Exclude data-dir from code style checks (#5725) 2025-12-17 16:22:42 +01:00
sandra r
40516ab8e0 Translations: Update Galician
Currently translated at 15.9% (983 of 6172 strings)

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

powered by weblate
2025-12-17 16:21:25 +01:00
sandra r
3ca343fabc Translations: Update Galician
Currently translated at 15.9% (982 of 6172 strings)

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

powered by weblate
2025-12-17 16:21:25 +01:00
Lachlan Struthers
7304b7f24b Translations: Update Albanian
Currently translated at 91.3% (232 of 254 strings)

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

powered by weblate
2025-12-17 16:21:25 +01:00
Lachlan Struthers
abaf968103 Translations: Update Albanian
Currently translated at 1.1% (71 of 6172 strings)

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

powered by weblate
2025-12-17 16:21:25 +01:00
Lachlan Struthers
86e2f5a155 Translations: Update Albanian
Currently translated at 69.6% (177 of 254 strings)

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

powered by weblate
2025-12-17 16:21:25 +01:00
Lachlan Struthers
4c64af02c1 Translations: Update Albanian
Currently translated at 0.8% (52 of 6172 strings)

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

powered by weblate
2025-12-17 16:21:25 +01:00
Phin Wolkwitz
11df4398e1 Fix presale date display in calendar (Z#23216645) (#5710)
Fix presale date display in calendar and introduce a template tag
2025-12-17 16:18:59 +01:00
Lukas Bockstaller
2e89fc0a94 Questions: filter answers by dateFrame (Z#23216406) (#5706)
* replace manual form with QuestionFilterForm

* move form to form/item.py

* filter using a dateFrameField

* rename QuestionFilterForm to QuestionAnswerFilterForm

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

* pass existing `opqs` into `filter_qs`

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

* clean up filters

* fix view errors

* add labels

* display validation failures on field/label

* fix linting issues

* adjust datetime comparisons from lte to lt & gte to gt

* Change filter-form layout similar to order-filter-form

* improve label texts

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

* use order constants

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

* use Order Constants in Form where possible

* Change phrasing from Subevent to Date

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

* include product variations in products filter

* repair time zone comparisons

* fix linting

* move filter form to form/filter.py

* remove references to timezone.utc

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

* remove manual class statements

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

* removes unnecessary check

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

* fix datetime comparison

* Add full stop to error message to match style

* unify var-names and code-indent

---------

Co-authored-by: Richard Schreiber <schreiber@pretix.eu>
Co-authored-by: Richard Schreiber <schreiber@rami.io>
2025-12-15 12:46:06 +01:00
Raphael Michel
510c4850a5 Merge branch 'Add-Promptpay-for-stripe' (#5670) 2025-12-12 09:08:12 +01:00
Raphael Michel
b13368d614 Event creation: Do not declare tax rate as optional (fixes #4794) (#5619) 2025-12-12 08:59:07 +01:00
Ana Rute Pacheco Vivas
b5cc8b368b Translations: Update Portuguese (Portugal)
Currently translated at 83.2% (5140 of 6172 strings)

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

powered by weblate
2025-12-12 08:59:04 +01:00
Renne Rocha
87c30d0acb Translations: Update Portuguese (Brazil)
Currently translated at 90.4% (5585 of 6172 strings)

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

powered by weblate
2025-12-12 08:59:04 +01:00
Raphael Michel
ffed8b29b1 Bank transfer: Allow CAMT import (#5601) 2025-12-12 08:58:52 +01:00
Ana Rute Pacheco Vivas
53fbb64225 Translations: Update Portuguese (Portugal)
Currently translated at 50.3% (128 of 254 strings)

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

powered by weblate
2025-12-10 17:02:20 +01:00
Ana Rute Pacheco Vivas
e10ec4074b Translations: Update Portuguese (Portugal)
Currently translated at 83.1% (5135 of 6172 strings)

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

powered by weblate
2025-12-10 17:02:20 +01:00
Lachlan Struthers
7f2dc77aca Translations: Update Albanian
Currently translated at 41.3% (105 of 254 strings)

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

powered by weblate
2025-12-10 17:02:20 +01:00
Lachlan Struthers
199a3bf1e7 Translations: Update Albanian
Currently translated at 0.6% (39 of 6172 strings)

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

powered by weblate
2025-12-10 17:02:20 +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
82ca50c7ff Fix templates 2025-12-09 12:42:47 +01:00
Daniel
3437b64947 Add PromptPay support (#5)
* Handle PromptPay QR flow

* Send billing email for PromptPay

* fix isort

* Update payment.py

* Update signals.py

---------

Co-authored-by: Chondaen <chondaen12@1000WA>
2025-12-09 12:28:28 +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
58 changed files with 3133 additions and 963 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

@@ -90,6 +90,7 @@ StaticMapping = namedtuple('StaticMapping', ('id', 'pretix_model', 'external_obj
class OutboundSyncProvider: class OutboundSyncProvider:
max_attempts = 5 max_attempts = 5
list_field_joiner = "," # set to None to keep native lists in properties
def __init__(self, event): def __init__(self, event):
self.event = event self.event = event
@@ -281,7 +282,8 @@ class OutboundSyncProvider:
'Please update value mapping for field "{field_name}" - option "{val}" not assigned' 'Please update value mapping for field "{field_name}" - option "{val}" not assigned'
).format(field_name=key, val=val)]) ).format(field_name=key, val=val)])
val = ",".join(val) if self.list_field_joiner:
val = self.list_field_joiner.join(val)
return val return val
def get_properties(self, inputs: dict, property_mappings: List[dict]): def get_properties(self, inputs: dict, property_mappings: List[dict]):

View File

@@ -71,15 +71,20 @@ def assign_properties(
return out return out
def _add_to_list(out, field_name, current_value, new_item, list_sep): def _add_to_list(out, field_name, current_value, new_item_input, list_sep):
new_item = str(new_item)
if list_sep is not None: if list_sep is not None:
new_item = new_item.replace(list_sep, "") new_items = str(new_item_input).split(list_sep)
current_value = current_value.split(list_sep) if current_value else [] current_value = current_value.split(list_sep) if current_value else []
elif not isinstance(current_value, (list, tuple)): else:
new_items = [str(new_item_input)]
if not isinstance(current_value, (list, tuple)):
current_value = [str(current_value)] current_value = [str(current_value)]
new_list = list(current_value)
for new_item in new_items:
if new_item not in current_value: if new_item not in current_value:
new_list = current_value + [new_item] new_list.append(new_item)
if new_list != current_value:
if list_sep is not None: if list_sep is not None:
new_list = list_sep.join(new_list) new_list = list_sep.join(new_list)
out[field_name] = new_list out[field_name] = new_list

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

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

@@ -0,0 +1,65 @@
#
# 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 datetime import datetime
from django import template
from django.utils.html import format_html
from django.utils.timezone import get_current_timezone
from pretix.base.i18n import LazyExpiresDate
from pretix.helpers.templatetags.date_fast import date_fast
register = template.Library()
@register.simple_tag
def html_time(value: datetime, dt_format: str = "SHORT_DATE_FORMAT", **kwargs):
"""
Building a <time datetime='{html-datetime}'>{human-readable datetime}</time> html string,
where the html-datetime as well as the human-readable datetime can be set
to a value from django's FORMAT_SETTINGS or "format_expires".
If attr_fmt isnt provided, it will be set to isoformat.
Usage example:
{% html_time event_start "SHORT_DATETIME_FORMAT" %}
or
{% html_time event_start "TIME_FORMAT" attr_fmt="H:i" %}
"""
if value in (None, ''):
return ''
value = value.astimezone(get_current_timezone())
attr_fmt = kwargs["attr_fmt"] if kwargs else None
try:
if not attr_fmt:
date_html = value.isoformat()
else:
date_html = date_fast(value, attr_fmt)
if dt_format == "format_expires":
date_human = LazyExpiresDate(value)
else:
date_human = date_fast(value, dt_format)
return format_html("<time datetime='{}'>{}</time>", date_html, date_human)
except AttributeError:
return ''

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

@@ -207,6 +207,7 @@ class EventWizardBasicsForm(I18nModelForm):
'Sample Conference Center\nHeidelberg, Germany' 'Sample Conference Center\nHeidelberg, Germany'
) )
self.fields['slug'].widget.prefix = build_absolute_uri(self.organizer, 'presale:organizer.index') self.fields['slug'].widget.prefix = build_absolute_uri(self.organizer, 'presale:organizer.index')
self.fields['tax_rate']._required = True # Do not render as optional because it is conditionally required
if self.has_subevents: if self.has_subevents:
del self.fields['presale_start'] del self.fields['presale_start']
del self.fields['presale_end'] del self.fields['presale_end']
@@ -1958,6 +1959,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

@@ -61,6 +61,10 @@ from pretix.base.models import (
SubEvent, SubEventMetaValue, Team, TeamAPIToken, TeamInvite, Voucher, SubEvent, SubEventMetaValue, Team, TeamAPIToken, TeamInvite, Voucher,
) )
from pretix.base.signals import register_payment_providers from pretix.base.signals import register_payment_providers
from pretix.base.timeframes import (
DateFrameField,
resolve_timeframe_to_datetime_start_inclusive_end_exclusive,
)
from pretix.control.forms import SplitDateTimeField from pretix.control.forms import SplitDateTimeField
from pretix.control.forms.widgets import Select2, Select2ItemVarQuota from pretix.control.forms.widgets import Select2, Select2ItemVarQuota
from pretix.control.signals import order_search_filter_q from pretix.control.signals import order_search_filter_q
@@ -1219,6 +1223,129 @@ class OrderPaymentSearchFilterForm(forms.Form):
return qs return qs
class QuestionAnswerFilterForm(forms.Form):
STATUS_VARIANTS = [
("", _("All orders")),
(Order.STATUS_PAID, _("Paid")),
(Order.STATUS_PAID + 'v', _("Paid or confirmed")),
(Order.STATUS_PENDING, _("Pending")),
(Order.STATUS_PENDING + Order.STATUS_PAID, _("Pending or paid")),
("o", _("Pending (overdue)")),
(Order.STATUS_EXPIRED, _("Expired")),
(Order.STATUS_PENDING + Order.STATUS_EXPIRED, _("Pending or expired")),
(Order.STATUS_CANCELED, _("Canceled"))
]
status = forms.ChoiceField(
choices=STATUS_VARIANTS,
required=False,
label=_("Order status"),
)
item = forms.ChoiceField(
choices=[],
required=False,
label=_("Products"),
)
subevent = forms.ModelChoiceField(
queryset=SubEvent.objects.none(),
required=False,
empty_label=pgettext_lazy('subevent', 'All dates'),
label=pgettext_lazy("subevent", "Date"),
)
date_range = DateFrameField(
required=False,
include_future_frames=True,
label=_('Event date'),
)
def __init__(self, *args, **kwargs):
self.event = kwargs.pop('event')
super().__init__(*args, **kwargs)
self.initial['status'] = Order.STATUS_PENDING + Order.STATUS_PAID
choices = [('', _('All products'))]
for i in self.event.items.prefetch_related('variations').all():
variations = list(i.variations.all())
if variations:
choices.append((str(i.pk), _('{product} Any variation').format(product=str(i))))
for v in variations:
choices.append(('%d-%d' % (i.pk, v.pk), '%s %s' % (str(i), v.value)))
else:
choices.append((str(i.pk), str(i)))
self.fields['item'].choices = choices
if self.event.has_subevents:
self.fields["subevent"].queryset = self.event.subevents.all()
self.fields['subevent'].widget = Select2(
attrs={
'data-model-select2': 'event',
'data-select2-url': reverse('control:event.subevents.select2', kwargs={
'event': self.event.slug,
'organizer': self.event.organizer.slug,
}),
'data-placeholder': pgettext_lazy('subevent', 'All dates')
}
)
self.fields['subevent'].widget.choices = self.fields['subevent'].choices
else:
del self.fields['subevent']
def clean(self):
cleaned_data = super().clean()
subevent = cleaned_data.get('subevent')
date_range = cleaned_data.get('date_range')
if subevent is not None and date_range is not None:
d_start, d_end = resolve_timeframe_to_datetime_start_inclusive_end_exclusive(now(), date_range, self.event.timezone)
if (
(d_start and not (d_start <= subevent.date_from)) or
(d_end and not (subevent.date_from < d_end))
):
self.add_error('subevent', pgettext_lazy('subevent', "Date doesn't start in selected date range."))
return cleaned_data
def filter_qs(self, opqs):
fdata = self.cleaned_data
subevent = fdata.get('subevent', None)
date_range = fdata.get('date_range', None)
if subevent is not None:
opqs = opqs.filter(subevent=subevent)
if date_range is not None:
d_start, d_end = resolve_timeframe_to_datetime_start_inclusive_end_exclusive(now(), date_range, self.event.timezone)
opqs = opqs.filter(
subevent__date_from__gte=d_start,
subevent__date_from__lt=d_end
)
s = fdata.get("status", Order.STATUS_PENDING + Order.STATUS_PAID)
if s != "":
if s == Order.STATUS_PENDING:
opqs = opqs.filter(order__status=Order.STATUS_PENDING,
order__expires__lt=now().replace(hour=0, minute=0, second=0))
elif s == Order.STATUS_PENDING + Order.STATUS_PAID:
opqs = opqs.filter(order__status__in=[Order.STATUS_PENDING, Order.STATUS_PAID])
elif s == Order.STATUS_PAID + 'v':
opqs = opqs.filter(
Q(order__status=Order.STATUS_PAID) |
Q(order__status=Order.STATUS_PENDING, order__valid_if_pending=True)
)
elif s == Order.STATUS_PENDING + Order.STATUS_EXPIRED:
opqs = opqs.filter(order__status__in=[Order.STATUS_PENDING, Order.STATUS_EXPIRED])
else:
opqs = opqs.filter(order__status=s)
if s not in (Order.STATUS_CANCELED, ""):
opqs = opqs.filter(canceled=False)
if fdata.get("item", "") != "":
i = fdata.get("item", "")
opqs = opqs.filter(item_id__in=(i,))
return opqs
class SubEventFilterForm(FilterForm): class SubEventFilterForm(FilterForm):
orders = { orders = {
'date_from': 'date_from', 'date_from': 'date_from',

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

@@ -20,33 +20,18 @@
</div> </div>
<form class="panel-body filter-form" action="" method="get"> <form class="panel-body filter-form" action="" method="get">
<div class="row"> <div class="row">
<div class="col-lg-2 col-sm-6 col-xs-6"> <div class="col-md-2 col-xs-6">
<select name="status" class="form-control"> {% bootstrap_field form.status %}
<option value="" {% if request.GET.status == "" %}selected="selected"{% endif %}>{% trans "All orders" %}</option>
<option value="p" {% if request.GET.status == "p" %}selected="selected"{% endif %}>{% trans "Paid" %}</option>
<option value="pv" {% if request.GET.status == "pv" %}selected="selected"{% endif %}>{% trans "Paid or confirmed" %}</option>
<option value="n" {% if request.GET.status == "n" %}selected="selected"{% endif %}>{% trans "Pending" %}</option>
<option value="np" {% if request.GET.status == "np" or "status" not in request.GET %}selected="selected"{% endif %}>{% trans "Pending or paid" %}</option>
<option value="o" {% if request.GET.status == "o" %}selected="selected"{% endif %}>{% trans "Pending (overdue)" %}</option>
<option value="e" {% if request.GET.status == "e" %}selected="selected"{% endif %}>{% trans "Expired" %}</option>
<option value="ne" {% if request.GET.status == "ne" %}selected="selected"{% endif %}>{% trans "Pending or expired" %}</option>
<option value="c" {% if request.GET.status == "c" %}selected="selected"{% endif %}>{% trans "Canceled" %}</option>
</select>
</div> </div>
<div class="col-lg-5 col-sm-6 col-xs-6"> <div class="col-md-3 col-xs-6">
<select name="item" class="form-control"> {% bootstrap_field form.item %}
<option value="">{% trans "All products" %}</option>
{% for item in items %}
<option value="{{ item.id }}"
{% if request.GET.item|add:0 == item.id %}selected="selected"{% endif %}>
{{ item.name }}
</option>
{% endfor %}
</select>
</div> </div>
{% if request.event.has_subevents %} {% if has_subevents %}
<div class="col-lg-5 col-sm-6 col-xs-6"> <div class="col-md-3 col-xs-6">
{% include "pretixcontrol/event/fragment_subevent_choice_simple.html" %} {% bootstrap_field form.subevent %}
</div>
<div class="col-md-4 col-xs-6">
{% bootstrap_field form.date_range %}
</div> </div>
{% endif %} {% endif %}
</div> </div>

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

@@ -65,7 +65,7 @@ from pretix.api.serializers.item import (
) )
from pretix.base.forms import I18nFormSet from pretix.base.forms import I18nFormSet
from pretix.base.models import ( from pretix.base.models import (
CartPosition, Item, ItemCategory, ItemProgramTime, ItemVariation, Order, CartPosition, Item, ItemCategory, ItemProgramTime, ItemVariation,
OrderPosition, Question, QuestionAnswer, QuestionOption, Quota, OrderPosition, Question, QuestionAnswer, QuestionOption, Quota,
SeatCategoryMapping, Voucher, SeatCategoryMapping, Voucher,
) )
@@ -74,6 +74,7 @@ from pretix.base.models.items import ItemAddOn, ItemBundle, ItemMetaValue
from pretix.base.services.quotas import QuotaAvailability from pretix.base.services.quotas import QuotaAvailability
from pretix.base.services.tickets import invalidate_cache from pretix.base.services.tickets import invalidate_cache
from pretix.base.signals import quota_availability from pretix.base.signals import quota_availability
from pretix.control.forms.filter import QuestionAnswerFilterForm
from pretix.control.forms.item import ( from pretix.control.forms.item import (
CategoryForm, ItemAddOnForm, ItemAddOnsFormSet, ItemBundleForm, CategoryForm, ItemAddOnForm, ItemAddOnsFormSet, ItemBundleForm,
ItemBundleFormSet, ItemCreateForm, ItemMetaValueForm, ItemProgramTimeForm, ItemBundleFormSet, ItemCreateForm, ItemMetaValueForm, ItemProgramTimeForm,
@@ -660,46 +661,26 @@ class QuestionMixin:
return ctx return ctx
class QuestionView(EventPermissionRequiredMixin, QuestionMixin, ChartContainingView, DetailView): class QuestionView(EventPermissionRequiredMixin, ChartContainingView, DetailView):
model = Question model = Question
template_name = 'pretixcontrol/items/question.html' template_name = 'pretixcontrol/items/question.html'
permission = 'can_change_items' permission = 'can_change_items'
template_name_field = 'question' template_name_field = 'question'
@cached_property
def filter_form(self):
return QuestionAnswerFilterForm(event=self.request.event, data=self.request.GET)
def get_answer_statistics(self): def get_answer_statistics(self):
opqs = OrderPosition.objects.filter( opqs = OrderPosition.objects.filter(
order__event=self.request.event, order__event=self.request.event,
) )
if self.filter_form.is_valid():
opqs = self.filter_form.filter_qs(opqs)
qs = QuestionAnswer.objects.filter( qs = QuestionAnswer.objects.filter(
question=self.object, orderposition__isnull=False, question=self.object, orderposition__isnull=False,
) )
if self.request.GET.get("subevent", "") != "":
opqs = opqs.filter(subevent=self.request.GET["subevent"])
s = self.request.GET.get("status", "np")
if s != "":
if s == 'o':
opqs = opqs.filter(order__status=Order.STATUS_PENDING,
order__expires__lt=now().replace(hour=0, minute=0, second=0))
elif s == 'np':
opqs = opqs.filter(order__status__in=[Order.STATUS_PENDING, Order.STATUS_PAID])
elif s == 'pv':
opqs = opqs.filter(
Q(order__status=Order.STATUS_PAID) |
Q(order__status=Order.STATUS_PENDING, order__valid_if_pending=True)
)
elif s == 'ne':
opqs = opqs.filter(order__status__in=[Order.STATUS_PENDING, Order.STATUS_EXPIRED])
else:
opqs = opqs.filter(order__status=s)
if s not in (Order.STATUS_CANCELED, ""):
opqs = opqs.filter(canceled=False)
if self.request.GET.get("item", "") != "":
i = self.request.GET.get("item", "")
opqs = opqs.filter(item_id__in=(i,))
qs = qs.filter(orderposition__in=opqs) qs = qs.filter(orderposition__in=opqs)
op_cnt = opqs.filter(item__in=self.object.items.all()).count() op_cnt = opqs.filter(item__in=self.object.items.all()).count()
@@ -746,9 +727,11 @@ class QuestionView(EventPermissionRequiredMixin, QuestionMixin, ChartContainingV
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
ctx = super().get_context_data() ctx = super().get_context_data()
ctx['items'] = self.object.items.all() ctx['items'] = self.object.items.exists()
ctx['has_subevents'] = self.request.event.has_subevents
stats = self.get_answer_statistics() stats = self.get_answer_statistics()
ctx['stats'], ctx['total'] = stats ctx['stats'], ctx['total'] = stats
ctx['form'] = self.filter_form
return ctx return ctx
def get_object(self, queryset=None) -> Question: def get_object(self, queryset=None) -> Question:

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-15 20: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
@@ -6529,7 +6506,6 @@ msgstr "pendiente"
#: pretix/base/models/orders.py:203 pretix/base/payment.py:570 #: pretix/base/models/orders.py:203 pretix/base/payment.py:570
#: pretix/base/services/invoices.py:581 #: pretix/base/services/invoices.py:581
#, fuzzy
msgid "paid" msgid "paid"
msgstr "pagado" msgstr "pagado"
@@ -6863,9 +6839,8 @@ msgid "This reference will be printed on your invoice for your convenience."
msgstr "Esta referencia imprimirase na súa factura para a súa conveniencia." msgstr "Esta referencia imprimirase na súa factura para a súa conveniencia."
#: pretix/base/models/orders.py:3534 #: pretix/base/models/orders.py:3534
#, fuzzy
msgid "Transmission type" msgid "Transmission type"
msgstr "digo de transacción" msgstr "Medio de contacto"
#: pretix/base/models/orders.py:3632 #: pretix/base/models/orders.py:3632
#: pretix/plugins/badges/templates/pretixplugins/badges/control_order_position_buttons.html:9 #: pretix/plugins/badges/templates/pretixplugins/badges/control_order_position_buttons.html:9
@@ -9318,10 +9293,10 @@ msgid "Your exported data exceeded the size limit for scheduled exports."
msgstr "" msgstr ""
#: pretix/base/services/invoices.py:116 #: pretix/base/services/invoices.py:116
#, fuzzy, python-brace-format #, python-brace-format
msgctxt "invoice" msgctxt "invoice"
msgid "Please complete your payment before {expire_date}." msgid "Please complete your payment before {expire_date}."
msgstr "Por favor complete su pago antes de {expire_date}." msgstr "Complete o seu pago antes de {expire_date}."
#: pretix/base/services/invoices.py:128 #: pretix/base/services/invoices.py:128
#, python-brace-format #, python-brace-format
@@ -21632,9 +21607,8 @@ msgid "Placed order"
msgstr "Pedido realizado" msgstr "Pedido realizado"
#: pretix/control/templates/pretixcontrol/event/mail.html:93 #: pretix/control/templates/pretixcontrol/event/mail.html:93
#, fuzzy
msgid "Paid order" msgid "Paid order"
msgstr "Orden de pago" msgstr "Pedido pagado"
#: pretix/control/templates/pretixcontrol/event/mail.html:96 #: pretix/control/templates/pretixcontrol/event/mail.html:96
msgid "Free order" msgid "Free order"
@@ -24239,9 +24213,8 @@ msgstr "Sí, aprobar la orden"
#: pretix/control/templates/pretixcontrol/order/index.html:166 #: pretix/control/templates/pretixcontrol/order/index.html:166
#: pretix/presale/templates/pretixpresale/event/order.html:483 #: pretix/presale/templates/pretixpresale/event/order.html:483
#: pretix/presale/templates/pretixpresale/event/order_cancel.html:7 #: pretix/presale/templates/pretixpresale/event/order_cancel.html:7
#, fuzzy
msgid "Cancel order" msgid "Cancel order"
msgstr "Cancelar orden" msgstr "Cancelar a orde"
#: pretix/control/templates/pretixcontrol/order/cancel.html:12 #: pretix/control/templates/pretixcontrol/order/cancel.html:12
#: pretix/control/templates/pretixcontrol/order/deny.html:11 #: pretix/control/templates/pretixcontrol/order/deny.html:11
@@ -25001,9 +24974,8 @@ msgstr "Cambiar"
#: pretix/control/templates/pretixcontrol/order/index.html:1034 #: pretix/control/templates/pretixcontrol/order/index.html:1034
#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:90 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:90
#: pretix/presale/templates/pretixpresale/event/order.html:318 #: pretix/presale/templates/pretixpresale/event/order.html:318
#, fuzzy
msgid "ZIP code and city" msgid "ZIP code and city"
msgstr "Código postal y ciudad" msgstr "Código postal e cidade"
#: pretix/control/templates/pretixcontrol/order/index.html:1047 #: pretix/control/templates/pretixcontrol/order/index.html:1047
#, fuzzy #, fuzzy
@@ -25460,9 +25432,8 @@ msgid "Preview refund amount"
msgstr "Reembolso" msgstr "Reembolso"
#: pretix/control/templates/pretixcontrol/orders/cancel.html:88 #: pretix/control/templates/pretixcontrol/orders/cancel.html:88
#, fuzzy
msgid "Cancel all orders" msgid "Cancel all orders"
msgstr "Cancelar orden" msgstr "Cancelar todos os pedidos"
#: pretix/control/templates/pretixcontrol/orders/cancel_confirm.html:13 #: pretix/control/templates/pretixcontrol/orders/cancel_confirm.html:13
#, fuzzy #, fuzzy
@@ -33277,9 +33248,8 @@ msgid "Payment reversed."
msgstr "Pago anulado." msgstr "Pago anulado."
#: pretix/plugins/paypal2/signals.py:62 #: pretix/plugins/paypal2/signals.py:62
#, fuzzy
msgid "Payment pending." msgid "Payment pending."
msgstr "Pago pendiente." msgstr "Pago pendente."
#: pretix/plugins/paypal2/signals.py:63 #: pretix/plugins/paypal2/signals.py:63
#, fuzzy #, fuzzy
@@ -33421,9 +33391,8 @@ msgstr "Por favor, inténtalo de nuevo."
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/pay.html:29 #: pretix/plugins/paypal2/templates/pretixplugins/paypal2/pay.html:29
#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:57 #: pretix/presale/templates/pretixpresale/event/checkout_payment.html:57
#, fuzzy
msgid "Please select how you want to pay." msgid "Please select how you want to pay."
msgstr "Por favor, seleccione cómo desea pagar." msgstr "Por favor, seleccione cómo desexa pagar."
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/pending.html:10 #: pretix/plugins/paypal2/templates/pretixplugins/paypal2/pending.html:10
#, fuzzy #, fuzzy
@@ -34573,7 +34542,7 @@ msgstr ""
#: pretix/plugins/stripe/payment.py:337 #: pretix/plugins/stripe/payment.py:337
msgid "Credit card payments" msgid "Credit card payments"
msgstr "Pagos con cartón de crédito" msgstr "Pagos con tarxeta de crédito"
#: pretix/plugins/stripe/payment.py:342 pretix/plugins/stripe/payment.py:1527 #: pretix/plugins/stripe/payment.py:342 pretix/plugins/stripe/payment.py:1527
msgid "iDEAL" msgid "iDEAL"
@@ -35126,18 +35095,12 @@ msgstr "Titular de la cuenta"
#: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form_simple.html:7 #: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form_simple.html:7
#: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form_simple_messaging_noform.html:13 #: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form_simple_messaging_noform.html:13
#: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form_simple_noform.html:5 #: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form_simple_noform.html:5
#, fuzzy
#| msgid ""
#| "After you submitted your order, we will redirect you to the payment "
#| "service provider to complete your payment. You will then be redirected "
#| "back here to get your tickets."
msgid "" msgid ""
"After you submitted your order, we will redirect you to the payment service " "After you submitted your order, we will redirect you to the payment service "
"provider to complete your payment. You will then be redirected back here." "provider to complete your payment. You will then be redirected back here."
msgstr "" msgstr ""
"Despois de que enviase o seu pedido, redirixirémoslle ao provedor de " "Despois de enviar o teu pedido, redirixirémoste ao provedor de servizos de "
"servizos de pago para completar o seu pago. A continuación, redirixiráselle " "pagamento para completar o pago. Despois, serás redirixido de novo aquí."
"de novo aquí para obter as súas entradas."
#: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form_card.html:9 #: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form_card.html:9
msgid "" msgid ""
@@ -35513,9 +35476,8 @@ msgid "Download tickets (PDF)"
msgstr "Descargar tickets (PDF)" msgstr "Descargar tickets (PDF)"
#: pretix/plugins/ticketoutputpdf/ticketoutput.py:66 #: pretix/plugins/ticketoutputpdf/ticketoutput.py:66
#, fuzzy
msgid "Download ticket (PDF)" msgid "Download ticket (PDF)"
msgstr "Descargar ticket" msgstr "Descargar ticket (PDF)"
#: pretix/plugins/ticketoutputpdf/views.py:62 #: pretix/plugins/ticketoutputpdf/views.py:62
#, fuzzy #, fuzzy
@@ -35654,7 +35616,6 @@ msgstr ""
"selecciona un método de pago." "selecciona un método de pago."
#: pretix/presale/checkoutflow.py:1393 pretix/presale/views/order.py:679 #: pretix/presale/checkoutflow.py:1393 pretix/presale/views/order.py:679
#, fuzzy
msgid "Please select a payment method." msgid "Please select a payment method."
msgstr "Por favor seleccione un método de pago." msgstr "Por favor seleccione un método de pago."
@@ -36115,9 +36076,8 @@ msgid "Cart expired"
msgstr "O carro da compra caducou" msgstr "O carro da compra caducou"
#: pretix/presale/templates/pretixpresale/event/checkout_base.html:36 #: pretix/presale/templates/pretixpresale/event/checkout_base.html:36
#, fuzzy
msgid "Show full cart" msgid "Show full cart"
msgstr "Mostrar información" msgstr "Mostrar o carro completo"
#: pretix/presale/templates/pretixpresale/event/checkout_base.html:52 #: pretix/presale/templates/pretixpresale/event/checkout_base.html:52
#: pretix/presale/templates/pretixpresale/event/index.html:86 #: pretix/presale/templates/pretixpresale/event/index.html:86
@@ -36209,9 +36169,8 @@ msgstr ""
"un enlace que puede utilizar para pagar." "un enlace que puede utilizar para pagar."
#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:215 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:215
#, fuzzy
msgid "Place binding order" msgid "Place binding order"
msgstr "Colocar orden de compra" msgstr "Realizar orde"
#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:217 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:217
msgid "Submit registration" msgid "Submit registration"
@@ -36810,9 +36769,9 @@ msgstr[0] "Unha entrada"
msgstr[1] "%(num)s entradas" msgstr[1] "%(num)s entradas"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:485 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:485
#, fuzzy, python-format #, python-format
msgid "incl. %(tax_sum)s taxes" msgid "incl. %(tax_sum)s taxes"
msgstr "incl. %(tax_sum)s impuestos" msgstr "incl. %(tax_sum)s IVE"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:505 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:505
#, python-format #, python-format
@@ -37135,9 +37094,8 @@ msgid "Confirmed"
msgstr "Confirmado" msgstr "Confirmado"
#: pretix/presale/templates/pretixpresale/event/fragment_order_status.html:15 #: pretix/presale/templates/pretixpresale/event/fragment_order_status.html:15
#, fuzzy
msgid "Payment pending" msgid "Payment pending"
msgstr "Pago pendiente" msgstr "Pago pendente"
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:21 #: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:21
#, fuzzy #, fuzzy
@@ -37161,11 +37119,11 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:131 #: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:131
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:288 #: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:288
#, fuzzy, python-format #, python-format
msgid "%(amount)s× in your cart" msgid "%(amount)s× in your cart"
msgid_plural "%(amount)s× in your cart" msgid_plural "%(amount)s× in your cart"
msgstr[0] "%(count)s elementos" msgstr[0] "%(amount)s× no teu carro"
msgstr[1] "%(count)s elementos" msgstr[1] "%(amount)s× no teu carro"
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:209 #: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:209
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:374 #: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:374
@@ -37396,9 +37354,9 @@ msgstr "O seu pedido foi procesado con éxito! Ver abaixo para máis detalles."
#: pretix/presale/templates/pretixpresale/event/order.html:19 #: pretix/presale/templates/pretixpresale/event/order.html:19
#: pretix/presale/templates/pretixpresale/event/order.html:50 #: pretix/presale/templates/pretixpresale/event/order.html:50
#, fuzzy
msgid "We successfully received your payment. See below for details." msgid "We successfully received your payment. See below for details."
msgstr "Hemos recibido con éxito su pago. Ver abajo para más detalles." msgstr ""
"Recibimos o teu pagamento correctamente. Consulta os detalles a continuación."
#: pretix/presale/templates/pretixpresale/event/order.html:35 #: pretix/presale/templates/pretixpresale/event/order.html:35
#, fuzzy #, fuzzy
@@ -37419,24 +37377,18 @@ msgstr ""
"organizador del evento antes de que pueda pagar y completar este pedido." "organizador del evento antes de que pueda pagar y completar este pedido."
#: pretix/presale/templates/pretixpresale/event/order.html:43 #: pretix/presale/templates/pretixpresale/event/order.html:43
#, fuzzy
msgid "Please note that we still await your payment to complete the process." msgid "Please note that we still await your payment to complete the process."
msgstr "Tenga en cuenta que aún esperamos su pago para completar el proceso." msgstr "Ten en conta que aínda agardamos o teu pago para completar o proceso."
#: pretix/presale/templates/pretixpresale/event/order.html:55 #: pretix/presale/templates/pretixpresale/event/order.html:55
#, fuzzy
#| msgid ""
#| "Please bookmark or save the link to this exact page if you want to access "
#| "your order later. We also sent you an email containing the link to the "
#| "address you specified."
msgid "" msgid ""
"Please bookmark or save the link to this exact page if you want to access " "Please bookmark or save the link to this exact page if you want to access "
"your order later. We also sent you an email to the address you specified " "your order later. We also sent you an email to the address you specified "
"containing the link to this page." "containing the link to this page."
msgstr "" msgstr ""
"Por favor, marque ou garde a ligazón a esta páxina exacta se desexa acceder " "Por favor, garda a ligazón a esta páxina exacta se queres acceder ao teu "
"ao seu pedido máis tarde. Tamén lle enviamos un correo electrónico coa " "pedido máis tarde. Tamén che enviamos un correo electrónico ao enderezo que "
"ligazón ao enderezo que vostede especificou." "especificaches coa ligazón a esta páxina."
#: pretix/presale/templates/pretixpresale/event/order.html:59 #: pretix/presale/templates/pretixpresale/event/order.html:59
#, fuzzy #, fuzzy
@@ -37458,9 +37410,9 @@ msgid "View in backend"
msgstr "Ver en el backend" msgstr "Ver en el backend"
#: pretix/presale/templates/pretixpresale/event/order.html:91 #: pretix/presale/templates/pretixpresale/event/order.html:91
#, fuzzy, python-format #, python-format
msgid "A payment of %(total)s is still pending for this order." msgid "A payment of %(total)s is still pending for this order."
msgstr "Un pago de %(total)s todavía está pendiente para esta orden." msgstr "Un pago de %(total)s aínda está pendente para esta orde."
#: pretix/presale/templates/pretixpresale/event/order.html:96 #: pretix/presale/templates/pretixpresale/event/order.html:96
#, fuzzy, python-format #, fuzzy, python-format
@@ -37569,10 +37521,9 @@ msgid "Change your order"
msgstr "Cancelar orden" msgstr "Cancelar orden"
#: pretix/presale/templates/pretixpresale/event/order.html:358 #: pretix/presale/templates/pretixpresale/event/order.html:358
#, fuzzy
msgctxt "action" msgctxt "action"
msgid "Cancel your order" msgid "Cancel your order"
msgstr "Cancelar orden" msgstr "Cancela o teu pedido"
#: pretix/presale/templates/pretixpresale/event/order.html:366 #: pretix/presale/templates/pretixpresale/event/order.html:366
msgid "" msgid ""
@@ -37688,9 +37639,9 @@ msgid "Request cancellation: %(code)s"
msgstr "Pedido cancelado: %(code)s" msgstr "Pedido cancelado: %(code)s"
#: pretix/presale/templates/pretixpresale/event/order_cancel.html:15 #: pretix/presale/templates/pretixpresale/event/order_cancel.html:15
#, fuzzy, python-format #, python-format
msgid "Cancel order: %(code)s" msgid "Cancel order: %(code)s"
msgstr "Cancelar orden: %(code)s" msgstr "Cancelar orde: %(code)s"
#: pretix/presale/templates/pretixpresale/event/order_cancel.html:38 #: pretix/presale/templates/pretixpresale/event/order_cancel.html:38
msgid "" msgid ""
@@ -37776,14 +37727,12 @@ msgid "Modify order: %(code)s"
msgstr "Modificar pedido: %(code)s" msgstr "Modificar pedido: %(code)s"
#: pretix/presale/templates/pretixpresale/event/order_modify.html:18 #: pretix/presale/templates/pretixpresale/event/order_modify.html:18
#, fuzzy
msgid "" msgid ""
"Modifying your invoice address will not automatically generate a new " "Modifying your invoice address will not automatically generate a new "
"invoice. Please contact us if you need a new invoice." "invoice. Please contact us if you need a new invoice."
msgstr "" msgstr ""
"La modificación de la dirección de facturación no generará automáticamente " "A modificación do enderezo de facturación non xerará automaticamente unha "
"una nueva factura. Póngase en contacto con nosotros si necesita una nueva " "nova factura. Póñase en contacto connosco se precisa unha nova factura."
"factura."
#: pretix/presale/templates/pretixpresale/event/order_modify.html:88 #: pretix/presale/templates/pretixpresale/event/order_modify.html:88
#: pretix/presale/templates/pretixpresale/event/position_modify.html:49 #: pretix/presale/templates/pretixpresale/event/position_modify.html:49
@@ -38632,10 +38581,8 @@ msgid "Your cart is now empty."
msgstr "Baleirouse o seu pedido." msgstr "Baleirouse o seu pedido."
#: pretix/presale/views/cart.py:569 #: pretix/presale/views/cart.py:569
#, fuzzy
#| msgid "Your cart has been updated."
msgid "Your cart timeout was extended." msgid "Your cart timeout was extended."
msgstr "O seu pedido actualizouse." msgstr "Ampliouse o tempo de espera do teu carro."
#: pretix/presale/views/cart.py:584 #: pretix/presale/views/cart.py:584
msgid "The products have been successfully added to your cart." msgid "The products have been successfully added to your cart."

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-11 01:00+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."
@@ -816,28 +816,22 @@ msgstr ""
"confirme primeiro o endereço de email na sua conta." "confirme primeiro o endereço de email na sua conta."
#: pretix/base/datasync/datasync.py:263 #: pretix/base/datasync/datasync.py:263
#, fuzzy, python-brace-format #, python-brace-format
#| msgid ""
#| "Field \"{field_name}\" is not valid for {available_inputs}. Please check "
#| "your {provider_name} settings."
msgid "" msgid ""
"Field \"{field_name}\" does not exist. Please check your {provider_name} " "Field \"{field_name}\" does not exist. Please check your {provider_name} "
"settings." "settings."
msgstr "" msgstr ""
"O campo \"{field_name}\" não é válido para {available_inputs}. Verifique as " "O campo \"{field_name}\" não existe. Por favor, verifique as configurações "
"configurações de {provider_name}." "de {provider_name}."
#: pretix/base/datasync/datasync.py:270 #: pretix/base/datasync/datasync.py:270
#, fuzzy, python-brace-format #, python-brace-format
#| msgid ""
#| "Field \"{field_name}\" is not valid for {available_inputs}. Please check "
#| "your {provider_name} settings."
msgid "" msgid ""
"Field \"{field_name}\" requires {required_input}, but only got " "Field \"{field_name}\" requires {required_input}, but only got "
"{available_inputs}. Please check your {provider_name} settings." "{available_inputs}. Please check your {provider_name} settings."
msgstr "" msgstr ""
"O campo \"{field_name}\" não é válido para {available_inputs}. Verifique as " "Campo \"{field_name}\" exige {required_input}, mas apenas {available_inputs} "
"configurações de {provider_name}." "foram fornecidas. Por favor, verifique as configurações de {provider_name}."
#: pretix/base/datasync/datasync.py:281 #: pretix/base/datasync/datasync.py:281
#, python-brace-format #, python-brace-format
@@ -2137,7 +2131,7 @@ msgstr "Comprar este produto requer aprovação"
#: pretix/base/exporters/items.py:85 pretix/base/models/items.py:627 #: pretix/base/exporters/items.py:85 pretix/base/models/items.py:627
msgid "Only sell this product as part of a bundle" msgid "Only sell this product as part of a bundle"
msgstr "Disponível apenas como parte de um pacote" msgstr "Venda este produto apenas como parte de um pacote"
#: pretix/base/exporters/items.py:86 pretix/base/models/items.py:634 #: pretix/base/exporters/items.py:86 pretix/base/models/items.py:634
msgid "Allow product to be canceled or changed" msgid "Allow product to be canceled or changed"
@@ -2839,7 +2833,7 @@ msgstr "Código de Status"
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_assign.html:25 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_assign.html:25
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:13 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:13
msgid "Amount" msgid "Amount"
msgstr "Valor" msgstr "Quantidade"
#: pretix/base/exporters/orderlist.py:1098 #: pretix/base/exporters/orderlist.py:1098
#: pretix/control/templates/pretixcontrol/boxoffice/payment.html:102 #: pretix/control/templates/pretixcontrol/boxoffice/payment.html:102
@@ -3286,10 +3280,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
@@ -3400,6 +3392,8 @@ 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 você informar um endereço para a fatura, você também deverá selecionar um "
"método para transmissão da fatura."
#: pretix/base/forms/questions.py:1385 #: pretix/base/forms/questions.py:1385
msgid "" msgid ""
@@ -3414,6 +3408,8 @@ 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 transmissão de fatura selecionado exige um campo que não está "
"disponível atualmente. Por favor, entre em contato com a organização."
#: 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."
@@ -3433,10 +3429,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 +3480,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 +3530,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 +3763,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 +3851,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 +4337,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 +4840,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 +5372,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 +6268,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 +7879,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 +9843,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 +10387,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 +11256,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 +12123,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 +12136,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
@@ -13256,13 +13203,13 @@ msgid "Contact:"
msgstr "Contato:" msgstr "Contato:"
#: pretix/base/templates/pretixbase/email/order_details.html:54 #: pretix/base/templates/pretixbase/email/order_details.html:54
#, fuzzy, python-format #, python-format
#| msgid ""
#| "You are receiving this email because you placed an order for {event}."
msgid "" msgid ""
"You are receiving this email because you placed an order for " "You are receiving this email because you placed an order for "
"<strong>%(event)s</strong>." "<strong>%(event)s</strong>."
msgstr "Você está recebendo este email porque fez um pedido para {event}." msgstr ""
"Você está recebendo este email por ter realizado um pedido para <strong>%"
"(event)s</strong>."
#: pretix/base/templates/pretixbase/email/order_details.html:93 #: pretix/base/templates/pretixbase/email/order_details.html:93
#: pretix/control/templates/pretixcontrol/organizers/customer.html:23 #: pretix/control/templates/pretixcontrol/organizers/customer.html:23
@@ -13937,7 +13884,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 +13970,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."
@@ -17401,19 +17343,14 @@ msgid "Your account has been disabled."
msgstr "Sua conta foi desativada." msgstr "Sua conta foi desativada."
#: pretix/control/logdisplay.py:672 #: pretix/control/logdisplay.py:672
#, fuzzy, python-brace-format #, python-brace-format
#| msgid ""
#| "The email address has been changed from \"{old_email}\" to \"{new_email}"
#| "\"."
msgid "Your email address has been changed from {old_email} to {email}." msgid "Your email address has been changed from {old_email} to {email}."
msgstr "" msgstr "Seu endereço de email foi modificado de {old_email} para {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 +19627,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 +21265,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 +21929,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 +26096,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 +26427,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 +26853,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 +27901,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 +29826,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 +30127,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 +30698,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 +33324,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
@@ -33774,12 +33726,11 @@ msgstr "Selecione como deseja pagar o saldo restante:"
#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:82 #: pretix/presale/templates/pretixpresale/event/checkout_payment.html:82
#: pretix/presale/templates/pretixpresale/event/order_pay_change.html:45 #: pretix/presale/templates/pretixpresale/event/order_pay_change.html:45
#, fuzzy, python-format #, python-format
#| msgid "%(num)s available"
msgid "(%(count)s available)" msgid "(%(count)s available)"
msgid_plural "(%(count)s available)" msgid_plural "(%(count)s available)"
msgstr[0] "%(num)s disponíveis" msgstr[0] "(%(count)s disponível)"
msgstr[1] "%(num)s disponíveis" msgstr[1] "(%(count)s disponíveis)"
#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:101 #: pretix/presale/templates/pretixpresale/event/checkout_payment.html:101
msgid "This sales channel does not provide support for test mode." msgid "This sales channel does not provide support for test mode."
@@ -34558,13 +34509,11 @@ msgstr "Mostrar imagem em tamanho real de %(item)s"
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:131 #: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:131
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:288 #: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:288
#, fuzzy, python-format #, python-format
#| msgid "%(count)s event"
#| msgid_plural "%(count)s events"
msgid "%(amount)s× in your cart" msgid "%(amount)s× in your cart"
msgid_plural "%(amount)s× in your cart" msgid_plural "%(amount)s× in your cart"
msgstr[0] "%(count)s evento" msgstr[0] "%(amount)s× no seu carrinho"
msgstr[1] "%(count)s events" msgstr[1] "%(amount)s× no seu carrinho"
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:209 #: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:209
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:374 #: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:374
@@ -35632,10 +35581,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
@@ -35652,7 +35599,7 @@ msgid ""
"This is a self-hosted installation of <a %(a_attr)s>pretix, your free and " "This is a self-hosted installation of <a %(a_attr)s>pretix, your free and "
"open source ticket sales software</a>." "open source ticket sales software</a>."
msgstr "" msgstr ""
"Está é uma instalação self-hosted do <a %(a_attr)s>pretix, seu aplicativo " "Esta é uma instalação auto-hospedada do <a %(a_attr)s>pretix, seu aplicativo "
"livre e de código aberto para venda de ingressos.</a>." "livre e de código aberto para venda de ingressos.</a>."
#: pretix/presale/templates/pretixpresale/index.html:15 #: pretix/presale/templates/pretixpresale/index.html:15
@@ -35748,22 +35695,18 @@ msgid "Issued on %(date)s"
msgstr "Leitura negada: %(date)s" msgstr "Leitura negada: %(date)s"
#: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:38 #: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:38
#, fuzzy, python-format #, python-format
#| msgid "Expired since"
msgid "Expired since %(date)s" msgid "Expired since %(date)s"
msgstr "Expirado desde" msgstr "Expirado desde %(date)s"
#: 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
#| msgid "Remaining balance"
msgid "Remaining value:" msgid "Remaining value:"
msgstr "Saldo restante" msgstr "Valor restante:"
#: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:76 #: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:76
#, fuzzy #, fuzzy
@@ -36287,10 +36230,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

@@ -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-02 16:47+0000\n" "PO-Revision-Date: 2025-12-11 01:00+0000\n"
"Last-Translator: Ana Rute Pacheco Vivas <rute.vivas@om.org>\n" "Last-Translator: Ana Rute Pacheco Vivas <rute.vivas@om.org>\n"
"Language-Team: Portuguese (Portugal) <https://translate.pretix.eu/projects/" "Language-Team: Portuguese (Portugal) <https://translate.pretix.eu/projects/"
"pretix/pretix/pt_PT/>\n" "pretix/pretix/pt_PT/>\n"
@@ -3522,8 +3522,7 @@ msgstr "Participante 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 "Envia a fatura diretamente por e-mail para o departamento financeiro"
"Envie a fatura diretamente por e-mail para o departamento de contabilidade"
#: pretix/base/invoicing/email.py:51 #: pretix/base/invoicing/email.py:51
msgid "" msgid ""
@@ -6702,10 +6701,8 @@ msgstr ""
"tua fatura, caso assim o desejes." "tua fatura, caso assim o desejes."
#: pretix/base/models/orders.py:3534 #: pretix/base/models/orders.py:3534
#, fuzzy
#| msgid "Transaction time"
msgid "Transmission type" msgid "Transmission type"
msgstr "Hora de transação" msgstr "Modo de comunicação"
#: pretix/base/models/orders.py:3632 #: pretix/base/models/orders.py:3632
#: pretix/plugins/badges/templates/pretixplugins/badges/control_order_position_buttons.html:9 #: pretix/plugins/badges/templates/pretixplugins/badges/control_order_position_buttons.html:9
@@ -20186,8 +20183,8 @@ msgid ""
"email address is owned by you. Please enter the verification code below:" "email address is owned by you. Please enter the verification code below:"
msgstr "" msgstr ""
"Enviamos um e-mail para %(recp)s com um código de confirmação para verificar " "Enviamos um e-mail para %(recp)s com um código de confirmação para verificar "
"se este endereço de e-mail é da sua propriedade. Por favor, insira o código " "se este endereço de e-mail te pertence. Por favor, indica o código de "
"de verificação abaixo:" "verificação abaixo:"
#: pretix/control/templates/pretixcontrol/email_setup_simple.html:63 #: pretix/control/templates/pretixcontrol/email_setup_simple.html:63
msgid "Verification code" msgid "Verification code"
@@ -27454,6 +27451,9 @@ msgid ""
"We will send a confirmation code to your new email address, which you need " "We will send a confirmation code to your new email address, which you need "
"to enter in the next step to confirm the email address is correct." "to enter in the next step to confirm the email address is correct."
msgstr "" msgstr ""
"Enviaremos um código de confirmação para o teu novo endereço de e-mail, que "
"precisas de inserir na próxima etapa para confirmar que o endereço de e-mail "
"está correto."
#: pretix/control/templates/pretixcontrol/user/change_password.html:4 #: pretix/control/templates/pretixcontrol/user/change_password.html:4
#: pretix/control/templates/pretixcontrol/user/change_password.html:8 #: pretix/control/templates/pretixcontrol/user/change_password.html:8
@@ -27567,6 +27567,9 @@ msgid ""
"confirm your email address using a confirmation code we will send to your " "confirm your email address using a confirmation code we will send to your "
"email address." "email address."
msgstr "" msgstr ""
"O teu endereço de e-mail ainda não foi confirmado. Para proteger a tua "
"conta, confirma o teu endereço de e-mail usando um código de confirmação que "
"te enviaremos."
#: pretix/control/templates/pretixcontrol/user/settings.html:18 #: pretix/control/templates/pretixcontrol/user/settings.html:18
#, fuzzy #, fuzzy
@@ -28878,7 +28881,7 @@ msgstr ""
#: pretix/control/views/mailsetup.py:216 #: pretix/control/views/mailsetup.py:216
msgid "The verification code was incorrect, please try again." msgid "The verification code was incorrect, please try again."
msgstr "O código de verificação estava incorreto, tente novamente." msgstr "O código de verificação estava incorreto, tenta novamente."
#: pretix/control/views/mailsetup.py:221 #: pretix/control/views/mailsetup.py:221
msgid "Sender address verification" msgid "Sender address verification"
@@ -29937,6 +29940,8 @@ msgid ""
"Please enter the confirmation code we sent to your email address " "Please enter the confirmation code we sent to your email address "
"<strong>{email}</strong>." "<strong>{email}</strong>."
msgstr "" msgstr ""
"Indica o código de confirmação que enviámos para o teu endereço de e-mail "
"<strong>{email}</strong>."
#: pretix/control/views/user.py:947 #: pretix/control/views/user.py:947
#, fuzzy #, fuzzy
@@ -34939,7 +34944,7 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/event/checkout_questions.html:9 #: pretix/presale/templates/pretixpresale/event/checkout_questions.html:9
msgid "Before we continue, we need you to answer some questions." msgid "Before we continue, we need you to answer some questions."
msgstr "Antes de continuarmos, precisamos que respondas a algumas perguntas." msgstr "Antes de continuares, precisamos que respondas a algumas perguntas."
#: pretix/presale/templates/pretixpresale/event/checkout_questions.html:49 #: pretix/presale/templates/pretixpresale/event/checkout_questions.html:49
msgid "Auto-fill with address" msgid "Auto-fill with address"
@@ -35374,10 +35379,8 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:514 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:514
#: pretix/presale/templates/pretixpresale/fragment_modals.html:48 #: pretix/presale/templates/pretixpresale/fragment_modals.html:48
#, fuzzy
#| msgid "Event description"
msgid "Renew reservation" msgid "Renew reservation"
msgstr "Descrição do Evento" msgstr "Renovar a reserva"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:526 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:526
#, fuzzy #, fuzzy
@@ -35962,8 +35965,8 @@ msgid ""
"Please note that we still await approval by the event organizer before you " "Please note that we still await approval by the event organizer before you "
"can pay and complete this order." "can pay and complete this order."
msgstr "" msgstr ""
"Por favor, note que a aprovação ainda aguardam pelo organizador do evento " "Por favor, nota que ainda estamos à espera da aprovação do organizador do "
"antes que pode pagar e concluir este pedido." "evento antes de poderes pagar e concluir esta encomenda."
#: pretix/presale/templates/pretixpresale/event/order.html:43 #: pretix/presale/templates/pretixpresale/event/order.html:43
msgid "Please note that we still await your payment to complete the process." msgid "Please note that we still await your payment to complete the process."
@@ -35972,19 +35975,14 @@ msgstr ""
"processo." "processo."
#: pretix/presale/templates/pretixpresale/event/order.html:55 #: pretix/presale/templates/pretixpresale/event/order.html:55
#, fuzzy
#| msgid ""
#| "Please bookmark or save the link to this exact page if you want to access "
#| "your order later. We also sent you an email containing the link to the "
#| "address you specified."
msgid "" msgid ""
"Please bookmark or save the link to this exact page if you want to access " "Please bookmark or save the link to this exact page if you want to access "
"your order later. We also sent you an email to the address you specified " "your order later. We also sent you an email to the address you specified "
"containing the link to this page." "containing the link to this page."
msgstr "" msgstr ""
"Por favor, guarda o link para esta página, caso queiras aceder ao teu pedido " "Por favor, guarda o link desta página, se quiseres aceder à tua encomenda "
"mais tarde. Também iremos enviar-te um email com o link para o endereço que " "mais tarde. Também enviámos um e-mail para o endereço que indicaste com o "
"indicaste." "link para esta página."
#: pretix/presale/templates/pretixpresale/event/order.html:59 #: pretix/presale/templates/pretixpresale/event/order.html:59
#, 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-20 10:37+0000\n" "POT-Creation-Date: 2025-11-20 10:37+0000\n"
"PO-Revision-Date: 2025-11-11 21:00+0000\n" "PO-Revision-Date: 2025-12-10 15:49+0000\n"
"Last-Translator: Ana Rute Pacheco Vivas <rute.vivas@om.org>\n" "Last-Translator: Ana Rute Pacheco Vivas <rute.vivas@om.org>\n"
"Language-Team: Portuguese (Portugal) <https://translate.pretix.eu/projects/" "Language-Team: Portuguese (Portugal) <https://translate.pretix.eu/projects/"
"pretix/pretix-js/pt_PT/>\n" "pretix/pretix-js/pt_PT/>\n"
@@ -798,7 +798,7 @@ msgstr ""
#: pretix/static/pretixpresale/js/ui/cart.js:90 #: pretix/static/pretixpresale/js/ui/cart.js:90
msgid "Renew reservation" msgid "Renew reservation"
msgstr "" msgstr "Renovar a reserva"
#: pretix/static/pretixpresale/js/ui/main.js:194 #: pretix/static/pretixpresale/js/ui/main.js:194
msgid "The organizer keeps %(currency)s %(amount)s" msgid "The organizer keeps %(currency)s %(amount)s"

View File

@@ -8,34 +8,36 @@ 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: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: 2025-12-14 00:00+0000\n"
"Last-Translator: Automatically generated\n" "Last-Translator: Lachlan Struthers <lachlan.struthers@om.org>\n"
"Language-Team: none\n" "Language-Team: Albanian <https://translate.pretix.eu/projects/pretix/pretix/"
"sq/>\n"
"Language: sq\n" "Language: sq\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.3\n"
#: pretix/_base_settings.py:87 #: pretix/_base_settings.py:87
msgid "English" msgid "English"
msgstr "" msgstr "Anglisht"
#: pretix/_base_settings.py:88 #: pretix/_base_settings.py:88
msgid "German" msgid "German"
msgstr "" msgstr "Gjermanisht"
#: pretix/_base_settings.py:89 #: pretix/_base_settings.py:89
msgid "German (informal)" msgid "German (informal)"
msgstr "" msgstr "Gjermanisht (joformale)"
#: pretix/_base_settings.py:90 #: pretix/_base_settings.py:90
msgid "Arabic" msgid "Arabic"
msgstr "" msgstr "Arabisht"
#: pretix/_base_settings.py:91 #: pretix/_base_settings.py:91
msgid "Basque" msgid "Basque"
msgstr "" msgstr "Baskisht"
#: pretix/_base_settings.py:92 #: pretix/_base_settings.py:92
msgid "Catalan" msgid "Catalan"
@@ -450,7 +452,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/event/mail.html:114 #: pretix/control/templates/pretixcontrol/event/mail.html:114
#: pretix/control/views/orders.py:1569 #: pretix/control/views/orders.py:1569
msgid "Order canceled" msgid "Order canceled"
msgstr "" msgstr "Porositja ësthë anuluar"
#: pretix/api/webhooks.py:278 pretix/base/notifications.py:257 #: pretix/api/webhooks.py:278 pretix/base/notifications.py:257
msgid "Order reactivated" msgid "Order reactivated"
@@ -1407,7 +1409,7 @@ msgstr ""
#: pretix/plugins/checkinlists/exporters.py:827 #: pretix/plugins/checkinlists/exporters.py:827
#: pretix/plugins/checkinlists/exporters.py:828 #: pretix/plugins/checkinlists/exporters.py:828
msgid "Yes" msgid "Yes"
msgstr "" msgstr "Po"
#: pretix/base/exporters/customers.py:100 #: pretix/base/exporters/customers.py:100
#: pretix/base/exporters/customers.py:101 pretix/base/exporters/events.py:83 #: pretix/base/exporters/customers.py:101 pretix/base/exporters/events.py:83
@@ -1431,7 +1433,7 @@ msgstr ""
#: pretix/plugins/checkinlists/exporters.py:827 #: pretix/plugins/checkinlists/exporters.py:827
#: pretix/plugins/checkinlists/exporters.py:828 #: pretix/plugins/checkinlists/exporters.py:828
msgid "No" msgid "No"
msgstr "" msgstr "Jo"
#: pretix/base/exporters/dekodi.py:42 pretix/base/exporters/invoices.py:66 #: pretix/base/exporters/dekodi.py:42 pretix/base/exporters/invoices.py:66
msgctxt "export_category" msgctxt "export_category"
@@ -2445,7 +2447,7 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:12 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:12
#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:91 #: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:91
msgid "Product" msgid "Product"
msgstr "" msgstr "Produkti"
#: pretix/base/exporters/orderlist.py:619 pretix/base/models/vouchers.py:315 #: pretix/base/exporters/orderlist.py:619 pretix/base/models/vouchers.py:315
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html:5 #: pretix/control/templates/pretixcontrol/vouchers/bulk.html:5
@@ -2783,7 +2785,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/event/cancel.html:20 #: pretix/control/templates/pretixcontrol/event/cancel.html:20
#: pretix/control/views/item.py:971 #: pretix/control/views/item.py:971
msgid "Paid orders" msgid "Paid orders"
msgstr "" msgstr "Porositje të paguara"
#: pretix/base/exporters/orderlist.py:1155 pretix/control/views/item.py:976 #: pretix/base/exporters/orderlist.py:1155 pretix/control/views/item.py:976
msgid "Pending orders" msgid "Pending orders"
@@ -2952,7 +2954,7 @@ msgstr ""
#: pretix/plugins/reports/accountingreport.py:105 #: pretix/plugins/reports/accountingreport.py:105
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:67 #: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:67
msgid "All" msgid "All"
msgstr "" msgstr "Të gjitha"
#: pretix/base/exporters/orderlist.py:1329 pretix/control/forms/filter.py:1450 #: pretix/base/exporters/orderlist.py:1329 pretix/control/forms/filter.py:1450
msgid "Live" msgid "Live"
@@ -3879,7 +3881,7 @@ msgstr ""
#: pretix/base/modelimport_vouchers.py:205 pretix/base/models/items.py:1256 #: pretix/base/modelimport_vouchers.py:205 pretix/base/models/items.py:1256
#: pretix/base/models/vouchers.py:266 pretix/base/models/waitinglist.py:99 #: pretix/base/models/vouchers.py:266 pretix/base/models/waitinglist.py:99
msgid "Product variation" msgid "Product variation"
msgstr "" msgstr "Varianti i produktit"
#: pretix/base/modelimport_orders.py:161 #: pretix/base/modelimport_orders.py:161
msgid "The variation can be specified by its internal ID or full name." msgid "The variation can be specified by its internal ID or full name."
@@ -4278,19 +4280,19 @@ msgstr ""
#: pretix/base/models/checkin.py:336 #: pretix/base/models/checkin.py:336
msgid "Entry" msgid "Entry"
msgstr "" msgstr "Hyrje"
#: pretix/base/models/checkin.py:337 #: pretix/base/models/checkin.py:337
msgid "Exit" msgid "Exit"
msgstr "" msgstr "Dalje"
#: pretix/base/models/checkin.py:356 #: pretix/base/models/checkin.py:356
msgid "Unknown ticket" msgid "Unknown ticket"
msgstr "" msgstr "Biletë e panjohur"
#: pretix/base/models/checkin.py:357 #: pretix/base/models/checkin.py:357
msgid "Ticket not paid" msgid "Ticket not paid"
msgstr "" msgstr "Bileta nuk është paguar"
#: pretix/base/models/checkin.py:358 #: pretix/base/models/checkin.py:358
msgid "Forbidden by custom rule" msgid "Forbidden by custom rule"
@@ -4298,23 +4300,23 @@ msgstr ""
#: pretix/base/models/checkin.py:359 #: pretix/base/models/checkin.py:359
msgid "Ticket code revoked/changed" msgid "Ticket code revoked/changed"
msgstr "" msgstr "Kodi i biletës është anuluar/ndryshuar"
#: pretix/base/models/checkin.py:360 #: pretix/base/models/checkin.py:360
msgid "Information required" msgid "Information required"
msgstr "" msgstr "Informacion i domosdoshëm"
#: pretix/base/models/checkin.py:361 #: pretix/base/models/checkin.py:361
msgid "Ticket already used" msgid "Ticket already used"
msgstr "" msgstr "Bileta tashmë është përdorur"
#: pretix/base/models/checkin.py:362 #: pretix/base/models/checkin.py:362
msgid "Ticket type not allowed here" msgid "Ticket type not allowed here"
msgstr "" msgstr "Ky lloj bilete nuk lejohet këtu"
#: pretix/base/models/checkin.py:363 #: pretix/base/models/checkin.py:363
msgid "Ticket code is ambiguous on list" msgid "Ticket code is ambiguous on list"
msgstr "" msgstr "Kodi i biletës është e paqartë në listë"
#: pretix/base/models/checkin.py:364 #: pretix/base/models/checkin.py:364
msgid "Server error" msgid "Server error"
@@ -4322,15 +4324,15 @@ msgstr ""
#: pretix/base/models/checkin.py:365 #: pretix/base/models/checkin.py:365
msgid "Ticket blocked" msgid "Ticket blocked"
msgstr "" msgstr "Bileta u bllokua"
#: pretix/base/models/checkin.py:366 #: pretix/base/models/checkin.py:366
msgid "Order not approved" msgid "Order not approved"
msgstr "" msgstr "Porositje nuk është aprovuar"
#: pretix/base/models/checkin.py:367 #: pretix/base/models/checkin.py:367
msgid "Ticket not valid at this time" msgid "Ticket not valid at this time"
msgstr "" msgstr "Bileta nuk është e vlefshme për momentin"
#: pretix/base/models/checkin.py:368 #: pretix/base/models/checkin.py:368
msgid "Check-in annulled" msgid "Check-in annulled"
@@ -4460,7 +4462,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/organizers/gates.html:16 #: pretix/control/templates/pretixcontrol/organizers/gates.html:16
#: pretix/plugins/checkinlists/exporters.py:769 #: pretix/plugins/checkinlists/exporters.py:769
msgid "Gate" msgid "Gate"
msgstr "" msgstr "Porta"
#: pretix/base/models/devices.py:131 #: pretix/base/models/devices.py:131
#: pretix/control/templates/pretixcontrol/organizers/devices.html:83 #: pretix/control/templates/pretixcontrol/organizers/devices.html:83
@@ -5928,7 +5930,7 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:34 #: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:34
#: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html:44 #: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html:44
msgid "Canceled" msgid "Canceled"
msgstr "" msgstr "e anuluar"
#: pretix/base/models/memberships.py:134 #: pretix/base/models/memberships.py:134
#: pretix/control/templates/pretixcontrol/organizers/customer.html:117 #: pretix/control/templates/pretixcontrol/organizers/customer.html:117
@@ -6671,7 +6673,7 @@ msgstr ""
#: pretix/base/models/vouchers.py:204 pretix/control/views/vouchers.py:120 #: pretix/base/models/vouchers.py:204 pretix/control/views/vouchers.py:120
msgid "Redeemed" msgid "Redeemed"
msgstr "" msgstr "e përdorur"
#: pretix/base/models/vouchers.py:209 #: pretix/base/models/vouchers.py:209
msgid "" msgid ""
@@ -7432,7 +7434,7 @@ msgstr ""
#: pretix/base/pdf.py:278 pretix/base/pdf.py:307 #: pretix/base/pdf.py:278 pretix/base/pdf.py:307
#: pretix/base/services/checkin.py:362 pretix/control/forms/filter.py:1271 #: pretix/base/services/checkin.py:362 pretix/control/forms/filter.py:1271
msgid "Friday" msgid "Friday"
msgstr "" msgstr "E Premte"
#: pretix/base/pdf.py:282 #: pretix/base/pdf.py:282
msgid "Event end date and time" msgid "Event end date and time"
@@ -7704,15 +7706,15 @@ msgstr ""
#: pretix/base/reldate.py:38 #: pretix/base/reldate.py:38
msgid "Event start" msgid "Event start"
msgstr "" msgstr "Fillimi i eventit"
#: pretix/base/reldate.py:39 #: pretix/base/reldate.py:39
msgid "Event end" msgid "Event end"
msgstr "" msgstr "Mbarimi i eventit"
#: pretix/base/reldate.py:40 #: pretix/base/reldate.py:40
msgid "Event admission" msgid "Event admission"
msgstr "" msgstr "Hyrja në event"
#: pretix/base/reldate.py:41 #: pretix/base/reldate.py:41
msgid "Presale start" msgid "Presale start"
@@ -8130,27 +8132,27 @@ msgstr ""
#: pretix/base/services/checkin.py:358 pretix/control/forms/filter.py:1267 #: pretix/base/services/checkin.py:358 pretix/control/forms/filter.py:1267
msgid "Monday" msgid "Monday"
msgstr "" msgstr "E Hënë"
#: pretix/base/services/checkin.py:359 pretix/control/forms/filter.py:1268 #: pretix/base/services/checkin.py:359 pretix/control/forms/filter.py:1268
msgid "Tuesday" msgid "Tuesday"
msgstr "" msgstr "E Martë"
#: pretix/base/services/checkin.py:360 pretix/control/forms/filter.py:1269 #: pretix/base/services/checkin.py:360 pretix/control/forms/filter.py:1269
msgid "Wednesday" msgid "Wednesday"
msgstr "" msgstr "E Mërkurë"
#: pretix/base/services/checkin.py:361 pretix/control/forms/filter.py:1270 #: pretix/base/services/checkin.py:361 pretix/control/forms/filter.py:1270
msgid "Thursday" msgid "Thursday"
msgstr "" msgstr "E Enjte"
#: pretix/base/services/checkin.py:363 pretix/control/forms/filter.py:1272 #: pretix/base/services/checkin.py:363 pretix/control/forms/filter.py:1272
msgid "Saturday" msgid "Saturday"
msgstr "" msgstr "E Shtunë"
#: pretix/base/services/checkin.py:364 pretix/control/forms/filter.py:1273 #: pretix/base/services/checkin.py:364 pretix/control/forms/filter.py:1273
msgid "Sunday" msgid "Sunday"
msgstr "" msgstr "E Diel"
#: pretix/base/services/checkin.py:368 #: pretix/base/services/checkin.py:368
#, python-brace-format #, python-brace-format
@@ -12889,7 +12891,7 @@ msgstr ""
#: pretix/plugins/reports/exporters.py:391 #: pretix/plugins/reports/exporters.py:391
#: pretix/presale/templates/pretixpresale/event/fragment_order_status.html:7 #: pretix/presale/templates/pretixpresale/event/fragment_order_status.html:7
msgid "Approval pending" msgid "Approval pending"
msgstr "" msgstr "Duke pritur aprovimin"
#: pretix/control/forms/filter.py:247 #: pretix/control/forms/filter.py:247
msgid "Follow-up configured" msgid "Follow-up configured"
@@ -13042,7 +13044,7 @@ msgstr ""
#: pretix/control/forms/filter.py:2052 pretix/control/forms/filter.py:2054 #: pretix/control/forms/filter.py:2052 pretix/control/forms/filter.py:2054
#: pretix/control/forms/filter.py:2620 pretix/control/forms/filter.py:2622 #: pretix/control/forms/filter.py:2620 pretix/control/forms/filter.py:2622
msgid "Search query" msgid "Search query"
msgstr "" msgstr "Kërkim"
#: pretix/control/forms/filter.py:1528 pretix/control/forms/filter.py:1600 #: pretix/control/forms/filter.py:1528 pretix/control/forms/filter.py:1600
#: pretix/control/templates/pretixcontrol/organizers/customer.html:47 #: pretix/control/templates/pretixcontrol/organizers/customer.html:47
@@ -13157,7 +13159,7 @@ msgstr ""
#: pretix/control/forms/filter.py:2117 #: pretix/control/forms/filter.py:2117
#: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:51 #: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:51
msgid "Valid" msgid "Valid"
msgstr "" msgstr "e vlefshme"
#: pretix/control/forms/filter.py:2118 #: pretix/control/forms/filter.py:2118
msgid "Unredeemed" msgid "Unredeemed"
@@ -16427,7 +16429,7 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/event/order_pay_change.html:75 #: pretix/presale/templates/pretixpresale/event/order_pay_change.html:75
#: pretix/presale/templates/pretixpresale/event/position_change.html:29 #: pretix/presale/templates/pretixpresale/event/position_change.html:29
msgid "Continue" msgid "Continue"
msgstr "" msgstr "Vazhdoni"
#: pretix/control/templates/pretixcontrol/auth/oauth_authorization.html:8 #: pretix/control/templates/pretixcontrol/auth/oauth_authorization.html:8
msgid "Authorize an application" msgid "Authorize an application"
@@ -16675,7 +16677,7 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/postmessage.html:27 #: pretix/presale/templates/pretixpresale/postmessage.html:27
#: pretix/presale/templates/pretixpresale/waiting.html:42 #: pretix/presale/templates/pretixpresale/waiting.html:42
msgid "If this takes longer than a few minutes, please contact us." msgid "If this takes longer than a few minutes, please contact us."
msgstr "" msgstr "Nëse kalon më shumë se disa minuta, ju lutemi t'na kontaktoni."
#: pretix/control/templates/pretixcontrol/boxoffice/payment.html:4 #: pretix/control/templates/pretixcontrol/boxoffice/payment.html:4
#: pretix/control/templates/pretixcontrol/organizers/devices.html:71 #: pretix/control/templates/pretixcontrol/organizers/devices.html:71
@@ -16905,7 +16907,7 @@ msgstr[1] ""
#: pretix/presale/templates/pretixpresale/event/position_change.html:24 #: pretix/presale/templates/pretixpresale/event/position_change.html:24
#: pretix/presale/templates/pretixpresale/event/position_modify.html:44 #: pretix/presale/templates/pretixpresale/event/position_modify.html:44
msgid "Cancel" msgid "Cancel"
msgstr "" msgstr "Anuloni"
#: pretix/control/templates/pretixcontrol/checkin/bulk_revert_confirm.html:27 #: pretix/control/templates/pretixcontrol/checkin/bulk_revert_confirm.html:27
#: pretix/control/templates/pretixcontrol/checkin/list_delete.html:24 #: pretix/control/templates/pretixcontrol/checkin/list_delete.html:24
@@ -17019,7 +17021,7 @@ msgstr ""
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:14 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:14
#: pretix/plugins/checkinlists/exporters.py:770 #: pretix/plugins/checkinlists/exporters.py:770
msgid "Result" msgid "Result"
msgstr "" msgstr "Rezultati"
#: pretix/control/templates/pretixcontrol/checkin/checkins.html:78 #: pretix/control/templates/pretixcontrol/checkin/checkins.html:78
#: pretix/control/templates/pretixcontrol/order/index.html:437 #: pretix/control/templates/pretixcontrol/order/index.html:437
@@ -17363,7 +17365,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/checkin/simulator.html:68 #: pretix/control/templates/pretixcontrol/checkin/simulator.html:68
msgid "Additional information required" msgid "Additional information required"
msgstr "" msgstr "Më shumë informacione kërkohen"
#: pretix/control/templates/pretixcontrol/checkin/simulator.html:70 #: pretix/control/templates/pretixcontrol/checkin/simulator.html:70
msgid "" msgid ""
@@ -18272,7 +18274,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/organizers/device_logs.html:50 #: pretix/control/templates/pretixcontrol/organizers/device_logs.html:50
#: pretix/control/templates/pretixcontrol/organizers/logs.html:80 #: pretix/control/templates/pretixcontrol/organizers/logs.html:80
msgid "No results" msgid "No results"
msgstr "" msgstr "S'ka rezultate"
#: pretix/control/templates/pretixcontrol/event/mail.html:7 #: pretix/control/templates/pretixcontrol/event/mail.html:7
#: pretix/control/templates/pretixcontrol/organizers/mail.html:11 #: pretix/control/templates/pretixcontrol/organizers/mail.html:11
@@ -18477,7 +18479,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/event/plugins.html:34 #: pretix/control/templates/pretixcontrol/event/plugins.html:34
#: pretix/control/templates/pretixcontrol/organizers/plugins.html:34 #: pretix/control/templates/pretixcontrol/organizers/plugins.html:34
msgid "Search results" msgid "Search results"
msgstr "" msgstr "Rezultatet e kërkimit"
#: pretix/control/templates/pretixcontrol/event/plugins.html:56 #: pretix/control/templates/pretixcontrol/event/plugins.html:56
#: pretix/control/templates/pretixcontrol/organizers/plugins.html:56 #: pretix/control/templates/pretixcontrol/organizers/plugins.html:56
@@ -19324,51 +19326,51 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/global_sysreport.html:16 #: pretix/control/templates/pretixcontrol/global_sysreport.html:16
msgid "January" msgid "January"
msgstr "" msgstr "Janar"
#: pretix/control/templates/pretixcontrol/global_sysreport.html:17 #: pretix/control/templates/pretixcontrol/global_sysreport.html:17
msgid "February" msgid "February"
msgstr "" msgstr "Shkurt"
#: pretix/control/templates/pretixcontrol/global_sysreport.html:18 #: pretix/control/templates/pretixcontrol/global_sysreport.html:18
msgid "March" msgid "March"
msgstr "" msgstr "Mars"
#: pretix/control/templates/pretixcontrol/global_sysreport.html:19 #: pretix/control/templates/pretixcontrol/global_sysreport.html:19
msgid "April" msgid "April"
msgstr "" msgstr "Prill"
#: pretix/control/templates/pretixcontrol/global_sysreport.html:20 #: pretix/control/templates/pretixcontrol/global_sysreport.html:20
msgid "May" msgid "May"
msgstr "" msgstr "Maj"
#: pretix/control/templates/pretixcontrol/global_sysreport.html:21 #: pretix/control/templates/pretixcontrol/global_sysreport.html:21
msgid "June" msgid "June"
msgstr "" msgstr "Qershor"
#: pretix/control/templates/pretixcontrol/global_sysreport.html:22 #: pretix/control/templates/pretixcontrol/global_sysreport.html:22
msgid "July" msgid "July"
msgstr "" msgstr "Korrik"
#: pretix/control/templates/pretixcontrol/global_sysreport.html:23 #: pretix/control/templates/pretixcontrol/global_sysreport.html:23
msgid "August" msgid "August"
msgstr "" msgstr "Gusht"
#: pretix/control/templates/pretixcontrol/global_sysreport.html:24 #: pretix/control/templates/pretixcontrol/global_sysreport.html:24
msgid "September" msgid "September"
msgstr "" msgstr "Shtator"
#: pretix/control/templates/pretixcontrol/global_sysreport.html:25 #: pretix/control/templates/pretixcontrol/global_sysreport.html:25
msgid "October" msgid "October"
msgstr "" msgstr "Tetor"
#: pretix/control/templates/pretixcontrol/global_sysreport.html:26 #: pretix/control/templates/pretixcontrol/global_sysreport.html:26
msgid "November" msgid "November"
msgstr "" msgstr "Nëntor"
#: pretix/control/templates/pretixcontrol/global_sysreport.html:27 #: pretix/control/templates/pretixcontrol/global_sysreport.html:27
msgid "December" msgid "December"
msgstr "" msgstr "Dhjetor"
#: pretix/control/templates/pretixcontrol/global_sysreport.html:32 #: pretix/control/templates/pretixcontrol/global_sysreport.html:32
msgid "Generate report" msgid "Generate report"
@@ -19743,7 +19745,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/subevents/bulk.html:355 #: pretix/control/templates/pretixcontrol/subevents/bulk.html:355
#: pretix/control/templates/pretixcontrol/subevents/bulk.html:364 #: pretix/control/templates/pretixcontrol/subevents/bulk.html:364
msgid "minutes" msgid "minutes"
msgstr "" msgstr "minuta"
#: pretix/control/templates/pretixcontrol/item/index.html:229 #: pretix/control/templates/pretixcontrol/item/index.html:229
msgid "hours" msgid "hours"
@@ -20096,7 +20098,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/items/question.html:91 #: pretix/control/templates/pretixcontrol/items/question.html:91
msgid "Count" msgid "Count"
msgstr "" msgstr "Sasia"
#: pretix/control/templates/pretixcontrol/items/question.html:92 #: pretix/control/templates/pretixcontrol/items/question.html:92
#, python-format #, python-format
@@ -21014,7 +21016,7 @@ msgstr ""
#: pretix/plugins/reports/exporters.py:969 #: pretix/plugins/reports/exporters.py:969
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:469 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:469
msgid "Total" msgid "Total"
msgstr "" msgstr "Shuma totale"
#: pretix/control/templates/pretixcontrol/order/index.html:789 #: pretix/control/templates/pretixcontrol/order/index.html:789
#: pretix/presale/templates/pretixpresale/event/order.html:210 #: pretix/presale/templates/pretixpresale/event/order.html:210
@@ -23096,7 +23098,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/pdf/index.html:52 #: pretix/control/templates/pretixcontrol/pdf/index.html:52
msgid "Text box" msgid "Text box"
msgstr "" msgstr "Kutia teksti"
#: pretix/control/templates/pretixcontrol/pdf/index.html:59 #: pretix/control/templates/pretixcontrol/pdf/index.html:59
msgid "QR Code" msgid "QR Code"
@@ -23135,7 +23137,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/pdf/index.html:107 #: pretix/control/templates/pretixcontrol/pdf/index.html:107
msgid "Duplicate" msgid "Duplicate"
msgstr "" msgstr "Kopjoni"
#: pretix/control/templates/pretixcontrol/pdf/index.html:117 #: pretix/control/templates/pretixcontrol/pdf/index.html:117
msgid "Undo" msgid "Undo"
@@ -27329,7 +27331,7 @@ msgstr ""
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:80 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:80
msgid "Comment:" msgid "Comment:"
msgstr "" msgstr "Komente:"
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:98 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:98
msgid "No order code detected" msgid "No order code detected"
@@ -27572,7 +27574,7 @@ msgstr ""
#: pretix/plugins/paypal2/payment.py:1097 #: pretix/plugins/paypal2/payment.py:1097
#: pretix/plugins/paypal2/payment.py:1098 pretix/plugins/stripe/payment.py:1816 #: pretix/plugins/paypal2/payment.py:1098 pretix/plugins/stripe/payment.py:1816
msgid "PayPal" msgid "PayPal"
msgstr "" msgstr "PayPal"
#: pretix/plugins/paypal/apps.py:53 #: pretix/plugins/paypal/apps.py:53
msgid "" msgid ""
@@ -29012,8 +29014,9 @@ msgid "Credit card payments"
msgstr "" msgstr ""
#: pretix/plugins/stripe/payment.py:342 pretix/plugins/stripe/payment.py:1527 #: pretix/plugins/stripe/payment.py:342 pretix/plugins/stripe/payment.py:1527
#, fuzzy
msgid "iDEAL" msgid "iDEAL"
msgstr "" msgstr "iDEAL"
#: pretix/plugins/stripe/payment.py:344 pretix/plugins/stripe/payment.py:352 #: pretix/plugins/stripe/payment.py:344 pretix/plugins/stripe/payment.py:352
#: pretix/plugins/stripe/payment.py:360 pretix/plugins/stripe/payment.py:395 #: pretix/plugins/stripe/payment.py:360 pretix/plugins/stripe/payment.py:395
@@ -29032,12 +29035,14 @@ msgid "Alipay"
msgstr "" msgstr ""
#: pretix/plugins/stripe/payment.py:358 pretix/plugins/stripe/payment.py:1564 #: pretix/plugins/stripe/payment.py:358 pretix/plugins/stripe/payment.py:1564
#, fuzzy
msgid "Bancontact" msgid "Bancontact"
msgstr "" msgstr "Bancontact"
#: pretix/plugins/stripe/payment.py:366 #: pretix/plugins/stripe/payment.py:366
#, fuzzy
msgid "SEPA Direct Debit" msgid "SEPA Direct Debit"
msgstr "" msgstr "Debit direkt me SEPA"
#: pretix/plugins/stripe/payment.py:369 #: pretix/plugins/stripe/payment.py:369
msgid "" msgid ""
@@ -29072,12 +29077,14 @@ msgid "Multibanco"
msgstr "" msgstr ""
#: pretix/plugins/stripe/payment.py:409 pretix/plugins/stripe/payment.py:1730 #: pretix/plugins/stripe/payment.py:409 pretix/plugins/stripe/payment.py:1730
#, fuzzy
msgid "Przelewy24" msgid "Przelewy24"
msgstr "" msgstr "Przelewy24"
#: pretix/plugins/stripe/payment.py:417 pretix/plugins/stripe/payment.py:1769 #: pretix/plugins/stripe/payment.py:417 pretix/plugins/stripe/payment.py:1769
#, fuzzy
msgid "WeChat Pay" msgid "WeChat Pay"
msgstr "" msgstr "WeChat Pay"
#: pretix/plugins/stripe/payment.py:433 pretix/plugins/stripe/payment.py:1824 #: pretix/plugins/stripe/payment.py:433 pretix/plugins/stripe/payment.py:1824
msgid "Swish" msgid "Swish"
@@ -29221,8 +29228,9 @@ msgid "giropay via Stripe"
msgstr "" msgstr ""
#: pretix/plugins/stripe/payment.py:1480 #: pretix/plugins/stripe/payment.py:1480
#, fuzzy
msgid "giropay" msgid "giropay"
msgstr "" msgstr "giropay"
#: pretix/plugins/stripe/payment.py:1483 #: pretix/plugins/stripe/payment.py:1483
msgid "" msgid ""
@@ -29757,7 +29765,7 @@ msgstr ""
#: pretix/plugins/ticketoutputpdf/templates/pretixplugins/ticketoutputpdf/edit.html:23 #: pretix/plugins/ticketoutputpdf/templates/pretixplugins/ticketoutputpdf/edit.html:23
msgid "Ticket design" msgid "Ticket design"
msgstr "" msgstr "Dizajni i biletës"
#: pretix/plugins/ticketoutputpdf/templates/pretixplugins/ticketoutputpdf/edit.html:27 #: pretix/plugins/ticketoutputpdf/templates/pretixplugins/ticketoutputpdf/edit.html:27
msgid "You can modify the design after you saved this page." msgid "You can modify the design after you saved this page."
@@ -30320,7 +30328,7 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:27 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:27
#: pretix/presale/templates/pretixpresale/event/fragment_cart_box.html:18 #: pretix/presale/templates/pretixpresale/event/fragment_cart_box.html:18
msgid "Cart expired" msgid "Cart expired"
msgstr "" msgstr "Shporta juaj u skadua"
#: pretix/presale/templates/pretixpresale/event/checkout_base.html:36 #: pretix/presale/templates/pretixpresale/event/checkout_base.html:36
msgid "Show full cart" msgid "Show full cart"
@@ -30928,11 +30936,13 @@ msgid ""
"The items in your cart are no longer reserved for you. You can still " "The items in your cart are no longer reserved for you. You can still "
"complete your order as long as theyre available." "complete your order as long as theyre available."
msgstr "" msgstr ""
"Sendet në shportën tuaj nuk janë të rezervuar më për ju. Ju mund t'a "
"përmbushni porosinë tuaj derisa janë ende të disponueshëm."
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:514 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:514
#: pretix/presale/templates/pretixpresale/fragment_modals.html:48 #: pretix/presale/templates/pretixpresale/fragment_modals.html:48
msgid "Renew reservation" msgid "Renew reservation"
msgstr "" msgstr "Rivendosni rezervimin"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:526 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:526
msgid "Reservation renewed" msgid "Reservation renewed"
@@ -32444,7 +32454,7 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/postmessage.html:21 #: pretix/presale/templates/pretixpresale/postmessage.html:21
#: pretix/presale/templates/pretixpresale/waiting.html:22 #: pretix/presale/templates/pretixpresale/waiting.html:22
msgid "We are processing your request …" msgid "We are processing your request …"
msgstr "" msgstr "Ne po e proçesojmë kërkesën tuaj …"
#: pretix/presale/utils.py:271 pretix/presale/utils.py:417 #: pretix/presale/utils.py:271 pretix/presale/utils.py:417
#: pretix/presale/utils.py:418 #: pretix/presale/utils.py:418

File diff suppressed because it is too large Load Diff

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

@@ -0,0 +1,71 @@
#
# 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.utils.translation import gettext_lazy as _
from lxml import etree
def parse(file):
# Spec: https://www.ebics.de/de/datenformate
data = file.read()
root = etree.fromstring(data)
statements = root.findall("{*}BkToCstmrStmt/{*}Stmt")
if not statements:
raise ValueError(_("Empty file or unknown format."))
def get_text(findall_result):
if len(findall_result) == 1:
return findall_result[0].text
return ""
rows = []
for stmt in statements:
for ntry in stmt.findall("{*}Ntry"):
minus = ""
otherparty = "Dbtr"
if ntry.findall("{*}CdtDbtInd")[0].text == "DBIT":
otherparty = "Cdtr"
minus = "-"
reference_parts = [
get_text(ntry.findall("{*}NtryDtls/{*}TxDtls/{*}RmtInf/{*}Ustrd")),
get_text(ntry.findall("{*}NtryDtls/{*}TxDtls/{*}Refs/{*}EndToEndId")),
get_text(ntry.findall("{*}NtryDtls/{*}TxDtls/{*}Refs/{*}InstructionIdentification")),
]
if ntry.findall("{*}NtryDtls/{*}Btch"):
# Batch booking, we do not support splitting yet
reference_parts.insert(0, get_text(ntry.findall("{*}NtryDtls/{*}Btch/{*}PmtInfId")))
row = {
'amount': minus + ntry.findall("{*}Amt")[0].text,
'date': get_text(ntry.findall("{*}BookgDt/{*}Dt")),
'reference': "\n".join(filter(lambda a: bool(a) and a != "NOTPROVIDED", reference_parts))
}
if ext_id := get_text(ntry.findall("{*}AcctSvcrRef")):
row['external_id'] = ext_id
if iban := get_text(ntry.findall(f"{{*}}NtryDtls/{{*}}TxDtls/{{*}}RltdPties/{{*}}{otherparty}Acct/{{*}}Id/{{*}}IBAN")):
row['iban'] = iban
if bic := get_text(ntry.findall(f"{{*}}NtryDtls/{{*}}TxDtls/{{*}}RltdAgts/{{*}}{otherparty}Agt/{{*}}FinInstnId/{{*}}BICFI")):
row['bic'] = bic
if payer := get_text(ntry.findall(f"{{*}}NtryDtls/{{*}}TxDtls/{{*}}RltdPties/{{*}}{otherparty}/{{*}}Nm")):
row['payer'] = payer
rows.append(row)
return rows

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

@@ -66,7 +66,7 @@ from pretix.control.permissions import (
) )
from pretix.control.views.organizer import OrganizerDetailViewMixin from pretix.control.views.organizer import OrganizerDetailViewMixin
from pretix.helpers.json import CustomJSONEncoder from pretix.helpers.json import CustomJSONEncoder
from pretix.plugins.banktransfer import csvimport, mt940import from pretix.plugins.banktransfer import camtimport, csvimport, mt940import
from pretix.plugins.banktransfer.models import ( from pretix.plugins.banktransfer.models import (
BankImportJob, BankTransaction, RefundExport, BankImportJob, BankTransaction, RefundExport,
) )
@@ -419,6 +419,9 @@ class ImportView(ListView):
): ):
return self.process_mt940() return self.process_mt940()
elif 'file' in self.request.FILES and '.xml' in self.request.FILES.get('file').name.lower():
return self.process_camt()
elif self.request.FILES.get('file') is None: elif self.request.FILES.get('file') is None:
messages.error(self.request, _('You must choose a file to import.')) messages.error(self.request, _('You must choose a file to import.'))
return self.redirect_back() return self.redirect_back()
@@ -432,6 +435,14 @@ class ImportView(ListView):
def settings(self): def settings(self):
return SettingsSandbox('payment', 'banktransfer', getattr(self.request, 'event', self.request.organizer)) return SettingsSandbox('payment', 'banktransfer', getattr(self.request, 'event', self.request.organizer))
def process_camt(self):
try:
return self.start_processing(camtimport.parse(self.request.FILES.get('file')))
except:
logger.exception('Failed to import CAMT file')
messages.error(self.request, _('We were unable to process your input.'))
return self.redirect_back()
def process_mt940(self): def process_mt940(self):
try: try:
return self.start_processing(mt940import.parse(self.request.FILES.get('file'))) return self.start_processing(mt940import.parse(self.request.FILES.get('file')))

View File

@@ -137,7 +137,7 @@ logger = logging.getLogger('pretix.plugins.stripe')
# Real-time payments # Real-time payments
# - Swish: ✓ # - Swish: ✓
# - PayNow: ✗ # - PayNow: ✗
# - PromptPay: # - PromptPay:
# - Pix: ✗ # - Pix: ✗
# #
# Vouchers # Vouchers
@@ -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'),
@@ -428,6 +440,14 @@ class StripeSettingsHolder(BasePaymentProvider):
'before they work properly.'), 'before they work properly.'),
required=False, required=False,
)), )),
('method_promptpay',
forms.BooleanField(
label='PromptPay',
disabled=self.event.currency != 'THB',
help_text=_('Some payment methods might need to be enabled in the settings of your Stripe account '
'before they work properly.'),
required=False,
)),
('method_swish', ('method_swish',
forms.BooleanField( forms.BooleanField(
label=_('Swish'), label=_('Swish'),
@@ -1810,6 +1830,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')
@@ -1842,6 +1888,30 @@ class StripeSwish(StripeRedirectMethod):
} }
class StripePromptPay(StripeRedirectMethod):
identifier = 'stripe_promptpay'
verbose_name = _('PromptPay via Stripe')
public_name = 'PromptPay'
method = 'promptpay'
confirmation_method = 'automatic'
explanation = _(
'This payment method is available to PromptPay users in Thailand. Please have your app ready.'
)
def is_allowed(self, request: HttpRequest, total: Decimal=None) -> bool:
return super().is_allowed(request, total) and request.event.currency == "THB"
def _payment_intent_kwargs(self, request, payment):
return {
"payment_method_data": {
"type": "promptpay",
"billing_details": {
"email": payment.order.email,
},
},
}
class StripeTwint(StripeRedirectMethod): class StripeTwint(StripeRedirectMethod):
identifier = 'stripe_twint' identifier = 'stripe_twint'
verbose_name = _('TWINT via Stripe') verbose_name = _('TWINT 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,17 @@ 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, StripePromptPay,
StripeSEPADirectDebit, StripeSettingsHolder, StripeSofort, StripeSwish, StripePrzelewy24, StripeRevolutPay, StripeSEPADirectDebit,
StripeTwint, StripeWeChatPay, StripeSettingsHolder, 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, StripePayByBank, StripePrzelewy24, StripePromptPay, StripeRevolutPay,
StripeSEPADirectDebit, StripeAffirm, StripeKlarna, StripePayPal, StripeSwish, StripeTwint, StripeMobilePay StripeWeChatPay, StripeSEPADirectDebit, StripeAffirm, StripeKlarna, StripePayPal, StripeSwish,
StripeTwint, StripeMobilePay
] ]
@@ -189,6 +190,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

@@ -79,3 +79,9 @@
.vcenter { .vcenter {
margin: auto; margin: auto;
} }
.stripe-qr-code {
max-width: 80%;
width: 200px;
height: auto;
}

View File

@@ -325,6 +325,8 @@ $(function () {
} else if ($("#stripe_payment_intent_next_action_redirect_url").length) { } else if ($("#stripe_payment_intent_next_action_redirect_url").length) {
let payment_intent_next_action_redirect_url = $.trim($("#stripe_payment_intent_next_action_redirect_url").html()); let payment_intent_next_action_redirect_url = $.trim($("#stripe_payment_intent_next_action_redirect_url").html());
pretixstripe.handlePaymentRedirectAction(payment_intent_next_action_redirect_url); pretixstripe.handlePaymentRedirectAction(payment_intent_next_action_redirect_url);
} else if ($.trim($("#stripe_payment_intent_action_type").html()) === "promptpay_display_qr_code") {
waitingDialog.hide();
} else if ($.trim($("#stripe_payment_intent_action_type").html()) === "wechat_pay_display_qr_code") { } else if ($.trim($("#stripe_payment_intent_action_type").html()) === "wechat_pay_display_qr_code") {
let payment_intent_client_secret = $.trim($("#stripe_payment_intent_client_secret").html()); let payment_intent_client_secret = $.trim($("#stripe_payment_intent_client_secret").html());
pretixstripe.handleWechatAction(payment_intent_client_secret); pretixstripe.handleWechatAction(payment_intent_client_secret);

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

@@ -27,10 +27,22 @@
<div class="stripe-errors sr-only panel-body"> <div class="stripe-errors sr-only panel-body">
</div> </div>
<div class="panel-body embed-responsive embed-responsive-sca" id="scacontainer"> {% if payment_intent_promptpay_image_url %}
<div class="panel-body">
<p>{% blocktrans trimmed %}
Please scan the QR code below to complete your PromptPay payment.
Once you have completed your payment, you can refresh this page.
{% endblocktrans %}</p>
<div class="text-center">
<img src="{{ payment_intent_promptpay_image_url }}" alt="{% trans 'PromptPay QR code' %}"
class="stripe-qr-code" />
</div> </div>
</div> </div>
{% else %}
<div class="panel-body embed-responsive embed-responsive-sca" id="scacontainer">
</div>
{% endif %}
</div>
<div class="row checkout-button-row"> <div class="row checkout-button-row">
<div class="col-md-4"> <div class="col-md-4">
<a class="btn btn-block btn-default btn-lg" <a class="btn btn-block btn-default btn-lg"

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()
@@ -595,7 +613,7 @@ class ScaView(StripeOrderView, View):
if intent.status == 'requires_action' and intent.next_action.type in [ if intent.status == 'requires_action' and intent.next_action.type in [
'use_stripe_sdk', 'redirect_to_url', 'alipay_handle_redirect', 'wechat_pay_display_qr_code', 'use_stripe_sdk', 'redirect_to_url', 'alipay_handle_redirect', 'wechat_pay_display_qr_code',
'swish_handle_redirect_or_display_qr_code', 'multibanco_display_details', 'swish_handle_redirect_or_display_qr_code', 'multibanco_display_details', 'promptpay_display_qr_code',
]: ]:
ctx = { ctx = {
'order': self.order, 'order': self.order,
@@ -613,6 +631,8 @@ class ScaView(StripeOrderView, View):
elif intent.next_action.type == 'multibanco_display_details': elif intent.next_action.type == 'multibanco_display_details':
ctx['payment_intent_next_action_redirect_url'] = intent.next_action.multibanco_display_details['hosted_voucher_url'] ctx['payment_intent_next_action_redirect_url'] = intent.next_action.multibanco_display_details['hosted_voucher_url']
ctx['payment_intent_redirect_action_handling'] = 'iframe' ctx['payment_intent_redirect_action_handling'] = 'iframe'
elif intent.next_action.type == 'promptpay_display_qr_code':
ctx['payment_intent_promptpay_image_url'] = intent.next_action.promptpay_display_qr_code['image_url_svg']
r = render(request, 'pretixplugins/stripe/sca.html', ctx) r = render(request, 'pretixplugins/stripe/sca.html', ctx)
r._csp_ignore = True r._csp_ignore = True

View File

@@ -1,3 +1,4 @@
{% load html_time %}
{% load i18n %} {% load i18n %}
{% load icon %} {% load icon %}
{% load eventurl %} {% load eventurl %}
@@ -21,20 +22,18 @@
{% if event.settings.show_times %} {% if event.settings.show_times %}
<br> <br>
<span data-time="{{ ev.date_from.isoformat }}" data-timezone="{{ request.event.timezone }}"> <span data-time="{{ ev.date_from.isoformat }}" data-timezone="{{ request.event.timezone }}">
{% with time_human=ev.date_from|date:"TIME_FORMAT" time_24=ev.date_from|time:"H:i" %} {% html_time ev.date_from "TIME_FORMAT" attr_fmt="H:i" as time%}
{% blocktrans trimmed with time='<time datetime="'|add:time_24|add:'">'|add:time_human|add:"</time>"|safe %} {% blocktrans with time=time %}
Begin: {{ time }} Begin: {{ time }}
{% endblocktrans %} {% endblocktrans %}
{% endwith %}
</span> </span>
{% if event.settings.show_date_to and ev.date_to %} {% if event.settings.show_date_to and ev.date_to %}
<br> <br>
<span data-time="{{ ev.date_to.isoformat }}" data-timezone="{{ request.event.timezone }}"> <span data-time="{{ ev.date_to.isoformat }}" data-timezone="{{ request.event.timezone }}">
{% with time_human=ev.date_to|date:"TIME_FORMAT" time_24=ev.date_to|time:"H:i" %} {% html_time ev.date_to "TIME_FORMAT" attr_fmt="H:i" as time%}
{% blocktrans trimmed with time='<time datetime="'|add:time_24|add:'">'|add:time_human|add:"</time>"|safe %} {% blocktrans with time=time %}
End: {{ time }} End: {{ time }}
{% endblocktrans %} {% endblocktrans %}
{% endwith %}
</span> </span>
{% endif %} {% endif %}
{% endif %} {% endif %}
@@ -42,19 +41,17 @@
<br> <br>
{% if ev.date_admission|date:"SHORT_DATE_FORMAT" == ev.date_from|date:"SHORT_DATE_FORMAT" %} {% if ev.date_admission|date:"SHORT_DATE_FORMAT" == ev.date_from|date:"SHORT_DATE_FORMAT" %}
<span data-time="{{ ev.date_admission.isoformat }}" data-timezone="{{ request.event.timezone }}"> <span data-time="{{ ev.date_admission.isoformat }}" data-timezone="{{ request.event.timezone }}">
{% with time_human=ev.date_admission|date:"TIME_FORMAT" time_24=ev.date_admission|time:"H:i" %} {% html_time ev.date_admission "TIME_FORMAT" attr_fmt="H:i" as time%}
{% blocktrans trimmed with time='<time datetime="'|add:time_24|add:'">'|add:time_human|add:"</time>"|safe %} {% blocktrans trimmed with time=time %}
Admission: {{ time }} Admission: {{ time }}
{% endblocktrans %} {% endblocktrans %}
{% endwith %}
</span> </span>
{% else %} {% else %}
<span data-time="{{ ev.date_admission.isoformat }}" data-timezone="{{ request.event.timezone }}"> <span data-time="{{ ev.date_admission.isoformat }}" data-timezone="{{ request.event.timezone }}">
{% with datetime_human=ev.date_admission|date:"SHORT_DATETIME_FORMAT" datetime_iso=ev.date_admission|time:"Y-m-d H:i" %} {% html_time ev.date_admission "SHORT_DATETIME_FORMAT" attr_fmt="Y-m-d H:i" as datetime%}
{% blocktrans trimmed with datetime='<time datetime="'|add:datetime_iso|add:'">'|add:datetime_human|add:"</time>"|safe %} {% blocktrans trimmed with datetime=datetime %}
Admission: {{ datetime }} Admission: {{ datetime }}
{% endblocktrans %} {% endblocktrans %}
{% endwith %}
</span> </span>
{% endif %} {% endif %}
{% endif %} {% endif %}

View File

@@ -1,4 +1,5 @@
{% extends "pretixpresale/event/base.html" %} {% extends "pretixpresale/event/base.html" %}
{% load html_time %}
{% load i18n %} {% load i18n %}
{% load bootstrap3 %} {% load bootstrap3 %}
{% load eventsignal %} {% load eventsignal %}
@@ -92,11 +93,10 @@
A payment of {{ total }} is still pending for this order. A payment of {{ total }} is still pending for this order.
{% endblocktrans %}</strong> {% endblocktrans %}</strong>
<strong> <strong>
{% with date_human=order|format_expires|safe date_iso=order.expires|date:"c" %} {% html_time order.expires "format_expires" as date %}
{% blocktrans trimmed with date='<time datetime="'|add:date_iso|add:'">'|add:date_human|add:"</time>"|safe %} {% blocktrans trimmed with date=date %}
Please complete your payment before {{ date }} Please complete your payment before {{ date }}
{% endblocktrans %} {% endblocktrans %}
{% endwith %}
</strong> </strong>
</p> </p>
{% if last_payment %} {% if last_payment %}

View File

@@ -1,3 +1,4 @@
{% load html_time %}
{% load i18n %} {% load i18n %}
{% load date_fast %} {% load date_fast %}
{% load calendarhead %} {% load calendarhead %}
@@ -55,7 +56,7 @@
running running
{% elif event.event.presale_has_ended %} {% elif event.event.presale_has_ended %}
over over
{% elif event.event.settings.presale_start_show_date and event.event.presale_start %} {% elif event.event.settings.presale_start_show_date and event.event.effective_presale_start %}
soon soon
{% else %} {% else %}
soon soon
@@ -108,13 +109,12 @@
<span class="fa fa-ticket" aria-hidden="true"></span> {% trans "Book now" %} <span class="fa fa-ticket" aria-hidden="true"></span> {% trans "Book now" %}
{% elif event.event.presale_has_ended %} {% elif event.event.presale_has_ended %}
{% trans "Sale over" %} {% trans "Sale over" %}
{% elif event.event.settings.presale_start_show_date and event.event.presale_start %} {% elif event.event.settings.presale_start_show_date and event.event.effective_presale_start %}
<span class="fa fa-ticket" aria-hidden="true"></span> <span class="fa fa-ticket" aria-hidden="true"></span>
{% with date_human=event.event.presale_start|date_fast:"SHORT_DATE_FORMAT" date_iso=event.event.presale_start|date_fast:"c" %} {% html_time event.event.effective_presale_start "SHORT_DATE_FORMAT" as start_date %}
{% blocktrans with start_date="<time datetime='"|add:date_iso|add:"'>"|add:date_human|add:"</time>"|safe %} {% blocktrans with start_date=start_date %}
from {{ start_date }} from {{ start_date }}
{% endblocktrans %} {% endblocktrans %}
{% endwith %}
{% else %} {% else %}
<span class="fa fa-ticket" aria-hidden="true"></span> {% trans "Soon" %} <span class="fa fa-ticket" aria-hidden="true"></span> {% trans "Soon" %}
{% endif %} {% endif %}

View File

@@ -1,3 +1,4 @@
{% load html_time %}
{% load i18n %} {% load i18n %}
{% load eventurl %} {% load eventurl %}
<div class="day-calendar cal-size-{{ raster_to_shortest_ratio }}{% if no_headlines %} no-headlines{% endif %}" <div class="day-calendar cal-size-{{ raster_to_shortest_ratio }}{% if no_headlines %} no-headlines{% endif %}"
@@ -52,7 +53,7 @@
running running
{% elif event.event.presale_has_ended %} {% elif event.event.presale_has_ended %}
over over
{% elif event.event.settings.presale_start_show_date and event.event.presale_start %} {% elif event.event.settings.presale_start_show_date and event.event.effective_presale_start %}
soon soon
{% else %} {% else %}
soon soon
@@ -114,9 +115,10 @@
<span class="fa fa-ticket" aria-hidden="true"></span> {% trans "Book now" %} <span class="fa fa-ticket" aria-hidden="true"></span> {% trans "Book now" %}
{% elif event.event.presale_has_ended %} {% elif event.event.presale_has_ended %}
<span class="fa fa-ticket" aria-hidden="true"></span> {% trans "Sale over" %} <span class="fa fa-ticket" aria-hidden="true"></span> {% trans "Sale over" %}
{% elif event.event.settings.presale_start_show_date and event.event.presale_start %} {% elif event.event.settings.presale_start_show_date and event.event.effective_presale_start %}
<span class="fa fa-ticket" aria-hidden="true"></span> <span class="fa fa-ticket" aria-hidden="true"></span>
{% blocktrans with start_date=event.event.presale_start|date:"SHORT_DATE_FORMAT" %} {% html_time event.event.effective_presale_start "SHORT_DATE_FORMAT" as start_date %}
{% blocktrans with start_date=start_date %}
from {{ start_date }} from {{ start_date }}
{% endblocktrans %} {% endblocktrans %}
{% else %} {% else %}

View File

@@ -1,3 +1,4 @@
{% load html_time %}
{% load i18n %} {% load i18n %}
{% load icon %} {% load icon %}
{% load textbubble %} {% load textbubble %}
@@ -52,11 +53,10 @@
{% endtextbubble %} {% endtextbubble %}
{% if event.settings.presale_start_show_date %} {% if event.settings.presale_start_show_date %}
<br><span class="text-muted"> <br><span class="text-muted">
{% with date_iso=event.effective_presale_start.isoformat date_human=event.effective_presale_start|date:"SHORT_DATE_FORMAT" %} {% html_time event.event.effective_presale_start "SHORT_DATE_FORMAT" as date %}
{% blocktrans trimmed with date='<time datetime="'|add:date_iso|add:'">'|add:date_human|add:"</time>"|safe %} {% blocktrans with date=date %}
Sale starts {{ date }} Sale starts {{ date }}
{% endblocktrans %} {% endblocktrans %}
{% endwith %}
</span> </span>
{% endif %} {% endif %}
{% endif %} {% endif %}

View File

@@ -1,3 +1,4 @@
{% load html_time %}
{% load i18n %} {% load i18n %}
{% load date_fast %} {% load date_fast %}
<div class="week-calendar"> <div class="week-calendar">
@@ -24,7 +25,7 @@
running running
{% elif event.event.presale_has_ended %} {% elif event.event.presale_has_ended %}
over over
{% elif event.event.settings.presale_start_show_date and event.event.presale_start %} {% elif event.event.settings.presale_start_show_date and event.event.effective_presale_start %}
soon soon
{% else %} {% else %}
soon soon
@@ -77,9 +78,10 @@
<span class="fa fa-ticket" aria-hidden="true"></span> {% trans "Book now" %} <span class="fa fa-ticket" aria-hidden="true"></span> {% trans "Book now" %}
{% elif event.event.presale_has_ended %} {% elif event.event.presale_has_ended %}
{% trans "Sale over" %} {% trans "Sale over" %}
{% elif event.event.settings.presale_start_show_date and event.event.presale_start %} {% elif event.event.settings.presale_start_show_date and event.event.effective_presale_start %}
<span class="fa fa-ticket" aria-hidden="true"></span> <span class="fa fa-ticket" aria-hidden="true"></span>
{% blocktrans with start_date=event.event.presale_start|date_fast:"SHORT_DATE_FORMAT" %} {% html_time event.event.effective_presale_start "SHORT_DATE_FORMAT" as start_date %}
{% blocktrans with start_date=start_date %}
from {{ start_date }} from {{ start_date }}
{% endblocktrans %} {% endblocktrans %}
{% else %} {% else %}

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,
@@ -472,10 +471,11 @@ class WidgetAPIProductList(EventListMixin, View):
availability['color'] = 'red' availability['color'] = 'red'
availability['text'] = gettext('Sale over') availability['text'] = gettext('Sale over')
availability['reason'] = 'over' availability['reason'] = 'over'
elif event.settings.presale_start_show_date and ev.presale_start: elif event.settings.presale_start_show_date and ev.effective_presale_start:
availability['color'] = 'orange' availability['color'] = 'orange'
availability['text'] = gettext('from %(start_date)s') % { availability['text'] = gettext('from %(start_date)s') % {
'start_date': date_format(ev.presale_start.astimezone(tz or event.timezone), "SHORT_DATE_FORMAT") 'start_date': date_format(ev.effective_presale_start.astimezone(tz or event.timezone),
"SHORT_DATE_FORMAT")
} }
availability['reason'] = 'soon' availability['reason'] = 'soon'
else: else:

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'

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 163 KiB

View File

@@ -1,7 +1,7 @@
[flake8] [flake8]
ignore = N802,W503,E402,C901,E722,W504,E252,N812,N806,N818,E741 ignore = N802,W503,E402,C901,E722,W504,E252,N812,N806,N818,E741
max-line-length = 160 max-line-length = 160
exclude = migrations,.ropeproject,static,mt940.py,_static,build,make_testdata.py,*/testutils/settings.py,tests/settings.py,pretix/base/models/__init__.py,pretix/base/secretgenerators/pretix_sig1_pb2.py,.eggs/* exclude = data/*,migrations,.ropeproject,static,mt940.py,_static,build,make_testdata.py,*/testutils/settings.py,tests/settings.py,pretix/base/models/__init__.py,pretix/base/secretgenerators/pretix_sig1_pb2.py,.eggs/*
max-complexity = 11 max-complexity = 11
[isort] [isort]
@@ -13,7 +13,7 @@ extra_standard_library = typing,enum,mimetypes
multi_line_output = 5 multi_line_output = 5
line_length = 79 line_length = 79
honor_noqa = true honor_noqa = true
skip_glob = make_testdata.py,wsgi.py,bootstrap,celery_app.py,pretix/settings.py,tests/settings.py,pretix/testutils/settings.py,.eggs/** skip_glob = data/**,make_testdata.py,wsgi.py,bootstrap,celery_app.py,pretix/settings.py,tests/settings.py,pretix/testutils/settings.py,.eggs/**
[tool:pytest] [tool:pytest]
DJANGO_SETTINGS_MODULE = tests.settings DJANGO_SETTINGS_MODULE = tests.settings

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

@@ -0,0 +1,756 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--Beispielnachricht_camt.053_BankToCustomerStatement_via_EBICS-->
<!-- Source https://www.bundesbank.de/de/startseite/beispieldateien-zur-bereitstellung-der-elektronischen-kontoinformationen-zu-dotationskonten-von-banken-im-format-camt-052-und-camt-053-bei-kommunikation-via-ebics-example-files-for-the-provision-of-electronic-account-information-for-cash-handling-accounts-of-banks-in-camt-052-and-camt-053-format-when-communicating-via-ebics-943090 -->
<Document xmlns:n0="urn:iso:std:iso:20022:tech:xsd:camt.053.001.08">
<BkToCstmrStmt>
<GrpHdr>
<MsgId>20240313C0098170</MsgId>
<CreDtTm>2024-03-13T18:40:42.8734727+01:00</CreDtTm>
</GrpHdr>
<Stmt>
<Id>20240313C0098170</Id>
<StmtPgntn>
<PgNb>00001</PgNb>
<LastPgInd>true</LastPgInd>
</StmtPgntn>
<ElctrncSeqNb>1</ElctrncSeqNb>
<CreDtTm>2024-03-13T18:40:42.8734727+01:00</CreDtTm>
<Acct>
<Id>
<IBAN>DE00IBANdesDotationskontos</IBAN>
</Id>
<Tp>
<Cd>CACC</Cd>
</Tp>
<Ccy>EUR</Ccy>
<Nm>Testbank, Hamburg</Nm>
<Ownr>
<Nm>Testbank-Inhaber</Nm>
</Ownr>
<Svcr>
<FinInstnId>
<BICFI>MARKDEF1200</BICFI>
<ClrSysMmbId>
<ClrSysId>
<Cd>DEBLZ</Cd>
</ClrSysId>
<MmbId>20000000</MmbId>
</ClrSysMmbId>
<Nm>Deutsche Bundesbank</Nm>
<Othr>
<Id>DE114103555</Id>
<Issr>UmsStId</Issr>
</Othr>
</FinInstnId>
<BrnchId>
<Nm>Filiale Hamburg</Nm>
</BrnchId>
</Svcr>
</Acct>
<Bal>
<Tp>
<CdOrPrtry>
<Cd>OPBD</Cd>
</CdOrPrtry>
</Tp>
<Amt Ccy="EUR">0.00</Amt>
<CdtDbtInd>CRDT</CdtDbtInd>
<Dt>
<Dt>2024-03-13</Dt>
</Dt>
</Bal>
<Bal>
<Tp>
<CdOrPrtry>
<Cd>CLBD</Cd>
</CdOrPrtry>
</Tp>
<Amt Ccy="EUR">0.00</Amt>
<CdtDbtInd>CRDT</CdtDbtInd>
<Dt>
<Dt>2024-03-13</Dt>
</Dt>
</Bal>
<Ntry>
<NtryRef>2000000011240313</NtryRef>
<Amt Ccy="EUR">100000.00</Amt>
<CdtDbtInd>CRDT</CdtDbtInd>
<Sts>
<Cd>BOOK</Cd>
</Sts>
<BookgDt>
<Dt>2024-03-13</Dt>
</BookgDt>
<ValDt>
<Dt>2024-03-13</Dt>
</ValDt>
<AcctSvcrRef>103600002791/0019200002</AcctSvcrRef>
<BkTxCd>
<Domn>
<Cd>PMNT</Cd>
<Fmly>
<Cd>CNTR</Cd>
<SubFmlyCd>CDPT</SubFmlyCd>
</Fmly>
</Domn>
<Prtry>
<Cd>NCMI+082+0019200002</Cd>
<Issr>DK</Issr>
</Prtry>
</BkTxCd>
<NtryDtls>
<TxDtls>
<Refs>
<AcctSvcrRef>2000000011240313</AcctSvcrRef>
</Refs>
<Amt Ccy="EUR">100000.00</Amt>
<BkTxCd>
<Domn>
<Cd>PMNT</Cd>
<Fmly>
<Cd>CNTR</Cd>
<SubFmlyCd>CDPT</SubFmlyCd>
</Fmly>
</Domn>
<Prtry>
<Cd>NCMI+082+0019200002</Cd>
<Issr>DK</Issr>
</Prtry>
</BkTxCd>
<Purp>
<Prtry>Einzahlung</Prtry>
</Purp>
<AddtlTxInf>Einzahlungen</AddtlTxInf>
</TxDtls>
</NtryDtls>
<AddtlNtryInf>Einzahlungen</AddtlNtryInf>
</Ntry>
<Ntry>
<NtryRef>2000000012240313</NtryRef>
<Amt Ccy="EUR">25000.00</Amt>
<CdtDbtInd>DBIT</CdtDbtInd>
<Sts>
<Cd>BOOK</Cd>
</Sts>
<BookgDt>
<Dt>2024-03-13</Dt>
</BookgDt>
<ValDt>
<Dt>2024-03-13</Dt>
</ValDt>
<AcctSvcrRef>049000039704/0019000002</AcctSvcrRef>
<BkTxCd>
<Domn>
<Cd>PMNT</Cd>
<Fmly>
<Cd>CNTR</Cd>
<SubFmlyCd>CWDL</SubFmlyCd>
</Fmly>
</Domn>
<Prtry>
<Cd>NCMI+083+0019000002</Cd>
<Issr>DK</Issr>
</Prtry>
</BkTxCd>
<NtryDtls>
<TxDtls>
<Refs>
<AcctSvcrRef>2000000012240313</AcctSvcrRef>
<InstrId>9998770</InstrId>
<ChqNb>9998770</ChqNb>
</Refs>
<Amt Ccy="EUR">25000.00</Amt>
<BkTxCd>
<Domn>
<Cd>PMNT</Cd>
<Fmly>
<Cd>CNTR</Cd>
<SubFmlyCd>CWDL</SubFmlyCd>
</Fmly>
</Domn>
<Prtry>
<Cd>NCMI+083+0019000002</Cd>
<Issr>DK</Issr>
</Prtry>
</BkTxCd>
<Purp>
<Prtry>Auszahlung</Prtry>
</Purp>
<AddtlTxInf>Auszahlungen</AddtlTxInf>
</TxDtls>
</NtryDtls>
<AddtlNtryInf>Auszahlungen</AddtlNtryInf>
</Ntry>
<Ntry>
<Amt Ccy="EUR">20000.00</Amt>
<CdtDbtInd>DBIT</CdtDbtInd>
<Sts>
<Cd>BOOK</Cd>
</Sts>
<BookgDt>
<Dt>2024-03-13</Dt>
</BookgDt>
<ValDt>
<Dt>2024-03-13</Dt>
</ValDt>
<AcctSvcrRef>047200003598/0002000001</AcctSvcrRef>
<BkTxCd>
<Domn>
<Cd>PMNT</Cd>
<Fmly>
<Cd>ICHQ</Cd>
<SubFmlyCd>CCHQ</SubFmlyCd>
</Fmly>
</Domn>
<Prtry>
<Cd>NCHK+101+0002000001</Cd>
<Issr>DK</Issr>
</Prtry>
</BkTxCd>
<NtryDtls>
<TxDtls>
<Refs>
<InstrId>9998771</InstrId>
<ChqNb>9998771</ChqNb>
</Refs>
<Amt Ccy="EUR">250000.00</Amt>
<BkTxCd>
<Domn>
<Cd>PMNT</Cd>
<Fmly>
<Cd>ICHQ</Cd>
<SubFmlyCd>CCHQ</SubFmlyCd>
</Fmly>
</Domn>
<Prtry>
<Cd>NCHK+101+0002000001</Cd>
<Issr>DK</Issr>
</Prtry>
</BkTxCd>
<RltdPties>
<Cdtr>
<Pty>
<Nm>Deutsche Bundesbank KBS HMS Hamburg</Nm>
</Pty>
</Cdtr>
<CdtrAcct>
<Id>
<IBAN>DE98200000000020002633</IBAN>
</Id>
</CdtrAcct>
</RltdPties>
<RltdAgts>
<CdtrAgt>
<FinInstnId>
<ClrSysMmbId>
<ClrSysId>
<Cd>DEBLZ</Cd>
</ClrSysId>
<MmbId>20000000</MmbId>
</ClrSysMmbId>
</FinInstnId>
</CdtrAgt>
</RltdAgts>
<Purp>
<Prtry>LS bestätigter Scheck</Prtry>
</Purp>
<RmtInf>
<Ustrd>Bestätigter Scheck vom 13.03.2024</Ustrd>
<Ustrd>Scheck Nr. 135469</Ustrd>
</RmtInf>
<AddtlTxInf>Inhaberscheck</AddtlTxInf>
</TxDtls>
</NtryDtls>
<AddtlNtryInf>Inhaberscheck</AddtlNtryInf>
</Ntry>
<Ntry>
<Amt Ccy="EUR">15.00</Amt>
<CdtDbtInd>DBIT</CdtDbtInd>
<Sts>
<Cd>BOOK</Cd>
</Sts>
<BookgDt>
<Dt>2024-03-13</Dt>
</BookgDt>
<ValDt>
<Dt>2024-03-13</Dt>
</ValDt>
<AcctSvcrRef>047200003598/0002000001</AcctSvcrRef>
<BkTxCd>
<Domn>
<Cd>ACMT</Cd>
<Fmly>
<Cd>MDOP</Cd>
<SubFmlyCd>CHRG</SubFmlyCd>
</Fmly>
</Domn>
<Prtry>
<Cd>NCHG+808+0002000001</Cd>
<Issr>DK</Issr>
</Prtry>
</BkTxCd>
<NtryDtls>
<TxDtls>
<Amt Ccy="EUR">15.00</Amt>
<BkTxCd>
<Domn>
<Cd>ACMT</Cd>
<Fmly>
<Cd>MDOP</Cd>
<SubFmlyCd>CHRG</SubFmlyCd>
</Fmly>
</Domn>
<Prtry>
<Cd>NCHG+808+0002000001</Cd>
<Issr>DK</Issr>
</Prtry>
</BkTxCd>
<Purp>
<Prtry>LS Entgelte Giro, SchE</Prtry>
</Purp>
<AddtlTxInf>Gebühren</AddtlTxInf>
</TxDtls>
</NtryDtls>
<AddtlNtryInf>Gebühren</AddtlNtryInf>
</Ntry>
<Ntry>
<NtryRef>H202403135000000107</NtryRef>
<Amt Ccy="EUR">145015.00</Amt>
<CdtDbtInd>CRDT</CdtDbtInd>
<Sts>
<Cd>BOOK</Cd>
</Sts>
<BookgDt>
<Dt>2024-03-13</Dt>
</BookgDt>
<ValDt>
<Dt>2024-03-13</Dt>
</ValDt>
<AcctSvcrRef>051500000059/0019000003</AcctSvcrRef>
<BkTxCd>
<Domn>
<Cd>PMNT</Cd>
<Fmly>
<Cd>RCDT</Cd>
<SubFmlyCd>SDVA</SubFmlyCd>
</Fmly>
</Domn>
<Prtry>
<Cd>NTRF+088+0019000003</Cd>
<Issr>DK</Issr>
</Prtry>
</BkTxCd>
<NtryDtls>
<TxDtls>
<Refs>
<AcctSvcrRef>H202403135000000107</AcctSvcrRef>
<InstrId>H202403135000000107</InstrId>
</Refs>
<Amt Ccy="EUR">145015.00</Amt>
<BkTxCd>
<Domn>
<Cd>PMNT</Cd>
<Fmly>
<Cd>RCDT</Cd>
<SubFmlyCd>SDVA</SubFmlyCd>
</Fmly>
</Domn>
<Prtry>
<Cd>NTRF+088+0019000003</Cd>
<Issr>DK</Issr>
</Prtry>
</BkTxCd>
<Purp>
<Prtry>Überw Prior1/SWI</Prtry>
</Purp>
<AddtlTxInf>Überweisungsgutschrift mit Festvaluta</AddtlTxInf>
</TxDtls>
</NtryDtls>
<AddtlNtryInf>Überweisungsgutschrift mit Festvaluta</AddtlNtryInf>
</Ntry>
<Ntry>
<NtryRef>H202403135000000108</NtryRef>
<Amt Ccy="EUR">50000.00</Amt>
<CdtDbtInd>CRDT</CdtDbtInd>
<Sts>
<Cd>BOOK</Cd>
</Sts>
<BookgDt>
<Dt>2024-03-13</Dt>
</BookgDt>
<ValDt>
<Dt>2024-03-13</Dt>
</ValDt>
<AcctSvcrRef>105600004525/0019200003</AcctSvcrRef>
<BkTxCd>
<Domn>
<Cd>PMNT</Cd>
<Fmly>
<Cd>RCDT</Cd>
<SubFmlyCd>SDVA</SubFmlyCd>
</Fmly>
</Domn>
<Prtry>
<Cd>NTRF+088+0019200003</Cd>
<Issr>DK</Issr>
</Prtry>
</BkTxCd>
<NtryDtls>
<TxDtls>
<Refs>
<AcctSvcrRef>H202403135000000108</AcctSvcrRef>
<InstrId>H202403135000000108</InstrId>
</Refs>
<Amt Ccy="EUR">50000.00</Amt>
<AmtDtls>
<InstdAmt>
<Amt Ccy="EUR">50000.00</Amt>
</InstdAmt>
</AmtDtls>
<BkTxCd>
<Domn>
<Cd>PMNT</Cd>
<Fmly>
<Cd>RCDT</Cd>
<SubFmlyCd>SDVA</SubFmlyCd>
</Fmly>
</Domn>
<Prtry>
<Cd>NTRF+088+0019200003</Cd>
<Issr>DK</Issr>
</Prtry>
</BkTxCd>
<RltdPties>
<Dbtr>
<Pty>
<Nm>Testbank</Nm>
</Pty>
</Dbtr>
<DbtrAcct>
<Id>
<Othr>
<Id>0123456789</Id>
</Othr>
</Id>
</DbtrAcct>
</RltdPties>
<Purp>
<Prtry>Überw Prior1/SWI</Prtry>
</Purp>
<RmtInf>
<Ustrd>VWZ pacs008 RTGS nach DOTA</Ustrd>
</RmtInf>
<AddtlTxInf>Überweisungsgutschrift mit Festvaluta</AddtlTxInf>
</TxDtls>
</NtryDtls>
<AddtlNtryInf>Überweisungsgutschrift mit Festvaluta</AddtlNtryInf>
</Ntry>
<Ntry>
<NtryRef>H202403135000000109</NtryRef>
<Amt Ccy="EUR">80000.00</Amt>
<CdtDbtInd>CRDT</CdtDbtInd>
<Sts>
<Cd>BOOK</Cd>
</Sts>
<BookgDt>
<Dt>2024-03-13</Dt>
</BookgDt>
<ValDt>
<Dt>2024-03-13</Dt>
</ValDt>
<AcctSvcrRef>051800000156/0019000004</AcctSvcrRef>
<BkTxCd>
<Domn>
<Cd>PMNT</Cd>
<Fmly>
<Cd>RCDT</Cd>
<SubFmlyCd>SDVA</SubFmlyCd>
</Fmly>
</Domn>
<Prtry>
<Cd>NTRF+088+0019000004</Cd>
<Issr>DK</Issr>
</Prtry>
</BkTxCd>
<NtryDtls>
<TxDtls>
<Refs>
<AcctSvcrRef>H202403135000000109</AcctSvcrRef>
<InstrId>pacs009-EndToEndId-00004</InstrId>
</Refs>
<Amt Ccy="EUR">80000.00</Amt>
<BkTxCd>
<Domn>
<Cd>PMNT</Cd>
<Fmly>
<Cd>RCDT</Cd>
<SubFmlyCd>SDVA</SubFmlyCd>
</Fmly>
</Domn>
<Prtry>
<Cd>NTRF+088+0019000004</Cd>
<Issr>DK</Issr>
</Prtry>
</BkTxCd>
<Purp>
<Prtry>Überw Prior1/SWI</Prtry>
</Purp>
<RmtInf>
<Ustrd>VWZ pacs009 RTGS nach DOTA</Ustrd>
</RmtInf>
<AddtlTxInf>Überweisungsgutschrift mit Festvaluta</AddtlTxInf>
</TxDtls>
</NtryDtls>
<AddtlNtryInf>Überweisungsgutschrift mit Festvaluta</AddtlNtryInf>
</Ntry>
<Ntry>
<NtryRef>pacs009-InstrId-00005</NtryRef>
<Amt Ccy="EUR">30000.00</Amt>
<CdtDbtInd>DBIT</CdtDbtInd>
<Sts>
<Cd>BOOK</Cd>
</Sts>
<BookgDt>
<Dt>2024-03-13</Dt>
</BookgDt>
<ValDt>
<Dt>2024-03-13</Dt>
</ValDt>
<AcctSvcrRef>055100000086/0019000005</AcctSvcrRef>
<BkTxCd>
<Domn>
<Cd>PMNT</Cd>
<Fmly>
<Cd>ICDT</Cd>
<SubFmlyCd>SDVA</SubFmlyCd>
</Fmly>
</Domn>
<Prtry>
<Cd>NTRF+087+0019000005</Cd>
<Issr>DK</Issr>
</Prtry>
</BkTxCd>
<NtryDtls>
<TxDtls>
<Refs>
<AcctSvcrRef>pacs009-InstrId-00005</AcctSvcrRef>
<InstrId>pacs009-InstrId-00005</InstrId>
</Refs>
<Amt Ccy="EUR">30000.00</Amt>
<BkTxCd>
<Domn>
<Cd>PMNT</Cd>
<Fmly>
<Cd>ICDT</Cd>
<SubFmlyCd>SDVA</SubFmlyCd>
</Fmly>
</Domn>
<Prtry>
<Cd>NTRF+087+0019000005</Cd>
<Issr>DK</Issr>
</Prtry>
</BkTxCd>
<Purp>
<Prtry>Überw Prior1/SWI</Prtry>
</Purp>
<RmtInf>
<Ustrd>VWZ pacs009 DOTA nach MCA</Ustrd>
</RmtInf>
<AddtlTxInf>Eilüberweisung</AddtlTxInf>
</TxDtls>
</NtryDtls>
<AddtlNtryInf>Eilüberweisung</AddtlNtryInf>
</Ntry>
<Ntry>
<NtryRef>pacs009-InstrId-00006</NtryRef>
<Amt Ccy="EUR">120000.00</Amt>
<CdtDbtInd>DBIT</CdtDbtInd>
<Sts>
<Cd>BOOK</Cd>
</Sts>
<BookgDt>
<Dt>2024-03-13</Dt>
</BookgDt>
<ValDt>
<Dt>2024-03-13</Dt>
</ValDt>
<AcctSvcrRef>001400001221/0019000006</AcctSvcrRef>
<BkTxCd>
<Domn>
<Cd>PMNT</Cd>
<Fmly>
<Cd>ICDT</Cd>
<SubFmlyCd>SDVA</SubFmlyCd>
</Fmly>
</Domn>
<Prtry>
<Cd>NTRF+087+0019000006</Cd>
<Issr>DK</Issr>
</Prtry>
</BkTxCd>
<NtryDtls>
<TxDtls>
<Refs>
<AcctSvcrRef>pacs009-InstrId-00006</AcctSvcrRef>
<InstrId>pacs009-InstrId-00006</InstrId>
</Refs>
<Amt Ccy="EUR">120000.00</Amt>
<BkTxCd>
<Domn>
<Cd>PMNT</Cd>
<Fmly>
<Cd>ICDT</Cd>
<SubFmlyCd>SDVA</SubFmlyCd>
</Fmly>
</Domn>
<Prtry>
<Cd>NTRF+087+0019000006</Cd>
<Issr>DK</Issr>
</Prtry>
</BkTxCd>
<Purp>
<Prtry>Überw Prior1/SWI</Prtry>
</Purp>
<RmtInf>
<Ustrd>VWZ pacs009 DOTA nach RTGS</Ustrd>
</RmtInf>
<AddtlTxInf>Eilüberweisung</AddtlTxInf>
</TxDtls>
</NtryDtls>
<AddtlNtryInf>Eilüberweisung</AddtlNtryInf>
</Ntry>
<Ntry>
<Amt Ccy="EUR">100000.00</Amt>
<CdtDbtInd>CRDT</CdtDbtInd>
<Sts>
<Cd>BOOK</Cd>
</Sts>
<BookgDt>
<Dt>2024-03-13</Dt>
</BookgDt>
<ValDt>
<Dt>2024-03-13</Dt>
</ValDt>
<AcctSvcrRef>016900004681/0002000002</AcctSvcrRef>
<BkTxCd>
<Prtry>
<Cd>NCHK+070+0002000002</Cd>
<Issr>DK</Issr>
</Prtry>
</BkTxCd>
<NtryDtls>
<TxDtls>
<Amt Ccy="EUR">100000.00</Amt>
<BkTxCd>
<Prtry>
<Cd>NCHK+070+0002000002</Cd>
<Issr>DK</Issr>
</Prtry>
</BkTxCd>
<RltdPties>
<Dbtr>
<Pty>
<Nm>Deutsche Bundesbank / 22772 Hamburg</Nm>
</Pty>
</Dbtr>
<DbtrAcct>
<Id>
<IBAN>DE98200000000020002633</IBAN>
</Id>
</DbtrAcct>
</RltdPties>
<RltdAgts>
<DbtrAgt>
<FinInstnId>
<ClrSysMmbId>
<ClrSysId>
<Cd>DEBLZ</Cd>
</ClrSysId>
<MmbId>20000000</MmbId>
</ClrSysMmbId>
</FinInstnId>
</DbtrAgt>
</RltdAgts>
<Purp>
<Prtry>GS bestätigter Scheck</Prtry>
</Purp>
<RmtInf>
<Ustrd>Rückgabe Best. Scheck vom 28.02.2024</Ustrd>
<Ustrd>Scheck Nr. 135468</Ustrd>
</RmtInf>
</TxDtls>
</NtryDtls>
</Ntry>
<Ntry>
<NtryRef>pacs008-InstrId-00007</NtryRef>
<Amt Ccy="EUR">280000.00</Amt>
<CdtDbtInd>DBIT</CdtDbtInd>
<Sts>
<Cd>BOOK</Cd>
</Sts>
<BookgDt>
<Dt>2024-03-13</Dt>
</BookgDt>
<ValDt>
<Dt>2024-03-13</Dt>
</ValDt>
<AcctSvcrRef>010300005153/0019000007</AcctSvcrRef>
<BkTxCd>
<Domn>
<Cd>PMNT</Cd>
<Fmly>
<Cd>ICDT</Cd>
<SubFmlyCd>SDVA</SubFmlyCd>
</Fmly>
</Domn>
<Prtry>
<Cd>NTRF+087+0019000007</Cd>
<Issr>DK</Issr>
</Prtry>
</BkTxCd>
<NtryDtls>
<TxDtls>
<Refs>
<AcctSvcrRef>pacs008-InstrId-00007</AcctSvcrRef>
<InstrId>pacs008-InstrId-00007</InstrId>
</Refs>
<Amt Ccy="EUR">280000.00</Amt>
<BkTxCd>
<Domn>
<Cd>PMNT</Cd>
<Fmly>
<Cd>ICDT</Cd>
<SubFmlyCd>SDVA</SubFmlyCd>
</Fmly>
</Domn>
<Prtry>
<Cd>NTRF+087+0019000007</Cd>
<Issr>DK</Issr>
</Prtry>
</BkTxCd>
<RltdPties>
<Cdtr>
<Pty>
<Nm>Testbank, Hamburg</Nm>
</Pty>
</Cdtr>
<CdtrAcct>
<Id>
<IBAN>DE00IBANbeiTestbank</IBAN>
</Id>
</CdtrAcct>
</RltdPties>
<Purp>
<Prtry>Überw Prior1/SWI</Prtry>
</Purp>
<RmtInf>
<Ustrd>VWZ pacs008 DOTA nach RTGS</Ustrd>
</RmtInf>
<AddtlTxInf>Eilüberweisung</AddtlTxInf>
</TxDtls>
</NtryDtls>
<AddtlNtryInf>Eilüberweisung</AddtlNtryInf>
</Ntry>
</Stmt>
</BkToCstmrStmt>
</Document>

View File

@@ -0,0 +1,312 @@
<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:camt.053.001.02" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:camt.053.001.02 camt.053.001.02.xsd">
<BkToCstmrStmt>
<GrpHdr>
<MsgId>053D2013-12-27T22:05:03.0N130000005</MsgId>
<CreDtTm>2013-12-27T22:04:52.0+01:00</CreDtTm>
<MsgPgntn>
<PgNb>1</PgNb>
<LastPgInd>true</LastPgInd>
</MsgPgntn>
</GrpHdr>
<Stmt>
<Id>0352C5320131227220503</Id>
<ElctrncSeqNb>130000005</ElctrncSeqNb>
<CreDtTm>2013-12-27T22:04:52.0+01:00</CreDtTm>
<Acct>
<Id>
<IBAN>DE14740618130000033626</IBAN>
</Id>
<Ccy>EUR</Ccy>
<Ownr>
<Nm>Testkonto Nummer 1</Nm>
</Ownr>
<Svcr>
<FinInstnId>
<BIC>GENODEF1PFK</BIC>
<Nm>VR-Bank Rottal-Inn eG</Nm>
<Othr>
<Id>DE 129267947</Id>
<Issr>UmsStId</Issr>
</Othr>
</FinInstnId>
</Svcr>
</Acct>
<Bal>
<Tp>
<CdOrPrtry>
<Cd>PRCD</Cd>
</CdOrPrtry>
</Tp>
<Amt Ccy="EUR">33.06</Amt>
<CdtDbtInd>CRDT</CdtDbtInd>
<Dt>
<Dt>2013-12-27</Dt>
</Dt>
</Bal>
<Bal>
<Tp>
<CdOrPrtry>
<Cd>CLBD</Cd>
</CdOrPrtry>
</Tp>
<Amt Ccy="EUR">23.06</Amt>
<CdtDbtInd>CRDT</CdtDbtInd>
<Dt>
<Dt>2013-12-27</Dt>
</Dt>
</Bal>
<Ntry>
<Amt Ccy="EUR">2.00</Amt>
<CdtDbtInd>DBIT</CdtDbtInd>
<Sts>BOOK</Sts>
<BookgDt>
<Dt>2013-12-27</Dt>
</BookgDt>
<ValDt>
<Dt>2013-12-27</Dt>
</ValDt>
<AcctSvcrRef>2013122710583450000</AcctSvcrRef>
<BkTxCd/>
<NtryDtls>
<TxDtls>
<BkTxCd>
<Prtry>
<Cd>NTRF+020</Cd>
<Issr>ZKA</Issr>
</Prtry>
</BkTxCd>
<RltdPties>
<Cdtr>
<Nm>Testkonto Nummer 2</Nm>
</Cdtr>
<CdtrAcct>
<Id>
<Othr>
<Id> 740618130100033626</Id>
<SchmeNm>
<Cd>BBAN</Cd>
</SchmeNm>
</Othr>
</Id>
</CdtrAcct>
</RltdPties>
<RmtInf>
<Ustrd>TEST BERWEISUNG MITTELS BLZUND KONTONUMMER - DTA</Ustrd>
</RmtInf>
</TxDtls>
</NtryDtls>
</Ntry>
<Ntry>
<Amt Ccy="EUR">3.00</Amt>
<CdtDbtInd>DBIT</CdtDbtInd>
<Sts>BOOK</Sts>
<BookgDt>
<Dt>2013-12-27</Dt>
</BookgDt>
<ValDt>
<Dt>2013-12-27</Dt>
</ValDt>
<AcctSvcrRef>2013122710583600000</AcctSvcrRef>
<BkTxCd/>
<NtryDtls>
<TxDtls>
<Refs>
<MsgId>CCTI/VRNWSW/b044f24cddb92a502b8a1b5</MsgId>
<EndToEndId>NOTPROVIDED</EndToEndId>
</Refs>
<BkTxCd>
<Prtry>
<Cd>NMSC+201</Cd>
<Issr>ZKA</Issr>
</Prtry>
</BkTxCd>
<RltdPties>
<Dbtr>
<Nm>Testkonto Nummer 1</Nm>
</Dbtr>
<DbtrAcct>
<Id>
<IBAN>DE14740618130000033626</IBAN>
</Id>
</DbtrAcct>
<UltmtDbtr>
<Nm>keine Information vorhanden</Nm>
</UltmtDbtr>
<Cdtr>
<Nm>Testkonto Nummer 2</Nm>
</Cdtr>
<CdtrAcct>
<Id>
<IBAN>DE58740618130100033626</IBAN>
</Id>
</CdtrAcct>
<UltmtCdtr>
<Nm>keine Information vorhanden</Nm>
</UltmtCdtr>
</RltdPties>
<RltdAgts>
<CdtrAgt>
<FinInstnId>
<BIC>GENODEF1PFK</BIC>
</FinInstnId>
</CdtrAgt>
</RltdAgts>
<RmtInf>
<Ustrd>Test+berweisung mit BIC und IBAN SEPA IBAN: DE58740618130100033626 BIC: GENODEF1PFK</Ustrd>
</RmtInf>
</TxDtls>
</NtryDtls>
</Ntry>
<Ntry>
<Amt Ccy="EUR">1.00</Amt>
<CdtDbtInd>CRDT</CdtDbtInd>
<Sts>BOOK</Sts>
<BookgDt>
<Dt>2013-12-27</Dt>
</BookgDt>
<ValDt>
<Dt>2013-12-27</Dt>
</ValDt>
<AcctSvcrRef>2013122711085260000</AcctSvcrRef>
<BkTxCd/>
<NtryDtls>
<TxDtls>
<BkTxCd>
<Prtry>
<Cd>NMSC+051</Cd>
<Issr>ZKA</Issr>
</Prtry>
</BkTxCd>
<RltdPties>
<Dbtr>
<Nm>Testkonto Nummer 2</Nm>
</Dbtr>
<DbtrAcct>
<Id>
<Othr>
<Id> 740618130100033626</Id>
<SchmeNm>
<Cd>BBAN</Cd>
</SchmeNm>
</Othr>
</Id>
</DbtrAcct>
</RltdPties>
<RmtInf>
<Ustrd>R CKBUCHUNG</Ustrd>
</RmtInf>
</TxDtls>
</NtryDtls>
</Ntry>
<Ntry>
<Amt Ccy="EUR">6.00</Amt>
<CdtDbtInd>DBIT</CdtDbtInd>
<Sts>BOOK</Sts>
<BookgDt>
<Dt>2013-12-27</Dt>
</BookgDt>
<ValDt>
<Dt>2013-12-27</Dt>
</ValDt>
<AcctSvcrRef>2013122711513230000</AcctSvcrRef>
<BkTxCd/>
<NtryDtls>
<Btch>
<PmtInfId>STZV-PmInf27122013-11:02-2</PmtInfId>
<NbOfTxs>2</NbOfTxs>
</Btch>
<TxDtls>
<Refs>
<MsgId>STZV-Msg27122013-11:02</MsgId>
<EndToEndId>STZV-EtE27122013-11:02-1</EndToEndId>
</Refs>
<AmtDtls>
<TxAmt>
<Amt Ccy="EUR">3.50</Amt>
</TxAmt>
</AmtDtls>
<BkTxCd>
<Prtry>
<Cd>NMSC+201</Cd>
<Issr>ZKA</Issr>
</Prtry>
</BkTxCd>
<RltdPties>
<Dbtr>
<Nm>Testkonto Nummer 2</Nm>
</Dbtr>
<DbtrAcct>
<Id>
<IBAN>DE58740618130100033626</IBAN>
</Id>
</DbtrAcct>
<UltmtDbtr>
<Nm>keine Information vorhanden</Nm>
</UltmtDbtr>
<Cdtr>
<Nm>Testkonto Nummer 1</Nm>
</Cdtr>
<CdtrAcct>
<Id>
<IBAN>DE14740618130000033626</IBAN>
</Id>
</CdtrAcct>
<UltmtCdtr>
<Nm>Testkonto</Nm>
</UltmtCdtr>
</RltdPties>
<RmtInf>
<Ustrd>Sammelueberwseisung 2. Zahlung TAN:283044 </Ustrd>
</RmtInf>
</TxDtls>
<TxDtls>
<Refs>
<MsgId>STZV-Msg27122013-11:02</MsgId>
<EndToEndId>STZV-EtE27122013-11:02-2</EndToEndId>
</Refs>
<AmtDtls>
<TxAmt>
<Amt Ccy="EUR">2.50</Amt>
</TxAmt>
</AmtDtls>
<BkTxCd>
<Prtry>
<Cd>NMSC+201</Cd>
<Issr>ZKA</Issr>
</Prtry>
</BkTxCd>
<RltdPties>
<Dbtr>
<Nm>Testkonto Nummer 2</Nm>
</Dbtr>
<DbtrAcct>
<Id>
<IBAN>DE58740618130100033626</IBAN>
</Id>
</DbtrAcct>
<UltmtDbtr>
<Nm>keine Information vorhanden</Nm>
</UltmtDbtr>
<Cdtr>
<Nm>Testkonto Nummer 1</Nm>
</Cdtr>
<CdtrAcct>
<Id>
<IBAN>DE14740618130000033626</IBAN>
</Id>
</CdtrAcct>
<UltmtCdtr>
<Nm>Testkonto</Nm>
</UltmtCdtr>
</RltdPties>
<RmtInf>
<Ustrd>Sammelueberweisung 1. Zahlung TAN:283044 </Ustrd>
</RmtInf>
</TxDtls>
</NtryDtls>
</Ntry>
</Stmt>
</BkToCstmrStmt>
</Document>

View File

@@ -0,0 +1,146 @@
#
# 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/>.
#
import os.path
from django.test import TestCase
from pretix.plugins.banktransfer import camtimport
DATA_DIR = os.path.dirname(__file__)
class CamtImportTest(TestCase):
def _test_from_sample_file(self, filename, expected_parsed):
with open(os.path.join(DATA_DIR, filename), "rb") as f:
parsed = camtimport.parse(f)
print(parsed)
self.assertEqual(parsed, expected_parsed)
def test_sample_file_sepatools(self):
expected_parsed = [
{
"amount": "-2.00",
"date": "2013-12-27",
"reference": "TEST BERWEISUNG MITTELS BLZUND KONTONUMMER - DTA",
"external_id": "2013122710583450000",
"payer": "Testkonto Nummer 2",
},
{
"amount": "-3.00",
"date": "2013-12-27",
"reference": "Test+berweisung mit BIC und IBAN SEPA IBAN: DE58740618130100033626 BIC: GENODEF1PFK",
"external_id": "2013122710583600000",
"iban": "DE58740618130100033626",
"payer": "Testkonto Nummer 2",
},
{
"amount": "1.00",
"date": "2013-12-27",
"reference": "R CKBUCHUNG",
"external_id": "2013122711085260000",
"payer": "Testkonto Nummer 2",
},
{
"amount": "-6.00",
"date": "2013-12-27",
"reference": "STZV-PmInf27122013-11:02-2",
"external_id": "2013122711513230000",
},
]
filename = "camt.053_sepatools.xml"
self._test_from_sample_file(filename, expected_parsed)
def test_sample_file_bundesbank(self):
expected_parsed = [
{
"amount": "100000.00",
"date": "2024-03-13",
"reference": "",
"external_id": "103600002791/0019200002",
},
{
"amount": "-25000.00",
"date": "2024-03-13",
"reference": "",
"external_id": "049000039704/0019000002",
},
{
"amount": "-20000.00",
"date": "2024-03-13",
"reference": "",
"external_id": "047200003598/0002000001",
"iban": "DE98200000000020002633",
},
{
"amount": "-15.00",
"date": "2024-03-13",
"reference": "",
"external_id": "047200003598/0002000001",
},
{
"amount": "145015.00",
"date": "2024-03-13",
"reference": "",
"external_id": "051500000059/0019000003",
},
{
"amount": "50000.00",
"date": "2024-03-13",
"reference": "VWZ pacs008 RTGS nach DOTA",
"external_id": "105600004525/0019200003",
},
{
"amount": "80000.00",
"date": "2024-03-13",
"reference": "VWZ pacs009 RTGS nach DOTA",
"external_id": "051800000156/0019000004",
},
{
"amount": "-30000.00",
"date": "2024-03-13",
"reference": "VWZ pacs009 DOTA nach MCA",
"external_id": "055100000086/0019000005",
},
{
"amount": "-120000.00",
"date": "2024-03-13",
"reference": "VWZ pacs009 DOTA nach RTGS",
"external_id": "001400001221/0019000006",
},
{
"amount": "100000.00",
"date": "2024-03-13",
"reference": "",
"external_id": "016900004681/0002000002",
"iban": "DE98200000000020002633",
},
{
"amount": "-280000.00",
"date": "2024-03-13",
"reference": "VWZ pacs008 DOTA nach RTGS",
"external_id": "010300005153/0019000007",
"iban": "DE00IBANbeiTestbank",
},
]
filename = "camt.053_bundesbank.xml"
self._test_from_sample_file(filename, expected_parsed)

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

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