mirror of
https://github.com/pretix/pretix.git
synced 2026-09-23 17:54:42 +00:00
Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
48356ea19e | ||
|
|
6fa91b37ab |
@@ -1,43 +0,0 @@
|
||||
name: SBOM
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ master, sbom ]
|
||||
tags: [ 'v.*' ]
|
||||
|
||||
permissions:
|
||||
contents: read # to fetch code (actions/checkout)
|
||||
|
||||
env:
|
||||
FORCE_COLOR: 1
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-22.04
|
||||
name: Submission
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: "3.13"
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v7
|
||||
with:
|
||||
node-version: '24.x'
|
||||
- uses: actions/cache@v4
|
||||
with:
|
||||
path: ~/.cache/pip
|
||||
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-pip-
|
||||
- name: Install system dependencies
|
||||
run: sudo apt update && sudo apt install -y gettext unzip
|
||||
- name: Install Python dependencies
|
||||
run: pip3 install -U "prisma-sbom-submit[python]"
|
||||
- name: Create SBOM
|
||||
run: NPM=$(which npm) prisma-sbom-submit collect . sbom.json
|
||||
- name: Submit SBOM
|
||||
run: prisma-sbom-submit upload --server https://prisma.pretix.com sbom.json
|
||||
env:
|
||||
PRISMA_UPLOAD_TOKEN: ${{ secrets.PRISMA_UPLOAD_TOKEN }}
|
||||
@@ -123,24 +123,7 @@ jobs:
|
||||
working-directory: ./src
|
||||
run: make all compress
|
||||
- name: Install Playwright browsers
|
||||
run: playwright install --with-deps
|
||||
run: playwright install
|
||||
- name: Run E2E tests
|
||||
working-directory: ./src
|
||||
run: PRETIX_CONFIG_FILE=tests/ci_postgres.cfg py.test tests/e2e/ -v --maxfail=10 --tracing=retain-on-failure
|
||||
- uses: actions/upload-artifact@v4
|
||||
if: ${{ !cancelled() }}
|
||||
with:
|
||||
name: playwright-traces
|
||||
path: test-results/
|
||||
- name: Log trace instructions
|
||||
if: steps.check-traces.outputs.found == 'true'
|
||||
run: |
|
||||
{
|
||||
echo "## 🎭 Playwright traces available"
|
||||
echo ""
|
||||
echo "Some tests failed or retried and produced traces."
|
||||
echo ""
|
||||
echo "1. Download the **playwright-traces-${{ github.run_id }}** artifact from this run (link in the **Summary** tab, under Artifacts)."
|
||||
echo "2. Unzip it."
|
||||
echo "3. Go to https://trace.playwright.dev and drag \`trace.zip\` into the page — or run \`npx playwright show-trace trace.zip\` locally."
|
||||
} >> "$GITHUB_STEP_SUMMARY"
|
||||
run: PRETIX_CONFIG_FILE=tests/ci_postgres.cfg py.test tests/e2e/ -v --maxfail=10
|
||||
|
||||
+1
-1
@@ -79,7 +79,7 @@ dependencies = [
|
||||
"phonenumberslite==9.0.*",
|
||||
"Pillow==12.3.*",
|
||||
"pretix-plugin-build",
|
||||
"protobuf==7.36.*",
|
||||
"protobuf==7.35.*",
|
||||
"psycopg2-binary",
|
||||
"pycountry",
|
||||
"pycparser==3.0",
|
||||
|
||||
@@ -899,7 +899,7 @@ class BaseQuestionsForm(forms.Form):
|
||||
field.widget.attrs['data-question-dependency-values'] = escapejson_attr(json.dumps(q.dependency_values))
|
||||
if q.type != 'M':
|
||||
field.widget.attrs['required'] = q.required and not self.all_optional
|
||||
field._required = q.required and not self.all_optional
|
||||
field._required = q.required and not self.all_optional
|
||||
field.required = False
|
||||
return field
|
||||
|
||||
@@ -1497,8 +1497,7 @@ class BaseInvoiceAddressForm(forms.ModelForm):
|
||||
pass # Skip re-validation if it is validated
|
||||
elif self.validate_vat_id and vat_id_applicable:
|
||||
try:
|
||||
requester_id = self.request.event.settings.invoice_address_from_vat_id
|
||||
normalized_id = validate_vat_id(data.get('vat_id'), str(data.get('country')), requester_id)
|
||||
normalized_id = validate_vat_id(data.get('vat_id'), str(data.get('country')))
|
||||
self.instance.vat_id_validated = bool(normalized_id)
|
||||
self.instance.vat_id = data['vat_id'] = normalized_id
|
||||
except VATIDFinalError as e:
|
||||
|
||||
@@ -626,14 +626,47 @@ class Order(LockModel, LoggedModel):
|
||||
self.save(update_fields=['last_modified'])
|
||||
|
||||
def set_expires(self, now_dt=None, subevents=None):
|
||||
from pretix.base.services.payment import compute_payment_deadline
|
||||
now_dt = now_dt or now()
|
||||
tz = ZoneInfo(self.event.settings.timezone)
|
||||
|
||||
self.expires = compute_payment_deadline(
|
||||
event=self.event,
|
||||
sales_channel=self.sales_channel,
|
||||
now_dt=now_dt,
|
||||
subevents=subevents,
|
||||
)
|
||||
sales_channel_suffix = "_" + self.sales_channel.identifier.replace(".", "_")
|
||||
if not (mode := self.event.settings.get(f'payment_term_mode{sales_channel_suffix}')):
|
||||
mode = self.event.settings.get('payment_term_mode')
|
||||
sales_channel_suffix = ""
|
||||
|
||||
if mode == 'days':
|
||||
exp_by_date = now_dt.astimezone(tz) + timedelta(days=self.event.settings.get(f'payment_term_days{sales_channel_suffix}', as_type=int))
|
||||
exp_by_date = exp_by_date.astimezone(tz).replace(hour=23, minute=59, second=59, microsecond=0)
|
||||
if self.event.settings.get('payment_term_weekdays'):
|
||||
if exp_by_date.weekday() == 5:
|
||||
exp_by_date += timedelta(days=2)
|
||||
elif exp_by_date.weekday() == 6:
|
||||
exp_by_date += timedelta(days=1)
|
||||
elif mode == 'minutes':
|
||||
exp_by_date = now_dt.astimezone(tz) + timedelta(minutes=self.event.settings.get(f'payment_term_minutes{sales_channel_suffix}', as_type=int))
|
||||
else:
|
||||
raise ValueError("'payment_term_mode' has an invalid value '{}'.".format(mode))
|
||||
|
||||
self.expires = exp_by_date
|
||||
|
||||
term_last = self.event.settings.get('payment_term_last', as_type=RelativeDateWrapper)
|
||||
if term_last:
|
||||
if self.event.has_subevents and subevents:
|
||||
terms = [
|
||||
term_last.datetime(se).date()
|
||||
for se in subevents
|
||||
]
|
||||
if not terms:
|
||||
return
|
||||
term_last = min(terms)
|
||||
else:
|
||||
term_last = term_last.datetime(self.event).date()
|
||||
term_last = make_aware(datetime.combine(
|
||||
term_last,
|
||||
time(hour=23, minute=59, second=59)
|
||||
), tz)
|
||||
if term_last < self.expires:
|
||||
self.expires = term_last
|
||||
|
||||
@cached_property
|
||||
def tax_total(self):
|
||||
|
||||
@@ -1605,7 +1605,6 @@ def add_payment_to_cart_session(cart_session, provider, min_value: Decimal=None,
|
||||
'max_value': str(max_value) if max_value is not None else None,
|
||||
'info_data': info_data or {},
|
||||
})
|
||||
cart_session['payments_postpone'] = False
|
||||
|
||||
|
||||
def add_payment_to_cart(request, provider, min_value: Decimal=None, max_value: Decimal=None, info_data: dict=None):
|
||||
|
||||
@@ -961,7 +961,7 @@ def _check_positions(event: Event, now_dt: datetime, time_machine_now_dt: dateti
|
||||
|
||||
|
||||
def _apply_rounding_and_fees(positions: List[CartPosition], payment_requests: List[dict], address: InvoiceAddress,
|
||||
meta_info: dict, event: Event, sales_channel: SalesChannel, require_approval=False):
|
||||
meta_info: dict, event: Event, require_approval=False):
|
||||
fees = []
|
||||
# Pre-rounding, pre-fee total is used for fee calculation
|
||||
total = sum([c.gross_price_before_rounding for c in positions])
|
||||
@@ -1021,14 +1021,7 @@ def _apply_rounding_and_fees(positions: List[CartPosition], payment_requests: Li
|
||||
payments_assigned += to_pay
|
||||
p['payment_amount'] = to_pay
|
||||
|
||||
allow_postponed_payment = (
|
||||
require_approval or
|
||||
(
|
||||
sales_channel.identifier in event.settings.payment_choice_postpone_allowed_channels and not payment_requests
|
||||
)
|
||||
)
|
||||
|
||||
if total != payments_assigned and not allow_postponed_payment:
|
||||
if total != payments_assigned and not require_approval:
|
||||
raise OrderError(_("The selected payment methods do not cover the total balance."))
|
||||
|
||||
return fees
|
||||
@@ -1050,15 +1043,7 @@ def _create_order(event: Event, *, email: str, positions: List[CartPosition], no
|
||||
|
||||
# Final calculation of fees, also performs final rounding
|
||||
try:
|
||||
fees = _apply_rounding_and_fees(
|
||||
positions,
|
||||
payment_requests,
|
||||
address,
|
||||
meta_info,
|
||||
event,
|
||||
sales_channel=sales_channel,
|
||||
require_approval=require_approval
|
||||
)
|
||||
fees = _apply_rounding_and_fees(positions, payment_requests, address, meta_info, event, require_approval=require_approval)
|
||||
except TaxRule.SaleNotAllowed:
|
||||
raise OrderError(error_messages['country_blocked'])
|
||||
|
||||
|
||||
@@ -1,76 +0,0 @@
|
||||
#
|
||||
# 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, time, timedelta
|
||||
from zoneinfo import ZoneInfo
|
||||
|
||||
from django.utils.timezone import make_aware, now
|
||||
|
||||
from pretix.base.models import Event, SalesChannel
|
||||
from pretix.base.reldate import RelativeDateWrapper
|
||||
|
||||
|
||||
def compute_payment_deadline(event: Event, sales_channel: SalesChannel, now_dt=None, subevents=None) -> datetime:
|
||||
now_dt = now_dt or now()
|
||||
tz = ZoneInfo(event.settings.timezone)
|
||||
|
||||
sales_channel_suffix = "_" + sales_channel.identifier.replace(".", "_")
|
||||
if not (mode := event.settings.get(f'payment_term_mode{sales_channel_suffix}')):
|
||||
mode = event.settings.get('payment_term_mode')
|
||||
sales_channel_suffix = ""
|
||||
|
||||
if mode == 'days':
|
||||
exp_by_date = now_dt.astimezone(tz) + timedelta(
|
||||
days=event.settings.get(f'payment_term_days{sales_channel_suffix}', as_type=int))
|
||||
exp_by_date = exp_by_date.astimezone(tz).replace(hour=23, minute=59, second=59, microsecond=0)
|
||||
if event.settings.get('payment_term_weekdays'):
|
||||
if exp_by_date.weekday() == 5:
|
||||
exp_by_date += timedelta(days=2)
|
||||
elif exp_by_date.weekday() == 6:
|
||||
exp_by_date += timedelta(days=1)
|
||||
elif mode == 'minutes':
|
||||
exp_by_date = now_dt.astimezone(tz) + timedelta(
|
||||
minutes=event.settings.get(f'payment_term_minutes{sales_channel_suffix}', as_type=int))
|
||||
else:
|
||||
raise ValueError("'payment_term_mode' has an invalid value '{}'.".format(mode))
|
||||
|
||||
expires = exp_by_date
|
||||
|
||||
term_last = event.settings.get('payment_term_last', as_type=RelativeDateWrapper)
|
||||
if term_last:
|
||||
if event.has_subevents and subevents:
|
||||
terms = [
|
||||
term_last.datetime(se).date()
|
||||
for se in subevents
|
||||
]
|
||||
if not terms:
|
||||
return expires
|
||||
term_last = min(terms)
|
||||
else:
|
||||
term_last = term_last.datetime(event).date()
|
||||
term_last = make_aware(datetime.combine(
|
||||
term_last,
|
||||
time(hour=23, minute=59, second=59)
|
||||
), tz)
|
||||
if term_last < expires:
|
||||
return term_last
|
||||
|
||||
return expires
|
||||
@@ -343,66 +343,6 @@ def _validate_vat_id_EU(vat_id, country_code):
|
||||
return vat_id
|
||||
|
||||
|
||||
def _validate_vat_id_EU_fallback_germany(vat_id, country_code, requester_id):
|
||||
# We can skip most static validation checks because _validate_vat_id_EU always runs before
|
||||
vat_id = normalize_vat_id(vat_id, country_code)
|
||||
|
||||
# The VIES service of the European commission is overused and down due to rate limits A LOT. There is another
|
||||
# API by German BZSt, but it only works if the requester is German and the requested is not.
|
||||
# https://www.bzst.de/DE/Unternehmen/Identifikationsnummern/Umsatzsteuer-Identifikationsnummer/AuslaendischeUSt-IdNr/auslaendische_ust_idnr_node.html
|
||||
try:
|
||||
r = requests.post(
|
||||
"https://api.evatr.vies.bzst.de/app/v1/abfrage",
|
||||
json={
|
||||
"anfragendeUstid": requester_id,
|
||||
"angefragteUstid": vat_id,
|
||||
},
|
||||
timeout=10,
|
||||
)
|
||||
d = r.json()
|
||||
if r.status_code == 200:
|
||||
if d['status'] in ('evatr-0000', 'evatr-2008'):
|
||||
# evatr-0000: Die angefragte Ust-IdNr. ist zum Anfragezeitpunkt gültig.
|
||||
# evatr-2008: Die angefragte Ust-IdNr. ist zum Anfragezeitpunkt gültig.
|
||||
# Für die qualifizierte Bestätigungsanfrage liegt einer Besonderheit vor.
|
||||
# Für Rückfragen wenden Sie sich an das BZSt.
|
||||
return vat_id
|
||||
# evatr-2002: Die angefragte USt-IdNr. ist zum Anfragezeitpunkt nicht gültig.
|
||||
# Sie ist erst gültig ab dem Datum im Feld gueltigAb.
|
||||
# evatr-2006: Die angefragte Ust-IdNr. ist zum Anfragezeitpunkt nicht gültig.
|
||||
# Sie war gültig im Zeitraum, der durch die Werte in den Feldern gueltigAb und gueltigBis beschrieben ist.
|
||||
raise VATIDFinalError(error_messages['invalid'])
|
||||
elif r.status_code == 400:
|
||||
if d['status'] in ('evatr-0002', 'evatr-0004', 'evatr-0008'):
|
||||
# evatr-0002: Mindestens eins der Pflichtfelder ist nicht besetzt.
|
||||
# evatr-0004: Die anfragende DE Ust-IdNr. ist syntaktisch falsch. Sie passt nicht in das deutsche Erzeugungsschema.
|
||||
# evatr-0008: Die maximale Anzahl von qualifizierten Bestätigungsabfragen für diese Session wurde erreicht.
|
||||
# Bitte starten Sie erneut mit einer einfachen Bestätigungsabfrage.
|
||||
raise VATIDTemporaryError(error_messages['unavailable'])
|
||||
# evatr-0005: Die angegebene angefragte Ust-IdNr. ist syntaktisch falsch.
|
||||
# evatr-0012: Die angefrage USt-IdNr. ist syntaktisch falsch. Sie passt nicht in das Erzeugungsschema.
|
||||
# evatr-2003: Das angegebene Länderkennzeichen der angefragten USt-IdNr. ist nicht gültig.
|
||||
raise VATIDFinalError(error_messages['invalid'])
|
||||
elif r.status_code == 403:
|
||||
# evatr-0006: Die anfragende DE USt-IdNr. ist nicht berechtigt eine DE Ust-IdNr. anzufragen.
|
||||
# evatr-0007: Fehlerhafter Aufruf.
|
||||
raise VATIDTemporaryError(error_messages['unavailable'])
|
||||
elif r.status_code == 404:
|
||||
if d['status'] in ('evatr-2005'):
|
||||
# evatr-2005: Die angegebene eigene DE Ust-IdNr. ist zum Anfragezeitpunkt nicht gültig.
|
||||
raise VATIDTemporaryError(error_messages['unavailable'])
|
||||
# evatr-2001: Die angefragte USt-IdNr. ist zum Anfragezeitpunkt nicht vergeben.
|
||||
raise VATIDFinalError(error_messages['invalid'])
|
||||
else: # 500, 503
|
||||
raise VATIDTemporaryError(error_messages['unavailable'])
|
||||
except requests.RequestException:
|
||||
logger.exception('VAT ID checking failed for country {}'.format(country_code))
|
||||
raise VATIDTemporaryError(error_messages['unavailable'])
|
||||
except ValueError: # JSON parsing failed
|
||||
logger.exception('VAT ID checking failed for country {}'.format(country_code))
|
||||
raise VATIDTemporaryError(error_messages['unavailable'])
|
||||
|
||||
|
||||
def _validate_vat_id_CH(vat_id, country_code):
|
||||
if vat_id[:3] != 'CHE':
|
||||
raise VATIDFinalError(error_messages['country_mismatch'])
|
||||
@@ -454,18 +394,12 @@ def _validate_vat_id_CH(vat_id, country_code):
|
||||
return vat_id
|
||||
|
||||
|
||||
def validate_vat_id(vat_id, country_code, requester_id=None):
|
||||
def validate_vat_id(vat_id, country_code):
|
||||
if not vat_id:
|
||||
return vat_id
|
||||
country_code = str(country_code)
|
||||
if is_eu_country(country_code):
|
||||
try:
|
||||
return _validate_vat_id_EU(vat_id, country_code)
|
||||
except VATIDTemporaryError:
|
||||
if requester_id and requester_id.startswith("DE") and not vat_id.startswith("DE"):
|
||||
return _validate_vat_id_EU_fallback_germany(vat_id, country_code, requester_id)
|
||||
else:
|
||||
raise
|
||||
return _validate_vat_id_EU(vat_id, country_code)
|
||||
elif country_code == 'CH':
|
||||
return _validate_vat_id_CH(vat_id, country_code)
|
||||
elif country_code == 'NO':
|
||||
|
||||
@@ -1159,19 +1159,6 @@ DEFAULTS = {
|
||||
"configured above."),
|
||||
)
|
||||
},
|
||||
'payment_choice_postpone_allowed_channels': {
|
||||
'default': [],
|
||||
'type': list,
|
||||
'form_class': forms.MultipleChoiceField,
|
||||
'form_kwargs': dict(
|
||||
label=_('Allow postponed payment choice for sales channels'),
|
||||
help_text=_("If postponed payment is allowed on a sales channel, customers can complete their order without "
|
||||
"selecting a payment method. This is useful whenever orders are not created by the same "
|
||||
"person who is making the payment."),
|
||||
widget=forms.CheckboxSelectMultiple,
|
||||
choices=[],
|
||||
)
|
||||
},
|
||||
'presale_start_show_date': {
|
||||
'default': 'True',
|
||||
'type': bool,
|
||||
@@ -1943,6 +1930,8 @@ DEFAULTS = {
|
||||
'serializer_class': serializers.BooleanField,
|
||||
'form_kwargs': dict(
|
||||
label=_("Hide all unavailable dates from calendar or list views"),
|
||||
help_text=_("This option currently only affects the calendar of this event series, not the organizer-wide "
|
||||
"calendar.")
|
||||
)
|
||||
},
|
||||
'event_calendar_future_only': {
|
||||
|
||||
@@ -135,8 +135,6 @@ class BaseQuestionsViewMixin:
|
||||
question_field.initial = getattr(question_field, 'initial', None) or src['initial']
|
||||
if 'validators' in src:
|
||||
question_field.validators += src['validators']
|
||||
if 'label' in src:
|
||||
question_field.label = src['label']
|
||||
|
||||
if len(form.fields) > 0:
|
||||
formlist.append(form)
|
||||
|
||||
@@ -855,21 +855,14 @@ class PaymentSettingsForm(EventSettingsValidationMixin, SettingsForm):
|
||||
'payment_term_accept_late',
|
||||
'payment_pending_hidden',
|
||||
'payment_explanation',
|
||||
'payment_choice_postpone_allowed_channels',
|
||||
'tax_rule_payment',
|
||||
]
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
channels = list(self.obj.organizer.sales_channels.all())
|
||||
self.fields['payment_choice_postpone_allowed_channels'].choices = [
|
||||
(c.identifier, c.label) for c in channels
|
||||
if c.type_instance.payment_restrictions_supported
|
||||
]
|
||||
|
||||
self.term_channel_fields = {}
|
||||
for c in channels:
|
||||
for c in self.obj.organizer.sales_channels.all():
|
||||
if c.type_instance.payment_restrictions_supported and c.identifier != "web":
|
||||
# At the moment, it seems sufficient to allow this for the same channel types as other payment settings
|
||||
# We can always introduce more flags later if needed
|
||||
|
||||
@@ -109,7 +109,6 @@
|
||||
{% bootstrap_form_errors form layout="control" %}
|
||||
{% bootstrap_field form.tax_rule_payment layout="control" %}
|
||||
{% bootstrap_field form.payment_explanation layout="control" %}
|
||||
{% bootstrap_field form.payment_choice_postpone_allowed_channels layout="control" %}
|
||||
</fieldset>
|
||||
</div>
|
||||
{% if "event.settings.payment:write" in request.eventpermset %}
|
||||
|
||||
@@ -1646,8 +1646,7 @@ class OrderCheckVATID(OrderView):
|
||||
return redirect(self.get_order_url())
|
||||
|
||||
try:
|
||||
requester_id = self.request.event.settings.invoice_address_from_vat_id
|
||||
normalized_id = validate_vat_id(ia.vat_id, str(ia.country), requester_id)
|
||||
normalized_id = validate_vat_id(ia.vat_id, str(ia.country))
|
||||
with transaction.atomic():
|
||||
ia.vat_id_validated = True
|
||||
ia.vat_id = normalized_id
|
||||
|
||||
@@ -5,10 +5,10 @@ msgstr ""
|
||||
"Project-Id-Version: 1\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-08-24 15:35+0000\n"
|
||||
"PO-Revision-Date: 2026-08-25 00:00+0000\n"
|
||||
"PO-Revision-Date: 2026-08-24 15:31+0000\n"
|
||||
"Last-Translator: Raphael Michel <michel@rami.io>\n"
|
||||
"Language-Team: German <https://translate.pretix.eu/projects/pretix/pretix/"
|
||||
"de/>\n"
|
||||
"Language-Team: German <https://translate.pretix.eu/projects/pretix/pretix/de/"
|
||||
">\n"
|
||||
"Language: de\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -31805,6 +31805,13 @@ msgid "Allow further payments during compliance hold"
|
||||
msgstr "Erlaube weitere Zahlungsversuche während PayPal eine Zahlung überprüft"
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "PayPals fraud prevention might block processing of individual payments "
|
||||
#| "for a considerable amount of time. The payment is marked as \"pending\" "
|
||||
#| "during this time window. You can allow your customers to start another "
|
||||
#| "payment attempts during that window. This might result in them being "
|
||||
#| "charged twice if theoriginal payment is approved."
|
||||
msgid ""
|
||||
"PayPals fraud prevention might block processing of individual payments for a "
|
||||
"considerable amount of time. The payment is marked as \"pending\" during "
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Project-Id-Version: 1\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-08-24 15:35+0000\n"
|
||||
"PO-Revision-Date: 2026-08-25 00:00+0000\n"
|
||||
"PO-Revision-Date: 2026-08-24 15:31+0000\n"
|
||||
"Last-Translator: Raphael Michel <michel@rami.io>\n"
|
||||
"Language-Team: German (informal) <https://translate.pretix.eu/projects/"
|
||||
"pretix/pretix/de_Informal/>\n"
|
||||
@@ -31761,6 +31761,13 @@ msgid "Allow further payments during compliance hold"
|
||||
msgstr "Erlaube weitere Zahlungsversuche während PayPal eine Zahlung überprüft"
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "PayPals fraud prevention might block processing of individual payments "
|
||||
#| "for a considerable amount of time. The payment is marked as \"pending\" "
|
||||
#| "during this time window. You can allow your customers to start another "
|
||||
#| "payment attempts during that window. This might result in them being "
|
||||
#| "charged twice if theoriginal payment is approved."
|
||||
msgid ""
|
||||
"PayPals fraud prevention might block processing of individual payments for a "
|
||||
"considerable amount of time. The payment is marked as \"pending\" during "
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-08-24 15:35+0000\n"
|
||||
"PO-Revision-Date: 2026-08-25 00:00+0000\n"
|
||||
"PO-Revision-Date: 2026-07-08 16:00+0000\n"
|
||||
"Last-Translator: CVZ-es <damien.bremont@casadevelazquez.org>\n"
|
||||
"Language-Team: Spanish <https://translate.pretix.eu/projects/pretix/pretix/"
|
||||
"es/>\n"
|
||||
@@ -17,7 +17,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 2026.8.1\n"
|
||||
"X-Generator: Weblate 2026.6.1\n"
|
||||
|
||||
#: pretix/_base_settings.py
|
||||
msgid "English"
|
||||
@@ -93,7 +93,7 @@ msgstr "Hebreo"
|
||||
|
||||
#: pretix/_base_settings.py
|
||||
msgid "Hungarian"
|
||||
msgstr "Húngaro"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/_base_settings.py
|
||||
msgid "Indonesian"
|
||||
@@ -439,8 +439,10 @@ msgid "You cannot exchange a medium for a medium."
|
||||
msgstr "No se puede cambiar un medio por otro."
|
||||
|
||||
#: pretix/api/views/checkin.py
|
||||
#, fuzzy
|
||||
#| msgid "Product does not support medium exchange."
|
||||
msgid "You cannot simulate a medium exchange."
|
||||
msgstr "No se puede simular un intercambio de medio."
|
||||
msgstr "Este producto no admite el cambio de medio."
|
||||
|
||||
#: pretix/api/views/oauth.py pretix/control/logdisplay.py
|
||||
#, python-brace-format
|
||||
@@ -1399,8 +1401,10 @@ msgid "Membership type"
|
||||
msgstr "Tipo de suscripción"
|
||||
|
||||
#: pretix/base/exporters/customers.py
|
||||
#, fuzzy
|
||||
#| msgid "Purchase time"
|
||||
msgid "Purchase ticket"
|
||||
msgstr "Comprar entrada"
|
||||
msgstr "Hora de compra"
|
||||
|
||||
#: pretix/base/exporters/customers.py pretix/base/exporters/orderlist.py
|
||||
#: pretix/base/exporters/waitinglist.py pretix/base/forms/questions.py
|
||||
@@ -1417,6 +1421,8 @@ msgid "Start date"
|
||||
msgstr "Fecha de inicio"
|
||||
|
||||
#: pretix/base/exporters/customers.py
|
||||
#, fuzzy
|
||||
#| msgid "Start time from"
|
||||
msgid "Start time"
|
||||
msgstr "Hora de inicio"
|
||||
|
||||
@@ -1431,8 +1437,10 @@ msgid "End date"
|
||||
msgstr "Fecha final"
|
||||
|
||||
#: pretix/base/exporters/customers.py
|
||||
#, fuzzy
|
||||
#| msgid "End: %(time)s"
|
||||
msgid "End time"
|
||||
msgstr "Hora de finalización"
|
||||
msgstr "Fin: %(time)s"
|
||||
|
||||
#: pretix/base/exporters/dekodi.py pretix/base/exporters/invoices.py
|
||||
msgctxt "export_category"
|
||||
@@ -4679,13 +4687,16 @@ msgid "This event is remote or partially remote."
|
||||
msgstr "Este evento es remoto o parcialmente remoto."
|
||||
|
||||
#: pretix/base/models/event.py
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "This will be used to let users know if the event is in a different "
|
||||
#| "timezone and let’s us calculate users’ local times."
|
||||
msgid ""
|
||||
"This will be used to let users know if the event is in a different timezone, "
|
||||
"and to let us calculate the local time of a user."
|
||||
msgstr ""
|
||||
"Esto servirá para informar a los usuarios de si el evento se celebra en una "
|
||||
"zona horaria diferente y para que podamos calcular la hora local de cada "
|
||||
"usuario."
|
||||
"Esto se utilizará para que los usuarios sepan si el evento se celebra en una "
|
||||
"zona horaria diferente y nos permite calcular la hora local de los usuarios."
|
||||
|
||||
#: pretix/base/models/event.py pretix/base/models/organizer.py
|
||||
#: pretix/control/navigation.py
|
||||
@@ -5812,7 +5823,7 @@ msgstr "Código de país (ISO 3166-1 alfa-2)"
|
||||
|
||||
#: pretix/base/models/items.py
|
||||
msgid "Asked on"
|
||||
msgstr "Preguntado el"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/models/items.py pretix/base/models/organizer.py
|
||||
msgid ""
|
||||
@@ -7512,6 +7523,9 @@ msgid "The payment for this invoice has already been received."
|
||||
msgstr "El pago de esta factura ya se ha recibido."
|
||||
|
||||
#: pretix/base/payment.py
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "This payment is already being processed and can not be canceled any more."
|
||||
msgid ""
|
||||
"This payment is already being processed and cannot be canceled any more."
|
||||
msgstr "Este pago ya se está procesando y ya no se puede cancelar."
|
||||
@@ -7638,12 +7652,15 @@ msgid "This gift card was used in the meantime. Please try again."
|
||||
msgstr "Mientras tanto, esta tarjeta de regalo se utilizó. Inténtalo de nuevo."
|
||||
|
||||
#: pretix/base/payment.py
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "This payment provider does not exist or the respective plugin is disabled."
|
||||
msgid ""
|
||||
"This payment provider exists for historical purposes only and is no longer "
|
||||
"usable."
|
||||
msgstr ""
|
||||
"Este proveedor de pagos se mantiene únicamente con fines históricos y ya no "
|
||||
"se puede utilizar."
|
||||
"Este proveedor de pago no existe o el plugin correspondiente está "
|
||||
"desactivado."
|
||||
|
||||
#: pretix/base/pdf.py
|
||||
msgid "Ticket code (barcode content)"
|
||||
@@ -8285,12 +8302,16 @@ msgid "Presale end"
|
||||
msgstr "Fin de la preventa"
|
||||
|
||||
#: pretix/base/reldate.py
|
||||
#, fuzzy
|
||||
#| msgid "Order email"
|
||||
msgid "Order creation"
|
||||
msgstr "Creación de pedidos"
|
||||
msgstr "Correo electrónico del pedido"
|
||||
|
||||
#: pretix/base/reldate.py
|
||||
#, fuzzy
|
||||
#| msgid "Order expired"
|
||||
msgid "Order expiry"
|
||||
msgstr "Caducidad del pedido"
|
||||
msgstr "Pedido caducado"
|
||||
|
||||
#: pretix/base/reldate.py
|
||||
msgid "before"
|
||||
@@ -8319,22 +8340,22 @@ msgstr "No fijado"
|
||||
#: pretix/base/reldate.py
|
||||
#, python-brace-format
|
||||
msgid "A relative date cannot be expressed as \"before\" for \"{}\""
|
||||
msgstr "Una fecha relativa no puede expresarse como «antes de» para «{}»"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/reldate.py
|
||||
#, python-brace-format
|
||||
msgid "A relative date cannot be expressed as \"after\" for \"{}\""
|
||||
msgstr "Una fecha relativa no puede expresarse como «después de» para «{}»"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/reldate.py
|
||||
#, python-brace-format
|
||||
msgid "A relative time cannot be expressed as \"before\" for \"{}\""
|
||||
msgstr "Un tiempo relativo no puede expresarse como «antes de» para «{}»"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/reldate.py
|
||||
#, python-brace-format
|
||||
msgid "A relative time cannot be expressed as \"after\" for \"{}\""
|
||||
msgstr "Un tiempo relativo no puede expresarse como «después de» para «{}»"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/secrets.py
|
||||
msgid "Random (default, works with all pretix apps)"
|
||||
@@ -9576,12 +9597,16 @@ msgstr ""
|
||||
"una tarjeta regalo."
|
||||
|
||||
#: pretix/base/services/orders.py
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "You cannot change the price of a position that has been used to issue a "
|
||||
#| "gift card."
|
||||
msgid ""
|
||||
"You cannot change the ticket secret of a position that has been used to "
|
||||
"issue a gift card."
|
||||
msgstr ""
|
||||
"No se puede modificar el código secreto de un ticket correspondiente a una "
|
||||
"posición que se haya utilizado para emitir una tarjeta regalo."
|
||||
"No se puede cambiar el precio de una posición que se ha usado para entregar "
|
||||
"una tarjeta regalo."
|
||||
|
||||
#: pretix/base/services/orders.py
|
||||
#, python-brace-format
|
||||
@@ -10360,12 +10385,12 @@ msgstr ""
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid "No dates match your criteria."
|
||||
msgstr "No hay fechas que se ajusten a tus criterios."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgctxt "subevents"
|
||||
msgid "Text for empty date results"
|
||||
msgstr "Texto para los resultados con fechas vacías"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgctxt "subevents"
|
||||
@@ -10376,11 +10401,6 @@ msgid ""
|
||||
"touch with you to arrange further dates. We do not recommend more than one "
|
||||
"or two sentences."
|
||||
msgstr ""
|
||||
"Este texto aparecerá si el calendario o la lista de fechas están vacíos, por "
|
||||
"ejemplo, porque un mes no contiene ninguna fecha o porque el filtro "
|
||||
"seleccionado por el usuario no arroja ningún resultado. Puedes aprovecharlo "
|
||||
"para indicar cómo ponerse en contacto contigo para concertar otras citas. No "
|
||||
"recomendamos que superen una o dos frases."
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid "Guidance text"
|
||||
@@ -14340,20 +14360,28 @@ msgstr ""
|
||||
"año en el que se emite la tarjeta de regalo."
|
||||
|
||||
#: pretix/control/forms/event.py
|
||||
#, fuzzy
|
||||
#| msgid "Payment date"
|
||||
msgid "Payment term"
|
||||
msgstr "Condiciones de pago"
|
||||
msgstr "Fecha de pago"
|
||||
|
||||
#: pretix/control/forms/event.py
|
||||
#, fuzzy
|
||||
#| msgid "(Same as above)"
|
||||
msgid "same as above"
|
||||
msgstr "igual que arriba"
|
||||
msgstr "(Lo mismo que arriba)"
|
||||
|
||||
#: pretix/control/forms/event.py
|
||||
#, fuzzy
|
||||
#| msgid "Payment term in days"
|
||||
msgid "different payment term in days"
|
||||
msgstr "plazo de pago diferente en días"
|
||||
msgstr "Plazo de pago en días"
|
||||
|
||||
#: pretix/control/forms/event.py
|
||||
#, fuzzy
|
||||
#| msgid "Payment term in minutes"
|
||||
msgid "different payment term in minutes"
|
||||
msgstr "plazo de pago diferente en minutos"
|
||||
msgstr "Plazo de pago en minutos"
|
||||
|
||||
#: pretix/control/forms/event.py
|
||||
msgid "Prices including tax"
|
||||
@@ -15108,7 +15136,7 @@ msgstr "Fecha final"
|
||||
|
||||
#: pretix/control/forms/filter.py
|
||||
msgid "Start time from"
|
||||
msgstr "Hora de inicio a partir de"
|
||||
msgstr "Hora de inicio"
|
||||
|
||||
#: pretix/control/forms/filter.py
|
||||
msgid "Start time until"
|
||||
@@ -15368,8 +15396,10 @@ msgid "Source"
|
||||
msgstr "Fuente"
|
||||
|
||||
#: pretix/control/forms/filter.py
|
||||
#, fuzzy
|
||||
#| msgid "All vouchers"
|
||||
msgid "All sources"
|
||||
msgstr "Todas las fuentes"
|
||||
msgstr "Todos los vales de compra"
|
||||
|
||||
#: pretix/control/forms/filter.py
|
||||
msgid "Team actions"
|
||||
@@ -15380,12 +15410,16 @@ msgid "Customer actions"
|
||||
msgstr "Acciones de los clientes"
|
||||
|
||||
#: pretix/control/forms/filter.py
|
||||
#, fuzzy
|
||||
#| msgid "Device status"
|
||||
msgid "Device actions"
|
||||
msgstr "Acciones del dispositivo"
|
||||
msgstr "Estado de los dispositivos"
|
||||
|
||||
#: pretix/control/forms/filter.py
|
||||
#, fuzzy
|
||||
#| msgid "Order email"
|
||||
msgid "User email"
|
||||
msgstr "Correo electrónico del usuario"
|
||||
msgstr "Correo electrónico del pedido"
|
||||
|
||||
#: pretix/control/forms/filter.py pretix/control/navigation.py
|
||||
msgid "All users"
|
||||
@@ -16907,33 +16941,40 @@ msgid ""
|
||||
"because at least one of the selected vouchers has already been redeemed "
|
||||
"%(max_redeemed)s times."
|
||||
msgstr ""
|
||||
"No puedes reducir el número máximo de canjes a %(max_usages)s, ya que al "
|
||||
"menos uno de los vales seleccionados ya se ha canjeado %(max_redeemed)s "
|
||||
"veces."
|
||||
|
||||
#: pretix/control/forms/vouchers.py
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "You cannot create a voucher that blocks quota as the selected product or "
|
||||
#| "quota is currently sold out or completely reserved."
|
||||
msgid ""
|
||||
"You cannot create a voucher that allows selection of a quota but has no date "
|
||||
"selected."
|
||||
msgstr ""
|
||||
"No se puede crear un comprobante que permita seleccionar una cuota pero en "
|
||||
"el que no se haya seleccionado ninguna fecha."
|
||||
"No se puede crear un vale de compra que bloquee la cuota ya que el producto "
|
||||
"seleccionado o la cuota está agotada o completamente reservada."
|
||||
|
||||
#: pretix/control/forms/vouchers.py
|
||||
#, fuzzy
|
||||
#| msgid "The selected product does not allow to select a seat."
|
||||
msgid "The selected quota does not match the selected subevent."
|
||||
msgstr "La cuota seleccionada no coincide con el subevento seleccionado."
|
||||
msgstr "El producto seleccionado no permite seleccionar una butaca."
|
||||
|
||||
#: pretix/control/forms/vouchers.py
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "There is not enough quota available on quota \"{}\" to perform the "
|
||||
#| "operation."
|
||||
msgid "There is no sufficient quota available to perform this change."
|
||||
msgstr "No hay cuota suficiente disponible para realizar este cambio."
|
||||
msgstr ""
|
||||
"No hay suficiente cuota disponible en la cuota \"{}\" para realizar esta "
|
||||
"operación."
|
||||
|
||||
#: pretix/control/forms/vouchers.py
|
||||
msgid ""
|
||||
"Changing the maximum number of usages in bulk is not supported if any of the "
|
||||
"selected vouchers is assigned a seat."
|
||||
msgstr ""
|
||||
"No es posible modificar de forma masiva el número máximo de usos si a alguno "
|
||||
"de los vales seleccionados se le ha asignado una plaza."
|
||||
|
||||
#: pretix/control/forms/vouchers.py
|
||||
msgctxt "subevent"
|
||||
@@ -16941,24 +16982,18 @@ msgid ""
|
||||
"Changing the date in bulk is not supported if any of the selected vouchers "
|
||||
"is assigned a seat."
|
||||
msgstr ""
|
||||
"No es posible modificar la fecha de forma masiva si a alguno de los "
|
||||
"comprobantes seleccionados se le ha asignado una plaza."
|
||||
|
||||
#: pretix/control/forms/vouchers.py
|
||||
msgid ""
|
||||
"Changing the product to a quota is not supported if any of the selected "
|
||||
"vouchers is assigned a seat."
|
||||
msgstr ""
|
||||
"No es posible cambiar el producto a una cuota si a alguno de los vales "
|
||||
"seleccionados se le ha asignado una plaza."
|
||||
|
||||
#: pretix/control/forms/vouchers.py
|
||||
msgid ""
|
||||
"This change cannot be completed because not all assigned seats of the "
|
||||
"vouchers are still available"
|
||||
msgstr ""
|
||||
"No es posible completar este cambio porque no todos los asientos asignados "
|
||||
"de los vales siguen estando disponibles"
|
||||
|
||||
#: pretix/control/forms/vouchers.py
|
||||
msgid "Codes"
|
||||
@@ -20413,24 +20448,34 @@ msgstr ""
|
||||
"¡Genial!"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
|
||||
#, fuzzy
|
||||
#| msgid "Your new SPF record could look like this:"
|
||||
msgid "Your new DKIM record should be set up as a CNAME record like this:"
|
||||
msgstr ""
|
||||
"El nuevo registro DKIM debe configurarse como un registro CNAME de la "
|
||||
"siguiente manera:"
|
||||
msgstr "El nuevo registro SPF podría tener el siguiente aspecto:"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "We found an SPF record on your domain that includes this system. Great!"
|
||||
msgid "We found a DKIM record on your domain for this system. Great!"
|
||||
msgstr ""
|
||||
"Hemos encontrado un registro DKIM en tu dominio para este sistema. ¡Genial!"
|
||||
"Hemos encontrado un registro SPF en su dominio que incluye este sistema. "
|
||||
"¡Genial!"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
|
||||
#, fuzzy
|
||||
#| msgid "Your new SPF record could look like this:"
|
||||
msgid "Your new DMARC record could look like this:"
|
||||
msgstr "El nuevo registro DMARC podría tener este aspecto:"
|
||||
msgstr "El nuevo registro SPF podría tener el siguiente aspecto:"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "We found an SPF record on your domain that includes this system. Great!"
|
||||
msgid "We found a DMARC record on your domain for this system. Great!"
|
||||
msgstr ""
|
||||
"Hemos encontrado un registro DMARC en tu dominio para este sistema. ¡Genial!"
|
||||
"Hemos encontrado un registro SPF en su dominio que incluye este sistema. "
|
||||
"¡Genial!"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
|
||||
msgid "Verification"
|
||||
@@ -22141,8 +22186,10 @@ msgid "The quick brown fox jumps over the lazy dog."
|
||||
msgstr "El veloz zorro marrón salta sobre el perro perezoso."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/fragment_log_filter_form.html
|
||||
#, fuzzy
|
||||
#| msgid "Specific seat"
|
||||
msgid "Specific object selected"
|
||||
msgstr "Se ha seleccionado un objeto concreto"
|
||||
msgstr "Butaca especifica"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/fragment_quota_box.html
|
||||
#: pretix/control/templates/pretixcontrol/fragment_quota_box_paid.html
|
||||
@@ -23215,24 +23262,28 @@ msgstr ""
|
||||
"sus usuarios acerca de las necesidades dietéticas."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/items/questions.html
|
||||
#, fuzzy
|
||||
#| msgid "Create a new question"
|
||||
msgid "Create a new per-ticket question"
|
||||
msgstr "Crear una nueva pregunta por ticket"
|
||||
msgstr "Crear una nueva pregunta"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/items/questions.html
|
||||
#, fuzzy
|
||||
#| msgid "Create a new question"
|
||||
msgid "Create a new order-level question"
|
||||
msgstr "Crear una nueva pregunta a nivel de pedido"
|
||||
msgstr "Crear una nueva pregunta"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/items/questions.html
|
||||
#, fuzzy
|
||||
#| msgid "Delete question"
|
||||
msgid "Per-ticket questions"
|
||||
msgstr "Preguntas por entrada"
|
||||
msgstr "Borrar pregunta"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/items/questions.html
|
||||
msgid ""
|
||||
"These questions are asked for every ticket, so possibly multiple times in "
|
||||
"the same order."
|
||||
msgstr ""
|
||||
"Estas preguntas se formulan para cada entrada, por lo que es posible que se "
|
||||
"repitan varias veces en el mismo pedido."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/items/questions.html
|
||||
msgid "Create a new question"
|
||||
@@ -23251,28 +23302,28 @@ msgid "All personalized products"
|
||||
msgstr "Todos los productos personalizados"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/items/questions.html
|
||||
#, fuzzy
|
||||
#| msgid "Include questions"
|
||||
msgid "Per-order questions"
|
||||
msgstr "Preguntas por pedido"
|
||||
msgstr "Incluir preguntas"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/items/questions.html
|
||||
msgid ""
|
||||
"This functionality is in active development and expected to change "
|
||||
"significantly over the coming months."
|
||||
msgstr ""
|
||||
"Esta funcionalidad se encuentra en fase de desarrollo activo y se prevé que "
|
||||
"sufra cambios significativos en los próximos meses."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/items/questions.html
|
||||
msgid ""
|
||||
"Per-order questions are currently not supported and will not be displayed in "
|
||||
"pretixPOS."
|
||||
msgstr ""
|
||||
"Actualmente no se admiten las preguntas por pedido y no se mostrarán en "
|
||||
"pretixPOS."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/items/questions.html
|
||||
#, fuzzy
|
||||
#| msgid "The question has been reordered."
|
||||
msgid "These questions are asked once per order."
|
||||
msgstr "Estas preguntas se formulan una vez por pedido."
|
||||
msgstr "La pregunta ha sido reordenada."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/items/quota.html
|
||||
#: pretix/control/templates/pretixcontrol/items/quota_edit.html
|
||||
@@ -23804,8 +23855,6 @@ msgid ""
|
||||
"Ticket secrets of order positions that have been used to issue a gift card "
|
||||
"can not be changed. Only the link will be changed in this case."
|
||||
msgstr ""
|
||||
"Los datos de los pedidos que se han utilizado para emitir una tarjeta regalo "
|
||||
"no se pueden modificar. En este caso, solo se modificará el enlace."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/order/change.html
|
||||
msgid ""
|
||||
@@ -23881,8 +23930,10 @@ msgstr "(opcional)"
|
||||
#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html
|
||||
#: pretix/presale/templates/pretixpresale/event/checkout_questions.html
|
||||
#: pretix/presale/templates/pretixpresale/event/order_modify.html
|
||||
#, fuzzy
|
||||
#| msgid "Additional information"
|
||||
msgid "Additional order information"
|
||||
msgstr "Información adicional sobre el pedido"
|
||||
msgstr "Información adicional"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/order/delete.html
|
||||
msgid "Delete order"
|
||||
@@ -25584,13 +25635,14 @@ msgid "Hardware model"
|
||||
msgstr "Modelo del Hardware"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/organizers/devices.html
|
||||
#, python-format
|
||||
#, fuzzy, python-format
|
||||
#| msgid "Begin: %(time)s"
|
||||
msgid "Last seen: %(time)s"
|
||||
msgstr "Última conexión: %(time)s"
|
||||
msgstr "Inicio: %(time)s"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/organizers/devices.html
|
||||
msgid "No recent contact"
|
||||
msgstr "No ha habido contacto reciente"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/organizers/devices.html
|
||||
msgid "Not yet initialized"
|
||||
@@ -27939,8 +27991,10 @@ msgstr ""
|
||||
"producto!"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/vouchers/bulk_edit.html
|
||||
#, fuzzy
|
||||
#| msgid "Create multiple vouchers"
|
||||
msgid "Change multiple vouchers"
|
||||
msgstr "Modificar varios vales"
|
||||
msgstr "Crear múltiples vales de compra"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/vouchers/delete.html
|
||||
#: pretix/control/templates/pretixcontrol/vouchers/detail.html
|
||||
@@ -28351,9 +28405,6 @@ msgid ""
|
||||
"team. If you want to add a different user or create a new account, log out "
|
||||
"and click the invitation link again."
|
||||
msgstr ""
|
||||
"No puedes aceptar la invitación para «{}», ya que ya formas parte de este "
|
||||
"equipo. Si quieres añadir a otro usuario o crear una nueva cuenta, cierra la "
|
||||
"sesión y vuelve a hacer clic en el enlace de invitación."
|
||||
|
||||
#: pretix/control/views/auth.py
|
||||
#, python-brace-format
|
||||
@@ -29037,6 +29088,13 @@ msgstr ""
|
||||
"SPF."
|
||||
|
||||
#: pretix/control/views/mailsetup.py
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "We could not find an SPF record set for the domain you are trying to use. "
|
||||
#| "This means that there is a very high change most of the emails will be "
|
||||
#| "rejected or marked as spam. We strongly recommend setting an SPF record "
|
||||
#| "on the domain. You can do so through the DNS settings at the provider you "
|
||||
#| "registered your domain with."
|
||||
msgid ""
|
||||
"We could not find a CNAME record pointing to our DKIM key for domain you are "
|
||||
"trying to use. This means that there is a very high change most of the "
|
||||
@@ -29044,35 +29102,53 @@ msgid ""
|
||||
"DKIM through a CNAME record. You can do so through the DNS settings at the "
|
||||
"provider you registered your domain with."
|
||||
msgstr ""
|
||||
"No hemos podido encontrar un registro CNAME que apunte a nuestra clave DKIM "
|
||||
"para el dominio que estás intentando utilizar. Esto significa que hay una "
|
||||
"probabilidad muy alta de que la mayoría de los correos electrónicos sean "
|
||||
"rechazados o marcados como spam. Te recomendamos encarecidamente que "
|
||||
"configures DKIM mediante un registro CNAME. Puedes hacerlo a través de la "
|
||||
"configuración de DNS del proveedor con el que registraste tu dominio."
|
||||
"No se pudo encontrar un registro SPF configurado para el dominio que está "
|
||||
"intentando usar. Esto significa que existe una alta probabilidad de que la "
|
||||
"mayoría de los correos electrónicos sean rechazados o marcados como spam. "
|
||||
"Recomendamos encarecidamente configurar un registro SPF en el dominio. Puede "
|
||||
"hacerlo a través de la configuración de DNS en el proveedor con el que "
|
||||
"registró su dominio."
|
||||
|
||||
#: pretix/control/views/mailsetup.py
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "We found an SPF record set for the domain you are trying to use, but it "
|
||||
#| "does not include this system's email server. This means that there is a "
|
||||
#| "very high chance most of the emails will be rejected or marked as spam. "
|
||||
#| "You should update the DNS settings of your domain to include this system "
|
||||
#| "in the SPF record."
|
||||
msgid ""
|
||||
"We found a CNAME record for a DKIM key, but it is not pointing to the right "
|
||||
"location. This means that there is a very high chance most of the emails "
|
||||
"will be rejected or marked as spam. You should update the DNS settings of "
|
||||
"your domain."
|
||||
msgstr ""
|
||||
"Hemos encontrado un registro CNAME para una clave DKIM, pero no apunta a la "
|
||||
"ubicación correcta. Esto significa que hay muchas posibilidades de que la "
|
||||
"mayoría de los correos electrónicos sean rechazados o marcados como spam. "
|
||||
"Deberías actualizar la configuración DNS de tu dominio."
|
||||
"Hemos encontrado un registro SPF configurado para el dominio que está "
|
||||
"intentando utilizar, pero no incluye el servidor de correo electrónico del "
|
||||
"mismo sistema. Esto significa que es muy probable que la mayoría de los "
|
||||
"correos electrónicos sean rechazados o marcados como spam. Debe actualizar "
|
||||
"la configuración DNS de su dominio para incluir este sistema en el registro "
|
||||
"SPF."
|
||||
|
||||
#: pretix/control/views/mailsetup.py
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "We found an SPF record set for the domain you are trying to use, but it "
|
||||
#| "does not include this system's email server. This means that there is a "
|
||||
#| "very high chance most of the emails will be rejected or marked as spam. "
|
||||
#| "You should update the DNS settings of your domain to include this system "
|
||||
#| "in the SPF record."
|
||||
msgid ""
|
||||
"We did not find a DMARC record for your domain. This means that there is a "
|
||||
"very high chance most of the emails will be rejected or marked as spam. You "
|
||||
"should update the DNS settings of your domain."
|
||||
msgstr ""
|
||||
"No hemos encontrado ningún registro DMARC para tu dominio. Esto significa "
|
||||
"que hay muchas posibilidades de que la mayoría de los correos electrónicos "
|
||||
"sean rechazados o marcados como spam. Deberías actualizar la configuración "
|
||||
"DNS de tu dominio."
|
||||
"Hemos encontrado un registro SPF configurado para el dominio que está "
|
||||
"intentando utilizar, pero no incluye el servidor de correo electrónico del "
|
||||
"mismo sistema. Esto significa que es muy probable que la mayoría de los "
|
||||
"correos electrónicos sean rechazados o marcados como spam. Debe actualizar "
|
||||
"la configuración DNS de su dominio para incluir este sistema en el registro "
|
||||
"SPF."
|
||||
|
||||
#: pretix/control/views/mailsetup.py
|
||||
msgid "The verification code was incorrect, please try again."
|
||||
@@ -31825,7 +31901,6 @@ msgstr ""
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid "Allow further payments during compliance hold"
|
||||
msgstr ""
|
||||
"Permitir que se realicen más pagos durante la suspensión por incumplimiento"
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
@@ -31835,24 +31910,16 @@ msgid ""
|
||||
"attempts during that window. This might result in them being charged twice "
|
||||
"if the original payment is approved."
|
||||
msgstr ""
|
||||
"El sistema de prevención de fraudes de PayPal podría bloquear la tramitación "
|
||||
"de pagos individuales durante un periodo de tiempo considerable. Durante ese "
|
||||
"intervalo, el pago aparece como «pendiente». Puedes permitir que tus "
|
||||
"clientes realicen nuevos intentos de pago durante ese intervalo. Esto podría "
|
||||
"dar lugar a que se les cobre dos veces si se aprueba el pago original."
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid "Timeout further payment attempts"
|
||||
msgstr "Tiempo de espera para nuevos intentos de pago"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
"Time duration in minutes after which another payment attempt is possible, "
|
||||
"while the last payment is still under investigation."
|
||||
msgstr ""
|
||||
"Tiempo, expresado en minutos, transcurrido tras el cual es posible realizar "
|
||||
"otro intento de pago, mientras el último pago sigue siendo objeto de "
|
||||
"investigación."
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid "-- Automatic --"
|
||||
@@ -32121,11 +32188,6 @@ msgid ""
|
||||
"twice in case PayPal allows your initial payment attempt. Please contact us "
|
||||
"to resolve this case."
|
||||
msgstr ""
|
||||
"PayPal está procesando tu pago. Este proceso está tardando más de lo "
|
||||
"habitual. Puedes esperar a que PayPal confirme el pago o intentar volver a "
|
||||
"pagar con este u otro método de pago. Esto podría dar lugar a que se te "
|
||||
"cobre dos veces en caso de que PayPal acepte tu primer intento de pago. "
|
||||
"Ponte en contacto con nosotros para resolver este asunto."
|
||||
|
||||
#: pretix/plugins/paypal2/views.py
|
||||
msgid ""
|
||||
@@ -32377,21 +32439,24 @@ msgid "Base redirection URLs"
|
||||
msgstr "URL de redirección de base"
|
||||
|
||||
#: pretix/plugins/returnurl/views.py
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "Redirection will only be allowed to URLs that start with one of these "
|
||||
#| "prefixes. Enter one or more allowed URL prefix per line. URL prefixes "
|
||||
#| "must include a slash after the hostname."
|
||||
msgid ""
|
||||
"Redirection will only be allowed to URLs that start with one of these "
|
||||
"prefixes. Enter one allowed URL prefix per line. URL prefixes must include a "
|
||||
"slash after the hostname."
|
||||
msgstr ""
|
||||
"Solo se permitirá la redirección a direcciones URL que empiecen por uno de "
|
||||
"estos prefijos. Introduce un prefijo de URL permitido por línea. Los "
|
||||
"La redirección sólo se permitirá a las URL que empiecen por uno de estos "
|
||||
"prefijos. Introduzca uno o más prefijos de URL permitidos por línea. Los "
|
||||
"prefijos de URL deben incluir una barra después del nombre de host."
|
||||
|
||||
#: pretix/plugins/returnurl/views.py
|
||||
msgid ""
|
||||
"All values must be URLs that include at last one slash after the hostname."
|
||||
msgstr ""
|
||||
"Todos los valores deben ser direcciones URL que incluyan al menos una barra "
|
||||
"después del nombre de host."
|
||||
|
||||
#: pretix/plugins/sendmail/apps.py
|
||||
msgid "Send out emails to all your customers or specific groups of customers."
|
||||
|
||||
@@ -4,10 +4,10 @@ msgstr ""
|
||||
"Project-Id-Version: 1\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-08-24 15:35+0000\n"
|
||||
"PO-Revision-Date: 2026-08-25 00:00+0000\n"
|
||||
"Last-Translator: CVZ-es <damien.bremont@casadevelazquez.org>\n"
|
||||
"Language-Team: French <https://translate.pretix.eu/projects/pretix/pretix/"
|
||||
"fr/>\n"
|
||||
"PO-Revision-Date: 2026-08-11 17:00+0000\n"
|
||||
"Last-Translator: Hijiri Umemoto <hijiri@umemoto.org>\n"
|
||||
"Language-Team: French <https://translate.pretix.eu/projects/pretix/pretix/fr/"
|
||||
">\n"
|
||||
"Language: fr\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -89,7 +89,7 @@ msgstr "Hébreu"
|
||||
|
||||
#: pretix/_base_settings.py
|
||||
msgid "Hungarian"
|
||||
msgstr "Hongrois"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/_base_settings.py
|
||||
msgid "Indonesian"
|
||||
@@ -438,8 +438,10 @@ msgid "You cannot exchange a medium for a medium."
|
||||
msgstr "Il n'est pas possible d'échanger un support contre un autre support."
|
||||
|
||||
#: pretix/api/views/checkin.py
|
||||
#, fuzzy
|
||||
#| msgid "Product does not support medium exchange."
|
||||
msgid "You cannot simulate a medium exchange."
|
||||
msgstr "l n'est pas possible de simuler un échange de support."
|
||||
msgstr "Ce produit ne permet pas de changer de support."
|
||||
|
||||
#: pretix/api/views/oauth.py pretix/control/logdisplay.py
|
||||
#, python-brace-format
|
||||
@@ -5831,7 +5833,7 @@ msgstr "Code pays (ISO 3166-1 alpha-2)"
|
||||
|
||||
#: pretix/base/models/items.py
|
||||
msgid "Asked on"
|
||||
msgstr "Question posée le"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/models/items.py pretix/base/models/organizer.py
|
||||
msgid ""
|
||||
@@ -7553,6 +7555,9 @@ msgid "The payment for this invoice has already been received."
|
||||
msgstr "Le paiement de cette facture a déjà été reçu."
|
||||
|
||||
#: pretix/base/payment.py
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "This payment is already being processed and can not be canceled any more."
|
||||
msgid ""
|
||||
"This payment is already being processed and cannot be canceled any more."
|
||||
msgstr ""
|
||||
@@ -8335,12 +8340,16 @@ msgid "Presale end"
|
||||
msgstr "Fin de la prévente"
|
||||
|
||||
#: pretix/base/reldate.py
|
||||
#, fuzzy
|
||||
#| msgid "Order email"
|
||||
msgid "Order creation"
|
||||
msgstr "Création d'une commande"
|
||||
msgstr "E-mail de la commande"
|
||||
|
||||
#: pretix/base/reldate.py
|
||||
#, fuzzy
|
||||
#| msgid "Order expired"
|
||||
msgid "Order expiry"
|
||||
msgstr "Expiration de la commande"
|
||||
msgstr "Commande expirée"
|
||||
|
||||
#: pretix/base/reldate.py
|
||||
msgid "before"
|
||||
@@ -8369,22 +8378,22 @@ msgstr "Non réglé"
|
||||
#: pretix/base/reldate.py
|
||||
#, python-brace-format
|
||||
msgid "A relative date cannot be expressed as \"before\" for \"{}\""
|
||||
msgstr "Une date relative ne peut pas être exprimée par « avant » pour « {} »"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/reldate.py
|
||||
#, python-brace-format
|
||||
msgid "A relative date cannot be expressed as \"after\" for \"{}\""
|
||||
msgstr "Une date relative ne peut pas être exprimée par « après » pour « {} »"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/reldate.py
|
||||
#, python-brace-format
|
||||
msgid "A relative time cannot be expressed as \"before\" for \"{}\""
|
||||
msgstr "Une durée relative ne peut pas être exprimée par « avant » pour « {} »"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/reldate.py
|
||||
#, python-brace-format
|
||||
msgid "A relative time cannot be expressed as \"after\" for \"{}\""
|
||||
msgstr "Un temps relatif ne peut pas être exprimé par « après » pour « {} »"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/secrets.py
|
||||
msgid "Random (default, works with all pretix apps)"
|
||||
@@ -10421,12 +10430,12 @@ msgstr ""
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid "No dates match your criteria."
|
||||
msgstr "Aucune date ne correspond à vos critères."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgctxt "subevents"
|
||||
msgid "Text for empty date results"
|
||||
msgstr "Texte à afficher lorsque les résultats ne contiennent aucune date"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgctxt "subevents"
|
||||
@@ -10437,11 +10446,6 @@ msgid ""
|
||||
"touch with you to arrange further dates. We do not recommend more than one "
|
||||
"or two sentences."
|
||||
msgstr ""
|
||||
"Ce texte s'affichera si le calendrier ou la liste des dates est vide, par "
|
||||
"exemple parce qu'un mois ne comporte aucune date ou qu'un filtre sélectionné "
|
||||
"par l'utilisateur ne donne aucun résultat. Vous pouvez en profiter pour "
|
||||
"indiquer comment vous contacter afin de convenir d'autres dates. Nous vous "
|
||||
"recommandons de ne pas dépasser une ou deux phrases."
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid "Guidance text"
|
||||
@@ -14475,20 +14479,28 @@ msgstr ""
|
||||
"plus l’année d’émission de la carte-cadeau."
|
||||
|
||||
#: pretix/control/forms/event.py
|
||||
#, fuzzy
|
||||
#| msgid "Payment date"
|
||||
msgid "Payment term"
|
||||
msgstr "Conditions de paiement"
|
||||
msgstr "Date de paiement"
|
||||
|
||||
#: pretix/control/forms/event.py
|
||||
#, fuzzy
|
||||
#| msgid "(Same as above)"
|
||||
msgid "same as above"
|
||||
msgstr "idem que ci-dessus"
|
||||
msgstr "(identique à ce qui précède)"
|
||||
|
||||
#: pretix/control/forms/event.py
|
||||
#, fuzzy
|
||||
#| msgid "Payment term in days"
|
||||
msgid "different payment term in days"
|
||||
msgstr "délai de paiement différent en jours"
|
||||
msgstr "Délai de paiement en jours"
|
||||
|
||||
#: pretix/control/forms/event.py
|
||||
#, fuzzy
|
||||
#| msgid "Payment term in minutes"
|
||||
msgid "different payment term in minutes"
|
||||
msgstr "durée de paiement différente en minutes"
|
||||
msgstr "Délai de paiement en minutes"
|
||||
|
||||
#: pretix/control/forms/event.py
|
||||
msgid "Prices including tax"
|
||||
@@ -20565,20 +20577,26 @@ msgstr ""
|
||||
"CNAME comme ceci :"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "We found an SPF record on your domain that includes this system. Great!"
|
||||
msgid "We found a DKIM record on your domain for this system. Great!"
|
||||
msgstr ""
|
||||
"Nous avons trouvé un enregistrement DKIM sur votre domaine pour ce système. "
|
||||
"Parfait !"
|
||||
"Nous avons trouvé un enregistrement SPF sur votre domaine qui inclut ce "
|
||||
"système. Super !"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
|
||||
msgid "Your new DMARC record could look like this:"
|
||||
msgstr "Votre nouvel enregistrement DMARC pourrait ressembler à ceci :"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "We found an SPF record on your domain that includes this system. Great!"
|
||||
msgid "We found a DMARC record on your domain for this system. Great!"
|
||||
msgstr ""
|
||||
"Nous avons trouvé un enregistrement DMARC sur votre domaine pour ce système. "
|
||||
"Parfait !"
|
||||
"Nous avons trouvé un enregistrement SPF sur votre domaine qui inclut ce "
|
||||
"système. Super !"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
|
||||
msgid "Verification"
|
||||
@@ -23389,24 +23407,28 @@ msgstr ""
|
||||
"besoins alimentaires."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/items/questions.html
|
||||
#, fuzzy
|
||||
#| msgid "Create a new question"
|
||||
msgid "Create a new per-ticket question"
|
||||
msgstr "Créer une nouvelle question spécifique à chaque ticket"
|
||||
msgstr "Créer une nouvelle question"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/items/questions.html
|
||||
#, fuzzy
|
||||
#| msgid "Create a new question"
|
||||
msgid "Create a new order-level question"
|
||||
msgstr "Créer une nouvelle question au niveau de la commande"
|
||||
msgstr "Créer une nouvelle question"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/items/questions.html
|
||||
#, fuzzy
|
||||
#| msgid "Delete question"
|
||||
msgid "Per-ticket questions"
|
||||
msgstr "Questions relatives à chaque billet"
|
||||
msgstr "Supprimer la question"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/items/questions.html
|
||||
msgid ""
|
||||
"These questions are asked for every ticket, so possibly multiple times in "
|
||||
"the same order."
|
||||
msgstr ""
|
||||
"Ces questions sont posées pour chaque billet, et peuvent donc être posées "
|
||||
"plusieurs fois au cours d'une même commande."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/items/questions.html
|
||||
msgid "Create a new question"
|
||||
@@ -23425,28 +23447,28 @@ msgid "All personalized products"
|
||||
msgstr "Tous les produits personnalisés"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/items/questions.html
|
||||
#, fuzzy
|
||||
#| msgid "Include questions"
|
||||
msgid "Per-order questions"
|
||||
msgstr "Questions relatives à chaque commande"
|
||||
msgstr "Inclure des questions"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/items/questions.html
|
||||
msgid ""
|
||||
"This functionality is in active development and expected to change "
|
||||
"significantly over the coming months."
|
||||
msgstr ""
|
||||
"Cette fonctionnalité est en cours de développement et devrait évoluer "
|
||||
"considérablement au cours des prochains mois."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/items/questions.html
|
||||
msgid ""
|
||||
"Per-order questions are currently not supported and will not be displayed in "
|
||||
"pretixPOS."
|
||||
msgstr ""
|
||||
"Les questions spécifiques à chaque commande ne sont actuellement pas prises "
|
||||
"en charge et n'apparaîtront pas dans pretixPOS."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/items/questions.html
|
||||
#, fuzzy
|
||||
#| msgid "The question has been reordered."
|
||||
msgid "These questions are asked once per order."
|
||||
msgstr "Ces questions sont posées une fois par commande."
|
||||
msgstr "La question a été réordonnée."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/items/quota.html
|
||||
#: pretix/control/templates/pretixcontrol/items/quota_edit.html
|
||||
@@ -24058,8 +24080,10 @@ msgstr "(optionnel)"
|
||||
#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html
|
||||
#: pretix/presale/templates/pretixpresale/event/checkout_questions.html
|
||||
#: pretix/presale/templates/pretixpresale/event/order_modify.html
|
||||
#, fuzzy
|
||||
#| msgid "Additional information"
|
||||
msgid "Additional order information"
|
||||
msgstr "Informations complémentaires sur la commande"
|
||||
msgstr "Informations complémentaires"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/order/delete.html
|
||||
msgid "Delete order"
|
||||
@@ -25775,13 +25799,14 @@ msgid "Hardware model"
|
||||
msgstr "Modèle de matériel"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/organizers/devices.html
|
||||
#, python-format
|
||||
#, fuzzy, python-format
|
||||
#| msgid "Begin: %(time)s"
|
||||
msgid "Last seen: %(time)s"
|
||||
msgstr "Dernière connexion : %(time)s"
|
||||
msgstr "Début : %(time)s"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/organizers/devices.html
|
||||
msgid "No recent contact"
|
||||
msgstr "Aucun contact récent"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/organizers/devices.html
|
||||
msgid "Not yet initialized"
|
||||
@@ -29261,6 +29286,13 @@ msgstr ""
|
||||
"l'enregistrement SPF."
|
||||
|
||||
#: pretix/control/views/mailsetup.py
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "We could not find an SPF record set for the domain you are trying to use. "
|
||||
#| "This means that there is a very high change most of the emails will be "
|
||||
#| "rejected or marked as spam. We strongly recommend setting an SPF record "
|
||||
#| "on the domain. You can do so through the DNS settings at the provider you "
|
||||
#| "registered your domain with."
|
||||
msgid ""
|
||||
"We could not find a CNAME record pointing to our DKIM key for domain you are "
|
||||
"trying to use. This means that there is a very high change most of the "
|
||||
@@ -29268,35 +29300,53 @@ msgid ""
|
||||
"DKIM through a CNAME record. You can do so through the DNS settings at the "
|
||||
"provider you registered your domain with."
|
||||
msgstr ""
|
||||
"Nous n'avons pas trouvé d'enregistrement CNAME pointant vers notre clé DKIM "
|
||||
"pour le domaine que vous essayez d'utiliser. Cela signifie qu'il y a de très "
|
||||
"fortes chances que la plupart des e-mails soient rejetés ou marqués comme "
|
||||
"spam. Nous vous recommandons vivement de configurer DKIM à l'aide d'un "
|
||||
"enregistrement CNAME. Vous pouvez le faire via les paramètres DNS chez le "
|
||||
"fournisseur auprès duquel vous avez enregistré votre domaine."
|
||||
"Nous n'avons pas trouvé d'enregistrement SPF pour le domaine que vous "
|
||||
"essayez d'utiliser. Cela signifie qu'il y a de fortes chances que la plupart "
|
||||
"des e-mails soient rejetés ou marqués comme spam. Nous vous recommandons "
|
||||
"vivement de configurer un enregistrement SPF sur le domaine. Vous pouvez le "
|
||||
"faire via les paramètres DNS chez le fournisseur auprès duquel vous avez "
|
||||
"enregistré votre domaine."
|
||||
|
||||
#: pretix/control/views/mailsetup.py
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "We found an SPF record set for the domain you are trying to use, but it "
|
||||
#| "does not include this system's email server. This means that there is a "
|
||||
#| "very high chance most of the emails will be rejected or marked as spam. "
|
||||
#| "You should update the DNS settings of your domain to include this system "
|
||||
#| "in the SPF record."
|
||||
msgid ""
|
||||
"We found a CNAME record for a DKIM key, but it is not pointing to the right "
|
||||
"location. This means that there is a very high chance most of the emails "
|
||||
"will be rejected or marked as spam. You should update the DNS settings of "
|
||||
"your domain."
|
||||
msgstr ""
|
||||
"Nous avons détecté un enregistrement CNAME associé à une clé DKIM, mais "
|
||||
"celui-ci ne pointe pas vers la bonne adresse. Cela signifie qu'il y a de "
|
||||
"très fortes chances que la plupart de vos e-mails soient rejetés ou classés "
|
||||
"comme spam. Vous devez mettre à jour les paramètres DNS de votre domaine."
|
||||
"Nous avons trouvé un enregistrement SPF défini pour le domaine que vous "
|
||||
"essayez d'utiliser, mais il n'inclut pas le serveur de messagerie de ce "
|
||||
"système. Cela signifie qu'il y a de fortes chances que la plupart des e-"
|
||||
"mails soient rejetés ou marqués comme spam. Vous devez mettre à jour les "
|
||||
"paramètres DNS de votre domaine afin d'inclure ce système dans "
|
||||
"l'enregistrement SPF."
|
||||
|
||||
#: pretix/control/views/mailsetup.py
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "We found an SPF record set for the domain you are trying to use, but it "
|
||||
#| "does not include this system's email server. This means that there is a "
|
||||
#| "very high chance most of the emails will be rejected or marked as spam. "
|
||||
#| "You should update the DNS settings of your domain to include this system "
|
||||
#| "in the SPF record."
|
||||
msgid ""
|
||||
"We did not find a DMARC record for your domain. This means that there is a "
|
||||
"very high chance most of the emails will be rejected or marked as spam. You "
|
||||
"should update the DNS settings of your domain."
|
||||
msgstr ""
|
||||
"Nous n'avons pas trouvé d'enregistrement DMARC pour votre domaine. Cela "
|
||||
"signifie qu'il y a de très fortes chances que la plupart de vos e-mails "
|
||||
"soient rejetés ou marqués comme spam. Vous devriez mettre à jour les "
|
||||
"paramètres DNS de votre domaine."
|
||||
"Nous avons trouvé un enregistrement SPF défini pour le domaine que vous "
|
||||
"essayez d'utiliser, mais il n'inclut pas le serveur de messagerie de ce "
|
||||
"système. Cela signifie qu'il y a de fortes chances que la plupart des e-"
|
||||
"mails soient rejetés ou marqués comme spam. Vous devez mettre à jour les "
|
||||
"paramètres DNS de votre domaine afin d'inclure ce système dans "
|
||||
"l'enregistrement SPF."
|
||||
|
||||
#: pretix/control/views/mailsetup.py
|
||||
msgid "The verification code was incorrect, please try again."
|
||||
@@ -31982,8 +32032,8 @@ msgid ""
|
||||
"We're waiting for an answer from PayPal regarding your payment. Please "
|
||||
"contact us, if this takes more than a few hours."
|
||||
msgstr ""
|
||||
"Nous attendons une réponse de PayPal concernant votre paiement. N'hésitez "
|
||||
"pas à nous contacter si cela prend plus de quelques heures."
|
||||
"Nous attendons une réponse de PayPal concernant votre paiement. Veuillez "
|
||||
"nous contacter, si cela prend plus de quelques heures."
|
||||
|
||||
#: pretix/plugins/paypal/views.py pretix/plugins/paypal2/views.py
|
||||
msgid "Invalid response from PayPal received."
|
||||
@@ -32081,8 +32131,6 @@ msgstr ""
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid "Allow further payments during compliance hold"
|
||||
msgstr ""
|
||||
"Autoriser la poursuite des paiements pendant la période de suspension pour "
|
||||
"non-conformité"
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
@@ -32092,25 +32140,16 @@ msgid ""
|
||||
"attempts during that window. This might result in them being charged twice "
|
||||
"if the original payment is approved."
|
||||
msgstr ""
|
||||
"Le système de prévention des fraudes de PayPal peut bloquer le traitement de "
|
||||
"certains paiements pendant une durée considérable. Pendant cette période, le "
|
||||
"paiement est marqué comme « en attente ». Vous pouvez autoriser vos clients "
|
||||
"à effectuer de nouvelles tentatives de paiement pendant cette période. Cela "
|
||||
"peut entraîner un double prélèvement si le paiement initial est finalement "
|
||||
"approuvé."
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid "Timeout further payment attempts"
|
||||
msgstr "Délai d'expiration des tentatives de paiement supplémentaires"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
"Time duration in minutes after which another payment attempt is possible, "
|
||||
"while the last payment is still under investigation."
|
||||
msgstr ""
|
||||
"Durée en minutes à l'issue de laquelle une nouvelle tentative de paiement "
|
||||
"est possible, alors que le dernier paiement fait toujours l'objet d'une "
|
||||
"enquête."
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid "-- Automatic --"
|
||||
@@ -32388,12 +32427,6 @@ msgid ""
|
||||
"twice in case PayPal allows your initial payment attempt. Please contact us "
|
||||
"to resolve this case."
|
||||
msgstr ""
|
||||
"Votre paiement est en cours de traitement par PayPal. Cette opération prend "
|
||||
"plus de temps que d'habitude. Vous pouvez attendre que PayPal valide le "
|
||||
"paiement ou essayer de payer à nouveau en utilisant ce moyen de paiement ou "
|
||||
"un autre. Cela pourrait entraîner un double prélèvement si PayPal autorise "
|
||||
"votre première tentative de paiement. Veuillez nous contacter pour résoudre "
|
||||
"ce problème."
|
||||
|
||||
#: pretix/plugins/paypal2/views.py
|
||||
msgid ""
|
||||
|
||||
@@ -35,7 +35,6 @@ import copy
|
||||
import inspect
|
||||
import uuid
|
||||
from collections import defaultdict
|
||||
from datetime import time
|
||||
from decimal import Decimal
|
||||
|
||||
from django import forms
|
||||
@@ -53,7 +52,6 @@ from django.shortcuts import redirect
|
||||
from django.utils import translation
|
||||
from django.utils.functional import cached_property
|
||||
from django.utils.html import conditional_escape
|
||||
from django.utils.timezone import now
|
||||
from django.utils.translation import (
|
||||
get_language, gettext_lazy as _, pgettext_lazy,
|
||||
)
|
||||
@@ -73,7 +71,6 @@ from pretix.base.services.cart import (
|
||||
from pretix.base.services.cross_selling import CrossSellingService
|
||||
from pretix.base.services.memberships import validate_memberships_in_order
|
||||
from pretix.base.services.orders import perform_order
|
||||
from pretix.base.services.payment import compute_payment_deadline
|
||||
from pretix.base.services.pricing import get_price
|
||||
from pretix.base.services.tasks import EventTask
|
||||
from pretix.base.settings import PERSON_NAME_SCHEMES
|
||||
@@ -843,8 +840,6 @@ class QuestionsStep(CartQuestionsViewMixin, CartMixin, TemplateFlowStep):
|
||||
f.fields[fname].disabled = val['disabled']
|
||||
if 'validators' in val and fname in f.fields:
|
||||
f.fields[fname].validators += val['validators']
|
||||
if 'label' in val and fname in f.fields:
|
||||
f.fields[fname].label = val['label']
|
||||
|
||||
return f
|
||||
|
||||
@@ -949,8 +944,6 @@ class QuestionsStep(CartQuestionsViewMixin, CartMixin, TemplateFlowStep):
|
||||
f.fields[fname].disabled = val['disabled']
|
||||
if 'validators' in val and fname in f.fields:
|
||||
f.fields[fname].validators += val['validators']
|
||||
if 'label' in val and fname in f.fields:
|
||||
f.fields[fname].label = val['label']
|
||||
|
||||
return f
|
||||
|
||||
@@ -1347,11 +1340,6 @@ class PaymentStep(CartMixin, TemplateFlowStep):
|
||||
self.request = request
|
||||
self.request.pci_dss_payment_page = True
|
||||
|
||||
if "postpone" in request.POST and self._allow_postpone:
|
||||
self.cart_session['payments_postpone'] = True
|
||||
self.cart_session['payments'] = []
|
||||
return redirect_to_url(self.get_next_url(request))
|
||||
|
||||
if "remove_payment" in request.POST:
|
||||
self._remove_payment(request.POST["remove_payment"])
|
||||
return redirect_to_url(self.get_step_url(request))
|
||||
@@ -1440,41 +1428,20 @@ class PaymentStep(CartMixin, TemplateFlowStep):
|
||||
ctx['providers'] = self.provider_forms
|
||||
ctx['show_fees'] = any(p['fee'] for p in self.provider_forms)
|
||||
|
||||
if 'payment' in self.request.POST:
|
||||
ctx['selected'] = self.request.POST['payment']
|
||||
elif self.cart_session.get('payments_postpone') and self._allow_postpone:
|
||||
ctx['selected'] = ''
|
||||
elif len(self.provider_forms) == 1:
|
||||
if len(self.provider_forms) == 1:
|
||||
ctx['selected'] = self.provider_forms[0]['provider'].identifier
|
||||
elif 'payment' in self.request.POST:
|
||||
ctx['selected'] = self.request.POST['payment']
|
||||
elif self.single_use_payment:
|
||||
ctx['selected'] = self.single_use_payment['provider']
|
||||
else:
|
||||
ctx['selected'] = ''
|
||||
|
||||
ctx['allow_postpone'] = self._allow_postpone
|
||||
if self._allow_postpone:
|
||||
now_dt = now()
|
||||
ctx['payment_deadline'] = compute_payment_deadline(
|
||||
event=self.request.event,
|
||||
sales_channel=self.request.sales_channel,
|
||||
subevents={p.subevent for p in ctx['cart']['raw']},
|
||||
now_dt=now_dt,
|
||||
)
|
||||
if ctx['payment_deadline'].time() != time(hour=23, minute=59, second=59):
|
||||
ctx['payment_deadline_minutes'] = int((ctx['payment_deadline'] - now_dt).total_seconds() // 60)
|
||||
return ctx
|
||||
|
||||
@cached_property
|
||||
def _allow_postpone(self):
|
||||
return self.request.sales_channel.identifier in self.request.event.settings.payment_choice_postpone_allowed_channels
|
||||
|
||||
def _is_allowed(self, prov, request):
|
||||
return prov.is_allowed(request, total=self._total_order_value)
|
||||
|
||||
def is_completed(self, request, warn=False):
|
||||
if self.cart_session.get('payments_postpone') and self._allow_postpone:
|
||||
return True
|
||||
|
||||
if not self.cart_session.get('payments'):
|
||||
if warn:
|
||||
messages.error(request, _('Please select a payment method to proceed.'))
|
||||
|
||||
@@ -334,7 +334,7 @@ class ResetPasswordForm(forms.Form):
|
||||
def clean_email(self):
|
||||
if 'email' not in self.cleaned_data:
|
||||
return
|
||||
if rate_limit("customer_pwreset_check", include_ip_from_request=self.request, max_num=10, expire_time=600):
|
||||
if rate_limit("customer_pwreset_check", max_num=10, expire_time=600):
|
||||
raise forms.ValidationError(
|
||||
self.error_messages['rate_limit'],
|
||||
code='rate_limit',
|
||||
|
||||
@@ -233,7 +233,7 @@ Arguments: ``request``, ``order``
|
||||
This signal allows you to override fields of the contact form that is presented during checkout
|
||||
and by default only asks for the email address. It is also being used for the invoice address
|
||||
form. You are supposed to return a dictionary of dictionaries with globally unique keys. The
|
||||
value-dictionary should contain one or more of the following keys: ``label``, ``initial``, ``disabled``,
|
||||
value-dictionary should contain one or more of the following keys: ``initial``, ``disabled``,
|
||||
``validators``. The key of the dictionary should be the name of the form field.
|
||||
|
||||
As with all event plugin signals, the ``sender`` keyword argument will contain the event. A ``request``
|
||||
@@ -264,9 +264,9 @@ Arguments: ``position``, ``request``
|
||||
This signal allows you to override fields of the questions form that is presented during checkout
|
||||
and by default only asks for the questions configured in the backend. You are supposed to return a
|
||||
dictionary of dictionaries with globally unique keys. The value-dictionary should contain one or
|
||||
more of the following keys: ``label``, ``initial``, ``disabled``, ``validators``. The key of the
|
||||
dictionary should be the form field name for system fields (e.g. ``company``), or the question's
|
||||
``identifier`` for user-defined questions.
|
||||
more of the following keys: ``initial``, ``disabled``, ``validators``. The key of the dictionary
|
||||
should be the form field name for system fields (e.g. ``company``), or the question's ``identifier``
|
||||
for user-defined questions.
|
||||
|
||||
The ``position`` keyword argument will contain a ``CartPosition`` or ``OrderPosition`` object.
|
||||
|
||||
|
||||
@@ -128,35 +128,6 @@
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if allow_postpone %}
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-body row">
|
||||
<div class="col-md-9 col-xs-12">
|
||||
{% trans "Not sure yet? You can complete your order first and then select a payment method later." %}
|
||||
<br>
|
||||
<span class="text-muted">
|
||||
{% if current_payments %}
|
||||
{% trans "To do so, please first remove the payment methods you already selected above." %}
|
||||
{% elif payment_deadline_minutes %}
|
||||
{% blocktrans trimmed with minutes=payment_deadline_minutes %}
|
||||
Your payment needs to be completed within {{ minutes }} minutes.
|
||||
{% endblocktrans %}
|
||||
{% else %}
|
||||
{% blocktrans trimmed with deadline=payment_deadline|date:"SHORT_DATE_FORMAT" %}
|
||||
Your payment needs to be completed by {{ deadline }}.
|
||||
{% endblocktrans %}
|
||||
{% endif %}
|
||||
</span>
|
||||
</div>
|
||||
<div class="col-md-3 col-xs-12 text-right flip">
|
||||
<button name="postpone" value="on" class="btn btn-primary"
|
||||
{% if current_payments %}disabled{% endif %}>
|
||||
{% trans "Proceed without selection" %}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="row checkout-button-row">
|
||||
<div class="col-md-4 col-sm-6">
|
||||
<a class="btn btn-block btn-default btn-lg"
|
||||
|
||||
@@ -79,7 +79,7 @@ from pretix.presale.signals import seatingframe_html_head
|
||||
from pretix.presale.views.organizer import (
|
||||
EventListMixin, add_subevents_for_days, days_for_template,
|
||||
filter_qs_by_attr, filter_subevents_with_plugins, has_before_after,
|
||||
should_hide_subevent, weeks_for_template,
|
||||
weeks_for_template,
|
||||
)
|
||||
|
||||
from . import (
|
||||
@@ -443,10 +443,12 @@ class EventIndex(EventViewMixin, EventListMixin, CartMixin, TemplateView):
|
||||
)
|
||||
)
|
||||
subevents = filter_subevents_with_plugins(list(subevents), self.request.sales_channel)
|
||||
context['subevent_list'] = [
|
||||
se for se in subevents
|
||||
if not should_hide_subevent(self.request.event.settings, se, voucher)
|
||||
]
|
||||
context['subevent_list'] = subevents
|
||||
if self.request.event.settings.event_list_available_only and not voucher:
|
||||
context['subevent_list'] = [
|
||||
se for se in subevents
|
||||
if not se.presale_has_ended and (se.best_availability_state is None or se.best_availability_state >= Quota.AVAILABILITY_RESERVED)
|
||||
]
|
||||
context['visible_events'] = len(subevents) > 0
|
||||
return context
|
||||
|
||||
|
||||
@@ -601,32 +601,6 @@ def filter_subevents_with_plugins(subevents, sales_channel=None):
|
||||
return subevents
|
||||
|
||||
|
||||
def should_hide_subevent(settings, subevent, voucher=None):
|
||||
hide = False
|
||||
if settings.event_list_available_only:
|
||||
hide = (
|
||||
# Presale is over → the subevent is not available → hide
|
||||
subevent.presale_has_ended or
|
||||
# Not a single product is available on this sales channel → hide
|
||||
# Note that means there could be products which are ignored for calendar availability (Quota.ignore_for_event_availability)
|
||||
# or products only visible with a voucher. However, for customers with these scenarios, the event_list_available_only
|
||||
# makes only very little sense as it would never do anything, so the flag can just be removed -- or the products should
|
||||
# be made visible so people know why there are no products. In case a voucher is already entered on the calendar view,
|
||||
# this is already respected and subevents are shown correctly.
|
||||
subevent.best_availability_state is None or
|
||||
(
|
||||
# Sold out → hide, unless we have a voucher active that can bypass all quotas
|
||||
(not voucher or not voucher.allow_ignore_quota) and
|
||||
subevent.best_availability_state < Quota.AVAILABILITY_RESERVED
|
||||
)
|
||||
)
|
||||
|
||||
if settings.event_calendar_future_only:
|
||||
if (subevent.date_to or subevent.date_from) < time_machine_now():
|
||||
hide = True
|
||||
return hide
|
||||
|
||||
|
||||
def add_subevents_for_days(qs, before, after, ebd, timezones, sales_channel, event=None, cart_namespace=None,
|
||||
voucher=None):
|
||||
qs = qs.filter(active=True, is_public=True).filter(
|
||||
@@ -666,8 +640,19 @@ def add_subevents_for_days(qs, before, after, ebd, timezones, sales_channel, eve
|
||||
kwargs['cart_namespace'] = cart_namespace
|
||||
|
||||
s = event.settings if event else se.event.settings
|
||||
if should_hide_subevent(s, se, voucher):
|
||||
continue
|
||||
|
||||
if s.event_list_available_only:
|
||||
hide = se.presale_has_ended or (
|
||||
(not voucher or not voucher.allow_ignore_quota) and
|
||||
se.best_availability_state is not None and
|
||||
se.best_availability_state < Quota.AVAILABILITY_RESERVED
|
||||
)
|
||||
if hide:
|
||||
continue
|
||||
|
||||
if s.event_calendar_future_only:
|
||||
if (se.date_to or se.date_from) < time_machine_now():
|
||||
continue
|
||||
|
||||
timezones.add(s.timezone)
|
||||
tz = ZoneInfo(s.timezone)
|
||||
|
||||
@@ -75,7 +75,7 @@ from pretix.presale.views.cart import get_or_create_cart_id
|
||||
from pretix.presale.views.organizer import (
|
||||
EventListMixin, add_events_for_days, add_subevents_for_days,
|
||||
days_for_template, filter_qs_by_attr, filter_subevents_with_plugins,
|
||||
should_hide_subevent, weeks_for_template,
|
||||
weeks_for_template,
|
||||
)
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
@@ -757,10 +757,14 @@ class WidgetAPIProductList(EventListMixin, View):
|
||||
evs = evs[:limit]
|
||||
|
||||
tz = request.event.timezone
|
||||
evs = [
|
||||
se for se in evs
|
||||
if not should_hide_subevent(self.request.event.settings, se)
|
||||
]
|
||||
if self.request.event.settings.event_list_available_only:
|
||||
evs = [
|
||||
se for se in evs
|
||||
if not se.presale_has_ended and (
|
||||
se.best_availability_state is not None and
|
||||
se.best_availability_state >= Quota.AVAILABILITY_RESERVED
|
||||
)
|
||||
]
|
||||
|
||||
data['events'] = [
|
||||
{
|
||||
|
||||
@@ -171,28 +171,12 @@ body.has-modal-dialog .container, body.has-modal-dialog #wrapper {
|
||||
width: fit-content;
|
||||
max-width: 80%;
|
||||
min-width: 24em;
|
||||
max-height: 80vh;
|
||||
margin-top: 10vh;
|
||||
|
||||
.modal-card-content {
|
||||
// not symmetric, but LOOKS more symmetric since the picture has so much more optical weight than the caption
|
||||
padding: 2.5em 2.5em 1.5em 2.5em;
|
||||
max-height: 80vh;
|
||||
}
|
||||
|
||||
figure {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
max-height: calc(80vh - 4em);
|
||||
padding: 2.5em;
|
||||
}
|
||||
|
||||
img {
|
||||
width: auto;
|
||||
object-fit: contain;
|
||||
height: 100%;
|
||||
flex-basis: 10%;
|
||||
flex-grow: 1;
|
||||
flex-shrink: 1;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
button {
|
||||
|
||||
@@ -345,7 +345,7 @@ Vue.component('pricebox', {
|
||||
+ ' :min="display_price_nonlocalized" :value="suggested_price_nonlocalized" :name="field_name"'
|
||||
+ ' step="any" v-bind:aria-labelledby="aria_labelledby" v-bind:aria-describedby="price_desc_id">'
|
||||
+ '</div>'
|
||||
+ '<small class="pretix-widget-pricebox-tax" :id="price_desc_id" v-if="show_taxline">'
|
||||
+ '<small class="pretix-widget-pricebox-tax" :id="price_desc_id" v-if="price.rate != \'0\' && price.gross != \'0.00\'">'
|
||||
+ '{{ taxline }}'
|
||||
+ '</small>'
|
||||
+ '</div>'),
|
||||
@@ -422,10 +422,6 @@ Vue.component('pricebox', {
|
||||
return '<span class="pretix-widget-pricebox-currency">' + this.$root.currency + "</span> " + this.display_price;
|
||||
}
|
||||
},
|
||||
show_taxline: function () {
|
||||
// rate can either be "0.00" or "0" => parseFloat to check
|
||||
return Number.parseFloat(this.price.rate) && Number.parseFloat(this.price.gross);
|
||||
},
|
||||
taxline: function () {
|
||||
if (this.$root.display_net_prices) {
|
||||
if (this.price.includes_mixed_tax_rate) {
|
||||
|
||||
@@ -86,8 +86,7 @@ const taxline = computed(() => {
|
||||
}
|
||||
})
|
||||
|
||||
// rate can either be "0.00" or "0" => parseFloat to check
|
||||
const showTaxline = computed(() => Number.parseFloat(props.price.rate) && Number.parseFloat(props.price.gross))
|
||||
const showTaxline = computed(() => props.price.rate !== '0' && props.price.gross !== '0.00')
|
||||
</script>
|
||||
<template lang="pug">
|
||||
.pretix-widget-pricebox
|
||||
|
||||
@@ -2372,97 +2372,6 @@ class CheckoutTestCase(BaseCheckoutTestCase, TimemachineTestMixin, TestCase):
|
||||
assert p2.fee.value == Decimal("0.46")
|
||||
assert o.total == Decimal("25.76")
|
||||
|
||||
def test_payment_postpone_not_allowed(self):
|
||||
self.event.settings.set('payment_banktransfer__enabled', True)
|
||||
with scopes_disabled():
|
||||
CartPosition.objects.create(
|
||||
event=self.event, cart_id=self.session_key, item=self.ticket,
|
||||
price=23, expires=now() + timedelta(minutes=10)
|
||||
)
|
||||
response = self.client.post('/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug), {
|
||||
'postpone': 'on',
|
||||
}, follow=False)
|
||||
assert 'Please select' in response.content.decode()
|
||||
|
||||
def test_payment_postpone_allowed(self):
|
||||
self.event.settings.set('payment_banktransfer__enabled', True)
|
||||
self.event.settings.payment_choice_postpone_allowed_channels = ['web']
|
||||
with scopes_disabled():
|
||||
CartPosition.objects.create(
|
||||
event=self.event, cart_id=self.session_key, item=self.ticket,
|
||||
price=23, expires=now() + timedelta(minutes=10)
|
||||
)
|
||||
response = self.client.post('/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug), {
|
||||
'postpone': 'on',
|
||||
}, follow=True)
|
||||
self.assertRedirects(response, '/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug),
|
||||
target_status_code=200)
|
||||
|
||||
response = self.client.post('/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), follow=True)
|
||||
doc = BeautifulSoup(response.content.decode(), "lxml")
|
||||
self.assertEqual(len(doc.select(".thank-you")), 1)
|
||||
with scopes_disabled():
|
||||
o = Order.objects.last()
|
||||
assert not o.payments.exists()
|
||||
|
||||
def test_payment_postpone_cleared_on_selection(self):
|
||||
self.event.settings.set('payment_banktransfer__enabled', True)
|
||||
self.event.settings.payment_choice_postpone_allowed_channels = ['web']
|
||||
with scopes_disabled():
|
||||
CartPosition.objects.create(
|
||||
event=self.event, cart_id=self.session_key, item=self.ticket,
|
||||
price=23, expires=now() + timedelta(minutes=10)
|
||||
)
|
||||
|
||||
response = self.client.post('/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug), {
|
||||
'postpone': 'on',
|
||||
}, follow=False)
|
||||
self.assertRedirects(response, '/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug),
|
||||
target_status_code=200)
|
||||
assert self.client.session['carts'][self.session_key].get('payments_postpone')
|
||||
|
||||
# The only available provider must not be preselected while the choice is postponed
|
||||
response = self.client.get('/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug), follow=True)
|
||||
doc = BeautifulSoup(response.content.decode(), "lxml")
|
||||
self.assertEqual(len(doc.select('input[name="payment"]')), 1)
|
||||
self.assertEqual(len(doc.select('input[name="payment"][checked]')), 0)
|
||||
|
||||
# Selecting a payment method takes the order out of the postponed state again
|
||||
response = self.client.post('/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug), {
|
||||
'payment': 'banktransfer',
|
||||
}, follow=False)
|
||||
self.assertRedirects(response, '/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug),
|
||||
target_status_code=200)
|
||||
assert not self.client.session['carts'][self.session_key].get('payments_postpone')
|
||||
|
||||
def test_payment_postpone_disabled_with_partial_payment(self):
|
||||
self.event.settings.set('payment_banktransfer__enabled', True)
|
||||
self.event.settings.payment_choice_postpone_allowed_channels = ['web']
|
||||
gc = self.orga.issued_gift_cards.create(currency="EUR")
|
||||
gc.transactions.create(value=20, acceptor=self.orga)
|
||||
with scopes_disabled():
|
||||
CartPosition.objects.create(
|
||||
event=self.event, cart_id=self.session_key, item=self.ticket,
|
||||
price=23, expires=now() + timedelta(minutes=10)
|
||||
)
|
||||
|
||||
response = self.client.get('/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug), follow=True)
|
||||
doc = BeautifulSoup(response.content.decode(), "lxml")
|
||||
self.assertEqual(len(doc.select('button[name="postpone"]')), 1)
|
||||
self.assertEqual(len(doc.select('button[name="postpone"][disabled]')), 0)
|
||||
|
||||
# Apply a gift card that only covers part of the total
|
||||
response = self.client.post('/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug), {
|
||||
'payment': 'giftcard',
|
||||
'payment_giftcard-code': gc.secret,
|
||||
}, follow=True)
|
||||
self.assertRedirects(response, '/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug),
|
||||
target_status_code=200)
|
||||
|
||||
# Postponing would silently drop the gift card, so it is no longer offered
|
||||
doc = BeautifulSoup(response.content.decode(), "lxml")
|
||||
self.assertEqual(len(doc.select('button[name="postpone"][disabled]')), 1)
|
||||
|
||||
def test_premature_confirm(self):
|
||||
response = self.client.get('/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), follow=True)
|
||||
self.assertRedirects(response, '/%s/%s/?require_cookie=true' % (self.orga.slug, self.event.slug),
|
||||
|
||||
@@ -31,9 +31,6 @@ export default defineConfig({
|
||||
// Allow serving source files from sibling plugin directories
|
||||
allow: ['src', ...pluginDirs],
|
||||
},
|
||||
cors: {
|
||||
origin: /^https?:\/\/(?:(?:[^:]+\.)?localhost|127\.0\.0\.1|\[::1\]|[^:]+\.pretix\.(dev|work))(?::\d+)?$/
|
||||
},
|
||||
},
|
||||
build: {
|
||||
manifest: true,
|
||||
|
||||
Reference in New Issue
Block a user