Compare commits

..

22 Commits

Author SHA1 Message Date
Martin Gross
36c7cbd866 Fix test - always allow org-token read-access to org-settings 2025-09-26 14:15:38 +02:00
Martin Gross
7116dd4a08 API/Organizer: Allow Device-Token access to Organizer settings; expose mf0aes_random_uid 2025-09-26 14:01:40 +02:00
Hijiri Umemoto
10bfd51d99 Translations: Update Japanese
Currently translated at 100.0% (252 of 252 strings)

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

powered by weblate
2025-09-25 08:49:15 +02:00
Hijiri Umemoto
50225fd2f4 Translations: Update Japanese
Currently translated at 100.0% (6068 of 6068 strings)

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

powered by weblate
2025-09-25 08:49:15 +02:00
Hijiri Umemoto
cd4fc1d6d8 Translations: Update Russian
Currently translated at 17.7% (1078 of 6068 strings)

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

powered by weblate
2025-09-25 08:49:15 +02:00
Raphael Michel
4931059da3 Approval process: Use less scary wording for free orders (Z#23206212) (#5485)
* Approval process: Use less scary wording for free orders (Z#23206212)

* Update src/pretix/presale/templates/pretixpresale/event/checkout_confirm.html

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

* Update src/pretix/presale/templates/pretixpresale/event/checkout_confirm.html

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

* Revert "Update src/pretix/presale/templates/pretixpresale/event/checkout_confirm.html"

This reverts commit bd98c1a014.

---------

Co-authored-by: luelista <weller@rami.io>
2025-09-24 15:50:48 +02:00
Richard Schreiber
15d15f978f Fix logging when changing user notifications (#5470) 2025-09-24 09:58:23 +02:00
Richard Schreiber
34dbbdd82f PDF-Editor: fix missing maxlength for layout name (#5473) 2025-09-24 09:58:02 +02:00
Richard Schreiber
9a54823515 Fix ticket-pdf export layout selection by saleschannel (#5482) 2025-09-24 09:57:38 +02:00
dependabot[bot]
4c76bb85a8 Bump pycparser from 2.22 to 2.23 (#5458)
Bumps [pycparser](https://github.com/eliben/pycparser) from 2.22 to 2.23.
- [Release notes](https://github.com/eliben/pycparser/releases)
- [Changelog](https://github.com/eliben/pycparser/blob/main/CHANGES)
- [Commits](https://github.com/eliben/pycparser/compare/release_v2.22...release_v2.23)

---
updated-dependencies:
- dependency-name: pycparser
  dependency-version: '2.23'
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-23 18:29:29 +02:00
dependabot[bot]
ed01a149b7 Update sentry-sdk requirement from ==2.37.* to ==2.38.* (#5468)
Updates the requirements on [sentry-sdk](https://github.com/getsentry/sentry-python) to permit the latest version.
- [Release notes](https://github.com/getsentry/sentry-python/releases)
- [Changelog](https://github.com/getsentry/sentry-python/blob/master/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-python/compare/2.37.0...2.38.0)

---
updated-dependencies:
- dependency-name: sentry-sdk
  dependency-version: 2.38.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-23 18:28:19 +02:00
dependabot[bot]
89adcc11c6 Update pyenchant requirement from ==3.2.* to ==3.3.* (#5467)
Updates the requirements on [pyenchant](https://github.com/pyenchant/pyenchant) to permit the latest version.
- [Release notes](https://github.com/pyenchant/pyenchant/releases)
- [Commits](https://github.com/pyenchant/pyenchant/compare/v3.2.0...v3.3.0)

---
updated-dependencies:
- dependency-name: pyenchant
  dependency-version: 3.3.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-23 18:28:13 +02:00
✨ Q (it/its) ✨
7037f348bf remove infinite loop when output plugin provides a URI for a whole order (#5474) 2025-09-23 18:26:38 +02:00
Raphael Michel
e694d3ca14 Translations: Update German (informal) (de_Informal)
Currently translated at 100.0% (6068 of 6068 strings)

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

powered by weblate
2025-09-23 18:24:49 +02:00
Raphael Michel
f3e1fd9135 Translations: Update German
Currently translated at 100.0% (6068 of 6068 strings)

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

powered by weblate
2025-09-23 18:24:49 +02:00
Yasunobu YesNo Kawaguchi
850552c235 Translations: Update Japanese
Currently translated at 100.0% (6068 of 6068 strings)

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

powered by weblate
2025-09-23 18:24:49 +02:00
Raphael Michel
fb8a8142d9 Scheduled exports: Check permissions on creation 2025-09-22 10:22:12 +02:00
Yasunobu YesNo Kawaguchi
5416c0cdfd Translations: Update Japanese
Currently translated at 100.0% (6068 of 6068 strings)

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

powered by weblate
2025-09-22 10:21:13 +02:00
Yasunobu YesNo Kawaguchi
a2421f9c66 Translations: Update Japanese
Currently translated at 100.0% (252 of 252 strings)

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

powered by weblate
2025-09-22 10:21:13 +02:00
Yasunobu YesNo Kawaguchi
8d06c79dd9 Translations: Update Japanese
Currently translated at 100.0% (6068 of 6068 strings)

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

powered by weblate
2025-09-22 10:21:13 +02:00
Raphael Michel
08961091f6 Invoicing: Allow types to add text and watermarks (#5453) 2025-09-22 10:04:25 +02:00
Raphael Michel
a7cbcb29b5 Update wordlists to work with pyenchant 3.3.0 (#5479)
* Drop old wordlists

* Add new list
2025-09-22 10:02:53 +02:00
23 changed files with 214 additions and 122 deletions

View File

@@ -6,4 +6,4 @@ sphinxcontrib-images
sphinxcontrib-jquery
sphinxcontrib-spelling==8.*
sphinxemoji
pyenchant==3.2.*
pyenchant==3.3.*

View File

@@ -7,4 +7,4 @@ sphinxcontrib-images
sphinxcontrib-jquery
sphinxcontrib-spelling==8.*
sphinxemoji
pyenchant==3.2.*
pyenchant==3.3.*

View File

@@ -79,7 +79,7 @@ dependencies = [
"protobuf==6.32.*",
"psycopg2-binary",
"pycountry",
"pycparser==2.22",
"pycparser==2.23",
"pycryptodome==3.23.*",
"pypdf==6.0.*",
"python-bidi==0.6.*", # Support for Arabic in reportlab
@@ -91,7 +91,7 @@ dependencies = [
"redis==6.4.*",
"reportlab==4.4.*",
"requests==2.32.*",
"sentry-sdk==2.37.*",
"sentry-sdk==2.38.*",
"sepaxml==2.6.*",
"stripe==7.9.*",
"text-unidecode==1.*",

View File

@@ -484,6 +484,7 @@ class OrganizerSettingsSerializer(SettingsSerializer):
'reusable_media_type_nfc_mf0aes',
'reusable_media_type_nfc_mf0aes_autocreate_giftcard',
'reusable_media_type_nfc_mf0aes_autocreate_giftcard_currency',
'reusable_media_type_nfc_mf0aes_random_uid',
]
def __init__(self, *args, **kwargs):

View File

@@ -546,7 +546,8 @@ class DeviceViewSet(mixins.CreateModelMixin,
class OrganizerSettingsView(views.APIView):
permission = 'can_change_organizer_settings'
permission = None
write_permission = 'can_change_organizer_settings'
def get(self, request, *args, **kwargs):
s = OrganizerSettingsSerializer(instance=request.organizer.settings, organizer=request.organizer, context={

View File

@@ -22,7 +22,7 @@
from django import forms
from django.core.validators import RegexValidator
from django.utils.translation import pgettext_lazy
from django.utils.translation import pgettext, pgettext_lazy
from django_countries.fields import Country
from localflavor.it.forms import ITSocialSecurityNumberField
@@ -73,3 +73,12 @@ class ItalianSdITransmissionType(TransmissionType):
if is_business:
return base | {"company", "vat_id", "transmission_it_sdi_pec", "transmission_it_sdi_recipient_code"}
return base | {"transmission_it_sdi_codice_fiscale"}
def pdf_info_text(self) -> str:
# Watermark is not necessary as this is a usual precaution in Italy
return pgettext(
"italian_invoice",
"This PDF document is a visual copy of the invoice and does not constitute an invoice for VAT "
"purposes. The invoice is issued in XML format, transmitted in accordance with the procedures and terms "
"set forth in No. 89757/2018 of April 30, 2018, issued by the Director of the Revenue Agency."
)

View File

@@ -20,6 +20,7 @@
# <https://www.gnu.org/licenses/>.
#
import logging
import math
import re
import unicodedata
from collections import defaultdict
@@ -223,6 +224,9 @@ class BaseReportlabInvoiceRenderer(BaseInvoiceRenderer):
stylesheet.add(ParagraphStyle(name='FineprintHeading', fontName=self.font_bold, fontSize=8, leading=12))
stylesheet.add(ParagraphStyle(name='Fineprint', fontName=self.font_regular, fontSize=8, leading=10))
stylesheet.add(ParagraphStyle(name='FineprintRight', fontName=self.font_regular, fontSize=8, leading=10, alignment=TA_RIGHT))
stylesheet.add(ParagraphStyle(name='WarningBlock', fontName=self.font_bold, fontSize=10, leading=12,
alignment=TA_LEFT, borderWidth=1 * mm, borderColor=colors.black,
borderPadding=2 * mm, spaceBefore=5 * mm, spaceAfter=5 * mm))
return stylesheet
def _register_fonts(self):
@@ -576,11 +580,28 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
canvas.drawRightString(self.pagesize[0] - 20 * mm, (297 - 100) * mm, self._normalize(gettext('TEST MODE')))
canvas.restoreState()
def _draw_watermark(self, canvas):
watermark = self.invoice.transmission_type_instance.pdf_watermark()
if watermark:
canvas.saveState()
for font_size in range(200, 20, -10):
width = stringWidth(watermark, self.font_bold, font_size)
if width < self.pagesize[0]:
break
canvas.translate(self.pagesize[0] / 2, self.pagesize[1] / 2)
canvas.rotate(math.atan(self.pagesize[1] / self.pagesize[0]) / math.pi * 180)
canvas.setFont(self.font_bold, font_size)
canvas.setFillColorRGB(.92, .92, .92)
canvas.drawCentredString(0, - font_size / 2, self._normalize(watermark))
canvas.restoreState()
def _on_first_page(self, canvas: Canvas, doc):
canvas.setCreator('pretix.eu')
canvas.setTitle(pgettext('invoice', 'Invoice {num}').format(num=self.invoice.number))
canvas.saveState()
self._draw_watermark(canvas)
self._draw_footer(canvas)
self._draw_testmode(canvas)
self._draw_invoice_from_label(canvas)
@@ -610,6 +631,14 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer):
def _get_intro(self):
story = []
type_info_text = self.invoice.transmission_type_instance.pdf_info_text()
if type_info_text:
story.append(FontFallbackParagraph(
type_info_text,
self.stylesheet['WarningBlock']
))
if self.invoice.custom_field:
story.append(FontFallbackParagraph(
'{}: {}'.format(

View File

@@ -23,7 +23,7 @@ import re
from django import forms
from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _
from django.utils.translation import gettext_lazy as _, pgettext
from django_countries.fields import Country
from pretix.base.invoicing.transmission import (
@@ -165,3 +165,13 @@ class PeppolTransmissionType(TransmissionType):
"company", "street", "zipcode", "city", "country",
}
return base | {"transmission_peppol_participant_id"}
def pdf_watermark(self) -> str:
return pgettext("peppol_invoice", "Visual copy")
def pdf_info_text(self) -> str:
return pgettext(
"peppol_invoice",
"This PDF document is a visual copy of the invoice and does not constitute an invoice for VAT "
"purposes. The original invoice is issued in XML format and transmitted through the Peppol network."
)

View File

@@ -104,6 +104,18 @@ class TransmissionType:
def transmission_info_to_form_data(self, transmission_info: dict) -> dict:
return transmission_info
def pdf_watermark(self) -> Optional[str]:
"""
Return a watermark that should be rendered across the PDF file.
"""
return None
def pdf_info_text(self) -> Optional[str]:
"""
Return an info text that should be rendered on the PDF file.
"""
return None
class TransmissionProvider:
"""

View File

@@ -69,9 +69,6 @@ def generate_order(order: int, provider: str):
prov = response(order.event)
if prov.identifier == provider:
filename, ttype, data = prov.generate_order(order)
if ttype == 'text/uri-list':
continue
path, ext = os.path.splitext(filename)
for ct in CachedCombinedTicket.objects.filter(order=order, provider=provider):
ct.delete()

View File

@@ -238,7 +238,7 @@
<div class="row control-group pdf-info">
<div class="col-sm-12">
<label for="pdf-info-name">{% trans "Layout name" %}</label><br>
<input type="text" id="pdf-info-name" class="input-block-level form-control" name="name" value="{{ name }}">
<input type="text" id="pdf-info-name" class="input-block-level form-control" name="name" value="{{ name }}" maxlength="190">
</div>
</div>
{% endif %}

View File

@@ -711,11 +711,15 @@ class OrderDownload(AsyncAction, OrderView):
)
return resp
elif isinstance(value, CachedCombinedTicket):
resp = FileResponse(value.file.file, content_type=value.type)
resp['Content-Disposition'] = 'attachment; filename="{}-{}-{}{}"'.format(
self.request.event.slug.upper(), self.order.code, self.output.identifier, value.extension
)
return resp
if value.type == 'text/uri-list':
resp = HttpResponseRedirect(value.file.file.read())
return resp
else:
resp = FileResponse(value.file.file, content_type=value.type)
resp['Content-Disposition'] = 'attachment; filename="{}-{}-{}{}"'.format(
self.request.event.slug.upper(), self.order.code, self.output.identifier, value.extension
)
return resp
else:
return redirect(self.get_self_url())
@@ -2832,11 +2836,23 @@ class ExportView(EventPermissionRequiredMixin, ExportMixin, ListView):
def get_queryset(self):
return self.get_scheduled_queryset()
def has_permission(self):
return self.request.user.has_event_permission(self.request.organizer, self.request.event, "can_view_orders")
def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs)
if "schedule" in self.request.POST or self.scheduled:
ctx['schedule_form'] = self.schedule_form
ctx['rrule_form'] = self.rrule_form
if "schedule" in self.request.POST and not self.has_permission():
messages.error(
self.request,
_(
"Your user account does not have sufficient permission to run this report, therefore "
"you cannot schedule it."
)
)
else:
ctx['schedule_form'] = self.schedule_form
ctx['rrule_form'] = self.rrule_form
elif not self.exporter:
for s in ctx['scheduled']:
try:

View File

@@ -2189,11 +2189,28 @@ class ExportView(OrganizerPermissionRequiredMixin, ExportMixin, ListView):
def get_queryset(self):
return self.get_scheduled_queryset()
def has_permission(self):
if isinstance(self.exporter, OrganizerLevelExportMixin):
if not self.request.user.has_organizer_permission(self.request.organizer, self.exporter.organizer_required_permission):
return False
if self.exporter and not self.exporter.available_for_user(self.request.user):
return False
return True
def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs)
if "schedule" in self.request.POST or self.scheduled:
ctx['schedule_form'] = self.schedule_form
ctx['rrule_form'] = self.rrule_form
if "schedule" in self.request.POST and not self.has_permission():
messages.error(
self.request,
_(
"Your user account does not have sufficient permission to run this report, therefore "
"you cannot schedule it."
)
)
else:
ctx['schedule_form'] = self.schedule_form
ctx['rrule_form'] = self.rrule_form
elif not self.exporter:
for s in ctx['scheduled']:
try:

View File

@@ -710,9 +710,9 @@ class UserNotificationsEditView(TemplateView):
messages.success(request, _('Your notification settings have been saved.'))
if request.user.notifications_send:
self.request.user.log_action('pretix.user.settings.notifications.disabled', user=self.request.user)
else:
self.request.user.log_action('pretix.user.settings.notifications.enabled', user=self.request.user)
else:
self.request.user.log_action('pretix.user.settings.notifications.disabled', user=self.request.user)
return redirect(
reverse('control:user.settings.notifications') +
('?event={}'.format(self.event.pk) if self.event else '')

View File

@@ -5,8 +5,8 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-08-19 16:35+0000\n"
"PO-Revision-Date: 2025-08-21 21:00+0000\n"
"Last-Translator: Luca Hammer <hammer@rami.io>\n"
"PO-Revision-Date: 2025-09-23 16:13+0000\n"
"Last-Translator: Raphael Michel <michel@rami.io>\n"
"Language-Team: German <https://translate.pretix.eu/projects/pretix/pretix/de/"
">\n"
"Language: de\n"
@@ -14,7 +14,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.13\n"
"X-Generator: Weblate 5.13.3\n"
"X-Poedit-Bookmarks: -1,-1,904,-1,-1,-1,-1,-1,-1,-1\n"
#: pretix/_base_settings.py:87
@@ -34662,17 +34662,17 @@ msgstr "Wann findet diese Veranstaltung statt?"
#: pretix/presale/templates/pretixpresale/event/fragment_event_info.html:25
#, python-format
msgid "Begin: %(time)s"
msgstr "Beginn: %(time)s"
msgstr "Beginn: %(time)s Uhr"
#: pretix/presale/templates/pretixpresale/event/fragment_event_info.html:34
#, python-format
msgid "End: %(time)s"
msgstr "Ende: %(time)s"
msgstr "Ende: %(time)s Uhr"
#: pretix/presale/templates/pretixpresale/event/fragment_event_info.html:46
#, python-format
msgid "Admission: %(time)s"
msgstr "Einlass: %(time)s"
msgstr "Einlass: %(time)s Uhr"
#: pretix/presale/templates/pretixpresale/event/fragment_event_info.html:54
#, python-format

View File

@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-08-19 16:35+0000\n"
"PO-Revision-Date: 2025-08-22 16:00+0000\n"
"PO-Revision-Date: 2025-09-23 16:13+0000\n"
"Last-Translator: Raphael Michel <michel@rami.io>\n"
"Language-Team: German (informal) <https://translate.pretix.eu/projects/"
"pretix/pretix/de_Informal/>\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.13\n"
"X-Generator: Weblate 5.13.3\n"
#: pretix/_base_settings.py:87
msgid "English"
@@ -34604,17 +34604,17 @@ msgstr "Wann findet diese Veranstaltung statt?"
#: pretix/presale/templates/pretixpresale/event/fragment_event_info.html:25
#, python-format
msgid "Begin: %(time)s"
msgstr "Beginn: %(time)s"
msgstr "Beginn: %(time)s Uhr"
#: pretix/presale/templates/pretixpresale/event/fragment_event_info.html:34
#, python-format
msgid "End: %(time)s"
msgstr "Ende: %(time)s"
msgstr "Ende: %(time)s Uhr"
#: pretix/presale/templates/pretixpresale/event/fragment_event_info.html:46
#, python-format
msgid "Admission: %(time)s"
msgstr "Einlass: %(time)s"
msgstr "Einlass: %(time)s Uhr"
#: pretix/presale/templates/pretixpresale/event/fragment_event_info.html:54
#, python-format

View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-08-19 16:35+0000\n"
"PO-Revision-Date: 2025-09-12 14:00+0000\n"
"Last-Translator: Yasunobu YesNo Kawaguchi <kawaguti@gmail.com>\n"
"PO-Revision-Date: 2025-09-25 03:00+0000\n"
"Last-Translator: Hijiri Umemoto <hijiri@umemoto.org>\n"
"Language-Team: Japanese <https://translate.pretix.eu/projects/pretix/pretix/"
"ja/>\n"
"Language: ja\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 5.13.2\n"
"X-Generator: Weblate 5.13.3\n"
#: pretix/_base_settings.py:87
msgid "English"
@@ -1165,7 +1165,7 @@ msgstr "CSVコンマ付き"
#: pretix/base/exporter.py:191 pretix/base/exporter.py:313
msgid "CSV (Excel-style)"
msgstr "CSVエクセルスタイル"
msgstr "CSVExcel形式"
#: pretix/base/exporter.py:192 pretix/base/exporter.py:314
msgid "CSV (with semicolons)"
@@ -1173,7 +1173,7 @@ msgstr "CSVセミコロン付き"
#: pretix/base/exporter.py:308
msgid "Combined Excel (.xlsx)"
msgstr "結合されたエクセル.xlsx"
msgstr "結合されたExcel.xlsx"
#: pretix/base/exporters/answers.py:54
msgid "Question answer file uploads"
@@ -1992,7 +1992,7 @@ msgstr "バリエーション"
#: pretix/control/templates/pretixcontrol/organizers/plugins.html:75
#: pretix/control/templates/pretixcontrol/users/index.html:51
msgid "Active"
msgstr "アクティブ"
msgstr "有効"
#: pretix/base/exporters/items.py:72 pretix/base/models/discount.py:77
#: pretix/control/forms/event.py:976 pretix/control/navigation.py:520
@@ -2000,7 +2000,7 @@ msgstr "アクティブ"
#: pretix/plugins/autocheckin/models.py:64
#: pretix/plugins/autocheckin/templates/pretixplugins/autocheckin/index.html:30
msgid "Sales channels"
msgstr "販売チャネル"
msgstr "販売チャネル"
#: pretix/base/exporters/items.py:73 pretix/base/models/items.py:497
#: pretix/base/models/items.py:1166
@@ -2589,7 +2589,7 @@ msgstr "座席位置注文リンク"
#: pretix/base/exporters/orderlist.py:840
msgid "Order transaction data"
msgstr "注文が再開されました"
msgstr "注文取引データ"
#: pretix/base/exporters/orderlist.py:842
msgid ""
@@ -2666,7 +2666,7 @@ msgstr "内部参考資料"
#: pretix/base/exporters/orderlist.py:915
msgctxt "subevent"
msgid "Date ID"
msgstr "日付"
msgstr "日付ID"
#: pretix/base/exporters/orderlist.py:920
msgid "Tax rule ID"
@@ -2675,12 +2675,12 @@ msgstr "税制ルールID"
#: pretix/base/exporters/orderlist.py:923
#: pretix/plugins/reports/accountingreport.py:320
msgid "Gross total"
msgstr "ご注文合計"
msgstr "計"
#: pretix/base/exporters/orderlist.py:924
#: pretix/plugins/reports/accountingreport.py:319
msgid "Tax total"
msgstr "税"
msgstr "税額合計"
#: pretix/base/exporters/orderlist.py:934
msgid ""
@@ -3192,7 +3192,7 @@ msgstr "この組み合わせの資格情報は、当社のシステムには登
#: pretix/base/forms/auth.py:66 pretix/base/forms/user.py:57
#: pretix/presale/forms/customer.py:385 pretix/presale/forms/customer.py:457
msgid "For security reasons, please wait 5 minutes before you try again."
msgstr "セキュリティ上の理由で、5分間経ってから再度お試しください。"
msgstr "セキュリティ上の理由により、5分お待ちいただいてから再度お試しください。"
#: pretix/base/forms/auth.py:67 pretix/base/forms/auth.py:273
msgid "This account is inactive."
@@ -3201,9 +3201,8 @@ msgstr "このアカウントは非アクティブです。"
#: pretix/base/forms/auth.py:156
msgid ""
"You already registered with that email address, please use the login form."
msgstr ""
"そのメールアドレスは、すでに登録済みです。ログインフォームを使用してくださ"
"い。"
msgstr "そのメールアドレスはすでに登録されています。ログインフォームをご利用ください"
""
#: pretix/base/forms/auth.py:157 pretix/base/forms/auth.py:215
#: pretix/base/forms/user.py:56 pretix/control/forms/users.py:45
@@ -4706,8 +4705,7 @@ msgstr ""
#: pretix/base/models/event.py:583 pretix/base/models/organizer.py:89
msgid "The slug may only contain letters, numbers, dots and dashes."
msgstr ""
"スラッグには、文字、数字、ドットまたはダッシュのみ含めることができます。"
msgstr "スラッグには文字、数字、ドット、ダッシュのみ使用できます。"
#: pretix/base/models/event.py:600 pretix/base/models/event.py:1495
msgid "Show in lists"
@@ -6158,7 +6156,7 @@ msgstr "保留"
#: pretix/base/models/orders.py:203 pretix/base/payment.py:568
#: pretix/base/services/invoices.py:486
msgid "paid"
msgstr "支払済み"
msgstr "支払済み"
#: pretix/base/models/orders.py:204 pretix/control/forms/filter.py:1571
#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:37
@@ -7181,7 +7179,7 @@ msgstr "日付"
#: pretix/plugins/reports/accountingreport.py:318
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:442
msgid "Net total"
msgstr "合計"
msgstr "正味合計"
#: pretix/base/notifications.py:202
msgid "Pending amount"
@@ -7495,7 +7493,7 @@ msgstr "無料"
#: pretix/base/payment.py:1166
msgid "Box office"
msgstr "興行収入"
msgstr "ボックスオフィス"
#: pretix/base/payment.py:1214 pretix/base/payment.py:1233
#: pretix/plugins/manualpayment/apps.py:30
@@ -12489,7 +12487,7 @@ msgstr "不正なリクエスト"
#: pretix/base/templates/400.html:9
msgid "We were unable to parse your request."
msgstr "リクエストをパースできませんでした。"
msgstr "リクエストを解析できませんでした。"
#: pretix/base/templates/400.html:12 pretix/base/templates/400_hostname.html:47
#: pretix/base/templates/403.html:12 pretix/base/templates/404.html:12
@@ -12583,15 +12581,15 @@ msgstr "内部サーバーエラー"
#: pretix/base/templates/500.html:9
msgid "We had trouble processing your request."
msgstr "リクエストの処理問題が発生しました。"
msgstr "リクエストの処理問題が発生しました。"
#: pretix/base/templates/500.html:10
msgid "If this problem persists, please contact us."
msgstr "障害が続く場合は、私たちにご連絡ください。"
msgstr "この問題が続く場合は、お問い合わせください。"
#: pretix/base/templates/500.html:13
msgid "If you contact us, please send us the following code:"
msgstr "連絡をいただく際は、のコードをお知らせください:"
msgstr "お問い合わせの際は、以下のコードをお送りください"
#: pretix/base/templates/csrffail.html:4 pretix/base/templates/csrffail.html:8
msgid "Verification failed"
@@ -14858,7 +14856,7 @@ msgstr "バンドル製品"
#: pretix/control/forms/item.py:1243 pretix/control/forms/orders.py:379
#: pretix/control/forms/orders.py:568
msgid "inactive"
msgstr "無効"
msgstr "非アクティブ"
#: pretix/control/forms/mailsetup.py:42
msgid "Hostname"
@@ -15495,7 +15493,7 @@ msgstr ""
#: pretix/control/forms/organizer.py:195
msgid "You need to choose an event."
msgstr "イベント選択が必要です。"
msgstr "イベント選択する必要があります。"
#: pretix/control/forms/organizer.py:227
msgid "You may set only one organizer domain."
@@ -17568,7 +17566,7 @@ msgstr "デバイス"
#: pretix/control/permissions.py:72 pretix/control/permissions.py:109
#: pretix/control/permissions.py:140 pretix/control/permissions.py:157
msgid "You do not have permission to view this content."
msgstr "この情報を見る権限がありません。"
msgstr "このコンテンツを表示する権限がありません。"
#: pretix/control/templates/pretixcontrol/auth/base.html:42
#: pretix/control/templates/pretixcontrol/base.html:358
@@ -17990,7 +17988,7 @@ msgstr "トレース番号"
#: pretix/control/templates/pretixcontrol/boxoffice/payment.html:22
msgctxt "terminal_zvt"
msgid "Payment type"
msgstr "支払い方法"
msgstr "支払いの種類"
#: pretix/control/templates/pretixcontrol/boxoffice/payment.html:24
msgctxt "terminal_zvt"
@@ -18055,7 +18053,7 @@ msgstr "サーバー取引コード"
#: pretix/control/templates/pretixcontrol/boxoffice/payment.html:75
#: pretix/control/templates/pretixcontrol/boxoffice/payment.html:91
msgid "Payment reference"
msgstr "内部参考資料"
msgstr "支払リファレンス"
#: pretix/control/templates/pretixcontrol/boxoffice/payment.html:78
msgid "Payment Application"
@@ -18516,7 +18514,7 @@ msgstr "カスタムチェックインルール"
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html:117
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/send_form.html:85
msgid "Edit"
msgstr "編集します"
msgstr "編集す"
#: pretix/control/templates/pretixcontrol/checkin/list_edit.html:89
msgid "Visualize"
@@ -19052,26 +19050,26 @@ msgstr "主催者の設定をリセットします"
#: pretix/control/templates/pretixcontrol/email_setup_simple.html:29
msgid "This is the SPF record we found on your domain:"
msgstr "これは、あなたのドメインで見つかったSPFレコードです:"
msgstr "これは、あなたのドメインで見つかったSPFレコードです"
#: pretix/control/templates/pretixcontrol/email_setup_simple.html:33
msgid "To fix this, include the following part before the last word:"
msgstr "修正する場合は、次の部分を最後の単語の前に含めてください:"
msgstr "これを修正するには、最後の単語の前に以下の部分を含めてください"
#: pretix/control/templates/pretixcontrol/email_setup_simple.html:38
msgid "Your new SPF record could look like this:"
msgstr "新しいSPFレコードは、つぎの通りです:"
msgstr "新しいSPFレコードは次のようになります:"
#: pretix/control/templates/pretixcontrol/email_setup_simple.html:43
msgid ""
"Please keep in mind that updates to DNS might require multiple hours to take "
"effect."
msgstr "DNSの更新が反映されるまで、長時間かかることをご理解ください。"
msgstr "DNS の更新が有効になるまでに数時間かかる場合があることに注意してください。"
#: pretix/control/templates/pretixcontrol/email_setup_simple.html:48
msgid "We found an SPF record on your domain that includes this system. Great!"
msgstr ""
"このシステムが含まれるあなたのドメインのSPFレコードが見つかりました。すごい"
msgstr "あなたのドメインでこのシステムを含むSPFレコードが見つかりました。素晴らしいで"
""
#: pretix/control/templates/pretixcontrol/email_setup_simple.html:54
msgid "Verification"
@@ -22038,7 +22036,7 @@ msgstr "あなた自身のアプリを管理してください"
#: pretix/control/templates/pretixcontrol/oauth/authorized.html:18
msgid "Permissions"
msgstr "パーミッション"
msgstr "権限"
#: pretix/control/templates/pretixcontrol/oauth/authorized.html:59
msgid "No applications have access to your pretix account."
@@ -23051,7 +23049,7 @@ msgstr "メールをプレビュー"
#: pretix/control/templates/pretixcontrol/order/sendmail.html:44
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/send_form.html:89
msgid "Send"
msgstr "送"
msgstr "送"
#: pretix/control/templates/pretixcontrol/order/transactions.html:5
#: pretix/control/templates/pretixcontrol/order/transactions.html:8
@@ -24391,7 +24389,7 @@ msgstr "手動でギフトカードを発行"
#: pretix/control/templates/pretixcontrol/organizers/giftcards.html:65
msgid "Last transaction"
msgstr "注文が再開されました"
msgstr "最新の取引"
#: pretix/control/templates/pretixcontrol/organizers/index.html:9
msgid ""
@@ -24850,7 +24848,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/organizers/webhooks.html:13
msgid "Read documentation"
msgstr "文書を読む"
msgstr "ドキュメントを読む"
#: pretix/control/templates/pretixcontrol/organizers/webhooks.html:19
msgid "You haven't created any webhooks yet."
@@ -25026,7 +25024,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/pdf/index.html:217
#: pretix/control/templates/pretixcontrol/pdf/index.html:233
msgid "Loading…"
msgstr "ロード中…"
msgstr "読み込み中…"
#: pretix/control/templates/pretixcontrol/pdf/index.html:220
msgid "Start editing"
@@ -25594,7 +25592,7 @@ msgstr "複数の新規日程を作る"
#: pretix/control/templates/pretixcontrol/subevents/index.html:96
#: pretix/plugins/reports/accountingreport.py:121
msgid "Begin"
msgstr "始めます"
msgstr "始"
#: pretix/control/templates/pretixcontrol/subevents/index.html:176
msgid "Show orders"
@@ -26541,7 +26539,7 @@ msgstr ""
#: pretix/control/templatetags/hierarkey_form.py:79
msgid "Unlock"
msgstr "アンロック"
msgstr "ロック解除"
#: pretix/control/templatetags/hierarkey_form.py:80
msgid "Go to organizer settings"
@@ -26669,7 +26667,7 @@ msgstr "新しいチェックインリストが作成されました。"
#: pretix/plugins/stripe/views.py:682
#: pretix/plugins/ticketoutputpdf/views.py:132
msgid "We could not save your changes. See below for details."
msgstr "変更を保存できませんでした。詳細は下記参照。"
msgstr "変更を保存できませんでした。詳細は以下をご覧ください。"
#: pretix/control/views/checkin.py:420 pretix/control/views/checkin.py:457
msgid "The requested list does not exist."
@@ -27797,7 +27795,7 @@ msgstr ""
#: pretix/control/views/organizer.py:579
msgid "The new organizer has been created."
msgstr "主催者が新規に生成されました。"
msgstr "新しい主催者が成されました。"
#: pretix/control/views/organizer.py:582
msgid "Administrators"
@@ -28412,7 +28410,7 @@ msgstr "一連のイベントのための代替の組織者のドメイン"
#: pretix/multidomain/models.py:38
msgid "Event domain"
msgstr "イベントドメイン"
msgstr "イベントドメイン"
#: pretix/multidomain/models.py:44
msgid "Domain name"
@@ -29638,7 +29636,7 @@ msgstr ""
#: pretix/plugins/checkinlists/exporters.py:374
msgctxt "tablehead"
msgid "paid"
msgstr "支払済"
msgstr "支払済"
#: pretix/plugins/checkinlists/exporters.py:477
msgid ""
@@ -30066,7 +30064,7 @@ msgstr ""
#: pretix/plugins/paypal2/payment.py:335 pretix/plugins/paypal2/views.py:250
msgid "An error occurred during connecting with PayPal, please try again."
msgstr "PayPalの接続で、エラーが発生しました。度お試しください。"
msgstr "PayPalの接続中にエラーが発生しました。もう一度お試しください。"
#: pretix/plugins/paypal2/payment.py:467 pretix/plugins/paypal2/payment.py:599
#: pretix/plugins/paypal2/payment.py:673 pretix/plugins/paypal2/payment.py:736
@@ -30277,25 +30275,22 @@ msgstr ""
msgid ""
"An error occurred returning from PayPal: request parameters missing. Please "
"try again."
msgstr ""
"PayPalから戻る際にエラーが発生しました: リクエストのパラメータがありません。"
"再度お試しください。"
msgstr "PayPalからの戻り処理でエラーが発生しましたリクエストパラメータが不足してい"
"ます。もう一度お試しください。"
#: pretix/plugins/paypal2/views.py:259
msgid ""
"An error occurred returning from PayPal: result parameters missing. Please "
"try again."
msgstr ""
"PayPalから戻る際にエラーが発生: リザルトのパラメータがありません。再度お試し"
"ください。"
msgstr "PayPalからの戻り処理でエラーが発生しました結果パラメータが不足しています。"
"もう一度お試しください。"
#: pretix/plugins/paypal2/views.py:264
msgid ""
"An error occurred returning from PayPal: session parameter not matching. "
"Please try again."
msgstr ""
"PayPalから戻る際にエラーが発生: セッションのパラメーターが一致しません。再度"
"お試しください。"
msgstr "PayPalからの戻り処理でエラーが発生しましたセッションパラメータが一致しませ"
"ん。もう一度お試しください。"
#: pretix/plugins/paypal2/views.py:269
msgid ""
@@ -30383,11 +30378,11 @@ msgstr "{datetime}時点のギフトカードの総額"
#: pretix/plugins/reports/accountingreport.py:771
msgid "Gift card transactions (credit)"
msgstr "注文が再開されました"
msgstr "ギフトカード取引(入金)"
#: pretix/plugins/reports/accountingreport.py:781
msgid "Gift card transactions (debit)"
msgstr "注文が再開されました"
msgstr "ギフトカード取引(出金)"
#: pretix/plugins/reports/accountingreport.py:883
msgid "Open items"
@@ -31002,7 +30997,7 @@ msgstr "メッセージはキューに入れられ、数分以内に%sの連絡
#: pretix/plugins/sendmail/views.py:250
msgid "Orders or attendees"
msgstr "注文が再開されました"
msgstr "注文または参加者"
#: pretix/plugins/sendmail/views.py:251
msgid ""
@@ -31338,7 +31333,7 @@ msgstr "Bancontact"
#: pretix/plugins/stripe/payment.py:366
msgid "SEPA Direct Debit"
msgstr "SEPA直接デビット"
msgstr "SEPA ダイレクトデビット"
#: pretix/plugins/stripe/payment.py:369
msgid ""
@@ -31459,15 +31454,14 @@ msgstr "Stripe支払いを利用するにはJavaScriptを有効にする必要
#: pretix/plugins/stripe/payment.py:929 pretix/plugins/stripe/payment.py:1051
#, python-format
msgid "Stripe reported an error with your card: %s"
msgstr "Stripeがのカードエラーを報告しました: %s"
msgstr "Stripeがあなたのカードエラーを報告しました%s"
#: pretix/plugins/stripe/payment.py:947 pretix/plugins/stripe/payment.py:1063
msgid ""
"We had trouble communicating with Stripe. Please try again and get in touch "
"with us if this problem persists."
msgstr ""
"Stripeとの通信で問題が生じました。再度お試しいただくか、問題が継続する場合は"
"私たちにお知らせください。"
msgstr "Stripeとの通信に問題が発生しました。もう一度お試しいただき、この問題が続く場"
"合はお問い合わせください。"
#: pretix/plugins/stripe/payment.py:988
msgid ""
@@ -31848,7 +31842,7 @@ msgstr ""
#: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form_card.html:19
msgid "For a credit card payment, please turn on JavaScript."
msgstr "クレジットカード決済は、JavaScriptを有効にしてください。"
msgstr "クレジットカード決済は、JavaScriptを有効にしてください。"
#: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form_card.html:25
msgid ""
@@ -31865,8 +31859,9 @@ msgid ""
"Your payment will be processed by Stripe, Inc. Your credit card data will be "
"transmitted directly to Stripe and never touches our servers."
msgstr ""
"支払いは、Stripe, Inc.で処理されます。あなたのクレジットカードの情報は、"
"Stripeに直接送信され、私たちのサーバを経由しません。"
"お客様の決済はStripe, "
"Inc.により処理されます。お客様のクレジットカード情報はStripeに直接送信され、"
"弊社のサーバーには一切保存されません。"
#: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form_sepadirectdebit.html:13
msgid "For a SEPA Debit payment, please turn on JavaScript."

View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-08-19 16:02+0000\n"
"PO-Revision-Date: 2025-08-24 16:00+0000\n"
"Last-Translator: Yasunobu YesNo Kawaguchi <kawaguti@gmail.com>\n"
"PO-Revision-Date: 2025-09-25 03:00+0000\n"
"Last-Translator: Hijiri Umemoto <hijiri@umemoto.org>\n"
"Language-Team: Japanese <https://translate.pretix.eu/projects/pretix/"
"pretix-js/ja/>\n"
"Language: ja\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 5.13\n"
"X-Generator: Weblate 5.13.3\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
@@ -64,7 +64,7 @@ msgstr "iDEAL"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:42
msgid "SEPA Direct Debit"
msgstr "SEPA Direct Debit"
msgstr "SEPA ダイレクトデビット"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:43
msgid "Bancontact"
@@ -327,7 +327,7 @@ msgstr "有効なチケット"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:70
msgid "Currently inside"
msgstr "現在オンラインです"
msgstr "現在入場中"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:71
#: pretix/static/pretixcontrol/js/ui/question.js:136
@@ -348,7 +348,7 @@ msgstr "閉じる"
#: pretix/static/pretixbase/js/addressform.js:105
#: pretix/static/pretixpresale/js/ui/main.js:509
msgid "required"
msgstr "必"
msgstr "必"
#: pretix/static/pretixbase/js/asynctask.js:12
msgid ""
@@ -698,7 +698,7 @@ msgstr "その他"
#: pretix/static/pretixcontrol/js/ui/question.js:81
msgid "Count"
msgstr "総数"
msgstr "カウント"
#: pretix/static/pretixcontrol/js/ui/subevent.js:111
msgid "(one more date)"

View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-08-19 16:35+0000\n"
"PO-Revision-Date: 2025-02-21 19:00+0000\n"
"Last-Translator: anonymous <noreply@weblate.org>\n"
"PO-Revision-Date: 2025-09-25 03:00+0000\n"
"Last-Translator: Hijiri Umemoto <hijiri@umemoto.org>\n"
"Language-Team: Russian <https://translate.pretix.eu/projects/pretix/pretix/"
"ru/>\n"
"Language: ru\n"
@@ -18,7 +18,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 5.10\n"
"X-Generator: Weblate 5.13.3\n"
#: pretix/_base_settings.py:87
msgid "English"
@@ -5059,9 +5059,7 @@ msgstr ""
#: pretix/base/models/event.py:583 pretix/base/models/organizer.py:89
msgid "The slug may only contain letters, numbers, dots and dashes."
msgstr ""
"Описательная часть URL-адреса может содержать только буквы, цифры, точки и "
"тире."
msgstr "Слизень может содержать только буквы, цифры, точки и тире."
#: pretix/base/models/event.py:600 pretix/base/models/event.py:1495
msgid "Show in lists"

View File

@@ -223,7 +223,7 @@ class AllTicketsPDF(BaseExporter):
with language(op.order.locale, o.event.settings.region):
layout = o.layout_map.get(
(op.item_id, op.order.sales_channel_id),
(op.item_id, op.order.sales_channel.identifier),
o.layout_map.get(
(op.item_id, 'web'),
o.default_layout

View File

@@ -186,7 +186,11 @@
{% if require_approval %}
<div class="alert alert-warning">
<strong>
{% trans "After you submitted your order using the button below, it will require approval by the event organizer before it can be confirmed and forms a valid contract." %}
{% if cart.total > 0 %}
{% trans "After you submitted your order using the button below, it will require approval by the event organizer before it can be confirmed and forms a valid contract." %}
{% else %}
{% trans "After you submitted your order using the button below, it will require approval by the event organizer." %}
{% endif %}
</strong>
{% blocktrans trimmed %}
We will send you an email as soon as the event organizer approved or rejected your order.

View File

@@ -1146,11 +1146,15 @@ class OrderDownloadMixin:
)
return resp
elif isinstance(value, CachedCombinedTicket):
resp = FileResponse(value.file.file, content_type=value.type)
resp['Content-Disposition'] = 'attachment; filename="{}-{}-{}{}"'.format(
self.request.event.slug.upper(), self.order.code, self.output.identifier, value.extension
)
return resp
if value.type == 'text/uri-list':
resp = HttpResponseRedirect(value.file.file.read())
return resp
else:
resp = FileResponse(value.file.file, content_type=value.type)
resp['Content-Disposition'] = 'attachment; filename="{}-{}-{}{}"'.format(
self.request.event.slug.upper(), self.order.code, self.output.identifier, value.extension
)
return resp
else:
return redirect(self.get_self_url())

View File

@@ -205,7 +205,6 @@ event_permission_sub_urls = [
org_permission_sub_urls = [
('patch', 'can_change_organizer_settings', '', 200),
('get', 'can_change_organizer_settings', 'settings/', 200),
('patch', 'can_change_organizer_settings', 'settings/', 200),
('get', 'can_change_organizer_settings', 'webhooks/', 200),
('post', 'can_change_organizer_settings', 'webhooks/', 400),