Compare commits

..

1 Commits

Author SHA1 Message Date
Raphael Michel
c70596bace Remove subevent.items and subevent.variations as they very much not do what you'd expect 2024-06-14 13:18:07 +02:00
28 changed files with 5353 additions and 8121 deletions

View File

@@ -41,6 +41,6 @@ pretix/
tests/
This is the root directory for all test codes. It includes subdirectories ``api``, ``base``,
``control``, ``presale``, ``helpers``, ``multidomain`` and ``plugins`` to mirror the structure
``control``, ``presale``, ``helpers`, ``multidomain`` and ``plugins`` to mirror the structure
of the pretix source code as well as ``testdummy``, which is a pretix plugin used during
testing.

View File

@@ -38,7 +38,7 @@ dependencies = [
"dj-static",
"Django[argon2]==4.2.*",
"django-bootstrap3==24.2",
"django-compressor==4.5",
"django-compressor==4.4",
"django-countries==7.6.*",
"django-filter==24.2",
"django-formset-js-improved==0.5.0.3",
@@ -114,7 +114,7 @@ dev = [
"coverage",
"coveralls",
"fakeredis==2.23.*",
"flake8==7.1.*",
"flake8==7.0.*",
"freezegun",
"isort==5.13.*",
"pep8-naming==0.14.*",

View File

@@ -79,7 +79,6 @@ ALL_LANGUAGES = [
('de', _('German')),
('de-informal', _('German (informal)')),
('ar', _('Arabic')),
('ca', _('Catalan')),
('zh-hans', _('Chinese (simplified)')),
('zh-hant', _('Chinese (traditional)')),
('cs', _('Czech')),
@@ -99,7 +98,6 @@ ALL_LANGUAGES = [
('pt-br', _('Portuguese (Brazil)')),
('ro', _('Romanian')),
('ru', _('Russian')),
('sk', _('Slovak')),
('es', _('Spanish')),
('tr', _('Turkish')),
('uk', _('Ukrainian')),

View File

@@ -32,7 +32,7 @@
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under the License.
from collections import OrderedDict, defaultdict
from collections import OrderedDict
from decimal import Decimal
from zoneinfo import ZoneInfo
@@ -605,9 +605,10 @@ class OrderListExporter(MultiSheetListExporter):
]
questions = list(Question.objects.filter(event__in=self.events))
options = defaultdict(list)
options = {}
for q in questions:
if q.type == Question.TYPE_CHOICE_MULTIPLE:
options[q.pk] = []
if form_data['group_multiple_choice']:
for o in q.options.all():
options[q.pk].append(o)
@@ -617,9 +618,6 @@ class OrderListExporter(MultiSheetListExporter):
headers.append(str(q.question) + ' ' + str(o.answer))
options[q.pk].append(o)
else:
if q.type == Question.TYPE_CHOICE:
for o in q.options.all():
options[q.pk].append(o)
headers.append(str(q.question))
headers += [
_('Company'),
@@ -729,7 +727,7 @@ class OrderListExporter(MultiSheetListExporter):
for a in op.answers.all():
# We do not want to localize Date, Time and Datetime question answers, as those can lead
# to difficulties parsing the data (for example 2019-02-01 may become Février, 2019 01 in French).
if a.question.type in (Question.TYPE_CHOICE_MULTIPLE, Question.TYPE_CHOICE):
if a.question.type == Question.TYPE_CHOICE_MULTIPLE:
acache[a.question_id] = set(o.pk for o in a.options.all())
elif a.question.type in Question.UNLOCALIZED_TYPES:
acache[a.question_id] = a.answer
@@ -742,10 +740,6 @@ class OrderListExporter(MultiSheetListExporter):
else:
for o in options[q.pk]:
row.append(_('Yes') if o.pk in acache.get(q.pk, set()) else _('No'))
elif q.type == Question.TYPE_CHOICE:
# Join is only necessary if the question type was modified but also keeps the code simpler here
# as we'd otherwise need some [0] and existance checks
row.append(", ".join(str(o.answer) for o in options[q.pk] if o.pk in acache.get(q.pk, set())))
else:
row.append(acache.get(q.pk, ''))

View File

@@ -1068,82 +1068,36 @@ class Renderer:
canvas.showPage()
def render_background(self, buffer, title=_('Ticket')):
buffer.seek(0)
fg_pdf = PdfReader(buffer)
if settings.PDFTK:
buffer.seek(0)
with tempfile.TemporaryDirectory() as d:
fg_filename = os.path.join(d, 'fg.pdf')
bg_filename = os.path.join(d, 'bg.pdf')
out_filename = os.path.join(d, 'out.pdf')
buffer.seek(0)
with open(fg_filename, 'wb') as f:
with open(os.path.join(d, 'back.pdf'), 'wb') as f:
f.write(self.bg_bytes)
with open(os.path.join(d, 'front.pdf'), 'wb') as f:
f.write(buffer.read())
# pdf_header is a string like "%pdf-X.X"
if float(self.bg_pdf.pdf_header[5:]) > float(fg_pdf.pdf_header[5:]):
# To fix issues with pdftk and background-PDF using pdf-version greater
# than foreground-PDF, we stamp front onto back instead.
# Just changing PDF-version in fg.pdf to match the version of
# bg.pdf as we do with pypdf, does not work with pdftk.
#
# Make sure that bg.pdf matches the number of pages of fg.pdf
# note: self.bg_pdf is a PdfReader(), not a PdfWriter()
fg_num_pages = fg_pdf.get_num_pages()
bg_num_pages = self.bg_pdf.get_num_pages()
bg_pdf_to_merge = PdfWriter()
bg_pdf_to_merge.append(
self.bg_pdf,
pages=(0, min(bg_num_pages, fg_num_pages)),
import_outline=False,
excluded_fields=("/Annots", "/B")
)
if fg_num_pages > bg_num_pages:
# repeat last page in bg_pdf to match fg_pdf
bg_pdf_to_merge.append(
bg_pdf_to_merge,
pages=[bg_num_pages - 1] * (fg_num_pages - bg_num_pages),
import_outline=False,
excluded_fields=("/Annots", "/B")
)
bg_pdf_to_merge.write(bg_filename)
pdftk_cmd = [
settings.PDFTK,
bg_filename,
'multistamp',
fg_filename
]
else:
with open(bg_filename, 'wb') as f:
f.write(self.bg_bytes)
pdftk_cmd = [
settings.PDFTK,
fg_filename,
'multibackground',
bg_filename
]
pdftk_cmd.extend(('output', out_filename, 'compress'))
subprocess.run(pdftk_cmd, check=True)
with open(out_filename, 'rb') as f:
subprocess.run([
settings.PDFTK,
os.path.join(d, 'front.pdf'),
'multibackground',
os.path.join(d, 'back.pdf'),
'output',
os.path.join(d, 'out.pdf'),
'compress'
], check=True)
with open(os.path.join(d, 'out.pdf'), 'rb') as f:
return BytesIO(f.read())
else:
buffer.seek(0)
new_pdf = PdfReader(buffer)
output = PdfWriter()
for i, page in enumerate(fg_pdf.pages):
for i, page in enumerate(new_pdf.pages):
bg_page = self.bg_pdf.pages[i]
if bg_page.rotation != 0:
bg_page.transfer_rotation_to_content()
page.merge_page(bg_page, over=False)
output.add_page(page)
# pdf_header is a string like "%pdf-X.X"
if float(self.bg_pdf.pdf_header[5:]) > float(fg_pdf.pdf_header[5:]):
output.pdf_header = self.bg_pdf.pdf_header
output.add_metadata({
'/Title': str(title),
'/Creator': 'pretix',
@@ -1154,66 +1108,33 @@ class Renderer:
return outbuffer
def merge_background(fg_pdf: PdfWriter, bg_pdf: PdfWriter, out_file, compress):
def merge_background(fg_pdf, bg_pdf, out_file, compress):
if settings.PDFTK:
with tempfile.TemporaryDirectory() as d:
fg_filename = os.path.join(d, 'fg.pdf')
bg_filename = os.path.join(d, 'bg.pdf')
# pdf_header is a string like "%pdf-X.X"
if float(bg_pdf.pdf_header[5:]) > float(fg_pdf.pdf_header[5:]):
# To fix issues with pdftk and background-PDF using pdf-version greater
# than foreground-PDF, we stamp front onto back instead.
# Just changing PDF-version in fg.pdf to match the version of
# bg.pdf as we do with pypdf, does not work with pdftk.
# Make sure that bg.pdf matches the number of pages of fg.pdf
fg_num_pages = fg_pdf.get_num_pages()
bg_num_pages = bg_pdf.get_num_pages()
if fg_num_pages > bg_num_pages:
# repeat last page in bg_pdf to match fg_pdf
bg_pdf.append(
bg_pdf,
pages=[bg_num_pages - 1] * (fg_num_pages - bg_num_pages),
import_outline=False,
excluded_fields=("/Annots", "/B")
)
bg_pdf.write(bg_filename)
pdftk_cmd = [
settings.PDFTK,
bg_filename,
'multistamp',
fg_filename,
]
else:
pdftk_cmd = [
settings.PDFTK,
fg_filename,
'multibackground',
bg_filename
]
pdftk_cmd.extend(('output', '-'))
if compress:
pdftk_cmd.append('compress')
fg_pdf.write(fg_filename)
bg_pdf.write(bg_filename)
pdftk_cmd = [
settings.PDFTK,
fg_filename,
'multibackground',
bg_filename,
'output',
'-',
]
if compress:
pdftk_cmd.append('compress')
subprocess.run(pdftk_cmd, check=True, stdout=out_file)
else:
output = PdfWriter()
for i, page in enumerate(fg_pdf.pages):
bg_page = bg_pdf.pages[i]
if bg_page.rotation != 0:
bg_page.transfer_rotation_to_content()
page.merge_page(bg_page, over=False)
# pdf_header is a string like "%pdf-X.X"
if float(bg_pdf.pdf_header[5:]) > float(fg_pdf.pdf_header[5:]):
fg_pdf.pdf_header = bg_pdf.pdf_header
fg_pdf.write(out_file)
output.add_page(page)
output.write(out_file)
@deconstructible

View File

@@ -444,11 +444,6 @@ def get_global_navigation(request):
'url': reverse('control:global.license'),
'active': (url.url_name == 'global.license'),
},
{
'label': _('System report'),
'url': reverse('control:global.sysreport'),
'active': (url.url_name == 'global.sysreport'),
},
]
})

View File

@@ -1,307 +0,0 @@
#
# This file is part of pretix (Community Edition).
#
# Copyright (C) 2014-2020 Raphael Michel and contributors
# Copyright (C) 2020-2021 rami.io GmbH and contributors
#
# This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General
# Public License as published by the Free Software Foundation in version 3 of the License.
#
# ADDITIONAL TERMS APPLY: Pursuant to Section 7 of the GNU Affero General Public License, additional terms are
# applicable granting you additional permissions and placing additional restrictions on your usage of this software.
# Please refer to the pretix LICENSE file to obtain the full terms applicable to this work. If you did not receive
# this file, see <https://pretix.eu/about/en/license>.
#
# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
# details.
#
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
# <https://www.gnu.org/licenses/>.
#
import os
import platform
import sys
import zoneinfo
from datetime import datetime, timedelta
from django.conf import settings
from django.db.models import Count, Exists, F, Min, OuterRef, Q, Sum
from django.utils.formats import date_format
from django.utils.timezone import now
from reportlab.lib import pagesizes
from reportlab.lib.enums import TA_CENTER
from reportlab.lib.units import mm
from reportlab.platypus import Paragraph, Spacer, Table, TableStyle
from pretix import __version__
from pretix.base.models import Order, OrderPayment, Transaction
from pretix.base.plugins import get_all_plugins
from pretix.base.templatetags.money import money_filter
from pretix.plugins.reports.exporters import ReportlabExportMixin
from pretix.settings import DATA_DIR
class SysReport(ReportlabExportMixin):
@property
def pagesize(self):
return pagesizes.portrait(pagesizes.A4)
def __init__(self, start_month, tzname):
self.tzname = tzname
self.tz = zoneinfo.ZoneInfo(tzname)
self.start_month = start_month
def page_header(self, canvas, doc):
pass
def page_footer(self, canvas, doc):
from reportlab.lib.units import mm
canvas.setFont("OpenSans", 8)
canvas.drawString(15 * mm, 10 * mm, "Page %d" % doc.page)
canvas.drawRightString(
self.pagesize[0] - doc.rightMargin,
10 * mm,
"Created: %s"
% date_format(now().astimezone(self.tz), "SHORT_DATETIME_FORMAT"),
)
def render(self):
return "sysreport.pdf", "application/pdf", self.create({})
def get_story(self, doc, form_data):
headlinestyle = self.get_style()
headlinestyle.fontSize = 15
subheadlinestyle = self.get_style()
subheadlinestyle.fontSize = 13
style_small = self.get_style()
style_small.fontSize = 6
story = [
Paragraph("System report", headlinestyle),
Spacer(1, 5 * mm),
Paragraph("Usage", subheadlinestyle),
Spacer(1, 5 * mm),
self._usage_table(),
Spacer(1, 5 * mm),
Paragraph("Installed versions", subheadlinestyle),
Spacer(1, 5 * mm),
self._tech_table(),
Spacer(1, 5 * mm),
Paragraph("Plugins", subheadlinestyle),
Spacer(1, 5 * mm),
Paragraph(self._get_plugin_versions(), style_small),
Spacer(1, 5 * mm),
Paragraph("Custom templates", subheadlinestyle),
Spacer(1, 5 * mm),
Paragraph(self._get_custom_templates(), style_small),
Spacer(1, 5 * mm),
]
return story
def _tech_table(self):
style = self.get_style()
style.fontSize = 8
style_small = self.get_style()
style_small.fontSize = 6
w = self.pagesize[0] - 30 * mm
colwidths = [
a * w
for a in (
0.2,
0.8,
)
]
tstyledata = [
("VALIGN", (0, 0), (-1, -1), "TOP"),
("LEFTPADDING", (0, 0), (0, -1), 0),
("RIGHTPADDING", (-1, 0), (-1, -1), 0),
]
tdata = [
[Paragraph("Site URL:", style), Paragraph(settings.SITE_URL, style)],
[Paragraph("pretix version:", style), Paragraph(__version__, style)],
[Paragraph("Python version:", style), Paragraph(sys.version, style)],
[Paragraph("Platform:", style), Paragraph(platform.platform(), style)],
[
Paragraph("Database engine:", style),
Paragraph(settings.DATABASES["default"]["ENGINE"], style),
],
]
table = Table(tdata, colWidths=colwidths, repeatRows=0)
table.setStyle(TableStyle(tstyledata))
return table
def _usage_table(self):
style = self.get_style()
style.fontSize = 8
style_small = self.get_style()
style_small.fontSize = 6
style_small.leading = 8
style_small.alignment = TA_CENTER
style_small_head = self.get_style()
style_small_head.fontSize = 6
style_small_head.leading = 8
style_small_head.alignment = TA_CENTER
style_small_head.fontName = "OpenSansBd"
w = self.pagesize[0] - 30 * mm
successful = (
Q(status=Order.STATUS_PAID)
| Q(valid_if_pending=True, status=Order.STATUS_PENDING)
| Q(
Exists(
OrderPayment.objects.filter(
order_id=OuterRef("pk"),
state__in=(
OrderPayment.PAYMENT_STATE_CONFIRMED,
OrderPayment.PAYMENT_STATE_REFUNDED,
),
)
),
)
)
orders_q = Order.objects.filter(
successful,
testmode=False,
)
orders_testmode_q = Order.objects.filter(
testmode=True,
)
orders_unconfirmed_q = Order.objects.filter(
~successful,
testmode=False,
)
revenue_q = Transaction.objects.filter(
Exists(
OrderPayment.objects.filter(
order_id=OuterRef("order_id"),
state__in=(
OrderPayment.PAYMENT_STATE_CONFIRMED,
OrderPayment.PAYMENT_STATE_REFUNDED,
),
)
),
order__testmode=False,
)
currencies = sorted(
list(
set(
Transaction.objects.annotate(c=F("order__event__currency"))
.values_list("c", flat=True)
.distinct()
)
)
)
year_first = orders_q.aggregate(m=Min("datetime__year"))["m"]
if not year_first:
year_first = now().year
elif datetime.now().month - 1 <= self.start_month:
year_first -= 1
year_last = now().year
tdata = [
[
Paragraph(l, style_small_head)
for l in (
"Time frame",
"Currency",
"Successful orders",
"Net revenue",
"Testmode orders",
"Unsucessful orders",
"Positions",
"Gross revenue",
)
]
]
for year in range(year_first, year_last + 1):
for i, c in enumerate(currencies):
first_day = datetime(
year, self.start_month, 1, 0, 0, 0, 0, tzinfo=self.tz
)
after_day = datetime(
year + 1, self.start_month, 1, 0, 0, 0, 0, tzinfo=self.tz
)
orders_count = (
orders_q.filter(
datetime__gte=first_day, datetime__lt=after_day
).aggregate(c=Count("*"))["c"]
or 0
)
testmode_count = (
orders_testmode_q.filter(
datetime__gte=first_day, datetime__lt=after_day
).aggregate(c=Count("*"))["c"]
or 0
)
unconfirmed_count = (
orders_unconfirmed_q.filter(
datetime__gte=first_day, datetime__lt=after_day
).aggregate(c=Count("*"))["c"]
or 0
)
revenue_data = revenue_q.filter(
datetime__gte=first_day, datetime__lt=after_day, order__event__currency=c
).aggregate(
c=Sum("count"),
s_net=Sum(F("price") - F("tax_value")),
s_gross=Sum(F("price")),
)
tdata.append(
(
Paragraph(
date_format(first_day, "M Y")
+ " "
+ date_format(after_day - timedelta(days=1), "M Y"),
style_small,
),
Paragraph(c, style_small),
Paragraph(str(orders_count), style_small) if i == 0 else "",
Paragraph(money_filter(revenue_data.get("s_net") or 0, c), style_small),
Paragraph(str(testmode_count), style_small) if i == 0 else "",
Paragraph(str(unconfirmed_count), style_small) if i == 0 else "",
Paragraph(str(revenue_data.get("c") or 0), style_small),
Paragraph(money_filter(revenue_data.get("s_gross") or 0, c), style_small),
)
)
colwidths = [a * w for a in (0.18,) + (0.82 / 7,) * 7]
tstyledata = [
("VALIGN", (0, 0), (-1, -1), "TOP"),
("LEFTPADDING", (0, 0), (0, -1), 0),
("RIGHTPADDING", (-1, 0), (-1, -1), 0),
("TOPPADDING", (0, 0), (-1, -1), 0),
("BOTTOMPADDING", (0, 0), (-1, -1), 1),
]
table = Table(tdata, colWidths=colwidths, repeatRows=0)
table.setStyle(TableStyle(tstyledata))
return table
def _get_plugin_versions(self):
lines = []
for p in get_all_plugins():
lines.append(f"{p.name} {p.version}")
return ", ".join(lines)
def _get_custom_templates(self):
lines = []
for dirpath, dirnames, filenames in os.walk(
os.path.join(DATA_DIR, "templates")
):
for f in filenames:
lines.append(f"{dirpath}/{f}")
d = "<br/>".join(lines[:50])
if len(lines) > 50:
d += "<br/>..."
if not d:
return ""
return d

View File

@@ -1,35 +0,0 @@
{% extends "pretixcontrol/global_settings_base.html" %}
{% load i18n %}
{% load bootstrap3 %}
{% block inner %}
<p>
{% trans "If you have a pretix Enterprise license, this report must be submitted to pretix support when your license renews. It may also be requested by pretix support to aid debugging of problems." %}
{% trans "It serves two purposes: Collecting useful information that might help with debugging problems in your pretix installation, and verifying that your usage of pretix is in compliance with the Enterprise license you purchased." %}
</p>
<form method="post">
{% csrf_token %}
<p>
<label>
{% trans "First month of license term:" %}
<select name="month" class="form-control">
<option value="1">{% trans "January" %}</option>
<option value="2">{% trans "February" %}</option>
<option value="3">{% trans "March" %}</option>
<option value="4">{% trans "April" %}</option>
<option value="5">{% trans "May" %}</option>
<option value="6">{% trans "June" %}</option>
<option value="7">{% trans "July" %}</option>
<option value="8">{% trans "August" %}</option>
<option value="9">{% trans "September" %}</option>
<option value="10">{% trans "October" %}</option>
<option value="11">{% trans "November" %}</option>
<option value="11">{% trans "December" %}</option>
</select>
</label>
</p>
<button type="submit" class="btn btn-primary btn-lg">
{% trans "Generate report" %}
</button>
</form>
{% endblock %}

View File

@@ -56,7 +56,6 @@ urlpatterns = [
re_path(r'^global/settings/$', global_settings.GlobalSettingsView.as_view(), name='global.settings'),
re_path(r'^global/update/$', global_settings.UpdateCheckView.as_view(), name='global.update'),
re_path(r'^global/license/$', global_settings.LicenseCheckView.as_view(), name='global.license'),
re_path(r'^global/sysreport/$', global_settings.SysReportView.as_view(), name='global.sysreport'),
re_path(r'^global/message/$', global_settings.MessageView.as_view(), name='global.message'),
re_path(r'^logdetail/$', global_settings.LogDetailView.as_view(), name='global.logdetail'),
re_path(r'^logdetail/payment/$', global_settings.PaymentDetailView.as_view(), name='global.paymentdetail'),

View File

@@ -32,16 +32,14 @@
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under the License.
import importlib_metadata as metadata
from django.conf import settings
from django.contrib import messages
from django.http import HttpResponse, JsonResponse
from django.http import JsonResponse
from django.shortcuts import get_object_or_404, redirect, reverse
from django.utils.timezone import now
from django.utils.translation import gettext_lazy as _
from django.views import View
from django.views.generic import FormView, TemplateView
from pretix.base.i18n import language
from pretix.base.models import LogEntry, OrderPayment, OrderRefund
from pretix.base.services.update_check import check_result_table, update_check
from pretix.base.settings import GlobalSettingsObject
@@ -51,7 +49,6 @@ from pretix.control.forms.global_settings import (
from pretix.control.permissions import (
AdministratorPermissionRequiredMixin, StaffMemberRequiredMixin,
)
from pretix.control.sysreport import SysReport
class GlobalSettingsView(AdministratorPermissionRequiredMixin, FormView):
@@ -265,25 +262,3 @@ class LicenseCheckView(StaffMemberRequiredMixin, FormView):
))
return res
class SysReportView(AdministratorPermissionRequiredMixin, TemplateView):
template_name = 'pretixcontrol/global_sysreport.html'
def get(self, request, *args, **kwargs):
return super().get(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
with language("en"):
try:
month = int(request.POST.get("month"))
except ValueError:
return super().get(request, *args, **kwargs)
if month < 1 or month > 12:
return super().get(request, *args, **kwargs)
name, mime, data = SysReport(month, settings.TIME_ZONE).render()
resp = HttpResponse(data)
resp['Content-Type'] = mime
resp['Content-Disposition'] = 'inline; filename="{}"'.format(name)
resp._csp_ignore = True
return resp

View File

@@ -1323,8 +1323,6 @@ class ItemUpdateGeneral(ItemDetailMixin, EventPermissionRequiredMixin, MetaDataE
def plugin_forms(self):
forms = []
for rec, resp in item_forms.send(sender=self.request.event, item=self.item, request=self.request):
if not resp:
continue
if isinstance(resp, (list, tuple)):
forms.extend(resp)
else:

View File

@@ -4,7 +4,7 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-24 08:47+0000\n"
"PO-Revision-Date: 2024-06-19 16:00+0000\n"
"PO-Revision-Date: 2024-05-30 17:00+0000\n"
"Last-Translator: Nikolai <nikolai@lengefeldt.de>\n"
"Language-Team: Danish <https://translate.pretix.eu/projects/pretix/pretix/da/"
">\n"
@@ -186,12 +186,12 @@ msgstr ""
#: pretix/api/models.py:118 pretix/base/models/devices.py:123
#: pretix/base/models/organizer.py:264
msgid "All events (including newly created ones)"
msgstr "Alle arrangementer (inkl. nyoprettede begivenheder)"
msgstr "Alle arrangementer (inkl. nyligt oprettede)"
#: pretix/api/models.py:119 pretix/base/models/devices.py:124
#: pretix/base/models/organizer.py:265
msgid "Limit to events"
msgstr "Vis kun arrangementer"
msgstr "Begræns til arrangementer"
#: pretix/api/models.py:120 pretix/base/exporters/orderlist.py:283
#: pretix/base/exporters/orderlist.py:1049
@@ -1278,7 +1278,7 @@ msgstr "Dato"
#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:43
#: pretix/presale/templates/pretixpresale/organizers/customer_profile.html:70
msgid "Order code"
msgstr "Bestillingsnr."
msgstr "Bestillingskode"
#: pretix/base/exporters/invoices.py:202 pretix/base/exporters/invoices.py:329
#: pretix/base/modelimport_orders.py:60 pretix/base/models/customers.py:384
@@ -3175,7 +3175,7 @@ msgstr "Faktura til"
#: pretix/base/invoice.py:401 pretix/base/invoice.py:951
msgctxt "invoice"
msgid "Order code"
msgstr "Bestillingsnr."
msgstr "Bestillingskode"
#: pretix/base/invoice.py:410 pretix/base/invoice.py:964
msgctxt "invoice"
@@ -11468,7 +11468,7 @@ msgstr "Arrangement:"
#: pretix/base/templates/pretixbase/email/order_details.html:26
#: pretix/base/templates/pretixbase/email/order_details.html:77
msgid "Order code:"
msgstr "Bestillingsnr.:"
msgstr "Bestillingskode:"
#: pretix/base/templates/pretixbase/email/order_details.html:31
msgid "created by"
@@ -14949,10 +14949,9 @@ msgid "The order has been reactivated."
msgstr "Bestilling oprettet."
#: pretix/control/logdisplay.py:390
#, python-brace-format
#, fuzzy, python-brace-format
msgid "The test mode order {code} has been deleted."
msgstr ""
"Bestillingen {code}, der blev oprettet under testmodus, er blevet slettet."
msgstr "Den valgte dato er blevet slettet."
#: pretix/control/logdisplay.py:391
msgid "The order has been created."
@@ -27562,7 +27561,7 @@ msgstr ""
#: pretix/plugins/reports/exporters.py:246
msgctxt "export_category"
msgid "Analysis"
msgstr "Analyse"
msgstr ""
#: pretix/plugins/reports/accountingreport.py:82
#, fuzzy
@@ -27660,8 +27659,9 @@ msgid "(excl. taxes)"
msgstr "inkl. %(rate)s%% moms"
#: pretix/plugins/reports/exporters.py:275
#, fuzzy
msgid "(incl. taxes)"
msgstr "(inkl. moms)"
msgstr "inkl. %(rate)s%% moms"
#: pretix/plugins/reports/exporters.py:285
#: pretix/plugins/reports/exporters.py:304

View File

@@ -5,8 +5,8 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-24 08:47+0000\n"
"PO-Revision-Date: 2024-06-18 20:00+0000\n"
"Last-Translator: Thilo-Alexander Ginkel <tg@tgbyte.de>\n"
"PO-Revision-Date: 2024-06-06 19:00+0000\n"
"Last-Translator: Mira <weller@rami.io>\n"
"Language-Team: German <https://translate.pretix.eu/projects/pretix/pretix/de/"
">\n"
"Language: de\n"
@@ -6357,7 +6357,7 @@ msgid ""
"The seat \"{id}\" is currently unavailable (blocked, already sold or a "
"different voucher)."
msgstr ""
"Der Sitzplatz \"{id}\" ist aktuell nicht verfügbar (blockiert, bereits "
"Der Sitzplatz \"{id}\" ist derzeit nicht verfügbar (blockiert, bereits "
"verkauft, oder einem anderen Gutschein zugewiesen)."
#: pretix/base/models/waitinglist.py:64
@@ -6390,7 +6390,7 @@ msgstr "Das ausgewählte Produkt ist im Moment nicht verfügbar."
#: pretix/base/models/waitinglist.py:186
msgid "No seat with this product is currently available."
msgstr "Es ist aktuell kein Sitzplatz mit diesem Produkt verfügbar."
msgstr "Es ist derzeit kein Sitzplatz mit diesem Produkt verfügbar."
#: pretix/base/models/waitinglist.py:189
msgid "A voucher has already been sent to this person."
@@ -6786,9 +6786,9 @@ msgid ""
"Create an invoice for orders using bank transfer immediately if the event is "
"otherwise configured to create invoices after payment is completed."
msgstr ""
"Generiere Rechnungen für Bestellungen die Banküberweisung als "
"Zahlungsmethode nutzen sofort, auch wenn die Veranstaltung konfiguriert ist "
"Rechnungen erst nach Zahlungseingang zu generieren."
"Generiere Rechnungen für Bestellungen die Bankeinzug als Zahlungsmethode "
"nutzen sofort, auch wenn die Veranstaltung konfiguriert ist Rechnungen erst "
"nach Zahlungseingang zu generieren."
#: pretix/base/payment.py:1260
msgid "Offsetting"
@@ -33115,7 +33115,7 @@ msgid ""
"There are currently no products available that can be bought with this "
"voucher."
msgstr ""
"Es sind aktuell keine Produkte verfügbar, die mit diesem Gutschein gebucht "
"Es sind derzeit keine Produkte verfügbar, die mit diesem Gutschein gebucht "
"werden können."
#: pretix/presale/templates/pretixpresale/event/voucher.html:52

View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-24 08:47+0000\n"
"PO-Revision-Date: 2024-06-18 20:00+0000\n"
"Last-Translator: Thilo-Alexander Ginkel <tg@tgbyte.de>\n"
"PO-Revision-Date: 2024-06-06 19:00+0000\n"
"Last-Translator: Mira <weller@rami.io>\n"
"Language-Team: German (informal) <https://translate.pretix.eu/projects/"
"pretix/pretix/de_Informal/>\n"
"Language: de_Informal\n"
@@ -6350,7 +6350,7 @@ msgid ""
"The seat \"{id}\" is currently unavailable (blocked, already sold or a "
"different voucher)."
msgstr ""
"Der Sitzplatz \"{id}\" ist aktuell nicht verfügbar (blockiert, bereits "
"Der Sitzplatz \"{id}\" ist derzeit nicht verfügbar (blockiert, bereits "
"verkauft, oder einem anderen Gutschein zugewiesen)."
#: pretix/base/models/waitinglist.py:64
@@ -6383,7 +6383,7 @@ msgstr "Das ausgewählte Produkt ist im Moment nicht verfügbar."
#: pretix/base/models/waitinglist.py:186
msgid "No seat with this product is currently available."
msgstr "Es ist aktuell kein Sitzplatz mit diesem Produkt verfügbar."
msgstr "Es ist derzeit kein Sitzplatz mit diesem Produkt verfügbar."
#: pretix/base/models/waitinglist.py:189
msgid "A voucher has already been sent to this person."
@@ -6778,9 +6778,9 @@ msgid ""
"Create an invoice for orders using bank transfer immediately if the event is "
"otherwise configured to create invoices after payment is completed."
msgstr ""
"Generiere Rechnungen für Bestellungen die Banküberweisung als "
"Zahlungsmethode nutzen sofort, auch wenn die Veranstaltung konfiguriert ist "
"Rechnungen erst nach Zahlungseingang zu generieren."
"Generiere Rechnungen für Bestellungen die Bankeinzug als Zahlungsmethode "
"nutzen sofort, auch wenn die Veranstaltung konfiguriert ist Rechnungen erst "
"nach Zahlungseingang zu generieren."
#: pretix/base/payment.py:1260
msgid "Offsetting"
@@ -33053,7 +33053,7 @@ msgid ""
"There are currently no products available that can be bought with this "
"voucher."
msgstr ""
"Es sind aktuell keine Produkte verfügbar, die mit diesem Gutschein gebucht "
"Es sind derzeit keine Produkte verfügbar, die mit diesem Gutschein gebucht "
"werden können."
#: pretix/presale/templates/pretixpresale/event/voucher.html:52

View File

@@ -4,8 +4,8 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-24 08:47+0000\n"
"PO-Revision-Date: 2024-06-18 20:00+0000\n"
"Last-Translator: simonD <simon.dalvy@gmail.com>\n"
"PO-Revision-Date: 2024-06-08 18:00+0000\n"
"Last-Translator: alemairebe <adrien@alemaire.be>\n"
"Language-Team: French <https://translate.pretix.eu/projects/pretix/pretix/fr/"
">\n"
"Language: fr\n"
@@ -85,7 +85,7 @@ msgstr "Letton"
#: pretix/_base_settings.py:95
msgid "Norwegian Bokmål"
msgstr "Norvégien Bokmål"
msgstr ""
#: pretix/_base_settings.py:96
msgid "Polish"
@@ -158,8 +158,10 @@ msgid "Allowed URIs list, space separated"
msgstr "Liste des URI autorisées, séparées par des espaces"
#: pretix/api/models.py:47
#, fuzzy
#| msgid "Allowed URIs list, space separated"
msgid "Allowed Post Logout URIs list, space separated"
msgstr "Liste des URI de déconnexion autorisées, séparées par des espaces"
msgstr "Liste des URI autorisées, séparées par des espaces"
#: pretix/api/models.py:51 pretix/base/models/customers.py:395
#: pretix/plugins/paypal/payment.py:113 pretix/plugins/paypal2/payment.py:108
@@ -311,8 +313,10 @@ msgid "This type of question cannot be asked during check-in."
msgstr "Ce genre de questions ne peut pas être posé lors de l'enregistrement."
#: pretix/api/serializers/item.py:493 pretix/control/forms/item.py:143
#, fuzzy
#| msgid "This type of question cannot be asked during check-in."
msgid "This type of question cannot be shown during check-in."
msgstr "Ce type de questions ne peut pas être affiché lors de l'enregistrement."
msgstr "Ce genre de questions ne peut pas être posé lors de l'enregistrement."
#: pretix/api/serializers/media.py:108
msgid ""
@@ -457,7 +461,7 @@ msgstr "Commande modifiée"
#: pretix/api/webhooks.py:266
msgid "Refund of payment created"
msgstr "Le remboursement du paiement a été réalisé"
msgstr "Le remboursement de la paiement a été fait"
#: pretix/api/webhooks.py:270 pretix/base/notifications.py:293
msgid "External refund of payment"
@@ -465,15 +469,15 @@ msgstr "Remboursement externe du paiement"
#: pretix/api/webhooks.py:274
msgid "Refund of payment requested by customer"
msgstr "Un remboursement a été demandé par le.a client.e"
msgstr "Une remboursement a été demandé par le.a client.e"
#: pretix/api/webhooks.py:278
msgid "Refund of payment completed"
msgstr "Remboursement du paiement effectué"
msgstr "Paiement effectué"
#: pretix/api/webhooks.py:282
msgid "Refund of payment canceled"
msgstr "Le remboursement a été annulé"
msgstr "La remboursement a été annulée"
#: pretix/api/webhooks.py:286
msgid "Refund of payment failed"
@@ -1199,8 +1203,8 @@ msgid ""
msgstr ""
"N'incluez que les factures pour les commandes qui ont au moins une tentative "
"de paiement par ce fournisseur de paiement. Notez que cela peut inclure "
"certaines factures de commandes qui ont été payées partiellement ou "
"totalement par un autre fournisseur de paiement."
"certaines factures d'ordres qui ont été pa partiellement ou totalement par "
"un autre fournisseur de paiement."
#: pretix/base/exporters/invoices.py:126
msgid "All invoices"
@@ -1740,8 +1744,10 @@ msgstr "Nécessite une attention particulière"
#: pretix/base/exporters/items.py:91 pretix/base/exporters/orderlist.py:282
#: pretix/base/models/items.py:590 pretix/base/models/items.py:1155
#: pretix/base/models/orders.py:288
#, fuzzy
#| msgid "Check-in time"
msgid "Check-in text"
msgstr "Texte d'enregistrement"
msgstr "Heure du check-in"
#: pretix/base/exporters/items.py:92 pretix/base/models/items.py:595
#: pretix/base/models/items.py:1080
@@ -1827,7 +1833,7 @@ msgstr "frais de la commande"
#: pretix/base/exporters/orderlist.py:109
msgid "Only paid orders"
msgstr "Seulement les commandes payées"
msgstr "Seulement les ordres payés"
#: pretix/base/exporters/orderlist.py:115
msgid "Include payment amounts"
@@ -1919,7 +1925,7 @@ msgstr "Total de la commande"
#: pretix/presale/templates/pretixpresale/organizers/customer_profile.html:75
#: pretix/presale/templates/pretixpresale/organizers/index.html:47
msgid "Status"
msgstr "État"
msgstr "Statut"
#: pretix/base/exporters/orderlist.py:260
#: pretix/base/exporters/orderlist.py:443
@@ -2679,7 +2685,7 @@ msgstr "Tous"
#: pretix/base/exporters/orderlist.py:1278 pretix/control/forms/filter.py:1343
msgid "Live"
msgstr "En ligne"
msgstr "En direct"
#: pretix/base/exporters/orderlist.py:1287 pretix/control/forms/filter.py:1351
#: pretix/control/templates/pretixcontrol/pdf/index.html:252
@@ -2750,6 +2756,8 @@ msgid "Reusable media"
msgstr "Support réutilisable"
#: pretix/base/exporters/reusablemedia.py:35
#, fuzzy
#| msgid "Reusable media"
msgctxt "export_category"
msgid "Reusable media"
msgstr "Support réutilisable"
@@ -2876,7 +2884,7 @@ msgstr "code de réduction"
#: pretix/base/forms/__init__.py:118
#, python-brace-format
msgid "You can use {markup_name} in this field."
msgstr "Vous pouvez utiliser {markup_name} dans ce champ."
msgstr ""
#: pretix/base/forms/__init__.py:178
#, python-format
@@ -3610,11 +3618,10 @@ msgid "Price mode"
msgstr "Mode prix"
#: pretix/base/modelimport_vouchers.py:150
#, python-brace-format
#, fuzzy, python-brace-format
#| msgid "Could not parse {value} as a date and time."
msgid "Could not parse {value} as a price mode, use one of {options}."
msgstr ""
"Impossible d'analyser {value} en tant que mode de prix, utilisez l'une des "
"{options}."
msgstr "Impossible danalyser {value} comme date et heure."
#: pretix/base/modelimport_vouchers.py:160 pretix/base/models/vouchers.py:245
msgid "Voucher value"
@@ -3622,7 +3629,7 @@ msgstr "Valeur du bon"
#: pretix/base/modelimport_vouchers.py:165
msgid "It is pointless to set a value without a price mode."
msgstr "Il est inutile de fixer une valeur sans mode de prix."
msgstr ""
#: pretix/base/modelimport_vouchers.py:237 pretix/base/models/items.py:1998
#: pretix/base/models/vouchers.py:272
@@ -3632,8 +3639,12 @@ msgid "Quota"
msgstr "Quota"
#: pretix/base/modelimport_vouchers.py:253
#, fuzzy
#| msgid "You cannot select a quota and a specific product at the same time."
msgid "You cannot specify a quota if you specified a product."
msgstr "Vous ne pouvez pas spécifier un quota si vous avez spécifié un produit."
msgstr ""
"Vous ne pouvez pas sélectionner simultanément un quota et un produit "
"spécifique."
#: pretix/base/modelimport_vouchers.py:282 pretix/base/models/vouchers.py:495
msgid "You need to choose a date if you select a seat."
@@ -3680,14 +3691,12 @@ msgstr ""
"ce bon"
#: pretix/base/models/auth.py:248
#, fuzzy
msgid "Is active"
msgstr "Actif"
msgstr "Est actif"
#: pretix/base/models/auth.py:250
#, fuzzy
msgid "Is site admin"
msgstr "Administrateur du site"
msgstr "Est administrateur du site"
#: pretix/base/models/auth.py:252
msgid "Date joined"
@@ -3900,8 +3909,10 @@ msgid "Ticket blocked"
msgstr "Billet bloqué"
#: pretix/base/models/checkin.py:370
#, fuzzy
#| msgid "Order approved"
msgid "Order not approved"
msgstr "Commande non validée"
msgstr "Commande approuvé"
#: pretix/base/models/checkin.py:371
msgid "Ticket not valid at this time"
@@ -4007,9 +4018,8 @@ msgstr "Cet identificateur est déjà utilisé pour une autre question."
#: pretix/control/templates/pretixcontrol/checkin/checkins.html:67
#: pretix/control/templates/pretixcontrol/organizers/gates.html:16
#: pretix/plugins/checkinlists/exporters.py:754
#, fuzzy
msgid "Gate"
msgstr "Pont"
msgstr "Porte"
#: pretix/base/models/devices.py:132
#: pretix/control/templates/pretixcontrol/organizers/devices.html:83
@@ -4871,8 +4881,6 @@ msgid ""
"This text will be shown by the check-in app if a ticket of this type is "
"scanned."
msgstr ""
"Ce texte sera affiché par l'application de \"check-in\" si un billet de ce "
"type est scanné."
#: pretix/base/models/items.py:598 pretix/base/models/items.py:1083
msgid ""
@@ -6062,11 +6070,11 @@ msgstr "Possibilité de modifier les paramètres du produit"
#: pretix/base/models/organizer.py:309
msgid "Can view orders"
msgstr "Peut afficher les commandes"
msgstr "Peut afficher les ordres"
#: pretix/base/models/organizer.py:313
msgid "Can change orders"
msgstr "Possibilité de modifier les commandes"
msgstr "Possibilité de modifier les ordres"
#: pretix/base/models/organizer.py:317
msgid "Can perform check-ins"
@@ -7506,15 +7514,17 @@ msgstr ""
"dans la quantité sélectionnée. Voir ci-dessous pour plus de détails."
#: pretix/base/services/cart.py:122
#, python-format
#, fuzzy, python-format
#| msgid ""
#| "Some of the products you selected are no longer available in the quantity "
#| "you selected. Please see below for details."
msgid ""
"Some of the products you selected are no longer available in the quantity "
"you selected. The following products are affected and have not been added to "
"your cart: %s"
msgstr ""
"Certains des produits que vous avez sélectionnés ne sont plus disponibles "
"dans la quantité sélectionnée. Les produits suivants sont concernés et n'ont "
"pas été ajoutés à votre panier : %s"
"dans la quantité sélectionnée. Voir ci-dessous pour plus de détails."
#: pretix/base/services/cart.py:127
#, python-format
@@ -8851,7 +8861,7 @@ msgid ""
"recommended!)"
msgstr ""
"Afficher les prix nets au lieu des prix bruts dans la liste de produits (pas "
"recommandé!)"
"recommandé!)"
#: pretix/base/settings.py:326
msgid ""
@@ -9192,9 +9202,8 @@ msgstr ""
"visiblement"
#: pretix/base/settings.py:720 pretix/base/settings.py:731
#, fuzzy
msgid "Only respected by some invoice renderers."
msgstr "Seulement respecté par certains générateurs de factures."
msgstr "Seulement respecté par certains exécutants de factures."
#: pretix/base/settings.py:730 pretix/base/settings.py:2847
#: pretix/control/templates/pretixcontrol/pdf/index.html:352
@@ -9735,8 +9744,10 @@ msgstr ""
"réattribué à la personne suivante sur la liste."
#: pretix/base/settings.py:1407
#, fuzzy
#| msgid "Enable waiting list"
msgid "Disable waiting list"
msgstr "Désactiver la liste d'attente"
msgstr "Activer la liste d'attente"
#: pretix/base/settings.py:1408
msgid ""
@@ -9746,11 +9757,6 @@ msgid ""
"still people on the waiting list. Vouchers that have already been sent "
"remain active."
msgstr ""
"Après cette date, la liste d'attente sera entièrement désactivée. Cela "
"signifie que plus personne ne pourra s'inscrire sur la liste d'attente, mais "
"que les billets seront à nouveau disponibles à la vente si les quotas le "
"permettent, même s'il y a encore des personnes sur la liste d'attente. Les "
"bons déjà envoyés restent actifs."
#: pretix/base/settings.py:1420
msgid "Ask for a name"
@@ -10092,9 +10098,6 @@ msgid ""
"Allow changes regardless of price, as long as no refund is required (i.e. "
"the resulting price is not lower than what has already been paid)."
msgstr ""
"Autoriser les modifications quel que soit le prix, à condition qu'aucun "
"remboursement ne soit exigé (c'est-à-dire que le prix obtenu ne soit pas "
"inférieur à celui qui a déjà été payé)."
#: pretix/base/settings.py:1732 pretix/base/settings.py:1743
msgid "Allow changes regardless of price, even if this results in a refund."
@@ -10587,16 +10590,17 @@ msgid ""
msgstr ""
"Bonjour\n"
"\n"
"Nous avons reçu avec succès votre commande pour l'événement {event}.\n"
"Votre commande nécessite lapprobation de lorganisateur de lévénement,\n"
"nous vous demandons d'être patient, nous vous recontacterons sous peu par "
"e-mail.\n"
"Nous avons reçu avec succès votre commande pour {event}. Depuis que vous "
"avez commandé\n"
"un produit qui nécessite lapprobation de lorganisateur de lévénement, "
"nous vous demandons de\n"
"Soyez patient et attendez notre prochain e-mail.\n"
"\n"
"Vous pouvez modifier les détails de votre commande et consulter son état à l"
"adresse suivante :\n"
"Vous pouvez modifier les détails de votre commande et consulter létat de "
"votre commande à ladresse\n"
"{url}\n"
"\n"
"Sincères salutations\n"
"Sinceres salutations \n"
"Votre équipe {event}"
#: pretix/base/settings.py:2243
@@ -11049,16 +11053,17 @@ msgid ""
msgstr ""
"Bonjour\n"
"\n"
"Nous avons approuvé votre commande pour l'événement {event} \n"
"et serons heureux de vous accueillir à cette occasion.\n"
"Nous avons approuvé votre commande pour {event} et serons heureux de vous "
"accueillir\n"
"lors de notre événement.\n"
"\n"
"Veuillez continuer en payant votre commande avant le {expire_date}.\n"
"Veuillez continuer en payant votre commande avant {expire_date}.\n"
"\n"
"Vous pouvez sélectionner un mode de paiement et effectuer le paiement ici:\n"
"\n"
"Vous pouvez sélectionner un mode de paiement et effectuer le paiement à l"
"adresse suivante :\n"
"{url}\n"
"\n"
"Sincères salutations\n"
"Sinceres salutations \n"
"Votre équipe {event}"
#: pretix/base/settings.py:2526 pretix/base/settings.py:2563
@@ -11105,16 +11110,16 @@ msgid ""
msgstr ""
"Bonjour\n"
"\n"
"Nous avons approuvé votre commande pour l'événement {event}\n"
"et serons heureux de vous accueillir\n"
"Votre commande ne comprend que des produits gratuits, \n"
"aucun paiement nest requis.\n"
"Nous avons approuvé votre commande pour {event} et serons heureux de vous "
"accueillir\n"
"lors de notre événement. Comme vous navez commandé que des produits "
"gratuits, aucun paiement nest requis.\n"
"\n"
"Vous pouvez modifier les détails de votre commande et consulter son état à l"
"adresse suivante :\n"
"Vous pouvez modifier les détails de votre commande et consulter létat de "
"votre commande à ladresse\n"
"{url}\n"
"\n"
"Sincères salutations\n"
"Sinceres salutations \n"
"Votre équipe {event}"
#: pretix/base/settings.py:2575
@@ -12583,9 +12588,11 @@ msgid "Customers can no longer cancel paid orders"
msgstr "Les clients ne peuvent plus annuler les commandes payées"
#: pretix/base/timeline.py:167
#, fuzzy
#| msgid "Waiting list entry deleted"
msgctxt "timeline"
msgid "Waiting list is disabled"
msgstr "La liste d'attente est désactivée"
msgstr "Suppression d'une inscription de la liste d'attente"
#: pretix/base/timeline.py:181
msgctxt "timeline"
@@ -13281,8 +13288,9 @@ msgid ""
"Our regular widget doesn't work in all website builders. If you run into "
"trouble, try using this compatibility mode."
msgstr ""
"Notre widget standard ne fonctionne pas avec tous les sites Web. Si vous "
"rencontrez des problèmes, essayez d'utiliser ce mode de compatibilité."
"Notre widget régulier ne fonctionne pas chez tous les constructeurs de sites "
"Web. Si vous rencontrez des problèmes, essayez d'utiliser ce mode de "
"compatibilité."
#: pretix/control/forms/event.py:1574
msgid "The given voucher code does not exist."
@@ -13620,7 +13628,7 @@ msgstr "jour de semaine"
#: pretix/control/forms/filter.py:1953 pretix/control/forms/filter.py:1955
#: pretix/control/forms/filter.py:2523 pretix/control/forms/filter.py:2525
msgid "Search query"
msgstr "Recherche"
msgstr "Requête de recherche"
#: pretix/control/forms/filter.py:1423 pretix/control/forms/filter.py:1496
#: pretix/control/templates/pretixcontrol/organizers/customer.html:45
@@ -18190,7 +18198,7 @@ msgstr ""
"Les e-mails seront envoyés via le serveur par défaut du système, mais avec "
"votre propre adresse dexpéditeur. Cela rendra vos e-mails plus "
"personnalisés et provenant directement de vous, mais cela pourrait également "
"nécessiter des étapes supplémentaires pour assurer une bonne déliverabilité."
"nécessiter des étapes supplémentaires pour assurer une bonne délivrabilité."
#: pretix/control/templates/pretixcontrol/email_setup.html:84
#: pretix/control/templates/pretixcontrol/email_setup_smtp.html:18
@@ -18723,7 +18731,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/event/live.html:51
#: pretix/control/templates/pretixcontrol/event/live.html:65
msgid "Go live"
msgstr "Publier"
msgstr "En direct"
#: pretix/control/templates/pretixcontrol/event/live.html:59
msgid "If you want to, you can publish your ticket shop now."
@@ -18780,7 +18788,7 @@ msgid ""
msgstr ""
"En outre, le mode test ne couvre que la boutique en ligne principale. Les "
"commandes créées via dautres canaux de vente tels que le module billetterie "
"ou revendeurs sont toujours créées en tant que commande de production."
"ou revendeurs sont toujours créées en tant quordres de fabrication."
#: pretix/control/templates/pretixcontrol/event/live.html:112
msgid ""
@@ -19246,7 +19254,7 @@ msgstr "Nom et adresse"
#: pretix/control/templates/pretixcontrol/event/settings.html:88
msgid "See invoice settings"
msgstr "Voir les paramètres de facturation"
msgstr "Voir les paramètre de facturation"
#: pretix/control/templates/pretixcontrol/event/settings.html:94
msgid "Attendee data (once per personalized ticket)"
@@ -19317,7 +19325,7 @@ msgstr "Affichage"
#, fuzzy
#| msgid "Product history"
msgid "Product list"
msgstr "Liste de produits"
msgstr "Historique du produit"
#: pretix/control/templates/pretixcontrol/event/settings.html:248
#, fuzzy
@@ -21170,9 +21178,9 @@ msgid ""
"If you chose \"split into new order\" for multiple positions, they will be "
"all split in one second order together, not multiple orders."
msgstr ""
"Si vous choisissez \" diviser en nouvelle commande \" pour plusieurs "
"positions, elles seront toutes divisées en une seule seconde commande "
"ensemble, et non en plusieurs commandes."
"Si vous choisissez \" diviser en nouvel ordre \" pour plusieurs positions, "
"elles seront toutes divisées en un seul second ordre ensemble, et non en "
"plusieurs ordres."
#: pretix/control/templates/pretixcontrol/order/change.html:48
msgid ""
@@ -22588,8 +22596,10 @@ msgstr "Sélectionner une action"
#: pretix/control/templates/pretixcontrol/orders/index.html:306
#: pretix/control/views/orders.py:332
#, fuzzy
#| msgid "Refund full paid amount"
msgid "Refund overpaid amount"
msgstr "Remboursement du trop-perçu"
msgstr "Remboursement du montant total payé"
#: pretix/control/templates/pretixcontrol/orders/index.html:314
#: pretix/control/views/orders.py:317
@@ -25001,9 +25011,8 @@ msgid "Generate 2FA emergency token"
msgstr "Générer de nouveaux tokens d'urgence"
#: pretix/control/templates/pretixcontrol/users/form.html:22
#, fuzzy
msgid "Impersonate user"
msgstr "Voir le site comme cet utilisateur"
msgstr "Utilisateur usurpé"
#: pretix/control/templates/pretixcontrol/users/form.html:42
msgid "Authentication backend"
@@ -25459,7 +25468,7 @@ msgid ""
"global settings to change them for all your organizers or you can unlock "
"them to change them for this event individually."
msgstr ""
"Ces paramètres sont actuellement définis au niveau global. De cette façon, "
"Ces paramètres sont actuellement définis au niveau mondial. De cette façon, "
"vous pouvez facilement les modifier pour tous les organisateurs en même "
"temps. Vous pouvez accéder aux paramètres globaux pour les modifier pour "
"tous vos organisateurs ou les déverrouiller pour les modifier "
@@ -25653,7 +25662,7 @@ msgstr "en ligne"
#: pretix/control/views/dashboards.py:271
msgid "live and in test mode"
msgstr "en production et en mode test"
msgstr "en direct et en mode test"
#: pretix/control/views/dashboards.py:272
msgid "not yet public"
@@ -30234,7 +30243,7 @@ msgstr "Compte Stripe"
#: pretix/plugins/stripe/payment.py:258
msgctxt "stripe"
msgid "Live"
msgstr "En ligne"
msgstr "En direct"
#: pretix/plugins/stripe/payment.py:259
msgctxt "stripe"
@@ -30251,7 +30260,7 @@ msgstr ""
#: pretix/plugins/stripe/payment.py:274
msgid "Publishable key"
msgstr "Clé publique"
msgstr "Clé publiable"
#: pretix/plugins/stripe/payment.py:277
#, fuzzy
@@ -30750,7 +30759,7 @@ msgstr "Stripe Connect : clé secrète"
#: pretix/plugins/stripe/signals.py:137
msgid "Stripe Connect: Publishable key"
msgstr "Stripe Connect : clé publique"
msgstr "Stripe Connect : clé publiable"
#: pretix/plugins/stripe/signals.py:144
msgid "Stripe Connect: Secret key (test)"
@@ -30758,7 +30767,7 @@ msgstr "Stripe Connect : clé secrète (test)"
#: pretix/plugins/stripe/signals.py:151
msgid "Stripe Connect: Publishable key (test)"
msgstr "Stripe Connect : clé publique (test)"
msgstr "Stripe Connect : clé publiable (test)"
#: pretix/plugins/stripe/signals.py:177
#: pretix/plugins/stripe/templates/pretixplugins/stripe/oauth_disconnect.html:3
@@ -31513,17 +31522,23 @@ msgstr "Avertissement"
#: pretix/presale/templates/pretixpresale/event/base.html:116
#: pretix/presale/templates/pretixpresale/event/base.html:190
#, fuzzy
#| msgid "This ticket shop is currently disabled."
msgid "This ticket shop is currently in test mode."
msgstr "Cette billetterie est actuellement en mode test."
msgstr "Cette billetterie est actuellement désactivée."
#: pretix/presale/templates/pretixpresale/event/base.html:119
#: pretix/presale/templates/pretixpresale/event/base.html:193
#, fuzzy
#| msgid ""
#| "This ticket shop is currently in test mode. Please do not perform any "
#| "real purchases as your order might be deleted without notice."
msgid ""
"Please do not perform any real purchases as your order might be deleted "
"without notice."
msgstr ""
"Veuillez ne pas effectuer dachats réels car votre commande pourrait être "
"supprimée sans préavis."
"Cette billetterie est actuellement en mode test. Veuillez ne pas effectuer "
"dachats réels car votre commande pourrait être supprimée sans préavis."
#: pretix/presale/templates/pretixpresale/event/base.html:123
#, python-format
@@ -31531,8 +31546,6 @@ msgid ""
"You are currently using the time machine. The ticket shop is rendered as if "
"it were %(datetime)s."
msgstr ""
"Vous utilisez actuellement la time machine. La boutique de billets est "
"présentée comme s'il était le %(datetime)s."
#: pretix/presale/templates/pretixpresale/event/base.html:131
#: pretix/presale/templates/pretixpresale/event/base.html:141
@@ -34174,10 +34187,12 @@ msgstr ""
"total."
#: pretix/presale/views/order.py:1635
#, fuzzy
#| msgid "You may not change your order in a way that reduces the total price."
msgid "You may not change your order in a way that would require a refund."
msgstr ""
"Vous ne pouvez pas modifier votre commande d'une manière qui nécessiterait "
"un remboursement."
"Vous ne pouvez pas modifier votre commande dune manière qui réduit le prix "
"total."
#: pretix/presale/views/order.py:1643
msgid ""
@@ -34235,13 +34250,16 @@ msgstr ""
"actuellement disponible."
#: pretix/presale/views/waiting.py:141
#, python-brace-format
#, fuzzy, python-brace-format
#| msgid ""
#| "We've added you to the waiting list. You will receive an email as soon as "
#| "this product gets available again."
msgid ""
"We've added you to the waiting list. We will send an email to {email} as "
"soon as this product gets available again."
msgstr ""
"Nous vous avons ajouté à la liste d'attente. Vous recevrez un email à "
"l'adresse {email} dès que ce produit sera de nouveau disponible."
"Nous vous avons ajouté à la liste d'attente. Vous recevrez un email dès que "
"les billets seront de nouveau disponibles."
#: pretix/presale/views/waiting.py:169
msgid "We could not find you on our waiting list."

View File

@@ -7,8 +7,8 @@ msgstr ""
"Project-Id-Version: French\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-08 13:19+0000\n"
"PO-Revision-Date: 2024-06-12 03:00+0000\n"
"Last-Translator: simonD <simon.dalvy@gmail.com>\n"
"PO-Revision-Date: 2023-09-11 10:00+0000\n"
"Last-Translator: Ronan LE MEILLAT <ronan.le_meillat@highcanfly.club>\n"
"Language-Team: French <https://translate.pretix.eu/projects/pretix/pretix-js/"
"fr/>\n"
"Language: fr\n"
@@ -16,7 +16,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 5.5.5\n"
"X-Generator: Weblate 4.18.2\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
@@ -305,7 +305,7 @@ msgstr "Le code du billet est ambigu dans la liste"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:65
msgid "Order not approved"
msgstr "Commande non validée"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:66
msgid "Checked-in Tickets"
@@ -433,7 +433,7 @@ msgstr "est après"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:40
msgid "="
msgstr "="
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:99
msgid "Product"
@@ -444,9 +444,8 @@ msgid "Product variation"
msgstr "Variation du produit"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:107
#, fuzzy
msgid "Gate"
msgstr "Pont"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:111
msgid "Current date and time"
@@ -472,13 +471,13 @@ msgstr "Nombre d'entrées depuis minuit"
#, fuzzy
#| msgid "Number of previous entries"
msgid "Number of previous entries since"
msgstr "Nombre d'entrées précédentes depuis"
msgstr "Nombre d'entrées précédentes"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:135
#, fuzzy
#| msgid "Number of previous entries"
msgid "Number of previous entries before"
msgstr "Nombre d'entrées précédentes avant"
msgstr "Nombre d'entrées précédentes"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:139
msgid "Number of days with a previous entry"
@@ -643,7 +642,7 @@ msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:475
#: pretix/static/pretixcontrol/js/ui/main.js:495
msgid "Search query"
msgstr "Recherche"
msgstr "Requête de recherche"
#: pretix/static/pretixcontrol/js/ui/main.js:493
msgid "All"
@@ -662,9 +661,8 @@ msgid "Enter page number between 1 and %(max)s."
msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:831
#, fuzzy
msgid "Invalid page number."
msgstr "Numéro de page invalide."
msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:989
msgid "Use a different name internally"
@@ -857,10 +855,9 @@ msgid "Not yet available"
msgstr "Méthode de paiement non disponible"
#: pretix/static/pretixpresale/js/widget/widget.js:36
#, fuzzy
msgctxt "widget"
msgid "Not available anymore"
msgstr "Méthode de paiement plus disponible"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:37
#, fuzzy
@@ -868,7 +865,7 @@ msgstr "Méthode de paiement plus disponible"
#| msgid "currently available: %s"
msgctxt "widget"
msgid "Currently not available"
msgstr "Actuellement non disponible"
msgstr "actuellement disponible: %s"
#: pretix/static/pretixpresale/js/widget/widget.js:38
#, javascript-format
@@ -966,7 +963,7 @@ msgstr "Continuer"
#| msgid "Select variant %s"
msgctxt "widget"
msgid "Show variants"
msgstr "Voir les variations"
msgstr "Sélectionner les variations %s"
#: pretix/static/pretixpresale/js/widget/widget.js:57
#, fuzzy
@@ -974,7 +971,7 @@ msgstr "Voir les variations"
#| msgid "Select variant %s"
msgctxt "widget"
msgid "Hide variants"
msgstr "Masquer les variations"
msgstr "Sélectionner les variations %s"
#: pretix/static/pretixpresale/js/widget/widget.js:58
msgctxt "widget"

View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-24 08:47+0000\n"
"PO-Revision-Date: 2024-06-18 20:00+0000\n"
"Last-Translator: Anarion Dunedain <anarion@go2.pl>\n"
"PO-Revision-Date: 2024-05-07 22:00+0000\n"
"Last-Translator: Adam Kaput <adamkaput@gmail.com>\n"
"Language-Team: Polish <https://translate.pretix.eu/projects/pretix/pretix/pl/"
">\n"
"Language: pl\n"
@@ -18,7 +18,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
"|| n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 5.5.5\n"
"X-Generator: Weblate 5.4.3\n"
#: pretix/_base_settings.py:78
msgid "English"
@@ -382,7 +382,7 @@ msgstr "Użyty voucher został już wykorzystany maksymalną ilość razy."
#: pretix/api/views/checkin.py:604 pretix/api/views/checkin.py:611
msgid "Medium connected to other event"
msgstr "Nośnik podpięty do innego wydarzenia"
msgstr ""
#: pretix/api/views/oauth.py:107 pretix/control/logdisplay.py:472
#, python-brace-format
@@ -2741,7 +2741,7 @@ msgstr "Data ostatniej faktury zamówienia"
#: pretix/control/templates/pretixcontrol/organizers/reusable_media.html:6
#: pretix/control/templates/pretixcontrol/organizers/reusable_media.html:9
msgid "Reusable media"
msgstr "Nośnik wielokrotnego użytku"
msgstr ""
#: pretix/base/exporters/reusablemedia.py:35
#, fuzzy
@@ -2872,7 +2872,7 @@ msgstr "Kod vouchera"
#: pretix/base/forms/__init__.py:118
#, python-brace-format
msgid "You can use {markup_name} in this field."
msgstr "W tym polu możesz użyć {markup_name}."
msgstr ""
#: pretix/base/forms/__init__.py:178
#, python-format
@@ -3334,7 +3334,7 @@ msgstr ""
#: pretix/base/invoice.py:858
msgid "Default invoice renderer (European-style letter)"
msgstr "Domyślny renderer faktur (styl europejski)"
msgstr ""
#: pretix/base/invoice.py:947
msgctxt "invoice"
@@ -3343,7 +3343,7 @@ msgstr "(Proszę, cytuj przez cały czas.)"
#: pretix/base/invoice.py:994
msgid "Simplified invoice renderer"
msgstr "Uproszczony renderer faktur"
msgstr ""
#: pretix/base/invoice.py:1013
#, fuzzy, python-brace-format
@@ -3372,17 +3372,17 @@ msgstr "Zachowaj puste"
#: pretix/base/modelimport.py:139
#, python-brace-format
msgid "Invalid setting for column \"{header}\"."
msgstr "Niepoprawne ustawienie dla kolumny \"{header}\"."
msgstr ""
#: pretix/base/modelimport.py:199
#, python-brace-format
msgid "Could not parse {value} as a yes/no value."
msgstr "Nie udało się odczytać {value} jako wartości tak/nie."
msgstr ""
#: pretix/base/modelimport.py:216
#, python-brace-format
msgid "Could not parse {value} as a date and time."
msgstr "Nie udało się odczytać {value} jako daty i czasu."
msgstr ""
#: pretix/base/modelimport.py:226 pretix/control/views/orders.py:1162
#: pretix/control/views/orders.py:1191 pretix/control/views/orders.py:1235
@@ -3487,7 +3487,7 @@ msgstr "Państwo"
#: pretix/base/modelimport_orders.py:433
msgid "Calculate from product"
msgstr "Oblicz z produktu"
msgstr ""
#: pretix/base/modelimport_orders.py:450
#: pretix/control/templates/pretixcontrol/checkin/index.html:111

View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-24 08:47+0000\n"
"PO-Revision-Date: 2024-06-18 20:00+0000\n"
"Last-Translator: \"L. Pereira\" <l@tia.mat.br>\n"
"PO-Revision-Date: 2024-05-27 21:00+0000\n"
"Last-Translator: mathbrito <mathbrito@users.noreply.translate.pretix.eu>\n"
"Language-Team: Portuguese (Brazil) <https://translate.pretix.eu/projects/"
"pretix/pretix/pt_BR/>\n"
"Language: pt_BR\n"
@@ -160,8 +160,10 @@ msgid "Allowed URIs list, space separated"
msgstr "Lista de URIs permitidas, separadas por espaço"
#: pretix/api/models.py:47
#, fuzzy
#| msgid "Allowed URIs list, space separated"
msgid "Allowed Post Logout URIs list, space separated"
msgstr "Lista de URIs permitidas após logout, separadas por espaço"
msgstr "Lista de URIs permitidas, separadas por espaço"
#: pretix/api/models.py:51 pretix/base/models/customers.py:395
#: pretix/plugins/paypal/payment.py:113 pretix/plugins/paypal2/payment.py:108
@@ -229,7 +231,7 @@ msgid ""
"Events cannot be created as 'live'. Quotas and payment must be added to the "
"event before sales can go live."
msgstr ""
"Eventos não podem ser criados como 'ao vivo'. Cotas e pagamentos devem ser "
"Eventos não podem ser criados ao 'vivo'. Cotas e pagamentos devem ser "
"adicionados ao evento antes que as vendas possam ser ativadas."
#: pretix/api/serializers/event.py:232 pretix/api/serializers/event.py:531
@@ -310,12 +312,16 @@ msgid "This type of question cannot be shown during check-in."
msgstr "Esse tipo de pergunta não pode ser mostrada durante o check-in."
#: pretix/api/serializers/media.py:108
#, fuzzy
#| msgid ""
#| "A gift card with the same secret already exists in your or an affiliated "
#| "organizer account."
msgid ""
"A medium with the same identifier and type already exists in your organizer "
"account."
msgstr ""
"Um meio de pagamento com o mesmo tipo e identificador existe em sua conta de "
"organização."
"Um cartão de presente com o mesmo segredo já existe na sua conta ou na de "
"algum organizador afiliado."
#: pretix/api/serializers/order.py:79
#, python-brace-format
@@ -339,8 +345,10 @@ msgstr "Não existe quantidade suficiente em \"{}\" para executar esta ação."
#: pretix/api/serializers/organizer.py:102
#: pretix/control/forms/organizer.py:829 pretix/presale/forms/customer.py:439
#, fuzzy
#| msgid "A voucher with this code already exists."
msgid "An account with this email address is already registered."
msgstr "Uma conta com este endereço de email já foi registrada."
msgstr "Um voucher com esse código já existe."
#: pretix/api/serializers/organizer.py:205
#: pretix/control/forms/organizer.py:678
@@ -367,13 +375,15 @@ msgid "This user already has permissions for this team."
msgstr "Esse usuário tem permissão de acesso nessa equipe."
#: pretix/api/views/cart.py:209
#, fuzzy
#| msgid "Your cart has been updated."
msgid ""
"The specified voucher has already been used the maximum number of times."
msgstr "O cupom fornecido já foi usado um número máximo de vezes."
msgstr "Seu carrinho foi atualizado."
#: pretix/api/views/checkin.py:604 pretix/api/views/checkin.py:611
msgid "Medium connected to other event"
msgstr "Meio conectado à outro evento"
msgstr ""
#: pretix/api/views/oauth.py:107 pretix/control/logdisplay.py:472
#, python-brace-format
@@ -431,8 +441,10 @@ msgid "Order expired"
msgstr "O carrinho expirou"
#: pretix/api/webhooks.py:250
#, fuzzy
#| msgid "Order information changed"
msgid "Order expiry date changed"
msgstr "Data de validade do pedido alterada"
msgstr "Informações do pedido alteradas"
#: pretix/api/webhooks.py:254 pretix/base/notifications.py:269
msgid "Order information changed"
@@ -448,8 +460,10 @@ msgid "Order changed"
msgstr "Pedido alterado"
#: pretix/api/webhooks.py:266
#, fuzzy
#| msgid "Payment method"
msgid "Refund of payment created"
msgstr "Pedido de reembolso criado"
msgstr "Meio de pagamento"
#: pretix/api/webhooks.py:270 pretix/base/notifications.py:293
msgid "External refund of payment"
@@ -460,20 +474,28 @@ msgid "Refund of payment requested by customer"
msgstr "Reembolso de pagamento solicitado pelo cliente"
#: pretix/api/webhooks.py:278
#, fuzzy
#| msgid "Payment method"
msgid "Refund of payment completed"
msgstr "Pedido de reembolso completado"
msgstr "Meio de pagamento"
#: pretix/api/webhooks.py:282
#, fuzzy
#| msgid "External refund of payment"
msgid "Refund of payment canceled"
msgstr "Reembolso de pagamento cancelado"
msgstr "Reembolso externo do pagamento"
#: pretix/api/webhooks.py:286
#, fuzzy
#| msgid "External refund of payment"
msgid "Refund of payment failed"
msgstr "Falha no reembolso de pagamento"
msgstr "Reembolso externo do pagamento"
#: pretix/api/webhooks.py:290
#, fuzzy
#| msgid "Payment date"
msgid "Payment confirmed"
msgstr "Pagamento confirmado"
msgstr "Data de pagamento"
#: pretix/api/webhooks.py:294
msgid "Order approved"
@@ -527,48 +549,69 @@ msgstr ""
"alterações em objetos aninhados como variaçoes ou pacotes)"
#: pretix/api/webhooks.py:339
#, fuzzy
#| msgid "Shop is live"
msgid "Shop taken live"
msgstr "Loja ativada"
msgstr "Loja ativa"
#: pretix/api/webhooks.py:343
#, fuzzy
#| msgid "Shop is live"
msgid "Shop taken offline"
msgstr "Loja desativada"
msgstr "Loja ativa"
#: pretix/api/webhooks.py:347
#, fuzzy
#| msgid "Your cart has been updated."
msgid "Test-Mode of shop has been activated"
msgstr "Modo de teste da loja ativado"
msgstr "Seu carrinho foi atualizado."
#: pretix/api/webhooks.py:351
#, fuzzy
#| msgid "Your cart has been updated."
msgid "Test-Mode of shop has been deactivated"
msgstr "Modo de teste da loja foi desativado"
msgstr "Seu carrinho foi atualizado."
#: pretix/api/webhooks.py:355
#, fuzzy
#| msgid "Waiting list"
msgid "Waiting list entry added"
msgstr "Entrada na lista de espera adicionada"
msgstr "Lista de espera"
#: pretix/api/webhooks.py:359
#, fuzzy
#| msgid "Waiting list"
msgid "Waiting list entry changed"
msgstr "Entrada na lista de espera alterada"
msgstr "Lista de espera"
#: pretix/api/webhooks.py:363
#, fuzzy
#| msgid "Waiting list"
msgid "Waiting list entry deleted"
msgstr "Entrada na lista de espera apagada"
msgstr "Lista de espera"
#: pretix/api/webhooks.py:367
msgid "Waiting list entry received voucher"
msgstr "Entrada na lista de espera recebeu cupom"
msgstr ""
#: pretix/api/webhooks.py:371
#, fuzzy
#| msgctxt "refund_source"
#| msgid "Customer"
msgid "Customer account created"
msgstr "Conta de usuário criada"
msgstr "Cliente"
#: pretix/api/webhooks.py:375
#, fuzzy
#| msgid "Account information changed"
msgid "Customer account changed"
msgstr "Informações da conta foram alteradas"
msgstr "Informações da conta alteradas"
#: pretix/api/webhooks.py:379
#, fuzzy
#| msgid "Your cart has been updated."
msgid "Customer account anonymized"
msgstr "Conta foi anonimizada"
msgstr "Seu carrinho foi atualizado."
#: pretix/base/addressvalidation.py:100 pretix/base/addressvalidation.py:103
#: pretix/base/addressvalidation.py:108 pretix/base/forms/questions.py:953
@@ -658,9 +701,10 @@ msgid "Incompatible SSO provider: \"{error}\"."
msgstr "Provedor de SSO incompatível: \"{error}\"."
#: pretix/base/customersso/oidc.py:109
#, python-brace-format
#, fuzzy, python-brace-format
#| msgid "Presale not started"
msgid "You are not requesting \"{scope}\"."
msgstr "Você não está requisitando \"{scope}\"."
msgstr "Pré-venda não iniciada"
#: pretix/base/customersso/oidc.py:115
#, python-brace-format
@@ -694,8 +738,6 @@ msgid ""
"The email address on this account is not yet verified. Please first confirm "
"the email address in your customer account."
msgstr ""
"O endereço de email desta conta ainda não foi verificado. Por favor, "
"confirme o endereço de email na sua conta."
#: pretix/base/email.py:199 pretix/base/exporters/items.py:152
#: pretix/base/exporters/items.py:197 pretix/control/views/main.py:311
@@ -737,8 +779,10 @@ msgid "Combined Excel (.xlsx)"
msgstr "Excel (.xlsx)"
#: pretix/base/exporters/answers.py:54
#, fuzzy
#| msgid "Questions"
msgid "Question answer file uploads"
msgstr "Upload de arquivos para perguntas e respostas"
msgstr "Perguntas"
#: pretix/base/exporters/answers.py:55 pretix/base/exporters/json.py:52
#: pretix/base/exporters/mail.py:53 pretix/base/exporters/orderlist.py:86
@@ -747,17 +791,17 @@ msgstr "Upload de arquivos para perguntas e respostas"
#: pretix/base/exporters/orderlist.py:1213
#: pretix/plugins/reports/exporters.py:478
#: pretix/plugins/reports/exporters.py:651
#, fuzzy
#| msgid "Order data"
msgctxt "export_category"
msgid "Order data"
msgstr "Informações do pedido"
msgstr "Informação do pedido"
#: pretix/base/exporters/answers.py:56
msgid ""
"Download a ZIP file including all files that have been uploaded by your "
"customers while creating an order."
msgstr ""
"Fazer o download de um ZIP incluindo todos os arquivos que foram enviados "
"pelos seus clientes quando um pedido foi criado."
#: pretix/base/exporters/answers.py:66 pretix/base/models/items.py:1672
#: pretix/control/navigation.py:182
@@ -816,41 +860,54 @@ msgstr "Data"
#: pretix/plugins/sendmail/forms.py:346
msgctxt "subevent"
msgid "All dates"
msgstr "Todas as datas"
msgstr ""
#: pretix/base/exporters/customers.py:49 pretix/control/navigation.py:592
#: pretix/control/templates/pretixcontrol/organizers/edit.html:132
#, fuzzy
#| msgctxt "invoice"
#| msgid "Invoice total"
msgid "Customer accounts"
msgstr "Contas de usuário"
msgstr "Total da fatura"
#: pretix/base/exporters/customers.py:51
#, fuzzy
#| msgctxt "invoice"
#| msgid "Invoice total"
msgctxt "export_category"
msgid "Customer accounts"
msgstr "Contas de usuário"
msgstr "Total da fatura"
#: pretix/base/exporters/customers.py:52
msgid "Download a spreadsheet of all currently registered customer accounts."
msgstr "Fazer o download de uma planilha com todos os usuários registrados."
msgstr ""
#: pretix/base/exporters/customers.py:64 pretix/base/models/customers.py:82
#: pretix/control/templates/pretixcontrol/organizers/customer.html:28
#: pretix/control/templates/pretixcontrol/organizers/customers.html:54
#: pretix/presale/templates/pretixpresale/event/checkout_customer.html:40
#: pretix/presale/templates/pretixpresale/organizers/customer_profile.html:20
#, fuzzy
#| msgctxt "refund_source"
#| msgid "Customer"
msgid "Customer ID"
msgstr "ID do Cliente"
msgstr "Cliente"
#: pretix/base/exporters/customers.py:65
#: pretix/control/templates/pretixcontrol/organizers/customer.html:31
#, fuzzy
#| msgid "Payment provider"
msgid "SSO provider"
msgstr "Provedor de Login Único (SSO)"
msgstr "Meio de pagamento"
#: pretix/base/exporters/customers.py:66 pretix/base/models/customers.py:108
#: pretix/control/templates/pretixcontrol/organizers/customer.html:35
#: pretix/control/templates/pretixcontrol/organizers/customers.html:65
#: pretix/control/templates/pretixcontrol/users/form.html:49
#, fuzzy
#| msgid "Internal identifier"
msgid "External identifier"
msgstr "Identificador externo"
msgstr "Identificador interno"
#: pretix/base/exporters/customers.py:68 pretix/base/exporters/orderlist.py:261
#: pretix/base/exporters/orderlist.py:444
@@ -923,22 +980,28 @@ msgid "Name"
msgstr "Nome"
#: pretix/base/exporters/customers.py:77 pretix/base/models/customers.py:99
#, fuzzy
#| msgid "This account is inactive."
msgid "Account active"
msgstr "Conta ativa"
msgstr "Esta conta está inativa."
#: pretix/base/exporters/customers.py:78 pretix/base/models/customers.py:100
#, fuzzy
#| msgid "Attendee email"
msgid "Verified email address"
msgstr "Email verificado"
msgstr "E-mail do participante"
#: pretix/base/exporters/customers.py:79 pretix/base/models/customers.py:101
#: pretix/control/templates/pretixcontrol/organizers/customer.html:67
msgid "Last login"
msgstr "Último login"
msgstr ""
#: pretix/base/exporters/customers.py:80 pretix/base/models/customers.py:102
#: pretix/control/templates/pretixcontrol/organizers/customer.html:65
#, fuzzy
#| msgid "Expiration date"
msgid "Registration date"
msgstr "Data de registro"
msgstr "Data de validade"
#: pretix/base/exporters/customers.py:81 pretix/base/exporters/invoices.py:205
#: pretix/base/exporters/waitinglist.py:118 pretix/base/models/auth.py:258
@@ -954,7 +1017,7 @@ msgstr "Idioma"
#: pretix/control/templates/pretixcontrol/organizers/customer.html:71
#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:68
msgid "Notes"
msgstr "Notas"
msgstr ""
#: pretix/base/exporters/customers.py:100
#: pretix/base/exporters/customers.py:101 pretix/base/exporters/events.py:83
@@ -1031,8 +1094,6 @@ msgid ""
"Download invoices in a format that can be used by the dekodi NREI conversion "
"software."
msgstr ""
"Fazer o download de faturas em um formato que possa ser usado no software de "
"conversão dekodi NREI."
#: pretix/base/exporters/dekodi.py:105
#, python-brace-format
@@ -1049,8 +1110,10 @@ msgstr "Ingresso do evento {event}-{code}"
#: pretix/plugins/reports/exporters.py:461
#: pretix/plugins/reports/exporters.py:698
#: pretix/plugins/ticketoutputpdf/exporters.py:85
#, fuzzy
#| msgid "Date and time"
msgid "Date range"
msgstr "Intervalo de datas"
msgstr "Data e hora"
#: pretix/base/exporters/dekodi.py:237 pretix/base/exporters/invoices.py:77
#, fuzzy
@@ -1065,21 +1128,23 @@ msgstr ""
"da fatura não corresponde sempre à ordem ou à data de pagamento."
#: pretix/base/exporters/events.py:47
#, fuzzy
#| msgid "Event start time"
msgid "Event data"
msgstr "Dados do evento"
msgstr "Hora de início do evento"
#: pretix/base/exporters/events.py:48
#, fuzzy
#| msgid "Event start time"
msgctxt "export_category"
msgid "Event data"
msgstr "Dados do evento"
msgstr "Hora de início do evento"
#: pretix/base/exporters/events.py:49
msgid ""
"Download a spreadsheet with information on all events in this organizer "
"account."
msgstr ""
"Fazer o download de uma planilha contendo informações sobre todos os eventos "
"nesta conta de organização."
#: pretix/base/exporters/events.py:57 pretix/base/exporters/orderlist.py:260
#: pretix/base/exporters/orderlist.py:440
@@ -1150,12 +1215,12 @@ msgstr "Localização"
#: pretix/base/exporters/events.py:68 pretix/base/models/event.py:597
#: pretix/base/models/event.py:1449
msgid "Latitude"
msgstr "Latitude"
msgstr ""
#: pretix/base/exporters/events.py:69 pretix/base/models/event.py:605
#: pretix/base/models/event.py:1457
msgid "Longitude"
msgstr "Longitude"
msgstr ""
#: pretix/base/exporters/events.py:70 pretix/base/models/event.py:617
#: pretix/base/models/event.py:1474
@@ -1203,8 +1268,6 @@ msgstr "Todos os pedidos"
#: pretix/base/exporters/invoices.py:127
msgid "Download all invoices created by the system as a ZIP file of PDF files."
msgstr ""
"Fazer o download de todas as faturas criadas pelo sistema como um arquivo "
"ZIP contendo arquivos PDF."
#: pretix/base/exporters/invoices.py:178
msgid "Invoice data"
@@ -1216,9 +1279,6 @@ msgid ""
"The spreadsheet includes two sheets, one with a line for every invoice, and "
"one with a line for every position of every invoice."
msgstr ""
"Fazer o download de uma planilha com dados de todas as faturas criadas pelo "
"sistema. A planilha inclui duas folhas, uma com uma linha para cada fatura, "
"and uma com uma linha o total de cada fatura."
#: pretix/base/exporters/invoices.py:191 pretix/base/shredder.py:576
#: pretix/control/templates/pretixcontrol/order/index.html:267
@@ -1518,8 +1578,10 @@ msgid "Gross price"
msgstr "Preço bruto"
#: pretix/base/exporters/invoices.py:322
#, fuzzy
#| msgid "Default price"
msgid "Net price"
msgstr "Preço líquido"
msgstr "Preço padrão"
#: pretix/base/exporters/invoices.py:323 pretix/base/exporters/orderlist.py:452
#: pretix/base/exporters/orderlist.py:577
@@ -1549,33 +1611,41 @@ msgid "Event start date"
msgstr "Data de início do evento"
#: pretix/base/exporters/invoices.py:350 pretix/base/pdf.py:278
#, fuzzy
#| msgid "Event end time"
msgid "Event end date"
msgstr "Data final do evento"
msgstr "Horário do final do evento"
#: pretix/base/exporters/items.py:50
#, fuzzy
#| msgid "Product picture"
msgid "Product data"
msgstr "Informações do produto"
msgstr "Imagem do produto"
#: pretix/base/exporters/items.py:51 pretix/base/exporters/orderlist.py:1100
#, fuzzy
#| msgid "Product picture"
msgctxt "export_category"
msgid "Product data"
msgstr "Informações do produto"
msgstr "Imagem do produto"
#: pretix/base/exporters/items.py:52
msgid "Download a spreadsheet with details about all products and variations."
msgstr ""
"Fazer o download de uma planilha com detalhes de todos os produtos e "
"variações."
#: pretix/base/exporters/items.py:58 pretix/base/exporters/orderlist.py:571
#: pretix/base/exporters/orderlist.py:862
#, fuzzy
#| msgid "Product"
msgid "Product ID"
msgstr "ID do Produto"
msgstr "Produto"
#: pretix/base/exporters/items.py:59 pretix/base/exporters/orderlist.py:573
#: pretix/base/exporters/orderlist.py:864
#, fuzzy
#| msgid "Variation"
msgid "Variation ID"
msgstr "ID da Variante"
msgstr "Variação"
#: pretix/base/exporters/items.py:60 pretix/base/models/items.py:115
#: pretix/base/pdf.py:151
@@ -1642,12 +1712,16 @@ msgstr "É um bilhete de admissão"
#: pretix/base/exporters/items.py:78
#: pretix/control/templates/pretixcontrol/item/create.html:74
#: pretix/control/templates/pretixcontrol/item/index.html:87
#, fuzzy
#| msgid "Device type"
msgid "Personalized ticket"
msgstr "Ingresso personalizado"
msgstr "Tipo de dispositivo"
#: pretix/base/exporters/items.py:79 pretix/base/models/items.py:471
#, fuzzy
#| msgid "Device type"
msgid "Generate tickets"
msgstr "Gerar ingressos"
msgstr "Tipo de dispositivo"
#: pretix/base/exporters/items.py:80 pretix/base/exporters/orderlist.py:1107
#: pretix/base/exporters/waitinglist.py:41 pretix/base/shredder.py:367
@@ -1712,11 +1786,13 @@ msgstr "Comprar este produto requer aprovação"
#: pretix/base/exporters/items.py:86 pretix/base/models/items.py:555
msgid "Only sell this product as part of a bundle"
msgstr "Apenas vender este produto como parte de um kit"
msgstr ""
#: pretix/base/exporters/items.py:87 pretix/base/models/items.py:562
#, fuzzy
#| msgid "Allow product to be canceled"
msgid "Allow product to be canceled or changed"
msgstr "Permitir que o produto seja cancelado ou alterado"
msgstr "Permitir que o produto seja cancelado"
#: pretix/base/exporters/items.py:88 pretix/base/models/items.py:568
msgid "Minimum amount per order"
@@ -1736,8 +1812,11 @@ msgstr "Requer atenção especial"
#: pretix/base/exporters/items.py:91 pretix/base/exporters/orderlist.py:282
#: pretix/base/models/items.py:590 pretix/base/models/items.py:1155
#: pretix/base/models/orders.py:288
#, fuzzy
#| msgctxt "subevent"
#| msgid "No date selected."
msgid "Check-in text"
msgstr "Texto para o check-in"
msgstr "Nenhuma data selecionada."
#: pretix/base/exporters/items.py:92 pretix/base/models/items.py:595
#: pretix/base/models/items.py:1080
@@ -1746,19 +1825,21 @@ msgstr "Preço original"
#: pretix/base/exporters/items.py:93 pretix/base/models/items.py:607
msgid "This product is a gift card"
msgstr "Este produto é um cartão de presente"
msgstr ""
#: pretix/base/exporters/items.py:94 pretix/base/models/items.py:613
#: pretix/base/models/items.py:1100
#: pretix/control/templates/pretixcontrol/item/include_variations.html:40
#: pretix/control/templates/pretixcontrol/item/include_variations.html:148
msgid "Require a valid membership"
msgstr "Exigir associação válida"
msgstr ""
#: pretix/base/exporters/items.py:95 pretix/base/models/items.py:622
#: pretix/base/models/items.py:1109
#, fuzzy
#| msgid "Team members"
msgid "Hide without a valid membership"
msgstr "Esconder sem uma associação válida"
msgstr "Membros do time"
#: pretix/base/exporters/json.py:51 pretix/base/exporters/orderlist.py:85
msgid "Order data"
@@ -1769,8 +1850,6 @@ msgid ""
"Download a structured JSON representation of all orders. This might be "
"useful for the import in third-party systems."
msgstr ""
"Fazer o download de uma representação de todos os pedidos, em formato JSON. "
"Pode ser útil para importar em sistemas de terceiros."
#: pretix/base/exporters/mail.py:52
msgid "Email addresses (text file)"
@@ -1781,8 +1860,6 @@ msgid ""
"Download a text file with all email addresses collected either from buyers "
"or from ticket holders."
msgstr ""
"Fazer o download de um arquivo texto com todos os endereços de email "
"coletados por compradores ou possuidores de ingressos."
#: pretix/base/exporters/mail.py:76 pretix/plugins/reports/exporters.py:487
#: pretix/plugins/reports/exporters.py:669
@@ -1842,7 +1919,7 @@ msgstr "Incluir apenas pedidos criados a partir desta data."
#: pretix/plugins/reports/exporters.py:454
#: pretix/plugins/ticketoutputpdf/exporters.py:97
msgid "Event date"
msgstr "Data do evento"
msgstr ""
#: pretix/base/exporters/orderlist.py:137
#, fuzzy

File diff suppressed because it is too large Load Diff

View File

@@ -8,16 +8,14 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-08 13:19+0000\n"
"PO-Revision-Date: 2024-06-17 17:00+0000\n"
"Last-Translator: Kristian Feldsam <feldsam@gmail.com>\n"
"Language-Team: Slovak <https://translate.pretix.eu/projects/pretix/pretix-js/"
"sk/>\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: sk\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
"X-Generator: Weblate 5.5.5\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
@@ -212,7 +210,7 @@ msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:39
msgid "Exit"
msgstr "Odchod"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:40
msgid "Scan a ticket or search and press return…"

File diff suppressed because it is too large Load Diff

View File

@@ -281,17 +281,6 @@ class TableTextRotate(Flowable):
canvas.drawString(0, -1, self.text)
def format_answer_for_export(a):
if a.question.type in (Question.TYPE_CHOICE, Question.TYPE_CHOICE_MULTIPLE):
return ", ".join(str(o.answer) for o in a.options.all())
elif a.question.type in Question.UNLOCALIZED_TYPES:
# We do not want to localize Date, Time and Datetime question answers, as those can lead
# to difficulties parsing the data (for example 2019-02-01 may become Février, 2019 01 in French).
return a.answer
else:
return str(a)
class PDFCheckinList(ReportlabExportMixin, CheckInListMixin, BaseExporter):
name = "overview"
identifier = 'checkinlistpdf'
@@ -383,14 +372,6 @@ class PDFCheckinList(ReportlabExportMixin, CheckInListMixin, BaseExporter):
tdata[0].append(p)
qs = self._get_queryset(cl, form_data)
qs = qs.prefetch_related(
'answers',
'answers__options',
'answers__question',
'addon_to__answers',
'addon_to__answers__question',
'addon_to__answers__options',
)
for op in qs:
try:
@@ -432,9 +413,19 @@ class PDFCheckinList(ReportlabExportMixin, CheckInListMixin, BaseExporter):
acache = {}
if op.addon_to:
for a in op.addon_to.answers.all():
acache[a.question_id] = format_answer_for_export(a)
# We do not want to localize Date, Time and Datetime question answers, as those can lead
# to difficulties parsing the data (for example 2019-02-01 may become Février, 2019 01 in French).
if a.question.type in Question.UNLOCALIZED_TYPES:
acache[a.question_id] = a.answer
else:
acache[a.question_id] = str(a)
for a in op.answers.all():
acache[a.question_id] = format_answer_for_export(a)
# We do not want to localize Date, Time and Datetime question answers, as those can lead
# to difficulties parsing the data (for example 2019-02-01 may become Février, 2019 01 in French).
if a.question.type in Question.UNLOCALIZED_TYPES:
acache[a.question_id] = a.answer
else:
acache[a.question_id] = str(a)
for q in questions:
txt = acache.get(q.pk, '')
txt = bleach.clean(txt, tags=['br']).strip().replace('<br>', '<br/>')
@@ -534,12 +525,7 @@ class CSVCheckinList(CheckInListMixin, ListExporter):
yield headers
qs = base_qs.prefetch_related(
'answers',
'answers__options',
'answers__question',
'addon_to__answers',
'addon_to__answers__question',
'addon_to__answers__options',
'answers', 'answers__question', 'addon_to__answers', 'addon_to__answers__question'
)
all_ids = list(base_qs.values_list('pk', flat=True))
@@ -611,9 +597,19 @@ class CSVCheckinList(CheckInListMixin, ListExporter):
acache = {}
if op.addon_to:
for a in op.addon_to.answers.all():
acache[a.question_id] = format_answer_for_export(a)
# We do not want to localize Date, Time and Datetime question answers, as those can lead
# to difficulties parsing the data (for example 2019-02-01 may become Février, 2019 01 in French).
if a.question.type in Question.UNLOCALIZED_TYPES:
acache[a.question_id] = a.answer
else:
acache[a.question_id] = str(a)
for a in op.answers.all():
acache[a.question_id] = format_answer_for_export(a)
# We do not want to localize Date, Time and Datetime question answers, as those can lead
# to difficulties parsing the data (for example 2019-02-01 may become Février, 2019 01 in French).
if a.question.type in Question.UNLOCALIZED_TYPES:
acache[a.question_id] = a.answer
else:
acache[a.question_id] = str(a)
for q in questions:
row.append(acache.get(q.pk, ''))

View File

@@ -116,7 +116,6 @@ logger = logging.getLogger('pretix.plugins.stripe')
# - PayNow: ✗
# - UPI: ✗
# - Netbanking: ✗
# - TWINT: ✓
#
# Bank transfers
# - ACH Bank Transfer: ✗
@@ -449,14 +448,6 @@ class StripeSettingsHolder(BasePaymentProvider):
'before they work properly.'),
required=False,
)),
('method_twint',
forms.BooleanField(
label='TWINT',
disabled=self.event.currency != 'CHF',
help_text=_('Some payment methods might need to be enabled in the settings of your Stripe account '
'before they work properly.'),
required=False,
)),
('method_affirm',
forms.BooleanField(
label=_('Affirm'),
@@ -953,17 +944,6 @@ class StripeMethod(BasePaymentProvider):
reference=intent.id,
defaults={'order': payment.order, 'payment': payment}
)
if intent.status == 'requires_action':
payment.info = str(intent)
if intent.next_action.type == 'multibanco_display_details':
payment.state = OrderPayment.PAYMENT_STATE_PENDING
payment.save()
return
payment.state = OrderPayment.PAYMENT_STATE_CREATED
payment.save()
return self._redirect_to_sca(request, payment)
if intent.status == 'requires_action':
payment.info = str(intent)
payment.state = OrderPayment.PAYMENT_STATE_CREATED
@@ -1066,6 +1046,135 @@ class StripeMethod(BasePaymentProvider):
'with us if this problem persists.'))
class StripeSourceMethod(StripeMethod):
def payment_is_valid_session(self, request):
return True
def _charge_source(self, request, source, payment):
try:
params = {}
if not source.startswith('src_'):
params['statement_descriptor'] = self.statement_descriptor(payment)
params.update(self.api_kwargs)
params.update(self._connect_kwargs(payment))
charge = stripe.Charge.create(
amount=self._get_amount(payment),
currency=self.event.currency.lower(),
source=source,
description='{event}-{code}'.format(
event=self.event.slug.upper(),
code=payment.order.code
),
metadata={
'order': str(payment.order.id),
'event': self.event.id,
'code': payment.order.code
},
# TODO: Is this sufficient?
idempotency_key=str(self.event.id) + payment.order.code + source,
**params
)
except stripe.error.CardError as e:
if e.json_body:
err = e.json_body['error']
logger.exception('Stripe error: %s' % str(err))
else:
err = {'message': str(e)}
logger.exception('Stripe error: %s' % str(e))
logger.info('Stripe card error: %s' % str(err))
payment.fail(info={
'error': True,
'message': err['message'],
})
raise PaymentException(_('Stripe reported an error with your card: %s') % err['message'])
except stripe.error.StripeError as e:
if e.json_body and 'error' in e.json_body:
err = e.json_body['error']
logger.exception('Stripe error: %s' % str(err))
if err.get('code') == 'idempotency_key_in_use':
# This is not an error we normally expect, however some payment methods like iDEAL will redirect
# the user back to our confirmation page at the same time from two devices: the web browser the
# purchase is executed from and the online banking app the payment is authorized from.
# In this case we will just log the idempotency error but not expose it to the user and just
# forward them back to their order page. There is a good chance that by the time the user hits
# the order page, the other request has gone through and the payment is confirmed.
# Usually however this should be prevented by SELECT FOR UPDATE calls!
return
else:
err = {'message': str(e)}
logger.exception('Stripe error: %s' % str(e))
payment.fail(info={
'error': True,
'message': err['message'],
})
raise PaymentException(_('We had trouble communicating with Stripe. Please try again and get in touch '
'with us if this problem persists.'))
else:
ReferencedStripeObject.objects.get_or_create(
reference=charge.id,
defaults={'order': payment.order, 'payment': payment}
)
if charge.status == 'succeeded' and charge.paid:
try:
payment.info = str(charge)
payment.confirm()
except Quota.QuotaExceededException as e:
raise PaymentException(str(e))
except SendMailException:
raise PaymentException(_('There was an error sending the confirmation mail.'))
elif charge.status == 'pending':
if request:
messages.warning(request, _('Your payment is pending completion. We will inform you as soon as the '
'payment completed.'))
payment.info = str(charge)
payment.state = OrderPayment.PAYMENT_STATE_PENDING
payment.save()
return
else:
logger.info('Charge failed: %s' % str(charge))
payment.fail(info=str(charge))
raise PaymentException(_('Stripe reported an error: %s') % charge.failure_message)
def execute_payment(self, request: HttpRequest, payment: OrderPayment):
self._init_api()
try:
source = self._create_source(request, payment)
except stripe.error.StripeError as e:
if e.json_body and 'err' in e.json_body:
err = e.json_body['error']
logger.exception('Stripe error: %s' % str(err))
if err.get('code') == 'idempotency_key_in_use':
# Same thing happening twice we don't want to record a failure, as that might prevent the
# other thread from succeeding.
return
else:
err = {'message': str(e)}
logger.exception('Stripe error: %s' % str(e))
payment.fail(info={
'error': True,
'message': err['message'],
})
raise PaymentException(_('We had trouble communicating with Stripe. Please try again and get in touch '
'with us if this problem persists.'))
ReferencedStripeObject.objects.get_or_create(
reference=source.id,
defaults={'order': payment.order, 'payment': payment}
)
payment.info = str(source)
payment.state = OrderPayment.PAYMENT_STATE_PENDING
payment.save()
request.session['payment_stripe_order_secret'] = payment.order.secret
return self.redirect(request, source.redirect.url)
class StripeRedirectMethod(StripeMethod):
redirect_action_handling = "redirect"
@@ -1684,26 +1793,53 @@ class StripeEPS(StripeRedirectWithAccountNamePaymentIntentMethod):
return super().payment_presale_render(payment)
class StripeMultibanco(StripeRedirectMethod):
class StripeMultibanco(StripeSourceMethod):
identifier = 'stripe_multibanco'
verbose_name = _('Multibanco via Stripe')
public_name = _('Multibanco')
method = 'multibanco'
explanation = _(
'Multibanco is a payment method available to Portuguese bank account holders.'
)
redirect_in_widget_allowed = False
abort_pending_allowed = True
def _payment_intent_kwargs(self, request, payment):
return {
"payment_method_data": {
"type": "multibanco",
"billing_details": {
"email": payment.order.email,
}
}
def payment_form_render(self, request) -> str:
template = get_template('pretixplugins/stripe/checkout_payment_form_simple_noform.html')
ctx = {
'request': request,
'event': self.event,
'settings': self.settings,
'explanation': self.explanation,
'form': self.payment_form(request)
}
return template.render(ctx)
def _create_source(self, request, payment):
source = stripe.Source.create(
type='multibanco',
amount=self._get_amount(payment),
currency=self.event.currency.lower(),
metadata={
'order': str(payment.order.id),
'event': self.event.id,
'code': payment.order.code
},
owner={
'email': payment.order.email
},
redirect={
'return_url': build_absolute_uri(self.event, 'plugins:stripe:return', kwargs={
'order': payment.order.code,
'payment': payment.pk,
'hash': payment.order.tagged_secret('plugins:stripe'),
})
},
**self.api_kwargs
)
return source
def payment_is_valid_session(self, request):
return True
def checkout_prepare(self, request, cart):
return True
class StripePrzelewy24(StripeRedirectMethod):
@@ -1802,25 +1938,3 @@ class StripeSwish(StripeRedirectMethod):
},
}
}
class StripeTwint(StripeRedirectMethod):
identifier = 'stripe_twint'
verbose_name = _('TWINT via Stripe')
public_name = 'TWINT'
method = 'twint'
confirmation_method = 'automatic'
explanation = _(
'This payment method is available to users of the Swiss app TWINT. Please have your app '
'ready.'
)
def is_allowed(self, request: HttpRequest, total: Decimal=None) -> bool:
return super().is_allowed(request, total) and request.event.currency == "CHF" and total <= Decimal("5000.00")
def _payment_intent_kwargs(self, request, payment):
return {
"payment_method_data": {
"type": "twint",
},
}

View File

@@ -48,14 +48,13 @@ def register_payment_provider(sender, **kwargs):
StripeAffirm, StripeAlipay, StripeBancontact, StripeCC, StripeEPS,
StripeGiropay, StripeIdeal, StripeKlarna, StripeMultibanco,
StripePayPal, StripePrzelewy24, StripeSEPADirectDebit,
StripeSettingsHolder, StripeSofort, StripeSwish, StripeTwint,
StripeWeChatPay,
StripeSettingsHolder, StripeSofort, StripeSwish, StripeWeChatPay,
)
return [
StripeSettingsHolder, StripeCC, StripeGiropay, StripeIdeal, StripeAlipay, StripeBancontact,
StripeSofort, StripeEPS, StripeMultibanco, StripePrzelewy24, StripeWeChatPay,
StripeSEPADirectDebit, StripeAffirm, StripeKlarna, StripePayPal, StripeSwish, StripeTwint,
StripeSEPADirectDebit, StripeAffirm, StripeKlarna, StripePayPal, StripeSwish
]

View File

@@ -1,43 +1,10 @@
{% load i18n %}
{% load eventurl %}
{% load money %}
{% if payment.state == "pending" %}
{% if payment_info.next_action.type == "multibanco_display_details" %}
<p><strong>{% trans "Payment instructions" %}:</strong></p>
<ol>
<li>
{% blocktrans trimmed %}
In your online bank account or from an ATM, choose "Payment and other services".
{% endblocktrans %}
</li>
<li>
{% blocktrans trimmed %}
Click "Payments of services/shopping".
{% endblocktrans %}
</li>
<li>
{% blocktrans trimmed %}
Enter the entity number, reference number, and amount.
{% endblocktrans %}
</li>
</ol>
<dl class="dl-inline">
<dt>{% trans "Entity number:" %}</dt> <dd>{{ payment_info.next_action.multibanco_display_details.entity }}</dd><br>
<dt>{% trans "Reference number:" %}</dt> <dd>{{ payment_info.next_action.multibanco_display_details.reference }}</dd><br>
<dt>{% trans "Amount:" %}</dt> <dd>{{ payment.amount|money:event.currency }}</dd>
</dl>
<p class="text-muted">
{% trans "There is no further action required on this website." %}
{% trans "We will send you an email as soon as we received your payment." %}
</p>
{% else %}
<p>
{% blocktrans trimmed %}
We're waiting for an answer from the payment provider regarding your payment. Please contact us if this
takes more than a few days.
{% endblocktrans %}
</p>
{% endif %}
<p>{% blocktrans trimmed %}
We're waiting for an answer from the payment provider regarding your payment. Please contact us if this
takes more than a few days.
{% endblocktrans %}</p>
{% elif payment.state == "created" and payment_info.status == "requires_action" %}
<p>{% blocktrans trimmed %}
You need to confirm your payment. Please click the link below to do so or start a new payment.

View File

@@ -595,7 +595,7 @@ class ScaView(StripeOrderView, View):
if intent.status == 'requires_action' and intent.next_action.type in [
'use_stripe_sdk', 'redirect_to_url', 'alipay_handle_redirect', 'wechat_pay_display_qr_code',
'swish_handle_redirect_or_display_qr_code', 'multibanco_display_details',
'swish_handle_redirect_or_display_qr_code',
]:
ctx = {
'order': self.order,
@@ -610,9 +610,6 @@ class ScaView(StripeOrderView, View):
elif intent.next_action.type == 'swish_handle_redirect_or_display_qr_code':
ctx['payment_intent_next_action_redirect_url'] = intent.next_action.swish_handle_redirect_or_display_qr_code['hosted_instructions_url']
ctx['payment_intent_redirect_action_handling'] = 'iframe'
elif intent.next_action.type == 'multibanco_display_details':
ctx['payment_intent_next_action_redirect_url'] = intent.next_action.multibanco_display_details['hosted_voucher_url']
ctx['payment_intent_redirect_action_handling'] = 'iframe'
r = render(request, 'pretixplugins/stripe/sca.html', ctx)
r._csp_ignore = True

View File

@@ -8,7 +8,7 @@
<form class="event-list-filter-form" method="get" data-save-scrollpos>
<input type="hidden" name="filtered" value="1">
{% for f, v in request.GET.items %}
{% if f not in filter_form.fields and f != "page" %}
{% if f not in filter_form.fields %}
<input type="hidden" name="{{ f }}" value="{{ v }}">
{% endif %}
{% endfor %}

View File

@@ -2081,12 +2081,12 @@
}
},
"node_modules/braces": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
"integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"optional": true,
"dependencies": {
"fill-range": "^7.1.1"
"fill-range": "^7.0.1"
},
"engines": {
"node": ">=8"
@@ -2513,9 +2513,9 @@
"integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ=="
},
"node_modules/fill-range": {
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
"integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"optional": true,
"dependencies": {
"to-regex-range": "^5.0.1"
@@ -5437,12 +5437,12 @@
}
},
"braces": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
"integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"optional": true,
"requires": {
"fill-range": "^7.1.1"
"fill-range": "^7.0.1"
}
},
"browserslist": {
@@ -5754,9 +5754,9 @@
"integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ=="
},
"fill-range": {
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
"integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"optional": true,
"requires": {
"to-regex-range": "^5.0.1"