Compare commits

..

37 Commits

Author SHA1 Message Date
Mira Weller
9f9454efa6 refactor FieldRenderers 2024-06-24 15:06:15 +02:00
Richard Schreiber
e7267df6e7 fix flake8 2024-06-19 22:29:40 +02:00
Richard Schreiber
120b89385a Set cursor: not-allowed on labels for disabled checkboxes 2024-06-19 22:22:03 +02:00
Raphael Michel
ce06672334 Event list: Do not carry page through filter form 2024-06-19 18:19:51 +02:00
Raphael Michel
223f095611 Add Slovak and Catalan to selectable languages 2024-06-19 18:11:41 +02:00
dependabot[bot]
b625dc9ec8 Bump braces from 3.0.2 to 3.0.3 in /src/pretix/static/npm_dir (#4230)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-06-19 18:01:25 +02:00
dependabot[bot]
50c4a1c376 Update flake8 requirement from ==7.0.* to ==7.1.* (#4240)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-06-19 18:01:18 +02:00
dependabot[bot]
6fd2e42426 Bump django-compressor from 4.4 to 4.5 (#4241)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-06-19 18:00:56 +02:00
Erik Löfman
da651df4f0 Translations: Update Swedish
Currently translated at 25.7% (1450 of 5634 strings)

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

powered by weblate
2024-06-19 18:00:44 +02:00
Nikolai
a6f527e32d Translations: Update Danish
Currently translated at 31.3% (1764 of 5634 strings)

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

powered by weblate
2024-06-19 18:00:44 +02:00
Thilo-Alexander Ginkel
3ea61fbd1f Translations: Update German
Currently translated at 100.0% (5634 of 5634 strings)

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

powered by weblate
2024-06-19 18:00:44 +02:00
simonD
6a959d4220 Translations: Update French
Currently translated at 96.5% (5440 of 5634 strings)

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

powered by weblate
2024-06-19 18:00:44 +02:00
L. Pereira
92959dbb1f Translations: Update Portuguese (Brazil)
Currently translated at 12.9% (730 of 5634 strings)

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

powered by weblate
2024-06-19 18:00:44 +02:00
Anarion Dunedain
6d6f3c4af8 Translations: Update Polish
Currently translated at 39.9% (2251 of 5634 strings)

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

powered by weblate
2024-06-19 18:00:44 +02:00
Thilo-Alexander Ginkel
8d14a285ca Translations: Update German (informal) (de_Informal)
Currently translated at 100.0% (5634 of 5634 strings)

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

powered by weblate
2024-06-19 18:00:44 +02:00
Raphael Michel
a6b8cd8a54 Stripe: Move Multibanco to payment intents (#4243) 2024-06-19 18:00:23 +02:00
Martin Gross
cb95cdc6ce item_forms: Allow signals to return None (#4237)
Co-authored-by: Richard Schreiber <schreiber@rami.io>
2024-06-18 16:24:39 +02:00
Erik Löfman
cc7b00e206 Translations: Update Swedish
Currently translated at 21.3% (1203 of 5634 strings)

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

powered by weblate
2024-06-18 15:34:40 +02:00
Kristian Feldsam
136c54b9a8 Translations: Update Slovak
Currently translated at 92.7% (5226 of 5634 strings)

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

powered by weblate
2024-06-18 15:34:40 +02:00
Kristian Feldsam
28ba434e45 Translations: Update Slovak
Currently translated at 0.4% (1 of 229 strings)

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

powered by weblate
2024-06-18 15:34:40 +02:00
Erik Löfman
09320093ad Translations: Update Swedish
Currently translated at 21.2% (1200 of 5634 strings)

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

powered by weblate
2024-06-17 10:15:25 +02:00
Kristian Feldsam
89cfab6cad Translations: Update Slovak
Currently translated at 91.0% (5129 of 5634 strings)

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

powered by weblate
2024-06-17 10:15:25 +02:00
alemairebe
a180ce4c51 Translations: Update French
Currently translated at 96.6% (5443 of 5634 strings)

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

powered by weblate
2024-06-17 10:15:25 +02:00
Raphael Michel
1200274ebf Export: Do not rely on cached answer option values (Z#23152831) (#4225)
* Export: Do not rely on cached answer option values

* refactor duplicate code

---------

Co-authored-by: Mira Weller <weller@rami.io>
2024-06-17 10:12:15 +02:00
Raphael Michel
877401d8c0 Remove subevent.items (#4220) 2024-06-14 14:49:55 +02:00
Martin Gross
44170c1b93 Doc: Add missing backquote in dev/structure (ref #4222) 2024-06-14 12:31:35 +02:00
Renne Rocha
ce34bd0a13 Translations: Update Portuguese (Brazil)
Currently translated at 11.9% (672 of 5634 strings)

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

powered by weblate
2024-06-14 12:03:39 +02:00
Erik Löfman
b58f05efd0 Translations: Update Swedish
Currently translated at 21.1% (1190 of 5634 strings)

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

powered by weblate
2024-06-14 12:03:39 +02:00
Tinna Sandström
3ac70e6e3a Translations: Update Swedish
Currently translated at 21.1% (1190 of 5634 strings)

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

powered by weblate
2024-06-14 12:03:39 +02:00
Raphael Michel
90123d6a58 Translations: Update German (informal) (de_Informal)
Currently translated at 100.0% (5634 of 5634 strings)

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

powered by weblate
2024-06-14 12:03:39 +02:00
Raphael Michel
48a3984db6 Translations: Update German
Currently translated at 100.0% (5634 of 5634 strings)

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

powered by weblate
2024-06-14 12:03:39 +02:00
simonD
fe6ee4437f Translations: Update French
Currently translated at 96.6% (5443 of 5634 strings)

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

powered by weblate
2024-06-14 12:03:39 +02:00
simonD
f470389cd8 Translations: Update French
Currently translated at 93.0% (213 of 229 strings)

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

powered by weblate
2024-06-14 12:03:39 +02:00
simonD
c848594c21 Translations: Update French
Currently translated at 96.5% (5442 of 5634 strings)

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

powered by weblate
2024-06-14 12:03:39 +02:00
Raphael Michel
e9a95b0b09 Add system report for pretix Enterprise (#4213)
* Add system report for pretix Enterprise

* Update src/pretix/control/sysreport.py

Co-authored-by: Mira <weller@rami.io>

* ADd missing license header

---------

Co-authored-by: Mira <weller@rami.io>
2024-06-13 17:08:36 +02:00
Richard Schreiber
3b48b0782d PDF: when merging bg.pdf with fg.pdf use the higher PDF-version (#4171) 2024-06-11 12:16:57 +02:00
Tinna Sandström
b55bd8f75a Translations: Update Swedish
Currently translated at 20.8% (1174 of 5634 strings)

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

powered by weblate
2024-06-11 09:00:13 +02:00
30 changed files with 8192 additions and 5523 deletions

View File

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

View File

@@ -38,7 +38,7 @@ dependencies = [
"dj-static",
"Django[argon2]==4.2.*",
"django-bootstrap3==24.2",
"django-compressor==4.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.*",

View File

@@ -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')),

View File

@@ -32,7 +32,7 @@
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under the License.
from collections import OrderedDict
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, ''))

View 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) == '&#160;':
# 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

View File

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

View File

@@ -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) == '&#160;':
# 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):

View File

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

View 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

View File

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

View File

@@ -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'),

View File

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

View File

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

View File

@@ -4,7 +4,7 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-24 08:47+0000\n"
"PO-Revision-Date: 2024-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

View File

@@ -5,8 +5,8 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-24 08:47+0000\n"
"PO-Revision-Date: 2024-06-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

View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-24 08:47+0000\n"
"PO-Revision-Date: 2024-06-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

View File

@@ -4,8 +4,8 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-24 08:47+0000\n"
"PO-Revision-Date: 2024-06-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é pa 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 danalyser {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 lapprobation de lorganisateur 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 lapprobation de lorganisateur 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 à ladresse\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 navez commandé que des produits "
"gratuits, aucun paiement nest 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 nest requis.\n"
"\n"
"Vous pouvez modifier les détails de votre commande et consulter létat de "
"votre commande à ladresse\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 dexpéditeur. Cela rendra vos e-mails plus "
"personnalisés et provenant directement de vous, mais cela pourrait également "
"nécessiter des étapes supplémentaires pour assurer une bonne dé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 dautres canaux de vente tels que le module billetterie "
"ou revendeurs sont toujours créées en tant quordres 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 "
"dachats réels car votre commande pourrait être supprimée sans préavis."
"Veuillez ne pas effectuer dachats réels car votre commande pourrait être "
"supprimée sans préavis."
#: pretix/presale/templates/pretixpresale/event/base.html:123
#, python-format
@@ -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 dune 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."

View File

@@ -7,8 +7,8 @@ msgstr ""
"Project-Id-Version: French\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-08 13:19+0000\n"
"PO-Revision-Date: 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"

View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-24 08:47+0000\n"
"PO-Revision-Date: 2024-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

View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-24 08:47+0000\n"
"PO-Revision-Date: 2024-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

View File

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

View File

@@ -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, ''))

View File

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

View File

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

View File

@@ -595,7 +595,7 @@ class ScaView(StripeOrderView, View):
if intent.status == 'requires_action' and intent.next_action.type in [
'use_stripe_sdk', 'redirect_to_url', 'alipay_handle_redirect', 'wechat_pay_display_qr_code',
'swish_handle_redirect_or_display_qr_code',
'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

View File

@@ -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) == '&#160;':
# 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)

View File

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

View File

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