forked from CGM_Public/pretix_original
Compare commits
37 Commits
remove-sub
...
fix-checkb
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9f9454efa6 | ||
|
|
e7267df6e7 | ||
|
|
120b89385a | ||
|
|
ce06672334 | ||
|
|
223f095611 | ||
|
|
b625dc9ec8 | ||
|
|
50c4a1c376 | ||
|
|
6fd2e42426 | ||
|
|
da651df4f0 | ||
|
|
a6f527e32d | ||
|
|
3ea61fbd1f | ||
|
|
6a959d4220 | ||
|
|
92959dbb1f | ||
|
|
6d6f3c4af8 | ||
|
|
8d14a285ca | ||
|
|
a6b8cd8a54 | ||
|
|
cb95cdc6ce | ||
|
|
cc7b00e206 | ||
|
|
136c54b9a8 | ||
|
|
28ba434e45 | ||
|
|
09320093ad | ||
|
|
89cfab6cad | ||
|
|
a180ce4c51 | ||
|
|
1200274ebf | ||
|
|
877401d8c0 | ||
|
|
44170c1b93 | ||
|
|
ce34bd0a13 | ||
|
|
b58f05efd0 | ||
|
|
3ac70e6e3a | ||
|
|
90123d6a58 | ||
|
|
48a3984db6 | ||
|
|
fe6ee4437f | ||
|
|
f470389cd8 | ||
|
|
c848594c21 | ||
|
|
e9a95b0b09 | ||
|
|
3b48b0782d | ||
|
|
b55bd8f75a |
@@ -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.
|
||||
|
||||
@@ -38,7 +38,7 @@ dependencies = [
|
||||
"dj-static",
|
||||
"Django[argon2]==4.2.*",
|
||||
"django-bootstrap3==24.2",
|
||||
"django-compressor==4.4",
|
||||
"django-compressor==4.5",
|
||||
"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.0.*",
|
||||
"flake8==7.1.*",
|
||||
"freezegun",
|
||||
"isort==5.13.*",
|
||||
"pep8-naming==0.14.*",
|
||||
|
||||
@@ -79,6 +79,7 @@ ALL_LANGUAGES = [
|
||||
('de', _('German')),
|
||||
('de-informal', _('German (informal)')),
|
||||
('ar', _('Arabic')),
|
||||
('ca', _('Catalan')),
|
||||
('zh-hans', _('Chinese (simplified)')),
|
||||
('zh-hant', _('Chinese (traditional)')),
|
||||
('cs', _('Czech')),
|
||||
@@ -98,6 +99,7 @@ ALL_LANGUAGES = [
|
||||
('pt-br', _('Portuguese (Brazil)')),
|
||||
('ro', _('Romanian')),
|
||||
('ru', _('Russian')),
|
||||
('sk', _('Slovak')),
|
||||
('es', _('Spanish')),
|
||||
('tr', _('Turkish')),
|
||||
('uk', _('Ukrainian')),
|
||||
|
||||
@@ -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
|
||||
from collections import OrderedDict, defaultdict
|
||||
from decimal import Decimal
|
||||
from zoneinfo import ZoneInfo
|
||||
|
||||
@@ -605,10 +605,9 @@ class OrderListExporter(MultiSheetListExporter):
|
||||
]
|
||||
|
||||
questions = list(Question.objects.filter(event__in=self.events))
|
||||
options = {}
|
||||
options = defaultdict(list)
|
||||
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)
|
||||
@@ -618,6 +617,9 @@ 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'),
|
||||
@@ -727,7 +729,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 == Question.TYPE_CHOICE_MULTIPLE:
|
||||
if a.question.type in (Question.TYPE_CHOICE_MULTIPLE, Question.TYPE_CHOICE):
|
||||
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
|
||||
@@ -740,6 +742,10 @@ 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, ''))
|
||||
|
||||
|
||||
112
src/pretix/base/forms/renderers.py
Normal file
112
src/pretix/base/forms/renderers.py
Normal file
@@ -0,0 +1,112 @@
|
||||
from bootstrap3.renderers import FieldRenderer
|
||||
from bootstrap3.text import text_value
|
||||
from django.forms import CheckboxInput, CheckboxSelectMultiple, RadioSelect
|
||||
from django.forms.utils import flatatt
|
||||
from django.utils.html import format_html
|
||||
from django.utils.safestring import mark_safe
|
||||
from django.utils.translation import pgettext
|
||||
|
||||
|
||||
def render_label(content, label_for=None, label_class=None, label_title='', label_id='', optional=False, is_valid=None, attrs=None):
|
||||
"""
|
||||
Render a label with content
|
||||
"""
|
||||
attrs = attrs or {}
|
||||
if label_for:
|
||||
attrs['for'] = label_for
|
||||
if label_class:
|
||||
attrs['class'] = label_class
|
||||
if label_title:
|
||||
attrs['title'] = label_title
|
||||
if label_id:
|
||||
attrs['id'] = label_id
|
||||
|
||||
opt = ""
|
||||
|
||||
if is_valid is not None:
|
||||
if is_valid:
|
||||
validation_text = pgettext('form', 'is valid')
|
||||
else:
|
||||
validation_text = pgettext('form', 'has errors')
|
||||
opt += '<strong class="sr-only"> {}</strong>'.format(validation_text)
|
||||
|
||||
if text_value(content) == ' ':
|
||||
# Empty label, e.g. checkbox
|
||||
attrs.setdefault('class', '')
|
||||
attrs['class'] += ' label-empty'
|
||||
# usually checkboxes have overall empty labels and special labels per checkbox
|
||||
# => remove for-attribute as well as "required"-text appended to label
|
||||
if 'for' in attrs:
|
||||
del attrs['for']
|
||||
else:
|
||||
opt += '<i class="sr-only label-required">, {}</i>'.format(pgettext('form', 'required')) if not optional else ''
|
||||
|
||||
builder = '<{tag}{attrs}>{content}{opt}</{tag}>'
|
||||
return format_html(
|
||||
builder,
|
||||
tag='label',
|
||||
attrs=mark_safe(flatatt(attrs)) if attrs else '',
|
||||
opt=mark_safe(opt),
|
||||
content=text_value(content),
|
||||
)
|
||||
|
||||
|
||||
class PretixFieldRenderer(FieldRenderer):
|
||||
def __init__(self, *args, **kwargs):
|
||||
kwargs['layout'] = 'horizontal'
|
||||
super().__init__(*args, **kwargs)
|
||||
self.is_group_widget = isinstance(self.widget, (CheckboxSelectMultiple, RadioSelect, )) or (self.is_multi_widget and len(self.widget.widgets) > 1)
|
||||
|
||||
def add_label(self, html):
|
||||
attrs = {}
|
||||
label = self.get_label()
|
||||
|
||||
if hasattr(self.field.field, '_show_required'):
|
||||
# e.g. payment settings forms where a field is only required if the payment provider is active
|
||||
required = self.field.field._show_required
|
||||
elif hasattr(self.field.field, '_required'):
|
||||
# e.g. payment settings forms where a field is only required if the payment provider is active
|
||||
required = self.field.field._required
|
||||
else:
|
||||
required = self.field.field.required
|
||||
|
||||
if self.field.form.is_bound:
|
||||
is_valid = len(self.field.errors) == 0
|
||||
else:
|
||||
is_valid = None
|
||||
|
||||
if self.is_group_widget:
|
||||
label_for = ""
|
||||
label_id = "legend-{}".format(self.field.html_name)
|
||||
else:
|
||||
label_for = self.field.id_for_label
|
||||
label_id = ""
|
||||
|
||||
if hasattr(self.field.field, 'question') and self.field.field.question.identifier:
|
||||
attrs["data-identifier"] = self.field.field.question.identifier
|
||||
|
||||
html = render_label(
|
||||
label,
|
||||
label_for=label_for,
|
||||
label_class=self.get_label_class(),
|
||||
label_id=label_id,
|
||||
attrs=attrs,
|
||||
optional=not required and not isinstance(self.widget, CheckboxInput),
|
||||
is_valid=is_valid
|
||||
) + html
|
||||
return html
|
||||
|
||||
def wrap_label_and_field(self, html):
|
||||
if self.is_group_widget:
|
||||
attrs = ' role="group" aria-labelledby="legend-{}"'.format(self.field.html_name)
|
||||
else:
|
||||
attrs = ''
|
||||
return '<div class="{klass}"{attrs}>{html}</div>'.format(klass=self.get_form_group_class(), html=html, attrs=attrs)
|
||||
|
||||
def wrap_widget(self, html):
|
||||
if isinstance(self.widget, CheckboxInput):
|
||||
css_class = "checkbox"
|
||||
if self.field.field.disabled:
|
||||
css_class += " disabled"
|
||||
html = f'<div class="{css_class}">{html}</div>'
|
||||
return html
|
||||
@@ -1068,36 +1068,72 @@ 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:
|
||||
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:
|
||||
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:
|
||||
f.write(buffer.read())
|
||||
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:
|
||||
# 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)))
|
||||
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))
|
||||
|
||||
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:
|
||||
return BytesIO(f.read())
|
||||
else:
|
||||
buffer.seek(0)
|
||||
new_pdf = PdfReader(buffer)
|
||||
output = PdfWriter()
|
||||
|
||||
for i, page in enumerate(new_pdf.pages):
|
||||
for i, page in enumerate(fg_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',
|
||||
@@ -1108,33 +1144,61 @@ class Renderer:
|
||||
return outbuffer
|
||||
|
||||
|
||||
def merge_background(fg_pdf, bg_pdf, out_file, compress):
|
||||
def merge_background(fg_pdf: PdfWriter, bg_pdf: PdfWriter, 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')
|
||||
fg_pdf.write(fg_filename)
|
||||
bg_pdf.write(bg_filename)
|
||||
pdftk_cmd = [
|
||||
settings.PDFTK,
|
||||
fg_filename,
|
||||
'multibackground',
|
||||
bg_filename,
|
||||
'output',
|
||||
'-',
|
||||
]
|
||||
|
||||
# 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))
|
||||
|
||||
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)
|
||||
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)
|
||||
output.add_page(page)
|
||||
output.write(out_file)
|
||||
|
||||
# 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)
|
||||
|
||||
|
||||
@deconstructible
|
||||
|
||||
@@ -21,82 +21,16 @@
|
||||
#
|
||||
from bootstrap3.renderers import FieldRenderer, InlineFieldRenderer
|
||||
from bootstrap3.text import text_value
|
||||
from django.forms import CheckboxInput, CheckboxSelectMultiple, RadioSelect
|
||||
from django.forms.utils import flatatt
|
||||
from django.utils.html import format_html
|
||||
from django.utils.safestring import mark_safe
|
||||
from django.utils.translation import pgettext
|
||||
from i18nfield.forms import I18nFormField
|
||||
|
||||
from pretix.base.forms.renderers import PretixFieldRenderer
|
||||
|
||||
|
||||
def render_label(content, label_for=None, label_class=None, label_title='', label_id='', optional=False):
|
||||
"""
|
||||
Render a label with content
|
||||
"""
|
||||
attrs = {}
|
||||
if label_for:
|
||||
attrs['for'] = label_for
|
||||
if label_class:
|
||||
attrs['class'] = label_class
|
||||
if label_title:
|
||||
attrs['title'] = label_title
|
||||
if label_id:
|
||||
attrs['id'] = label_id
|
||||
|
||||
if text_value(content) == ' ':
|
||||
# Empty label, e.g. checkbox
|
||||
attrs.setdefault('class', '')
|
||||
attrs['class'] += ' label-empty'
|
||||
|
||||
builder = '<{tag}{attrs}>{content}{opt}</{tag}>'
|
||||
return format_html(
|
||||
builder,
|
||||
tag='label',
|
||||
attrs=mark_safe(flatatt(attrs)) if attrs else '',
|
||||
opt=mark_safe('<br><span class="optional">{}</span>'.format(pgettext('form', 'Optional'))) if optional else '',
|
||||
content=text_value(content),
|
||||
)
|
||||
|
||||
|
||||
class ControlFieldRenderer(FieldRenderer):
|
||||
def __init__(self, *args, **kwargs):
|
||||
kwargs['layout'] = 'horizontal'
|
||||
super().__init__(*args, **kwargs)
|
||||
self.is_group_widget = isinstance(self.widget, (CheckboxSelectMultiple, RadioSelect, )) or (self.is_multi_widget and len(self.widget.widgets) > 1)
|
||||
|
||||
def add_label(self, html):
|
||||
label = self.get_label()
|
||||
|
||||
if hasattr(self.field.field, '_required'):
|
||||
# e.g. payment settings forms where a field is only required if the payment provider is active
|
||||
required = self.field.field._required
|
||||
elif isinstance(self.field.field, I18nFormField):
|
||||
required = self.field.field.one_required
|
||||
else:
|
||||
required = self.field.field.required
|
||||
|
||||
if self.is_group_widget:
|
||||
label_for = ""
|
||||
label_id = "legend-{}".format(self.field.html_name)
|
||||
else:
|
||||
label_for = self.field.id_for_label
|
||||
label_id = ""
|
||||
|
||||
html = render_label(
|
||||
label,
|
||||
label_for=label_for,
|
||||
label_class=self.get_label_class(),
|
||||
label_id=label_id,
|
||||
optional=not required and not isinstance(self.widget, CheckboxInput)
|
||||
) + html
|
||||
return html
|
||||
|
||||
def wrap_label_and_field(self, html):
|
||||
if self.is_group_widget:
|
||||
attrs = ' role="group" aria-labelledby="legend-{}"'.format(self.field.html_name)
|
||||
else:
|
||||
attrs = ''
|
||||
return '<div class="{klass}"{attrs}>{html}</div>'.format(klass=self.get_form_group_class(), html=html, attrs=attrs)
|
||||
class ControlFieldRenderer(PretixFieldRenderer):
|
||||
pass
|
||||
|
||||
|
||||
class ControlFieldWithVisibilityRenderer(ControlFieldRenderer):
|
||||
|
||||
@@ -444,6 +444,11 @@ 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'),
|
||||
},
|
||||
]
|
||||
})
|
||||
|
||||
|
||||
307
src/pretix/control/sysreport.py
Normal file
307
src/pretix/control/sysreport.py
Normal file
@@ -0,0 +1,307 @@
|
||||
#
|
||||
# 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
|
||||
@@ -0,0 +1,35 @@
|
||||
{% 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 %}
|
||||
@@ -56,6 +56,7 @@ 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'),
|
||||
|
||||
@@ -32,14 +32,16 @@
|
||||
# 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 JsonResponse
|
||||
from django.http import HttpResponse, 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
|
||||
@@ -49,6 +51,7 @@ from pretix.control.forms.global_settings import (
|
||||
from pretix.control.permissions import (
|
||||
AdministratorPermissionRequiredMixin, StaffMemberRequiredMixin,
|
||||
)
|
||||
from pretix.control.sysreport import SysReport
|
||||
|
||||
|
||||
class GlobalSettingsView(AdministratorPermissionRequiredMixin, FormView):
|
||||
@@ -262,3 +265,25 @@ 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
|
||||
|
||||
@@ -1323,6 +1323,8 @@ 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:
|
||||
|
||||
@@ -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-05-30 17:00+0000\n"
|
||||
"PO-Revision-Date: 2024-06-19 16: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. nyligt oprettede)"
|
||||
msgstr "Alle arrangementer (inkl. nyoprettede begivenheder)"
|
||||
|
||||
#: pretix/api/models.py:119 pretix/base/models/devices.py:124
|
||||
#: pretix/base/models/organizer.py:265
|
||||
msgid "Limit to events"
|
||||
msgstr "Begræns til arrangementer"
|
||||
msgstr "Vis kun 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 "Bestillingskode"
|
||||
msgstr "Bestillingsnr."
|
||||
|
||||
#: 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 "Bestillingskode"
|
||||
msgstr "Bestillingsnr."
|
||||
|
||||
#: 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 "Bestillingskode:"
|
||||
msgstr "Bestillingsnr.:"
|
||||
|
||||
#: pretix/base/templates/pretixbase/email/order_details.html:31
|
||||
msgid "created by"
|
||||
@@ -14949,9 +14949,10 @@ msgid "The order has been reactivated."
|
||||
msgstr "Bestilling oprettet."
|
||||
|
||||
#: pretix/control/logdisplay.py:390
|
||||
#, fuzzy, python-brace-format
|
||||
#, python-brace-format
|
||||
msgid "The test mode order {code} has been deleted."
|
||||
msgstr "Den valgte dato er blevet slettet."
|
||||
msgstr ""
|
||||
"Bestillingen {code}, der blev oprettet under testmodus, er blevet slettet."
|
||||
|
||||
#: pretix/control/logdisplay.py:391
|
||||
msgid "The order has been created."
|
||||
@@ -27561,7 +27562,7 @@ msgstr ""
|
||||
#: pretix/plugins/reports/exporters.py:246
|
||||
msgctxt "export_category"
|
||||
msgid "Analysis"
|
||||
msgstr ""
|
||||
msgstr "Analyse"
|
||||
|
||||
#: pretix/plugins/reports/accountingreport.py:82
|
||||
#, fuzzy
|
||||
@@ -27659,9 +27660,8 @@ msgid "(excl. taxes)"
|
||||
msgstr "inkl. %(rate)s%% moms"
|
||||
|
||||
#: pretix/plugins/reports/exporters.py:275
|
||||
#, fuzzy
|
||||
msgid "(incl. taxes)"
|
||||
msgstr "inkl. %(rate)s%% moms"
|
||||
msgstr "(inkl. moms)"
|
||||
|
||||
#: pretix/plugins/reports/exporters.py:285
|
||||
#: pretix/plugins/reports/exporters.py:304
|
||||
|
||||
@@ -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-06 19:00+0000\n"
|
||||
"Last-Translator: Mira <weller@rami.io>\n"
|
||||
"PO-Revision-Date: 2024-06-18 20:00+0000\n"
|
||||
"Last-Translator: Thilo-Alexander Ginkel <tg@tgbyte.de>\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 derzeit nicht verfügbar (blockiert, bereits "
|
||||
"Der Sitzplatz \"{id}\" ist aktuell 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 derzeit kein Sitzplatz mit diesem Produkt verfügbar."
|
||||
msgstr "Es ist aktuell 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 Bankeinzug als Zahlungsmethode "
|
||||
"nutzen sofort, auch wenn die Veranstaltung konfiguriert ist Rechnungen erst "
|
||||
"nach Zahlungseingang zu generieren."
|
||||
"Generiere Rechnungen für Bestellungen die Banküberweisung 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 derzeit keine Produkte verfügbar, die mit diesem Gutschein gebucht "
|
||||
"Es sind aktuell keine Produkte verfügbar, die mit diesem Gutschein gebucht "
|
||||
"werden können."
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html:52
|
||||
|
||||
@@ -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-06 19:00+0000\n"
|
||||
"Last-Translator: Mira <weller@rami.io>\n"
|
||||
"PO-Revision-Date: 2024-06-18 20:00+0000\n"
|
||||
"Last-Translator: Thilo-Alexander Ginkel <tg@tgbyte.de>\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 derzeit nicht verfügbar (blockiert, bereits "
|
||||
"Der Sitzplatz \"{id}\" ist aktuell 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 derzeit kein Sitzplatz mit diesem Produkt verfügbar."
|
||||
msgstr "Es ist aktuell 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 Bankeinzug als Zahlungsmethode "
|
||||
"nutzen sofort, auch wenn die Veranstaltung konfiguriert ist Rechnungen erst "
|
||||
"nach Zahlungseingang zu generieren."
|
||||
"Generiere Rechnungen für Bestellungen die Banküberweisung 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 derzeit keine Produkte verfügbar, die mit diesem Gutschein gebucht "
|
||||
"Es sind aktuell keine Produkte verfügbar, die mit diesem Gutschein gebucht "
|
||||
"werden können."
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html:52
|
||||
|
||||
@@ -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-08 18:00+0000\n"
|
||||
"Last-Translator: alemairebe <adrien@alemaire.be>\n"
|
||||
"PO-Revision-Date: 2024-06-18 20:00+0000\n"
|
||||
"Last-Translator: simonD <simon.dalvy@gmail.com>\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 ""
|
||||
msgstr "Norvégien Bokmål"
|
||||
|
||||
#: pretix/_base_settings.py:96
|
||||
msgid "Polish"
|
||||
@@ -158,10 +158,8 @@ 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 autorisées, séparées par des espaces"
|
||||
msgstr "Liste des URI de déconnexion 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
|
||||
@@ -313,10 +311,8 @@ 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 genre de questions ne peut pas être posé lors de l'enregistrement."
|
||||
msgstr "Ce type de questions ne peut pas être affiché lors de l'enregistrement."
|
||||
|
||||
#: pretix/api/serializers/media.py:108
|
||||
msgid ""
|
||||
@@ -461,7 +457,7 @@ msgstr "Commande modifiée"
|
||||
|
||||
#: pretix/api/webhooks.py:266
|
||||
msgid "Refund of payment created"
|
||||
msgstr "Le remboursement de la paiement a été fait"
|
||||
msgstr "Le remboursement du paiement a été réalisé"
|
||||
|
||||
#: pretix/api/webhooks.py:270 pretix/base/notifications.py:293
|
||||
msgid "External refund of payment"
|
||||
@@ -469,15 +465,15 @@ msgstr "Remboursement externe du paiement"
|
||||
|
||||
#: pretix/api/webhooks.py:274
|
||||
msgid "Refund of payment requested by customer"
|
||||
msgstr "Une remboursement a été demandé par le.a client.e"
|
||||
msgstr "Un remboursement a été demandé par le.a client.e"
|
||||
|
||||
#: pretix/api/webhooks.py:278
|
||||
msgid "Refund of payment completed"
|
||||
msgstr "Paiement effectué"
|
||||
msgstr "Remboursement du paiement effectué"
|
||||
|
||||
#: pretix/api/webhooks.py:282
|
||||
msgid "Refund of payment canceled"
|
||||
msgstr "La remboursement a été annulée"
|
||||
msgstr "Le remboursement a été annulé"
|
||||
|
||||
#: pretix/api/webhooks.py:286
|
||||
msgid "Refund of payment failed"
|
||||
@@ -1203,8 +1199,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 d'ordres qui ont été paié partiellement ou totalement par "
|
||||
"un autre fournisseur de paiement."
|
||||
"certaines factures de commandes qui ont été payées partiellement ou "
|
||||
"totalement par un autre fournisseur de paiement."
|
||||
|
||||
#: pretix/base/exporters/invoices.py:126
|
||||
msgid "All invoices"
|
||||
@@ -1744,10 +1740,8 @@ 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 "Heure du check-in"
|
||||
msgstr "Texte d'enregistrement"
|
||||
|
||||
#: pretix/base/exporters/items.py:92 pretix/base/models/items.py:595
|
||||
#: pretix/base/models/items.py:1080
|
||||
@@ -1833,7 +1827,7 @@ msgstr "frais de la commande"
|
||||
|
||||
#: pretix/base/exporters/orderlist.py:109
|
||||
msgid "Only paid orders"
|
||||
msgstr "Seulement les ordres payés"
|
||||
msgstr "Seulement les commandes payées"
|
||||
|
||||
#: pretix/base/exporters/orderlist.py:115
|
||||
msgid "Include payment amounts"
|
||||
@@ -1925,7 +1919,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 "Statut"
|
||||
msgstr "État"
|
||||
|
||||
#: pretix/base/exporters/orderlist.py:260
|
||||
#: pretix/base/exporters/orderlist.py:443
|
||||
@@ -2685,7 +2679,7 @@ msgstr "Tous"
|
||||
|
||||
#: pretix/base/exporters/orderlist.py:1278 pretix/control/forms/filter.py:1343
|
||||
msgid "Live"
|
||||
msgstr "En direct"
|
||||
msgstr "En ligne"
|
||||
|
||||
#: pretix/base/exporters/orderlist.py:1287 pretix/control/forms/filter.py:1351
|
||||
#: pretix/control/templates/pretixcontrol/pdf/index.html:252
|
||||
@@ -2756,8 +2750,6 @@ 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"
|
||||
@@ -2884,7 +2876,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 ""
|
||||
msgstr "Vous pouvez utiliser {markup_name} dans ce champ."
|
||||
|
||||
#: pretix/base/forms/__init__.py:178
|
||||
#, python-format
|
||||
@@ -3618,10 +3610,11 @@ msgid "Price mode"
|
||||
msgstr "Mode prix"
|
||||
|
||||
#: pretix/base/modelimport_vouchers.py:150
|
||||
#, fuzzy, python-brace-format
|
||||
#| msgid "Could not parse {value} as a date and time."
|
||||
#, python-brace-format
|
||||
msgid "Could not parse {value} as a price mode, use one of {options}."
|
||||
msgstr "Impossible d’analyser {value} comme date et heure."
|
||||
msgstr ""
|
||||
"Impossible d'analyser {value} en tant que mode de prix, utilisez l'une des "
|
||||
"{options}."
|
||||
|
||||
#: pretix/base/modelimport_vouchers.py:160 pretix/base/models/vouchers.py:245
|
||||
msgid "Voucher value"
|
||||
@@ -3629,7 +3622,7 @@ msgstr "Valeur du bon"
|
||||
|
||||
#: pretix/base/modelimport_vouchers.py:165
|
||||
msgid "It is pointless to set a value without a price mode."
|
||||
msgstr ""
|
||||
msgstr "Il est inutile de fixer une valeur sans mode de prix."
|
||||
|
||||
#: pretix/base/modelimport_vouchers.py:237 pretix/base/models/items.py:1998
|
||||
#: pretix/base/models/vouchers.py:272
|
||||
@@ -3639,12 +3632,8 @@ 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 sélectionner simultanément un quota et un produit "
|
||||
"spécifique."
|
||||
msgstr "Vous ne pouvez pas spécifier un quota si vous avez spécifié un produit."
|
||||
|
||||
#: pretix/base/modelimport_vouchers.py:282 pretix/base/models/vouchers.py:495
|
||||
msgid "You need to choose a date if you select a seat."
|
||||
@@ -3691,12 +3680,14 @@ msgstr ""
|
||||
"ce bon"
|
||||
|
||||
#: pretix/base/models/auth.py:248
|
||||
#, fuzzy
|
||||
msgid "Is active"
|
||||
msgstr "Est actif"
|
||||
msgstr "Actif"
|
||||
|
||||
#: pretix/base/models/auth.py:250
|
||||
#, fuzzy
|
||||
msgid "Is site admin"
|
||||
msgstr "Est administrateur du site"
|
||||
msgstr "Administrateur du site"
|
||||
|
||||
#: pretix/base/models/auth.py:252
|
||||
msgid "Date joined"
|
||||
@@ -3909,10 +3900,8 @@ msgid "Ticket blocked"
|
||||
msgstr "Billet bloqué"
|
||||
|
||||
#: pretix/base/models/checkin.py:370
|
||||
#, fuzzy
|
||||
#| msgid "Order approved"
|
||||
msgid "Order not approved"
|
||||
msgstr "Commande approuvé"
|
||||
msgstr "Commande non validée"
|
||||
|
||||
#: pretix/base/models/checkin.py:371
|
||||
msgid "Ticket not valid at this time"
|
||||
@@ -4018,8 +4007,9 @@ 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 "Porte"
|
||||
msgstr "Pont"
|
||||
|
||||
#: pretix/base/models/devices.py:132
|
||||
#: pretix/control/templates/pretixcontrol/organizers/devices.html:83
|
||||
@@ -4881,6 +4871,8 @@ 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 ""
|
||||
@@ -6070,11 +6062,11 @@ msgstr "Possibilité de modifier les paramètres du produit"
|
||||
|
||||
#: pretix/base/models/organizer.py:309
|
||||
msgid "Can view orders"
|
||||
msgstr "Peut afficher les ordres"
|
||||
msgstr "Peut afficher les commandes"
|
||||
|
||||
#: pretix/base/models/organizer.py:313
|
||||
msgid "Can change orders"
|
||||
msgstr "Possibilité de modifier les ordres"
|
||||
msgstr "Possibilité de modifier les commandes"
|
||||
|
||||
#: pretix/base/models/organizer.py:317
|
||||
msgid "Can perform check-ins"
|
||||
@@ -7514,17 +7506,15 @@ msgstr ""
|
||||
"dans la quantité sélectionnée. Voir ci-dessous pour plus de détails."
|
||||
|
||||
#: pretix/base/services/cart.py:122
|
||||
#, fuzzy, python-format
|
||||
#| msgid ""
|
||||
#| "Some of the products you selected are no longer available in the quantity "
|
||||
#| "you selected. Please see below for details."
|
||||
#, python-format
|
||||
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. Voir ci-dessous pour plus de détails."
|
||||
"dans la quantité sélectionnée. Les produits suivants sont concernés et n'ont "
|
||||
"pas été ajoutés à votre panier : %s"
|
||||
|
||||
#: pretix/base/services/cart.py:127
|
||||
#, python-format
|
||||
@@ -8861,7 +8851,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 ""
|
||||
@@ -9202,8 +9192,9 @@ 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 exécutants de factures."
|
||||
msgstr "Seulement respecté par certains générateurs de factures."
|
||||
|
||||
#: pretix/base/settings.py:730 pretix/base/settings.py:2847
|
||||
#: pretix/control/templates/pretixcontrol/pdf/index.html:352
|
||||
@@ -9744,10 +9735,8 @@ msgstr ""
|
||||
"réattribué à la personne suivante sur la liste."
|
||||
|
||||
#: pretix/base/settings.py:1407
|
||||
#, fuzzy
|
||||
#| msgid "Enable waiting list"
|
||||
msgid "Disable waiting list"
|
||||
msgstr "Activer la liste d'attente"
|
||||
msgstr "Désactiver la liste d'attente"
|
||||
|
||||
#: pretix/base/settings.py:1408
|
||||
msgid ""
|
||||
@@ -9757,6 +9746,11 @@ 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"
|
||||
@@ -10098,6 +10092,9 @@ 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."
|
||||
@@ -10590,17 +10587,16 @@ msgid ""
|
||||
msgstr ""
|
||||
"Bonjour\n"
|
||||
"\n"
|
||||
"Nous avons reçu avec succès votre commande pour {event}. Depuis que vous "
|
||||
"avez commandé\n"
|
||||
"un produit qui nécessite l’approbation de l’organisateur de l’événement, "
|
||||
"nous vous demandons de\n"
|
||||
"Soyez patient et attendez notre prochain e-mail.\n"
|
||||
"Nous avons reçu avec succès votre commande pour l'événement {event}.\n"
|
||||
"Votre commande nécessite l’approbation de l’organisateur de l’événement,\n"
|
||||
"nous vous demandons d'être patient, nous vous recontacterons sous peu par "
|
||||
"e-mail.\n"
|
||||
"\n"
|
||||
"Vous pouvez modifier les détails de votre commande et consulter l’état de "
|
||||
"votre commande à l’adresse\n"
|
||||
"Vous pouvez modifier les détails de votre commande et consulter son état à l’"
|
||||
"adresse suivante :\n"
|
||||
"{url}\n"
|
||||
"\n"
|
||||
"Sinceres salutations \n"
|
||||
"Sincères salutations\n"
|
||||
"Votre équipe {event}"
|
||||
|
||||
#: pretix/base/settings.py:2243
|
||||
@@ -11053,17 +11049,16 @@ msgid ""
|
||||
msgstr ""
|
||||
"Bonjour\n"
|
||||
"\n"
|
||||
"Nous avons approuvé votre commande pour {event} et serons heureux de vous "
|
||||
"accueillir\n"
|
||||
"lors de notre événement.\n"
|
||||
"Nous avons approuvé votre commande pour l'événement {event} \n"
|
||||
"et serons heureux de vous accueillir à cette occasion.\n"
|
||||
"\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"
|
||||
"Veuillez continuer en payant votre commande avant le {expire_date}.\n"
|
||||
"\n"
|
||||
"Vous pouvez sélectionner un mode de paiement et effectuer le paiement à l’"
|
||||
"adresse suivante :\n"
|
||||
"{url}\n"
|
||||
"\n"
|
||||
"Sinceres salutations \n"
|
||||
"Sincères salutations\n"
|
||||
"Votre équipe {event}"
|
||||
|
||||
#: pretix/base/settings.py:2526 pretix/base/settings.py:2563
|
||||
@@ -11110,16 +11105,16 @@ msgid ""
|
||||
msgstr ""
|
||||
"Bonjour\n"
|
||||
"\n"
|
||||
"Nous avons approuvé votre commande pour {event} et serons heureux de vous "
|
||||
"accueillir\n"
|
||||
"lors de notre événement. Comme vous n’avez commandé que des produits "
|
||||
"gratuits, aucun paiement n’est requis.\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 n’est requis.\n"
|
||||
"\n"
|
||||
"Vous pouvez modifier les détails de votre commande et consulter l’état de "
|
||||
"votre commande à l’adresse\n"
|
||||
"Vous pouvez modifier les détails de votre commande et consulter son état à l’"
|
||||
"adresse suivante :\n"
|
||||
"{url}\n"
|
||||
"\n"
|
||||
"Sinceres salutations \n"
|
||||
"Sincères salutations\n"
|
||||
"Votre équipe {event}"
|
||||
|
||||
#: pretix/base/settings.py:2575
|
||||
@@ -12588,11 +12583,9 @@ 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 "Suppression d'une inscription de la liste d'attente"
|
||||
msgstr "La liste d'attente est désactivée"
|
||||
|
||||
#: pretix/base/timeline.py:181
|
||||
msgctxt "timeline"
|
||||
@@ -13288,9 +13281,8 @@ msgid ""
|
||||
"Our regular widget doesn't work in all website builders. If you run into "
|
||||
"trouble, try using this compatibility mode."
|
||||
msgstr ""
|
||||
"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é."
|
||||
"Notre widget standard ne fonctionne pas avec tous les 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."
|
||||
@@ -13628,7 +13620,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 "Requête de recherche"
|
||||
msgstr "Recherche"
|
||||
|
||||
#: pretix/control/forms/filter.py:1423 pretix/control/forms/filter.py:1496
|
||||
#: pretix/control/templates/pretixcontrol/organizers/customer.html:45
|
||||
@@ -18198,7 +18190,7 @@ msgstr ""
|
||||
"Les e-mails seront envoyés via le serveur par défaut du système, mais avec "
|
||||
"votre propre adresse d’expé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élivrabilité."
|
||||
"nécessiter des étapes supplémentaires pour assurer une bonne déliverabilité."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/email_setup.html:84
|
||||
#: pretix/control/templates/pretixcontrol/email_setup_smtp.html:18
|
||||
@@ -18731,7 +18723,7 @@ msgstr ""
|
||||
#: pretix/control/templates/pretixcontrol/event/live.html:51
|
||||
#: pretix/control/templates/pretixcontrol/event/live.html:65
|
||||
msgid "Go live"
|
||||
msgstr "En direct"
|
||||
msgstr "Publier"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/event/live.html:59
|
||||
msgid "If you want to, you can publish your ticket shop now."
|
||||
@@ -18788,7 +18780,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"En outre, le mode test ne couvre que la boutique en ligne principale. Les "
|
||||
"commandes créées via d’autres canaux de vente tels que le module billetterie "
|
||||
"ou revendeurs sont toujours créées en tant qu’ordres de fabrication."
|
||||
"ou revendeurs sont toujours créées en tant que commande de production."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/event/live.html:112
|
||||
msgid ""
|
||||
@@ -19254,7 +19246,7 @@ msgstr "Nom et adresse"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/event/settings.html:88
|
||||
msgid "See invoice settings"
|
||||
msgstr "Voir les paramètre de facturation"
|
||||
msgstr "Voir les paramètres de facturation"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/event/settings.html:94
|
||||
msgid "Attendee data (once per personalized ticket)"
|
||||
@@ -19325,7 +19317,7 @@ msgstr "Affichage"
|
||||
#, fuzzy
|
||||
#| msgid "Product history"
|
||||
msgid "Product list"
|
||||
msgstr "Historique du produit"
|
||||
msgstr "Liste de produits"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/event/settings.html:248
|
||||
#, fuzzy
|
||||
@@ -21178,9 +21170,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 nouvel ordre \" pour plusieurs positions, "
|
||||
"elles seront toutes divisées en un seul second ordre ensemble, et non en "
|
||||
"plusieurs ordres."
|
||||
"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."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/order/change.html:48
|
||||
msgid ""
|
||||
@@ -22596,10 +22588,8 @@ 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 montant total payé"
|
||||
msgstr "Remboursement du trop-perçu"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/orders/index.html:314
|
||||
#: pretix/control/views/orders.py:317
|
||||
@@ -25011,8 +25001,9 @@ 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 "Utilisateur usurpé"
|
||||
msgstr "Voir le site comme cet utilisateur"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/users/form.html:42
|
||||
msgid "Authentication backend"
|
||||
@@ -25468,7 +25459,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 mondial. De cette façon, "
|
||||
"Ces paramètres sont actuellement définis au niveau global. 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 "
|
||||
@@ -25662,7 +25653,7 @@ msgstr "en ligne"
|
||||
|
||||
#: pretix/control/views/dashboards.py:271
|
||||
msgid "live and in test mode"
|
||||
msgstr "en direct et en mode test"
|
||||
msgstr "en production et en mode test"
|
||||
|
||||
#: pretix/control/views/dashboards.py:272
|
||||
msgid "not yet public"
|
||||
@@ -30243,7 +30234,7 @@ msgstr "Compte Stripe"
|
||||
#: pretix/plugins/stripe/payment.py:258
|
||||
msgctxt "stripe"
|
||||
msgid "Live"
|
||||
msgstr "En direct"
|
||||
msgstr "En ligne"
|
||||
|
||||
#: pretix/plugins/stripe/payment.py:259
|
||||
msgctxt "stripe"
|
||||
@@ -30260,7 +30251,7 @@ msgstr ""
|
||||
|
||||
#: pretix/plugins/stripe/payment.py:274
|
||||
msgid "Publishable key"
|
||||
msgstr "Clé publiable"
|
||||
msgstr "Clé publique"
|
||||
|
||||
#: pretix/plugins/stripe/payment.py:277
|
||||
#, fuzzy
|
||||
@@ -30759,7 +30750,7 @@ msgstr "Stripe Connect : clé secrète"
|
||||
|
||||
#: pretix/plugins/stripe/signals.py:137
|
||||
msgid "Stripe Connect: Publishable key"
|
||||
msgstr "Stripe Connect : clé publiable"
|
||||
msgstr "Stripe Connect : clé publique"
|
||||
|
||||
#: pretix/plugins/stripe/signals.py:144
|
||||
msgid "Stripe Connect: Secret key (test)"
|
||||
@@ -30767,7 +30758,7 @@ msgstr "Stripe Connect : clé secrète (test)"
|
||||
|
||||
#: pretix/plugins/stripe/signals.py:151
|
||||
msgid "Stripe Connect: Publishable key (test)"
|
||||
msgstr "Stripe Connect : clé publiable (test)"
|
||||
msgstr "Stripe Connect : clé publique (test)"
|
||||
|
||||
#: pretix/plugins/stripe/signals.py:177
|
||||
#: pretix/plugins/stripe/templates/pretixplugins/stripe/oauth_disconnect.html:3
|
||||
@@ -31522,23 +31513,17 @@ 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 désactivée."
|
||||
msgstr "Cette billetterie est actuellement en mode test."
|
||||
|
||||
#: 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 ""
|
||||
"Cette billetterie est actuellement en mode test. Veuillez ne pas effectuer "
|
||||
"d’achats réels car votre commande pourrait être supprimée sans préavis."
|
||||
"Veuillez ne pas effectuer d’achats réels car votre commande pourrait être "
|
||||
"supprimée sans préavis."
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/base.html:123
|
||||
#, python-format
|
||||
@@ -31546,6 +31531,8 @@ 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
|
||||
@@ -34187,12 +34174,10 @@ 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 réduit le prix "
|
||||
"total."
|
||||
"Vous ne pouvez pas modifier votre commande d'une manière qui nécessiterait "
|
||||
"un remboursement."
|
||||
|
||||
#: pretix/presale/views/order.py:1643
|
||||
msgid ""
|
||||
@@ -34250,16 +34235,13 @@ msgstr ""
|
||||
"actuellement disponible."
|
||||
|
||||
#: pretix/presale/views/waiting.py:141
|
||||
#, 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."
|
||||
#, python-brace-format
|
||||
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 dès que "
|
||||
"les billets seront de nouveau disponibles."
|
||||
"Nous vous avons ajouté à la liste d'attente. Vous recevrez un email à "
|
||||
"l'adresse {email} dès que ce produit sera de nouveau disponible."
|
||||
|
||||
#: pretix/presale/views/waiting.py:169
|
||||
msgid "We could not find you on our waiting list."
|
||||
|
||||
@@ -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: 2023-09-11 10:00+0000\n"
|
||||
"Last-Translator: Ronan LE MEILLAT <ronan.le_meillat@highcanfly.club>\n"
|
||||
"PO-Revision-Date: 2024-06-12 03:00+0000\n"
|
||||
"Last-Translator: simonD <simon.dalvy@gmail.com>\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 4.18.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
|
||||
@@ -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 ""
|
||||
msgstr "Commande non validée"
|
||||
|
||||
#: 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,8 +444,9 @@ msgid "Product variation"
|
||||
msgstr "Variation du produit"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:107
|
||||
#, fuzzy
|
||||
msgid "Gate"
|
||||
msgstr ""
|
||||
msgstr "Pont"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:111
|
||||
msgid "Current date and time"
|
||||
@@ -471,13 +472,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"
|
||||
msgstr "Nombre d'entrées précédentes depuis"
|
||||
|
||||
#: 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"
|
||||
msgstr "Nombre d'entrées précédentes avant"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:139
|
||||
msgid "Number of days with a previous entry"
|
||||
@@ -642,7 +643,7 @@ msgstr ""
|
||||
#: pretix/static/pretixcontrol/js/ui/main.js:475
|
||||
#: pretix/static/pretixcontrol/js/ui/main.js:495
|
||||
msgid "Search query"
|
||||
msgstr "Requête de recherche"
|
||||
msgstr "Recherche"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/main.js:493
|
||||
msgid "All"
|
||||
@@ -661,8 +662,9 @@ msgid "Enter page number between 1 and %(max)s."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/main.js:831
|
||||
#, fuzzy
|
||||
msgid "Invalid page number."
|
||||
msgstr ""
|
||||
msgstr "Numéro de page invalide."
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/main.js:989
|
||||
msgid "Use a different name internally"
|
||||
@@ -855,9 +857,10 @@ 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 ""
|
||||
msgstr "Méthode de paiement plus disponible"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:37
|
||||
#, fuzzy
|
||||
@@ -865,7 +868,7 @@ msgstr ""
|
||||
#| msgid "currently available: %s"
|
||||
msgctxt "widget"
|
||||
msgid "Currently not available"
|
||||
msgstr "actuellement disponible : %s"
|
||||
msgstr "Actuellement non disponible"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:38
|
||||
#, javascript-format
|
||||
@@ -963,7 +966,7 @@ msgstr "Continuer"
|
||||
#| msgid "Select variant %s"
|
||||
msgctxt "widget"
|
||||
msgid "Show variants"
|
||||
msgstr "Sélectionner les variations %s"
|
||||
msgstr "Voir les variations"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:57
|
||||
#, fuzzy
|
||||
@@ -971,7 +974,7 @@ msgstr "Sélectionner les variations %s"
|
||||
#| msgid "Select variant %s"
|
||||
msgctxt "widget"
|
||||
msgid "Hide variants"
|
||||
msgstr "Sélectionner les variations %s"
|
||||
msgstr "Masquer les variations"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:58
|
||||
msgctxt "widget"
|
||||
|
||||
@@ -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-05-07 22:00+0000\n"
|
||||
"Last-Translator: Adam Kaput <adamkaput@gmail.com>\n"
|
||||
"PO-Revision-Date: 2024-06-18 20:00+0000\n"
|
||||
"Last-Translator: Anarion Dunedain <anarion@go2.pl>\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.4.3\n"
|
||||
"X-Generator: Weblate 5.5.5\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 ""
|
||||
msgstr "Nośnik podpięty do innego wydarzenia"
|
||||
|
||||
#: 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 ""
|
||||
msgstr "Nośnik wielokrotnego użytku"
|
||||
|
||||
#: 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 ""
|
||||
msgstr "W tym polu możesz użyć {markup_name}."
|
||||
|
||||
#: 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 ""
|
||||
msgstr "Domyślny renderer faktur (styl europejski)"
|
||||
|
||||
#: 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 ""
|
||||
msgstr "Uproszczony renderer faktur"
|
||||
|
||||
#: 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 ""
|
||||
msgstr "Niepoprawne ustawienie dla kolumny \"{header}\"."
|
||||
|
||||
#: pretix/base/modelimport.py:199
|
||||
#, python-brace-format
|
||||
msgid "Could not parse {value} as a yes/no value."
|
||||
msgstr ""
|
||||
msgstr "Nie udało się odczytać {value} jako wartości tak/nie."
|
||||
|
||||
#: pretix/base/modelimport.py:216
|
||||
#, python-brace-format
|
||||
msgid "Could not parse {value} as a date and time."
|
||||
msgstr ""
|
||||
msgstr "Nie udało się odczytać {value} jako daty i czasu."
|
||||
|
||||
#: 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 ""
|
||||
msgstr "Oblicz z produktu"
|
||||
|
||||
#: pretix/base/modelimport_orders.py:450
|
||||
#: pretix/control/templates/pretixcontrol/checkin/index.html:111
|
||||
|
||||
@@ -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-05-27 21:00+0000\n"
|
||||
"Last-Translator: mathbrito <mathbrito@users.noreply.translate.pretix.eu>\n"
|
||||
"PO-Revision-Date: 2024-06-18 20:00+0000\n"
|
||||
"Last-Translator: \"L. Pereira\" <l@tia.mat.br>\n"
|
||||
"Language-Team: Portuguese (Brazil) <https://translate.pretix.eu/projects/"
|
||||
"pretix/pretix/pt_BR/>\n"
|
||||
"Language: pt_BR\n"
|
||||
@@ -160,10 +160,8 @@ 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, separadas por espaço"
|
||||
msgstr "Lista de URIs permitidas após logout, 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
|
||||
@@ -231,7 +229,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 ao 'vivo'. Cotas e pagamentos devem ser "
|
||||
"Eventos não podem ser criados como '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
|
||||
@@ -312,16 +310,12 @@ 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 cartão de presente com o mesmo segredo já existe na sua conta ou na de "
|
||||
"algum organizador afiliado."
|
||||
"Um meio de pagamento com o mesmo tipo e identificador existe em sua conta de "
|
||||
"organização."
|
||||
|
||||
#: pretix/api/serializers/order.py:79
|
||||
#, python-brace-format
|
||||
@@ -345,10 +339,8 @@ 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 "Um voucher com esse código já existe."
|
||||
msgstr "Uma conta com este endereço de email já foi registrada."
|
||||
|
||||
#: pretix/api/serializers/organizer.py:205
|
||||
#: pretix/control/forms/organizer.py:678
|
||||
@@ -375,15 +367,13 @@ 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 "Seu carrinho foi atualizado."
|
||||
msgstr "O cupom fornecido já foi usado um número máximo de vezes."
|
||||
|
||||
#: pretix/api/views/checkin.py:604 pretix/api/views/checkin.py:611
|
||||
msgid "Medium connected to other event"
|
||||
msgstr ""
|
||||
msgstr "Meio conectado à outro evento"
|
||||
|
||||
#: pretix/api/views/oauth.py:107 pretix/control/logdisplay.py:472
|
||||
#, python-brace-format
|
||||
@@ -441,10 +431,8 @@ msgid "Order expired"
|
||||
msgstr "O carrinho expirou"
|
||||
|
||||
#: pretix/api/webhooks.py:250
|
||||
#, fuzzy
|
||||
#| msgid "Order information changed"
|
||||
msgid "Order expiry date changed"
|
||||
msgstr "Informações do pedido alteradas"
|
||||
msgstr "Data de validade do pedido alterada"
|
||||
|
||||
#: pretix/api/webhooks.py:254 pretix/base/notifications.py:269
|
||||
msgid "Order information changed"
|
||||
@@ -460,10 +448,8 @@ msgid "Order changed"
|
||||
msgstr "Pedido alterado"
|
||||
|
||||
#: pretix/api/webhooks.py:266
|
||||
#, fuzzy
|
||||
#| msgid "Payment method"
|
||||
msgid "Refund of payment created"
|
||||
msgstr "Meio de pagamento"
|
||||
msgstr "Pedido de reembolso criado"
|
||||
|
||||
#: pretix/api/webhooks.py:270 pretix/base/notifications.py:293
|
||||
msgid "External refund of payment"
|
||||
@@ -474,28 +460,20 @@ 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 "Meio de pagamento"
|
||||
msgstr "Pedido de reembolso completado"
|
||||
|
||||
#: pretix/api/webhooks.py:282
|
||||
#, fuzzy
|
||||
#| msgid "External refund of payment"
|
||||
msgid "Refund of payment canceled"
|
||||
msgstr "Reembolso externo do pagamento"
|
||||
msgstr "Reembolso de pagamento cancelado"
|
||||
|
||||
#: pretix/api/webhooks.py:286
|
||||
#, fuzzy
|
||||
#| msgid "External refund of payment"
|
||||
msgid "Refund of payment failed"
|
||||
msgstr "Reembolso externo do pagamento"
|
||||
msgstr "Falha no reembolso de pagamento"
|
||||
|
||||
#: pretix/api/webhooks.py:290
|
||||
#, fuzzy
|
||||
#| msgid "Payment date"
|
||||
msgid "Payment confirmed"
|
||||
msgstr "Data de pagamento"
|
||||
msgstr "Pagamento confirmado"
|
||||
|
||||
#: pretix/api/webhooks.py:294
|
||||
msgid "Order approved"
|
||||
@@ -549,69 +527,48 @@ 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 ativa"
|
||||
msgstr "Loja ativada"
|
||||
|
||||
#: pretix/api/webhooks.py:343
|
||||
#, fuzzy
|
||||
#| msgid "Shop is live"
|
||||
msgid "Shop taken offline"
|
||||
msgstr "Loja ativa"
|
||||
msgstr "Loja desativada"
|
||||
|
||||
#: pretix/api/webhooks.py:347
|
||||
#, fuzzy
|
||||
#| msgid "Your cart has been updated."
|
||||
msgid "Test-Mode of shop has been activated"
|
||||
msgstr "Seu carrinho foi atualizado."
|
||||
msgstr "Modo de teste da loja ativado"
|
||||
|
||||
#: pretix/api/webhooks.py:351
|
||||
#, fuzzy
|
||||
#| msgid "Your cart has been updated."
|
||||
msgid "Test-Mode of shop has been deactivated"
|
||||
msgstr "Seu carrinho foi atualizado."
|
||||
msgstr "Modo de teste da loja foi desativado"
|
||||
|
||||
#: pretix/api/webhooks.py:355
|
||||
#, fuzzy
|
||||
#| msgid "Waiting list"
|
||||
msgid "Waiting list entry added"
|
||||
msgstr "Lista de espera"
|
||||
msgstr "Entrada na lista de espera adicionada"
|
||||
|
||||
#: pretix/api/webhooks.py:359
|
||||
#, fuzzy
|
||||
#| msgid "Waiting list"
|
||||
msgid "Waiting list entry changed"
|
||||
msgstr "Lista de espera"
|
||||
msgstr "Entrada na lista de espera alterada"
|
||||
|
||||
#: pretix/api/webhooks.py:363
|
||||
#, fuzzy
|
||||
#| msgid "Waiting list"
|
||||
msgid "Waiting list entry deleted"
|
||||
msgstr "Lista de espera"
|
||||
msgstr "Entrada na lista de espera apagada"
|
||||
|
||||
#: pretix/api/webhooks.py:367
|
||||
msgid "Waiting list entry received voucher"
|
||||
msgstr ""
|
||||
msgstr "Entrada na lista de espera recebeu cupom"
|
||||
|
||||
#: pretix/api/webhooks.py:371
|
||||
#, fuzzy
|
||||
#| msgctxt "refund_source"
|
||||
#| msgid "Customer"
|
||||
msgid "Customer account created"
|
||||
msgstr "Cliente"
|
||||
msgstr "Conta de usuário criada"
|
||||
|
||||
#: pretix/api/webhooks.py:375
|
||||
#, fuzzy
|
||||
#| msgid "Account information changed"
|
||||
msgid "Customer account changed"
|
||||
msgstr "Informações da conta alteradas"
|
||||
msgstr "Informações da conta foram alteradas"
|
||||
|
||||
#: pretix/api/webhooks.py:379
|
||||
#, fuzzy
|
||||
#| msgid "Your cart has been updated."
|
||||
msgid "Customer account anonymized"
|
||||
msgstr "Seu carrinho foi atualizado."
|
||||
msgstr "Conta foi anonimizada"
|
||||
|
||||
#: pretix/base/addressvalidation.py:100 pretix/base/addressvalidation.py:103
|
||||
#: pretix/base/addressvalidation.py:108 pretix/base/forms/questions.py:953
|
||||
@@ -701,10 +658,9 @@ msgid "Incompatible SSO provider: \"{error}\"."
|
||||
msgstr "Provedor de SSO incompatível: \"{error}\"."
|
||||
|
||||
#: pretix/base/customersso/oidc.py:109
|
||||
#, fuzzy, python-brace-format
|
||||
#| msgid "Presale not started"
|
||||
#, python-brace-format
|
||||
msgid "You are not requesting \"{scope}\"."
|
||||
msgstr "Pré-venda não iniciada"
|
||||
msgstr "Você não está requisitando \"{scope}\"."
|
||||
|
||||
#: pretix/base/customersso/oidc.py:115
|
||||
#, python-brace-format
|
||||
@@ -738,6 +694,8 @@ 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
|
||||
@@ -779,10 +737,8 @@ msgid "Combined Excel (.xlsx)"
|
||||
msgstr "Excel (.xlsx)"
|
||||
|
||||
#: pretix/base/exporters/answers.py:54
|
||||
#, fuzzy
|
||||
#| msgid "Questions"
|
||||
msgid "Question answer file uploads"
|
||||
msgstr "Perguntas"
|
||||
msgstr "Upload de arquivos para perguntas e respostas"
|
||||
|
||||
#: pretix/base/exporters/answers.py:55 pretix/base/exporters/json.py:52
|
||||
#: pretix/base/exporters/mail.py:53 pretix/base/exporters/orderlist.py:86
|
||||
@@ -791,17 +747,17 @@ msgstr "Perguntas"
|
||||
#: 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ção do pedido"
|
||||
msgstr "Informações 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
|
||||
@@ -860,54 +816,41 @@ msgstr "Data"
|
||||
#: pretix/plugins/sendmail/forms.py:346
|
||||
msgctxt "subevent"
|
||||
msgid "All dates"
|
||||
msgstr ""
|
||||
msgstr "Todas as datas"
|
||||
|
||||
#: 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 "Total da fatura"
|
||||
msgstr "Contas de usuário"
|
||||
|
||||
#: pretix/base/exporters/customers.py:51
|
||||
#, fuzzy
|
||||
#| msgctxt "invoice"
|
||||
#| msgid "Invoice total"
|
||||
msgctxt "export_category"
|
||||
msgid "Customer accounts"
|
||||
msgstr "Total da fatura"
|
||||
msgstr "Contas de usuário"
|
||||
|
||||
#: pretix/base/exporters/customers.py:52
|
||||
msgid "Download a spreadsheet of all currently registered customer accounts."
|
||||
msgstr ""
|
||||
msgstr "Fazer o download de uma planilha com todos os usuários registrados."
|
||||
|
||||
#: 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 "Cliente"
|
||||
msgstr "ID do Cliente"
|
||||
|
||||
#: pretix/base/exporters/customers.py:65
|
||||
#: pretix/control/templates/pretixcontrol/organizers/customer.html:31
|
||||
#, fuzzy
|
||||
#| msgid "Payment provider"
|
||||
msgid "SSO provider"
|
||||
msgstr "Meio de pagamento"
|
||||
msgstr "Provedor de Login Único (SSO)"
|
||||
|
||||
#: 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 interno"
|
||||
msgstr "Identificador externo"
|
||||
|
||||
#: pretix/base/exporters/customers.py:68 pretix/base/exporters/orderlist.py:261
|
||||
#: pretix/base/exporters/orderlist.py:444
|
||||
@@ -980,28 +923,22 @@ 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 "Esta conta está inativa."
|
||||
msgstr "Conta ativa"
|
||||
|
||||
#: pretix/base/exporters/customers.py:78 pretix/base/models/customers.py:100
|
||||
#, fuzzy
|
||||
#| msgid "Attendee email"
|
||||
msgid "Verified email address"
|
||||
msgstr "E-mail do participante"
|
||||
msgstr "Email verificado"
|
||||
|
||||
#: pretix/base/exporters/customers.py:79 pretix/base/models/customers.py:101
|
||||
#: pretix/control/templates/pretixcontrol/organizers/customer.html:67
|
||||
msgid "Last login"
|
||||
msgstr ""
|
||||
msgstr "Último login"
|
||||
|
||||
#: 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 validade"
|
||||
msgstr "Data de registro"
|
||||
|
||||
#: pretix/base/exporters/customers.py:81 pretix/base/exporters/invoices.py:205
|
||||
#: pretix/base/exporters/waitinglist.py:118 pretix/base/models/auth.py:258
|
||||
@@ -1017,7 +954,7 @@ msgstr "Idioma"
|
||||
#: pretix/control/templates/pretixcontrol/organizers/customer.html:71
|
||||
#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:68
|
||||
msgid "Notes"
|
||||
msgstr ""
|
||||
msgstr "Notas"
|
||||
|
||||
#: pretix/base/exporters/customers.py:100
|
||||
#: pretix/base/exporters/customers.py:101 pretix/base/exporters/events.py:83
|
||||
@@ -1094,6 +1031,8 @@ 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
|
||||
@@ -1110,10 +1049,8 @@ 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 "Data e hora"
|
||||
msgstr "Intervalo de datas"
|
||||
|
||||
#: pretix/base/exporters/dekodi.py:237 pretix/base/exporters/invoices.py:77
|
||||
#, fuzzy
|
||||
@@ -1128,23 +1065,21 @@ 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 "Hora de início do evento"
|
||||
msgstr "Dados do evento"
|
||||
|
||||
#: pretix/base/exporters/events.py:48
|
||||
#, fuzzy
|
||||
#| msgid "Event start time"
|
||||
msgctxt "export_category"
|
||||
msgid "Event data"
|
||||
msgstr "Hora de início do evento"
|
||||
msgstr "Dados 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
|
||||
@@ -1215,12 +1150,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 ""
|
||||
msgstr "Latitude"
|
||||
|
||||
#: pretix/base/exporters/events.py:69 pretix/base/models/event.py:605
|
||||
#: pretix/base/models/event.py:1457
|
||||
msgid "Longitude"
|
||||
msgstr ""
|
||||
msgstr "Longitude"
|
||||
|
||||
#: pretix/base/exporters/events.py:70 pretix/base/models/event.py:617
|
||||
#: pretix/base/models/event.py:1474
|
||||
@@ -1268,6 +1203,8 @@ 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"
|
||||
@@ -1279,6 +1216,9 @@ 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
|
||||
@@ -1578,10 +1518,8 @@ msgid "Gross price"
|
||||
msgstr "Preço bruto"
|
||||
|
||||
#: pretix/base/exporters/invoices.py:322
|
||||
#, fuzzy
|
||||
#| msgid "Default price"
|
||||
msgid "Net price"
|
||||
msgstr "Preço padrão"
|
||||
msgstr "Preço líquido"
|
||||
|
||||
#: pretix/base/exporters/invoices.py:323 pretix/base/exporters/orderlist.py:452
|
||||
#: pretix/base/exporters/orderlist.py:577
|
||||
@@ -1611,41 +1549,33 @@ 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 "Horário do final do evento"
|
||||
msgstr "Data final do evento"
|
||||
|
||||
#: pretix/base/exporters/items.py:50
|
||||
#, fuzzy
|
||||
#| msgid "Product picture"
|
||||
msgid "Product data"
|
||||
msgstr "Imagem do produto"
|
||||
msgstr "Informações 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 "Imagem do produto"
|
||||
msgstr "Informações 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 "Produto"
|
||||
msgstr "ID do 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 "Variação"
|
||||
msgstr "ID da Variante"
|
||||
|
||||
#: pretix/base/exporters/items.py:60 pretix/base/models/items.py:115
|
||||
#: pretix/base/pdf.py:151
|
||||
@@ -1712,16 +1642,12 @@ 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 "Tipo de dispositivo"
|
||||
msgstr "Ingresso personalizado"
|
||||
|
||||
#: pretix/base/exporters/items.py:79 pretix/base/models/items.py:471
|
||||
#, fuzzy
|
||||
#| msgid "Device type"
|
||||
msgid "Generate tickets"
|
||||
msgstr "Tipo de dispositivo"
|
||||
msgstr "Gerar ingressos"
|
||||
|
||||
#: pretix/base/exporters/items.py:80 pretix/base/exporters/orderlist.py:1107
|
||||
#: pretix/base/exporters/waitinglist.py:41 pretix/base/shredder.py:367
|
||||
@@ -1786,13 +1712,11 @@ 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 ""
|
||||
msgstr "Apenas vender este produto como parte de um kit"
|
||||
|
||||
#: 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"
|
||||
msgstr "Permitir que o produto seja cancelado ou alterado"
|
||||
|
||||
#: pretix/base/exporters/items.py:88 pretix/base/models/items.py:568
|
||||
msgid "Minimum amount per order"
|
||||
@@ -1812,11 +1736,8 @@ 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 "Nenhuma data selecionada."
|
||||
msgstr "Texto para o check-in"
|
||||
|
||||
#: pretix/base/exporters/items.py:92 pretix/base/models/items.py:595
|
||||
#: pretix/base/models/items.py:1080
|
||||
@@ -1825,21 +1746,19 @@ msgstr "Preço original"
|
||||
|
||||
#: pretix/base/exporters/items.py:93 pretix/base/models/items.py:607
|
||||
msgid "This product is a gift card"
|
||||
msgstr ""
|
||||
msgstr "Este produto é um cartão de presente"
|
||||
|
||||
#: 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 ""
|
||||
msgstr "Exigir associação válida"
|
||||
|
||||
#: 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 "Membros do time"
|
||||
msgstr "Esconder sem uma associação válida"
|
||||
|
||||
#: pretix/base/exporters/json.py:51 pretix/base/exporters/orderlist.py:85
|
||||
msgid "Order data"
|
||||
@@ -1850,6 +1769,8 @@ 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)"
|
||||
@@ -1860,6 +1781,8 @@ 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
|
||||
@@ -1919,7 +1842,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 ""
|
||||
msgstr "Data do evento"
|
||||
|
||||
#: pretix/base/exporters/orderlist.py:137
|
||||
#, fuzzy
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -8,14 +8,16 @@ 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: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Automatically generated\n"
|
||||
"Language-Team: none\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"
|
||||
"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
|
||||
@@ -210,7 +212,7 @@ msgstr ""
|
||||
|
||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:39
|
||||
msgid "Exit"
|
||||
msgstr ""
|
||||
msgstr "Odchod"
|
||||
|
||||
#: 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
@@ -281,6 +281,17 @@ 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'
|
||||
@@ -372,6 +383,14 @@ 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:
|
||||
@@ -413,19 +432,9 @@ class PDFCheckinList(ReportlabExportMixin, CheckInListMixin, BaseExporter):
|
||||
acache = {}
|
||||
if op.addon_to:
|
||||
for a in op.addon_to.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.UNLOCALIZED_TYPES:
|
||||
acache[a.question_id] = a.answer
|
||||
else:
|
||||
acache[a.question_id] = str(a)
|
||||
acache[a.question_id] = format_answer_for_export(a)
|
||||
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.UNLOCALIZED_TYPES:
|
||||
acache[a.question_id] = a.answer
|
||||
else:
|
||||
acache[a.question_id] = str(a)
|
||||
acache[a.question_id] = format_answer_for_export(a)
|
||||
for q in questions:
|
||||
txt = acache.get(q.pk, '')
|
||||
txt = bleach.clean(txt, tags=['br']).strip().replace('<br>', '<br/>')
|
||||
@@ -525,7 +534,12 @@ class CSVCheckinList(CheckInListMixin, ListExporter):
|
||||
yield headers
|
||||
|
||||
qs = base_qs.prefetch_related(
|
||||
'answers', 'answers__question', 'addon_to__answers', 'addon_to__answers__question'
|
||||
'answers',
|
||||
'answers__options',
|
||||
'answers__question',
|
||||
'addon_to__answers',
|
||||
'addon_to__answers__question',
|
||||
'addon_to__answers__options',
|
||||
)
|
||||
|
||||
all_ids = list(base_qs.values_list('pk', flat=True))
|
||||
@@ -597,19 +611,9 @@ class CSVCheckinList(CheckInListMixin, ListExporter):
|
||||
acache = {}
|
||||
if op.addon_to:
|
||||
for a in op.addon_to.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.UNLOCALIZED_TYPES:
|
||||
acache[a.question_id] = a.answer
|
||||
else:
|
||||
acache[a.question_id] = str(a)
|
||||
acache[a.question_id] = format_answer_for_export(a)
|
||||
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.UNLOCALIZED_TYPES:
|
||||
acache[a.question_id] = a.answer
|
||||
else:
|
||||
acache[a.question_id] = str(a)
|
||||
acache[a.question_id] = format_answer_for_export(a)
|
||||
for q in questions:
|
||||
row.append(acache.get(q.pk, ''))
|
||||
|
||||
|
||||
@@ -944,6 +944,17 @@ 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
|
||||
@@ -1046,135 +1057,6 @@ 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"
|
||||
|
||||
@@ -1793,53 +1675,26 @@ class StripeEPS(StripeRedirectWithAccountNamePaymentIntentMethod):
|
||||
return super().payment_presale_render(payment)
|
||||
|
||||
|
||||
class StripeMultibanco(StripeSourceMethod):
|
||||
class StripeMultibanco(StripeRedirectMethod):
|
||||
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_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)
|
||||
def _payment_intent_kwargs(self, request, payment):
|
||||
return {
|
||||
"payment_method_data": {
|
||||
"type": "multibanco",
|
||||
"billing_details": {
|
||||
"email": payment.order.email,
|
||||
}
|
||||
}
|
||||
}
|
||||
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):
|
||||
|
||||
@@ -1,10 +1,43 @@
|
||||
{% load i18n %}
|
||||
{% load eventurl %}
|
||||
{% load money %}
|
||||
{% if payment.state == "pending" %}
|
||||
<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>
|
||||
{% 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 %}
|
||||
{% 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.
|
||||
|
||||
@@ -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',
|
||||
'swish_handle_redirect_or_display_qr_code', 'multibanco_display_details',
|
||||
]:
|
||||
ctx = {
|
||||
'order': self.order,
|
||||
@@ -610,6 +610,9 @@ 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
|
||||
|
||||
@@ -19,66 +19,14 @@
|
||||
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
|
||||
# <https://www.gnu.org/licenses/>.
|
||||
#
|
||||
from bootstrap3.renderers import FieldRenderer
|
||||
from bootstrap3.text import text_value
|
||||
from bootstrap3.utils import add_css_class
|
||||
from django.forms import CheckboxInput, CheckboxSelectMultiple, RadioSelect
|
||||
from django.forms.utils import flatatt
|
||||
from django.utils.html import escape, format_html, strip_tags
|
||||
from django.utils.html import escape, strip_tags
|
||||
from django.utils.safestring import mark_safe
|
||||
from django.utils.translation import pgettext
|
||||
|
||||
from pretix.base.forms.renderers import PretixFieldRenderer
|
||||
|
||||
|
||||
def render_label(content, label_for=None, label_class=None, label_title='', label_id='', optional=False, is_valid=None, attrs=None):
|
||||
"""
|
||||
Render a label with content
|
||||
"""
|
||||
attrs = attrs or {}
|
||||
if label_for:
|
||||
attrs['for'] = label_for
|
||||
if label_class:
|
||||
attrs['class'] = label_class
|
||||
if label_title:
|
||||
attrs['title'] = label_title
|
||||
if label_id:
|
||||
attrs['id'] = label_id
|
||||
|
||||
opt = ""
|
||||
|
||||
if is_valid is not None:
|
||||
if is_valid:
|
||||
validation_text = pgettext('form', 'is valid')
|
||||
else:
|
||||
validation_text = pgettext('form', 'has errors')
|
||||
opt += '<strong class="sr-only"> {}</strong>'.format(validation_text)
|
||||
|
||||
if text_value(content) == ' ':
|
||||
# Empty label, e.g. checkbox
|
||||
attrs.setdefault('class', '')
|
||||
attrs['class'] += ' label-empty'
|
||||
# usually checkboxes have overall empty labels and special labels per checkbox
|
||||
# => remove for-attribute as well as "required"-text appended to label
|
||||
if 'for' in attrs:
|
||||
del attrs['for']
|
||||
else:
|
||||
opt += '<i class="sr-only label-required">, {}</i>'.format(pgettext('form', 'required')) if not optional else ''
|
||||
|
||||
builder = '<{tag}{attrs}>{content}{opt}</{tag}>'
|
||||
return format_html(
|
||||
builder,
|
||||
tag='label',
|
||||
attrs=mark_safe(flatatt(attrs)) if attrs else '',
|
||||
opt=mark_safe(opt),
|
||||
content=text_value(content),
|
||||
)
|
||||
|
||||
|
||||
class CheckoutFieldRenderer(FieldRenderer):
|
||||
def __init__(self, *args, **kwargs):
|
||||
kwargs['layout'] = 'horizontal'
|
||||
super().__init__(*args, **kwargs)
|
||||
self.is_group_widget = isinstance(self.widget, (CheckboxSelectMultiple, RadioSelect, )) or (self.is_multi_widget and len(self.widget.widgets) > 1)
|
||||
|
||||
class CheckoutFieldRenderer(PretixFieldRenderer):
|
||||
def get_form_group_class(self):
|
||||
form_group_class = self.form_group_class
|
||||
if self.field.errors:
|
||||
@@ -121,45 +69,6 @@ class CheckoutFieldRenderer(FieldRenderer):
|
||||
help_ids = ["help-for-{id}-{idx}".format(id=self.field.id_for_label, idx=idx) for idx in range(help_cnt)]
|
||||
widget.attrs["aria-describedby"] = " ".join(help_ids)
|
||||
|
||||
def add_label(self, html):
|
||||
attrs = {}
|
||||
label = self.get_label()
|
||||
|
||||
if hasattr(self.field.field, '_show_required'):
|
||||
# e.g. payment settings forms where a field is only required if the payment provider is active
|
||||
required = self.field.field._show_required
|
||||
elif hasattr(self.field.field, '_required'):
|
||||
# e.g. payment settings forms where a field is only required if the payment provider is active
|
||||
required = self.field.field._required
|
||||
else:
|
||||
required = self.field.field.required
|
||||
|
||||
if self.field.form.is_bound:
|
||||
is_valid = len(self.field.errors) == 0
|
||||
else:
|
||||
is_valid = None
|
||||
|
||||
if self.is_group_widget:
|
||||
label_for = ""
|
||||
label_id = "legend-{}".format(self.field.html_name)
|
||||
else:
|
||||
label_for = self.field.id_for_label
|
||||
label_id = ""
|
||||
|
||||
if hasattr(self.field.field, 'question') and self.field.field.question.identifier:
|
||||
attrs["data-identifier"] = self.field.field.question.identifier
|
||||
|
||||
html = render_label(
|
||||
label,
|
||||
label_for=label_for,
|
||||
label_class=self.get_label_class(),
|
||||
label_id=label_id,
|
||||
attrs=attrs,
|
||||
optional=not required and not isinstance(self.widget, CheckboxInput),
|
||||
is_valid=is_valid
|
||||
) + html
|
||||
return html
|
||||
|
||||
def put_inside_label(self, html):
|
||||
content = "{field} {label}".format(field=html, label=self.label)
|
||||
return render_label(
|
||||
@@ -167,10 +76,3 @@ class CheckoutFieldRenderer(FieldRenderer):
|
||||
label_for=self.field.id_for_label,
|
||||
label_title=escape(strip_tags(self.field_help)),
|
||||
)
|
||||
|
||||
def wrap_label_and_field(self, html):
|
||||
if self.is_group_widget:
|
||||
attrs = ' role="group" aria-labelledby="legend-{}"'.format(self.field.html_name)
|
||||
else:
|
||||
attrs = ''
|
||||
return '<div class="{klass}"{attrs}>{html}</div>'.format(klass=self.get_form_group_class(), html=html, attrs=attrs)
|
||||
|
||||
@@ -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 %}
|
||||
{% if f not in filter_form.fields and f != "page" %}
|
||||
<input type="hidden" name="{{ f }}" value="{{ v }}">
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
|
||||
28
src/pretix/static/npm_dir/package-lock.json
generated
28
src/pretix/static/npm_dir/package-lock.json
generated
@@ -2081,12 +2081,12 @@
|
||||
}
|
||||
},
|
||||
"node_modules/braces": {
|
||||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
|
||||
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
|
||||
"version": "3.0.3",
|
||||
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
|
||||
"integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"fill-range": "^7.0.1"
|
||||
"fill-range": "^7.1.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
@@ -2513,9 +2513,9 @@
|
||||
"integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ=="
|
||||
},
|
||||
"node_modules/fill-range": {
|
||||
"version": "7.0.1",
|
||||
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
|
||||
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
|
||||
"version": "7.1.1",
|
||||
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
|
||||
"integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"to-regex-range": "^5.0.1"
|
||||
@@ -5437,12 +5437,12 @@
|
||||
}
|
||||
},
|
||||
"braces": {
|
||||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
|
||||
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
|
||||
"version": "3.0.3",
|
||||
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
|
||||
"integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"fill-range": "^7.0.1"
|
||||
"fill-range": "^7.1.1"
|
||||
}
|
||||
},
|
||||
"browserslist": {
|
||||
@@ -5754,9 +5754,9 @@
|
||||
"integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ=="
|
||||
},
|
||||
"fill-range": {
|
||||
"version": "7.0.1",
|
||||
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
|
||||
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
|
||||
"version": "7.1.1",
|
||||
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
|
||||
"integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"to-regex-range": "^5.0.1"
|
||||
|
||||
Reference in New Issue
Block a user