mirror of
https://github.com/pretix/pretix.git
synced 2026-04-26 23:52:35 +00:00
Compare commits
1 Commits
mail-html-
...
fix-mail-h
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4d18e8391a |
@@ -60,9 +60,6 @@ The following values for ``action_types`` are valid with pretix core:
|
|||||||
* ``pretix.event.added``
|
* ``pretix.event.added``
|
||||||
* ``pretix.event.changed``
|
* ``pretix.event.changed``
|
||||||
* ``pretix.event.deleted``
|
* ``pretix.event.deleted``
|
||||||
* ``pretix.giftcards.created``
|
|
||||||
* ``pretix.giftcards.modified``
|
|
||||||
* ``pretix.giftcards.transaction.*``
|
|
||||||
* ``pretix.voucher.added``
|
* ``pretix.voucher.added``
|
||||||
* ``pretix.voucher.changed``
|
* ``pretix.voucher.changed``
|
||||||
* ``pretix.voucher.deleted``
|
* ``pretix.voucher.deleted``
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
sphinx==9.1.*
|
sphinx==9.1.*
|
||||||
sphinx-rtd-theme~=3.1.0
|
sphinx-rtd-theme~=3.1.0
|
||||||
sphinxcontrib-httpdomain~=2.0.0
|
sphinxcontrib-httpdomain~=1.8.1
|
||||||
sphinxcontrib-images~=1.0.1
|
sphinxcontrib-images~=1.0.1
|
||||||
sphinxcontrib-jquery~=4.1
|
sphinxcontrib-jquery~=4.1
|
||||||
sphinxcontrib-spelling~=8.0.2
|
sphinxcontrib-spelling~=8.0.2
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
-e ../
|
-e ../
|
||||||
sphinx==9.1.*
|
sphinx==9.1.*
|
||||||
sphinx-rtd-theme~=3.1.0
|
sphinx-rtd-theme~=3.1.0
|
||||||
sphinxcontrib-httpdomain~=2.0.0
|
sphinxcontrib-httpdomain~=1.8.1
|
||||||
sphinxcontrib-images~=1.0.1
|
sphinxcontrib-images~=1.0.1
|
||||||
sphinxcontrib-jquery~=4.1
|
sphinxcontrib-jquery~=4.1
|
||||||
sphinxcontrib-spelling~=8.0.2
|
sphinxcontrib-spelling~=8.0.2
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ dependencies = [
|
|||||||
"celery==5.6.*",
|
"celery==5.6.*",
|
||||||
"chardet==5.2.*",
|
"chardet==5.2.*",
|
||||||
"cryptography>=44.0.0",
|
"cryptography>=44.0.0",
|
||||||
"css-inline==0.20.*",
|
"css-inline==0.19.*",
|
||||||
"defusedcsv>=1.1.0",
|
"defusedcsv>=1.1.0",
|
||||||
"dnspython==2.*",
|
"dnspython==2.*",
|
||||||
"Django[argon2]==4.2.*,>=4.2.26",
|
"Django[argon2]==4.2.*,>=4.2.26",
|
||||||
@@ -65,7 +65,7 @@ dependencies = [
|
|||||||
"kombu==5.6.*",
|
"kombu==5.6.*",
|
||||||
"libsass==0.23.*",
|
"libsass==0.23.*",
|
||||||
"lxml",
|
"lxml",
|
||||||
"markdown==3.10.2", # 3.3.5 requires importlib-metadata>=4.4, but django-bootstrap3 requires importlib-metadata<3.
|
"markdown==3.10.1", # 3.3.5 requires importlib-metadata>=4.4, but django-bootstrap3 requires importlib-metadata<3.
|
||||||
# We can upgrade markdown again once django-bootstrap3 upgrades or once we drop Python 3.6 and 3.7
|
# We can upgrade markdown again once django-bootstrap3 upgrades or once we drop Python 3.6 and 3.7
|
||||||
"mt-940==4.30.*",
|
"mt-940==4.30.*",
|
||||||
"oauthlib==3.3.*",
|
"oauthlib==3.3.*",
|
||||||
@@ -73,7 +73,7 @@ dependencies = [
|
|||||||
"packaging",
|
"packaging",
|
||||||
"paypalrestsdk==1.13.*",
|
"paypalrestsdk==1.13.*",
|
||||||
"paypal-checkout-serversdk==1.0.*",
|
"paypal-checkout-serversdk==1.0.*",
|
||||||
"PyJWT==2.11.*",
|
"PyJWT==2.10.*",
|
||||||
"phonenumberslite==9.0.*",
|
"phonenumberslite==9.0.*",
|
||||||
"Pillow==12.1.*",
|
"Pillow==12.1.*",
|
||||||
"pretix-plugin-build",
|
"pretix-plugin-build",
|
||||||
@@ -92,7 +92,7 @@ dependencies = [
|
|||||||
"redis==7.1.*",
|
"redis==7.1.*",
|
||||||
"reportlab==4.4.*",
|
"reportlab==4.4.*",
|
||||||
"requests==2.32.*",
|
"requests==2.32.*",
|
||||||
"sentry-sdk==2.52.*",
|
"sentry-sdk==2.51.*",
|
||||||
"sepaxml==2.7.*",
|
"sepaxml==2.7.*",
|
||||||
"stripe==7.9.*",
|
"stripe==7.9.*",
|
||||||
"text-unidecode==1.*",
|
"text-unidecode==1.*",
|
||||||
|
|||||||
@@ -249,17 +249,12 @@ class GiftCardViewSet(viewsets.ModelViewSet):
|
|||||||
def perform_create(self, serializer):
|
def perform_create(self, serializer):
|
||||||
value = serializer.validated_data.pop('value')
|
value = serializer.validated_data.pop('value')
|
||||||
inst = serializer.save(issuer=self.request.organizer)
|
inst = serializer.save(issuer=self.request.organizer)
|
||||||
inst.log_action(
|
|
||||||
action='pretix.giftcards.created',
|
|
||||||
user=self.request.user,
|
|
||||||
auth=self.request.auth,
|
|
||||||
)
|
|
||||||
inst.transactions.create(value=value, acceptor=self.request.organizer)
|
inst.transactions.create(value=value, acceptor=self.request.organizer)
|
||||||
inst.log_action(
|
inst.log_action(
|
||||||
action='pretix.giftcards.transaction.manual',
|
'pretix.giftcards.transaction.manual',
|
||||||
user=self.request.user,
|
user=self.request.user,
|
||||||
auth=self.request.auth,
|
auth=self.request.auth,
|
||||||
data=merge_dicts(self.request.data, {'id': inst.pk, 'acceptor_id': self.request.organizer.id})
|
data=merge_dicts(self.request.data, {'id': inst.pk})
|
||||||
)
|
)
|
||||||
|
|
||||||
@transaction.atomic()
|
@transaction.atomic()
|
||||||
@@ -274,7 +269,7 @@ class GiftCardViewSet(viewsets.ModelViewSet):
|
|||||||
inst = serializer.save(secret=serializer.instance.secret, currency=serializer.instance.currency,
|
inst = serializer.save(secret=serializer.instance.secret, currency=serializer.instance.currency,
|
||||||
testmode=serializer.instance.testmode)
|
testmode=serializer.instance.testmode)
|
||||||
inst.log_action(
|
inst.log_action(
|
||||||
action='pretix.giftcards.modified',
|
'pretix.giftcards.modified',
|
||||||
user=self.request.user,
|
user=self.request.user,
|
||||||
auth=self.request.auth,
|
auth=self.request.auth,
|
||||||
data=self.request.data,
|
data=self.request.data,
|
||||||
@@ -287,10 +282,10 @@ class GiftCardViewSet(viewsets.ModelViewSet):
|
|||||||
diff = value - old_value
|
diff = value - old_value
|
||||||
inst.transactions.create(value=diff, acceptor=self.request.organizer)
|
inst.transactions.create(value=diff, acceptor=self.request.organizer)
|
||||||
inst.log_action(
|
inst.log_action(
|
||||||
action='pretix.giftcards.transaction.manual',
|
'pretix.giftcards.transaction.manual',
|
||||||
user=self.request.user,
|
user=self.request.user,
|
||||||
auth=self.request.auth,
|
auth=self.request.auth,
|
||||||
data={'value': diff, 'acceptor_id': self.request.organizer.id}
|
data={'value': diff}
|
||||||
)
|
)
|
||||||
|
|
||||||
return inst
|
return inst
|
||||||
@@ -314,14 +309,10 @@ class GiftCardViewSet(viewsets.ModelViewSet):
|
|||||||
}, status=status.HTTP_409_CONFLICT)
|
}, status=status.HTTP_409_CONFLICT)
|
||||||
gc.transactions.create(value=value, text=text, info=info, acceptor=self.request.organizer)
|
gc.transactions.create(value=value, text=text, info=info, acceptor=self.request.organizer)
|
||||||
gc.log_action(
|
gc.log_action(
|
||||||
action='pretix.giftcards.transaction.manual',
|
'pretix.giftcards.transaction.manual',
|
||||||
user=self.request.user,
|
user=self.request.user,
|
||||||
auth=self.request.auth,
|
auth=self.request.auth,
|
||||||
data={
|
data={'value': value, 'text': text}
|
||||||
'value': value,
|
|
||||||
'text': text,
|
|
||||||
'acceptor_id': self.request.organizer.id
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
return Response(GiftCardSerializer(gc, context=self.get_serializer_context()).data, status=status.HTTP_200_OK)
|
return Response(GiftCardSerializer(gc, context=self.get_serializer_context()).data, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
|
|||||||
@@ -174,35 +174,6 @@ class ParametrizedEventWebhookEvent(ParametrizedWebhookEvent):
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class ParametrizedGiftcardWebhookEvent(ParametrizedWebhookEvent):
|
|
||||||
def build_payload(self, logentry: LogEntry):
|
|
||||||
giftcard = logentry.content_object
|
|
||||||
if not giftcard:
|
|
||||||
return None
|
|
||||||
|
|
||||||
return {
|
|
||||||
'notification_id': logentry.pk,
|
|
||||||
'issuer_id': logentry.organizer_id,
|
|
||||||
'giftcard': giftcard.pk,
|
|
||||||
'action': logentry.action_type,
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
class ParametrizedGiftcardTransactionWebhookEvent(ParametrizedWebhookEvent):
|
|
||||||
def build_payload(self, logentry: LogEntry):
|
|
||||||
giftcard = logentry.content_object
|
|
||||||
if not giftcard:
|
|
||||||
return None
|
|
||||||
|
|
||||||
return {
|
|
||||||
'notification_id': logentry.pk,
|
|
||||||
'issuer_id': logentry.organizer_id,
|
|
||||||
'acceptor_id': logentry.parsed_data.get('acceptor_id'),
|
|
||||||
'giftcard': giftcard.pk,
|
|
||||||
'action': logentry.action_type,
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
class ParametrizedVoucherWebhookEvent(ParametrizedWebhookEvent):
|
class ParametrizedVoucherWebhookEvent(ParametrizedWebhookEvent):
|
||||||
|
|
||||||
def build_payload(self, logentry: LogEntry):
|
def build_payload(self, logentry: LogEntry):
|
||||||
@@ -462,18 +433,6 @@ def register_default_webhook_events(sender, **kwargs):
|
|||||||
'pretix.customer.anonymized',
|
'pretix.customer.anonymized',
|
||||||
_('Customer account anonymized'),
|
_('Customer account anonymized'),
|
||||||
),
|
),
|
||||||
ParametrizedGiftcardWebhookEvent(
|
|
||||||
'pretix.giftcards.created',
|
|
||||||
_('Gift card added'),
|
|
||||||
),
|
|
||||||
ParametrizedGiftcardWebhookEvent(
|
|
||||||
'pretix.giftcards.modified',
|
|
||||||
_('Gift card modified'),
|
|
||||||
),
|
|
||||||
ParametrizedGiftcardTransactionWebhookEvent(
|
|
||||||
'pretix.giftcards.transaction.*',
|
|
||||||
_('Gift card used in transcation'),
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
import logging
|
import logging
|
||||||
from itertools import groupby
|
from itertools import groupby
|
||||||
from smtplib import SMTPResponseException
|
from smtplib import SMTPResponseException
|
||||||
from typing import TypeVar, Union
|
from typing import TypeVar
|
||||||
|
|
||||||
import bleach
|
import bleach
|
||||||
import css_inline
|
import css_inline
|
||||||
@@ -31,7 +31,6 @@ from django.core.mail.backends.smtp import EmailBackend
|
|||||||
from django.db.models import Count
|
from django.db.models import Count
|
||||||
from django.dispatch import receiver
|
from django.dispatch import receiver
|
||||||
from django.template.loader import get_template
|
from django.template.loader import get_template
|
||||||
from django.utils.safestring import mark_safe
|
|
||||||
from django.utils.translation import get_language, gettext_lazy as _
|
from django.utils.translation import get_language, gettext_lazy as _
|
||||||
|
|
||||||
from pretix.base.models import Event
|
from pretix.base.models import Event
|
||||||
@@ -40,9 +39,7 @@ from pretix.base.templatetags.rich_text import (
|
|||||||
DEFAULT_CALLBACKS, EMAIL_RE, URL_RE, abslink_callback,
|
DEFAULT_CALLBACKS, EMAIL_RE, URL_RE, abslink_callback,
|
||||||
markdown_compile_email, truelink_callback,
|
markdown_compile_email, truelink_callback,
|
||||||
)
|
)
|
||||||
from pretix.helpers.format import (
|
from pretix.helpers.format import SafeFormatter, format_map
|
||||||
FormattedString, PlainHtmlAlternativeString, SafeFormatter, format_map,
|
|
||||||
)
|
|
||||||
|
|
||||||
from pretix.base.services.placeholders import ( # noqa
|
from pretix.base.services.placeholders import ( # noqa
|
||||||
get_available_placeholders, PlaceholderContext
|
get_available_placeholders, PlaceholderContext
|
||||||
@@ -86,8 +83,8 @@ class BaseHTMLMailRenderer:
|
|||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.identifier
|
return self.identifier
|
||||||
|
|
||||||
def render(self, content: Union[str, FormattedString, PlainHtmlAlternativeString], plain_signature: str,
|
def render(self, plain_body: str, plain_signature: str, subject: str, order=None,
|
||||||
subject: str, order=None, position=None, context=None) -> str:
|
position=None, context=None) -> str:
|
||||||
"""
|
"""
|
||||||
This method should generate the HTML part of the email.
|
This method should generate the HTML part of the email.
|
||||||
|
|
||||||
@@ -143,37 +140,25 @@ class TemplateBasedMailRenderer(BaseHTMLMailRenderer):
|
|||||||
def compile_markdown(self, plaintext, context=None):
|
def compile_markdown(self, plaintext, context=None):
|
||||||
return markdown_compile_email(plaintext, context=context)
|
return markdown_compile_email(plaintext, context=context)
|
||||||
|
|
||||||
def render(self, content: Union[str, FormattedString, PlainHtmlAlternativeString], plain_signature: str,
|
def render(self, plain_body: str, plain_signature: str, subject: str, order, position, context) -> str:
|
||||||
subject: str, order=None, position=None, context=None) -> str:
|
body_md = self.compile_markdown(plain_body, context)
|
||||||
if isinstance(content, FormattedString):
|
if context:
|
||||||
# Raw string that is already formatted but not markdown-rendered
|
linker = bleach.Linker(
|
||||||
body_content_html = self.compile_markdown(content, context)
|
url_re=URL_RE,
|
||||||
|
email_re=EMAIL_RE,
|
||||||
elif isinstance(content, PlainHtmlAlternativeString):
|
callbacks=DEFAULT_CALLBACKS + [truelink_callback, abslink_callback],
|
||||||
# HTML already rendered by Django templates
|
parse_email=True
|
||||||
body_content_html = content.html
|
)
|
||||||
|
body_md = format_map(
|
||||||
else:
|
body_md,
|
||||||
# Raw string that is not yet formatted or markdown-rendered
|
context=context,
|
||||||
body_content_html = self.compile_markdown(content, context)
|
mode=SafeFormatter.MODE_RICH_TO_HTML,
|
||||||
if context:
|
linkifier=linker
|
||||||
linker = bleach.Linker(
|
)
|
||||||
url_re=URL_RE,
|
|
||||||
email_re=EMAIL_RE,
|
|
||||||
callbacks=DEFAULT_CALLBACKS + [truelink_callback, abslink_callback],
|
|
||||||
parse_email=True
|
|
||||||
)
|
|
||||||
body_content_html = format_map(
|
|
||||||
body_content_html,
|
|
||||||
context=context,
|
|
||||||
mode=SafeFormatter.MODE_RICH_TO_HTML,
|
|
||||||
linkifier=linker
|
|
||||||
)
|
|
||||||
|
|
||||||
htmlctx = {
|
htmlctx = {
|
||||||
'site': settings.PRETIX_INSTANCE_NAME,
|
'site': settings.PRETIX_INSTANCE_NAME,
|
||||||
'site_url': settings.SITE_URL,
|
'site_url': settings.SITE_URL,
|
||||||
'body': mark_safe(body_content_html),
|
'body': body_md,
|
||||||
'subject': str(subject),
|
'subject': str(subject),
|
||||||
'color': settings.PRETIX_PRIMARY_COLOR,
|
'color': settings.PRETIX_PRIMARY_COLOR,
|
||||||
'rtl': get_language() in settings.LANGUAGES_RTL or get_language().split('-')[0] in settings.LANGUAGES_RTL,
|
'rtl': get_language() in settings.LANGUAGES_RTL or get_language().split('-')[0] in settings.LANGUAGES_RTL,
|
||||||
|
|||||||
@@ -890,18 +890,18 @@ class BaseQuestionsForm(forms.Form):
|
|||||||
if not help_text:
|
if not help_text:
|
||||||
if q.valid_date_min and q.valid_date_max:
|
if q.valid_date_min and q.valid_date_max:
|
||||||
help_text = format_lazy(
|
help_text = format_lazy(
|
||||||
_('Please enter a date between {min} and {max}.'),
|
'Please enter a date between {min} and {max}.',
|
||||||
min=date_format(q.valid_date_min, "SHORT_DATE_FORMAT"),
|
min=date_format(q.valid_date_min, "SHORT_DATE_FORMAT"),
|
||||||
max=date_format(q.valid_date_max, "SHORT_DATE_FORMAT"),
|
max=date_format(q.valid_date_max, "SHORT_DATE_FORMAT"),
|
||||||
)
|
)
|
||||||
elif q.valid_date_min:
|
elif q.valid_date_min:
|
||||||
help_text = format_lazy(
|
help_text = format_lazy(
|
||||||
_('Please enter a date no earlier than {min}.'),
|
'Please enter a date no earlier than {min}.',
|
||||||
min=date_format(q.valid_date_min, "SHORT_DATE_FORMAT"),
|
min=date_format(q.valid_date_min, "SHORT_DATE_FORMAT"),
|
||||||
)
|
)
|
||||||
elif q.valid_date_max:
|
elif q.valid_date_max:
|
||||||
help_text = format_lazy(
|
help_text = format_lazy(
|
||||||
_('Please enter a date no later than {max}.'),
|
'Please enter a date no later than {max}.',
|
||||||
max=date_format(q.valid_date_max, "SHORT_DATE_FORMAT"),
|
max=date_format(q.valid_date_max, "SHORT_DATE_FORMAT"),
|
||||||
)
|
)
|
||||||
if initial and initial.answer:
|
if initial and initial.answer:
|
||||||
@@ -939,18 +939,18 @@ class BaseQuestionsForm(forms.Form):
|
|||||||
if not help_text:
|
if not help_text:
|
||||||
if q.valid_datetime_min and q.valid_datetime_max:
|
if q.valid_datetime_min and q.valid_datetime_max:
|
||||||
help_text = format_lazy(
|
help_text = format_lazy(
|
||||||
_('Please enter a date and time between {min} and {max}.'),
|
'Please enter a date and time between {min} and {max}.',
|
||||||
min=date_format(q.valid_datetime_min, "SHORT_DATETIME_FORMAT"),
|
min=date_format(q.valid_datetime_min, "SHORT_DATETIME_FORMAT"),
|
||||||
max=date_format(q.valid_datetime_max, "SHORT_DATETIME_FORMAT"),
|
max=date_format(q.valid_datetime_max, "SHORT_DATETIME_FORMAT"),
|
||||||
)
|
)
|
||||||
elif q.valid_datetime_min:
|
elif q.valid_datetime_min:
|
||||||
help_text = format_lazy(
|
help_text = format_lazy(
|
||||||
_('Please enter a date and time no earlier than {min}.'),
|
'Please enter a date and time no earlier than {min}.',
|
||||||
min=date_format(q.valid_datetime_min, "SHORT_DATETIME_FORMAT"),
|
min=date_format(q.valid_datetime_min, "SHORT_DATETIME_FORMAT"),
|
||||||
)
|
)
|
||||||
elif q.valid_datetime_max:
|
elif q.valid_datetime_max:
|
||||||
help_text = format_lazy(
|
help_text = format_lazy(
|
||||||
_('Please enter a date and time no later than {max}.'),
|
'Please enter a date and time no later than {max}.',
|
||||||
max=date_format(q.valid_datetime_max, "SHORT_DATETIME_FORMAT"),
|
max=date_format(q.valid_datetime_max, "SHORT_DATETIME_FORMAT"),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -33,7 +33,8 @@ from pretix.base.invoicing.transmission import (
|
|||||||
transmission_types,
|
transmission_types,
|
||||||
)
|
)
|
||||||
from pretix.base.models import Invoice, InvoiceAddress
|
from pretix.base.models import Invoice, InvoiceAddress
|
||||||
from pretix.base.services.mail import mail
|
from pretix.base.services.mail import mail, render_mail
|
||||||
|
from pretix.helpers.format import format_map
|
||||||
|
|
||||||
|
|
||||||
@transmission_types.new()
|
@transmission_types.new()
|
||||||
@@ -133,7 +134,9 @@ class EmailTransmissionProvider(TransmissionProvider):
|
|||||||
subject = invoice.order.event.settings.get('mail_subject_order_invoice', as_type=LazyI18nString)
|
subject = invoice.order.event.settings.get('mail_subject_order_invoice', as_type=LazyI18nString)
|
||||||
|
|
||||||
# Do not set to completed because that is done by the email sending task
|
# Do not set to completed because that is done by the email sending task
|
||||||
outgoing_mail = mail(
|
subject = format_map(subject, context)
|
||||||
|
email_content = render_mail(template, context)
|
||||||
|
mail(
|
||||||
[recipient],
|
[recipient],
|
||||||
subject,
|
subject,
|
||||||
template,
|
template,
|
||||||
@@ -148,10 +151,19 @@ class EmailTransmissionProvider(TransmissionProvider):
|
|||||||
plain_text_only=True,
|
plain_text_only=True,
|
||||||
no_order_links=True,
|
no_order_links=True,
|
||||||
)
|
)
|
||||||
if outgoing_mail:
|
invoice.order.log_action(
|
||||||
invoice.order.log_action(
|
'pretix.event.order.email.invoice',
|
||||||
'pretix.event.order.email.invoice',
|
user=None,
|
||||||
user=None,
|
auth=None,
|
||||||
auth=None,
|
data={
|
||||||
data=outgoing_mail.log_data()
|
'subject': subject,
|
||||||
)
|
'message': email_content,
|
||||||
|
'position': None,
|
||||||
|
'recipient': recipient,
|
||||||
|
'invoices': [invoice.pk],
|
||||||
|
'attach_tickets': False,
|
||||||
|
'attach_ical': False,
|
||||||
|
'attach_other_files': [],
|
||||||
|
'attach_cached_files': [],
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|||||||
@@ -21,7 +21,6 @@
|
|||||||
#
|
#
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
from django.utils.translation import gettext_lazy as _
|
|
||||||
from django_countries.fields import Country
|
from django_countries.fields import Country
|
||||||
|
|
||||||
from pretix.base.models import Invoice, InvoiceAddress
|
from pretix.base.models import Invoice, InvoiceAddress
|
||||||
@@ -107,22 +106,6 @@ class TransmissionType:
|
|||||||
def transmission_info_to_form_data(self, transmission_info: dict) -> dict:
|
def transmission_info_to_form_data(self, transmission_info: dict) -> dict:
|
||||||
return transmission_info
|
return transmission_info
|
||||||
|
|
||||||
def describe_info(self, transmission_info: dict, country: Country, is_business: bool):
|
|
||||||
form_data = self.transmission_info_to_form_data(transmission_info)
|
|
||||||
data = []
|
|
||||||
visible_field_keys = self.invoice_address_form_fields_visible(country, is_business)
|
|
||||||
for k, f in self.invoice_address_form_fields.items():
|
|
||||||
if k not in visible_field_keys:
|
|
||||||
continue
|
|
||||||
v = form_data.get(k)
|
|
||||||
if v is True:
|
|
||||||
v = _("Yes")
|
|
||||||
elif v is False:
|
|
||||||
v = _("No")
|
|
||||||
if v:
|
|
||||||
data.append((f.label, v))
|
|
||||||
return data
|
|
||||||
|
|
||||||
def pdf_watermark(self) -> Optional[str]:
|
def pdf_watermark(self) -> Optional[str]:
|
||||||
"""
|
"""
|
||||||
Return a watermark that should be rendered across the PDF file.
|
Return a watermark that should be rendered across the PDF file.
|
||||||
|
|||||||
@@ -130,8 +130,6 @@ class LoggingMixin:
|
|||||||
organizer_id = self.event.organizer_id
|
organizer_id = self.event.organizer_id
|
||||||
elif hasattr(self, 'organizer_id'):
|
elif hasattr(self, 'organizer_id'):
|
||||||
organizer_id = self.organizer_id
|
organizer_id = self.organizer_id
|
||||||
elif hasattr(self, 'issuer_id'):
|
|
||||||
organizer_id = self.issuer_id
|
|
||||||
|
|
||||||
if user and not user.is_authenticated:
|
if user and not user.is_authenticated:
|
||||||
user = None
|
user = None
|
||||||
|
|||||||
@@ -40,7 +40,6 @@ from i18nfield.fields import I18nCharField
|
|||||||
from phonenumber_field.modelfields import PhoneNumberField
|
from phonenumber_field.modelfields import PhoneNumberField
|
||||||
|
|
||||||
from pretix.base.banlist import banned
|
from pretix.base.banlist import banned
|
||||||
from pretix.base.i18n import language
|
|
||||||
from pretix.base.models.base import LoggedModel
|
from pretix.base.models.base import LoggedModel
|
||||||
from pretix.base.models.fields import MultiStringField
|
from pretix.base.models.fields import MultiStringField
|
||||||
from pretix.base.models.giftcards import GiftCardTransaction
|
from pretix.base.models.giftcards import GiftCardTransaction
|
||||||
@@ -165,28 +164,6 @@ class Customer(LoggedModel):
|
|||||||
self.attendee_profiles.all().delete()
|
self.attendee_profiles.all().delete()
|
||||||
self.invoice_addresses.all().delete()
|
self.invoice_addresses.all().delete()
|
||||||
|
|
||||||
def send_security_notice(self, message, email=None):
|
|
||||||
from pretix.base.services.mail import SendMailException, mail
|
|
||||||
from pretix.multidomain.urlreverse import build_absolute_uri
|
|
||||||
|
|
||||||
try:
|
|
||||||
with language(self.locale):
|
|
||||||
mail(
|
|
||||||
email or self.email,
|
|
||||||
self.organizer.settings.mail_subject_customer_security_notice,
|
|
||||||
self.organizer.settings.mail_text_customer_security_notice,
|
|
||||||
{
|
|
||||||
**self.get_email_context(),
|
|
||||||
'message': str(message),
|
|
||||||
'url': build_absolute_uri(self.organizer, 'presale:organizer.customer.index')
|
|
||||||
},
|
|
||||||
customer=self,
|
|
||||||
organizer=self.organizer,
|
|
||||||
locale=self.locale
|
|
||||||
)
|
|
||||||
except SendMailException:
|
|
||||||
pass # Already logged
|
|
||||||
|
|
||||||
@scopes_disabled()
|
@scopes_disabled()
|
||||||
def assign_identifier(self):
|
def assign_identifier(self):
|
||||||
charset = list('ABCDEFGHJKLMNPQRSTUVWXYZ23456789')
|
charset = list('ABCDEFGHJKLMNPQRSTUVWXYZ23456789')
|
||||||
|
|||||||
@@ -220,20 +220,3 @@ class OutgoingMail(models.Model):
|
|||||||
error_log_action_type = 'pretix.email.error'
|
error_log_action_type = 'pretix.email.error'
|
||||||
log_target = None
|
log_target = None
|
||||||
return log_target, error_log_action_type
|
return log_target, error_log_action_type
|
||||||
|
|
||||||
def log_data(self):
|
|
||||||
return {
|
|
||||||
"subject": self.subject,
|
|
||||||
"message": self.body_plain,
|
|
||||||
"to": self.to,
|
|
||||||
"cc": self.cc,
|
|
||||||
"bcc": self.bcc,
|
|
||||||
|
|
||||||
"invoices": [i.pk for i in self.should_attach_invoices.all()],
|
|
||||||
"attach_tickets": self.should_attach_tickets,
|
|
||||||
"attach_ical": self.should_attach_ical,
|
|
||||||
"attach_other_files": self.should_attach_other_files,
|
|
||||||
"attach_cached_files": [cf.filename for cf in self.should_attach_cached_files.all()],
|
|
||||||
|
|
||||||
"position": self.orderposition.positionid if self.orderposition else None,
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -87,6 +87,7 @@ from pretix.base.timemachine import time_machine_now
|
|||||||
|
|
||||||
from ...helpers import OF_SELF
|
from ...helpers import OF_SELF
|
||||||
from ...helpers.countries import CachedCountries, FastCountryField
|
from ...helpers.countries import CachedCountries, FastCountryField
|
||||||
|
from ...helpers.format import format_map
|
||||||
from ...helpers.names import build_name
|
from ...helpers.names import build_name
|
||||||
from ...testutils.middleware import debugflags_var
|
from ...testutils.middleware import debugflags_var
|
||||||
from ._transactions import (
|
from ._transactions import (
|
||||||
@@ -1166,7 +1167,7 @@ class Order(LockModel, LoggedModel):
|
|||||||
only be attached for this position and child positions, the link will only point to the
|
only be attached for this position and child positions, the link will only point to the
|
||||||
position and the attendee email will be used if available.
|
position and the attendee email will be used if available.
|
||||||
"""
|
"""
|
||||||
from pretix.base.services.mail import mail
|
from pretix.base.services.mail import mail, render_mail
|
||||||
|
|
||||||
if not self.email and not (position and position.attendee_email):
|
if not self.email and not (position and position.attendee_email):
|
||||||
return
|
return
|
||||||
@@ -1176,20 +1177,31 @@ class Order(LockModel, LoggedModel):
|
|||||||
if position and position.attendee_email:
|
if position and position.attendee_email:
|
||||||
recipient = position.attendee_email
|
recipient = position.attendee_email
|
||||||
|
|
||||||
outgoing_mail = mail(
|
email_content = render_mail(template, context)
|
||||||
|
subject = format_map(subject, context)
|
||||||
|
mail(
|
||||||
recipient, subject, template, context,
|
recipient, subject, template, context,
|
||||||
self.event, self.locale, self, headers=headers, sender=sender,
|
self.event, self.locale, self, headers=headers, sender=sender,
|
||||||
invoices=invoices, attach_tickets=attach_tickets,
|
invoices=invoices, attach_tickets=attach_tickets,
|
||||||
position=position, auto_email=auto_email, attach_ical=attach_ical,
|
position=position, auto_email=auto_email, attach_ical=attach_ical,
|
||||||
attach_other_files=attach_other_files, attach_cached_files=attach_cached_files,
|
attach_other_files=attach_other_files, attach_cached_files=attach_cached_files,
|
||||||
)
|
)
|
||||||
if outgoing_mail:
|
self.log_action(
|
||||||
self.log_action(
|
log_entry_type,
|
||||||
log_entry_type,
|
user=user,
|
||||||
user=user,
|
auth=auth,
|
||||||
auth=auth,
|
data={
|
||||||
data=outgoing_mail.log_data(),
|
'subject': subject,
|
||||||
)
|
'message': email_content,
|
||||||
|
'position': position.positionid if position else None,
|
||||||
|
'recipient': recipient,
|
||||||
|
'invoices': [i.pk for i in invoices] if invoices else [],
|
||||||
|
'attach_tickets': attach_tickets,
|
||||||
|
'attach_ical': attach_ical,
|
||||||
|
'attach_other_files': attach_other_files,
|
||||||
|
'attach_cached_files': [cf.filename for cf in attach_cached_files] if attach_cached_files else [],
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
def resend_link(self, user=None, auth=None):
|
def resend_link(self, user=None, auth=None):
|
||||||
with language(self.locale, self.event.settings.region):
|
with language(self.locale, self.event.settings.region):
|
||||||
@@ -2887,14 +2899,16 @@ class OrderPosition(AbstractPosition):
|
|||||||
:param attach_tickets: Attach tickets of this order, if they are existing and ready to download
|
:param attach_tickets: Attach tickets of this order, if they are existing and ready to download
|
||||||
:param attach_ical: Attach relevant ICS files
|
:param attach_ical: Attach relevant ICS files
|
||||||
"""
|
"""
|
||||||
from pretix.base.services.mail import mail
|
from pretix.base.services.mail import mail, render_mail
|
||||||
|
|
||||||
if not self.attendee_email:
|
if not self.attendee_email:
|
||||||
return
|
return
|
||||||
|
|
||||||
with language(self.order.locale, self.order.event.settings.region):
|
with language(self.order.locale, self.order.event.settings.region):
|
||||||
recipient = self.attendee_email
|
recipient = self.attendee_email
|
||||||
outgoing_mail = mail(
|
email_content = render_mail(template, context)
|
||||||
|
subject = format_map(subject, context)
|
||||||
|
mail(
|
||||||
recipient, subject, template, context,
|
recipient, subject, template, context,
|
||||||
self.event, self.order.locale, order=self.order, headers=headers, sender=sender,
|
self.event, self.order.locale, order=self.order, headers=headers, sender=sender,
|
||||||
position=self,
|
position=self,
|
||||||
@@ -2903,13 +2917,21 @@ class OrderPosition(AbstractPosition):
|
|||||||
attach_ical=attach_ical,
|
attach_ical=attach_ical,
|
||||||
attach_other_files=attach_other_files,
|
attach_other_files=attach_other_files,
|
||||||
)
|
)
|
||||||
if outgoing_mail:
|
self.order.log_action(
|
||||||
self.order.log_action(
|
log_entry_type,
|
||||||
log_entry_type,
|
user=user,
|
||||||
user=user,
|
auth=auth,
|
||||||
auth=auth,
|
data={
|
||||||
data=outgoing_mail.log_data(),
|
'subject': subject,
|
||||||
)
|
'message': email_content,
|
||||||
|
'recipient': recipient,
|
||||||
|
'invoices': [i.pk for i in invoices] if invoices else [],
|
||||||
|
'attach_tickets': attach_tickets,
|
||||||
|
'attach_ical': attach_ical,
|
||||||
|
'attach_other_files': attach_other_files,
|
||||||
|
'attach_cached_files': [],
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
def resend_link(self, user=None, auth=None):
|
def resend_link(self, user=None, auth=None):
|
||||||
|
|
||||||
@@ -3485,10 +3507,18 @@ class InvoiceAddress(models.Model):
|
|||||||
def describe_transmission(self):
|
def describe_transmission(self):
|
||||||
from pretix.base.invoicing.transmission import transmission_types
|
from pretix.base.invoicing.transmission import transmission_types
|
||||||
data = []
|
data = []
|
||||||
|
|
||||||
t, __ = transmission_types.get(identifier=self.transmission_type)
|
t, __ = transmission_types.get(identifier=self.transmission_type)
|
||||||
data.append((_("Transmission type"), t.public_name))
|
data.append((_("Transmission type"), t.public_name))
|
||||||
if self.transmission_info:
|
form_data = t.transmission_info_to_form_data(self.transmission_info or {})
|
||||||
data += t.describe_info(self.transmission_info, self.country, self.is_business)
|
for k, f in t.invoice_address_form_fields.items():
|
||||||
|
v = form_data.get(k)
|
||||||
|
if v is True:
|
||||||
|
v = _("Yes")
|
||||||
|
elif v is False:
|
||||||
|
v = _("No")
|
||||||
|
if v:
|
||||||
|
data.append((f.label, v))
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -34,9 +34,10 @@ from phonenumber_field.modelfields import PhoneNumberField
|
|||||||
from pretix.base.email import get_email_context
|
from pretix.base.email import get_email_context
|
||||||
from pretix.base.i18n import language
|
from pretix.base.i18n import language
|
||||||
from pretix.base.models import User, Voucher
|
from pretix.base.models import User, Voucher
|
||||||
from pretix.base.services.mail import mail
|
from pretix.base.services.mail import mail, render_mail
|
||||||
from pretix.helpers import OF_SELF
|
from pretix.helpers import OF_SELF
|
||||||
|
|
||||||
|
from ...helpers.format import format_map
|
||||||
from ...helpers.names import build_name
|
from ...helpers.names import build_name
|
||||||
from .base import LoggedModel
|
from .base import LoggedModel
|
||||||
from .event import Event, SubEvent
|
from .event import Event, SubEvent
|
||||||
@@ -271,7 +272,9 @@ class WaitingListEntry(LoggedModel):
|
|||||||
with language(self.locale, self.event.settings.region):
|
with language(self.locale, self.event.settings.region):
|
||||||
recipient = self.email
|
recipient = self.email
|
||||||
|
|
||||||
outgoing_mail = mail(
|
email_content = render_mail(template, context)
|
||||||
|
subject = format_map(subject, context)
|
||||||
|
mail(
|
||||||
recipient, subject, template, context,
|
recipient, subject, template, context,
|
||||||
self.event,
|
self.event,
|
||||||
self.locale,
|
self.locale,
|
||||||
@@ -281,13 +284,18 @@ class WaitingListEntry(LoggedModel):
|
|||||||
attach_other_files=attach_other_files,
|
attach_other_files=attach_other_files,
|
||||||
attach_cached_files=attach_cached_files,
|
attach_cached_files=attach_cached_files,
|
||||||
)
|
)
|
||||||
if outgoing_mail:
|
self.log_action(
|
||||||
self.log_action(
|
log_entry_type,
|
||||||
log_entry_type,
|
user=user,
|
||||||
user=user,
|
auth=auth,
|
||||||
auth=auth,
|
data={
|
||||||
data=outgoing_mail.log_data(),
|
'subject': subject,
|
||||||
)
|
'message': email_content,
|
||||||
|
'recipient': recipient,
|
||||||
|
'attach_other_files': attach_other_files,
|
||||||
|
'attach_cached_files': [cf.filename for cf in attach_cached_files] if attach_cached_files else [],
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def clean_itemvar(event, item, variation):
|
def clean_itemvar(event, item, variation):
|
||||||
|
|||||||
@@ -1295,7 +1295,6 @@ class ManualPayment(BasePaymentProvider):
|
|||||||
|
|
||||||
def format_map(self, order, payment):
|
def format_map(self, order, payment):
|
||||||
return {
|
return {
|
||||||
# Possible placeholder injection, we should make sure to never include user-controlled variables here
|
|
||||||
'order': order.code,
|
'order': order.code,
|
||||||
'amount': payment.amount,
|
'amount': payment.amount,
|
||||||
'currency': self.event.currency,
|
'currency': self.event.currency,
|
||||||
@@ -1647,13 +1646,6 @@ class GiftCardPayment(BasePaymentProvider):
|
|||||||
'transaction_id': trans.pk,
|
'transaction_id': trans.pk,
|
||||||
}
|
}
|
||||||
payment.confirm(send_mail=not is_early_special_case, generate_invoice=not is_early_special_case)
|
payment.confirm(send_mail=not is_early_special_case, generate_invoice=not is_early_special_case)
|
||||||
gc.log_action(
|
|
||||||
action='pretix.giftcards.transaction.payment',
|
|
||||||
data={
|
|
||||||
'value': trans.value,
|
|
||||||
'acceptor_id': self.event.organizer.id
|
|
||||||
}
|
|
||||||
)
|
|
||||||
except PaymentException as e:
|
except PaymentException as e:
|
||||||
payment.fail(info={'error': str(e)})
|
payment.fail(info={'error': str(e)})
|
||||||
raise e
|
raise e
|
||||||
@@ -1678,14 +1670,6 @@ class GiftCardPayment(BasePaymentProvider):
|
|||||||
'transaction_id': trans.pk,
|
'transaction_id': trans.pk,
|
||||||
}
|
}
|
||||||
refund.done()
|
refund.done()
|
||||||
gc.log_action(
|
|
||||||
action='pretix.giftcards.transaction.refund',
|
|
||||||
data={
|
|
||||||
'value': refund.amount,
|
|
||||||
'acceptor_id': self.event.organizer.id,
|
|
||||||
'text': refund.comment,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@receiver(register_payment_providers, dispatch_uid="payment_free")
|
@receiver(register_payment_providers, dispatch_uid="payment_free")
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ def get_all_plugins(*, event=None, organizer=None) -> List[type]:
|
|||||||
if app.name in settings.PRETIX_PLUGINS_EXCLUDE:
|
if app.name in settings.PRETIX_PLUGINS_EXCLUDE:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
level = getattr(meta, "level", PLUGIN_LEVEL_EVENT)
|
level = getattr(app, "level", PLUGIN_LEVEL_EVENT)
|
||||||
if level == PLUGIN_LEVEL_EVENT:
|
if level == PLUGIN_LEVEL_EVENT:
|
||||||
if event and hasattr(app, 'is_available'):
|
if event and hasattr(app, 'is_available'):
|
||||||
if not app.is_available(event):
|
if not app.is_available(event):
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ from pretix.base.services.tax import split_fee_for_taxes
|
|||||||
from pretix.base.templatetags.money import money_filter
|
from pretix.base.templatetags.money import money_filter
|
||||||
from pretix.celery_app import app
|
from pretix.celery_app import app
|
||||||
from pretix.helpers import OF_SELF
|
from pretix.helpers import OF_SELF
|
||||||
|
from pretix.helpers.format import format_map
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@@ -54,7 +55,7 @@ def _send_wle_mail(wle: WaitingListEntry, subject: LazyI18nString, message: Lazy
|
|||||||
email_context = get_email_context(event_or_subevent=subevent or wle.event, event=wle.event)
|
email_context = get_email_context(event_or_subevent=subevent or wle.event, event=wle.event)
|
||||||
mail(
|
mail(
|
||||||
wle.email,
|
wle.email,
|
||||||
str(subject),
|
format_map(subject, email_context),
|
||||||
message,
|
message,
|
||||||
email_context,
|
email_context,
|
||||||
wle.event,
|
wle.event,
|
||||||
@@ -72,8 +73,9 @@ def _send_mail(order: Order, subject: LazyI18nString, message: LazyI18nString, s
|
|||||||
|
|
||||||
email_context = get_email_context(event_or_subevent=subevent or order.event, refund_amount=refund_amount,
|
email_context = get_email_context(event_or_subevent=subevent or order.event, refund_amount=refund_amount,
|
||||||
order=order, position_or_address=ia, event=order.event)
|
order=order, position_or_address=ia, event=order.event)
|
||||||
|
real_subject = format_map(subject, email_context)
|
||||||
order.send_mail(
|
order.send_mail(
|
||||||
subject, message, email_context,
|
real_subject, message, email_context,
|
||||||
'pretix.event.order.email.event_canceled',
|
'pretix.event.order.email.event_canceled',
|
||||||
user,
|
user,
|
||||||
)
|
)
|
||||||
@@ -83,13 +85,14 @@ def _send_mail(order: Order, subject: LazyI18nString, message: LazyI18nString, s
|
|||||||
continue
|
continue
|
||||||
|
|
||||||
if p.addon_to_id is None and p.attendee_email and p.attendee_email != order.email:
|
if p.addon_to_id is None and p.attendee_email and p.attendee_email != order.email:
|
||||||
|
real_subject = format_map(subject, email_context)
|
||||||
email_context = get_email_context(event_or_subevent=p.subevent or order.event,
|
email_context = get_email_context(event_or_subevent=p.subevent or order.event,
|
||||||
event=order.event,
|
event=order.event,
|
||||||
refund_amount=refund_amount,
|
refund_amount=refund_amount,
|
||||||
position_or_address=p,
|
position_or_address=p,
|
||||||
order=order, position=p)
|
order=order, position=p)
|
||||||
order.send_mail(
|
order.send_mail(
|
||||||
subject, message, email_context,
|
real_subject, message, email_context,
|
||||||
'pretix.event.order.email.event_canceled',
|
'pretix.event.order.email.event_canceled',
|
||||||
position=p,
|
position=p,
|
||||||
user=user
|
user=user
|
||||||
|
|||||||
@@ -58,7 +58,6 @@ from django.core.mail.message import SafeMIMEText
|
|||||||
from django.db import connection, transaction
|
from django.db import connection, transaction
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
from django.dispatch import receiver
|
from django.dispatch import receiver
|
||||||
from django.template import Context
|
|
||||||
from django.template.loader import get_template
|
from django.template.loader import get_template
|
||||||
from django.utils.html import escape
|
from django.utils.html import escape
|
||||||
from django.utils.timezone import now, override
|
from django.utils.timezone import now, override
|
||||||
@@ -82,9 +81,7 @@ from pretix.base.signals import (
|
|||||||
)
|
)
|
||||||
from pretix.celery_app import app
|
from pretix.celery_app import app
|
||||||
from pretix.helpers import OF_SELF
|
from pretix.helpers import OF_SELF
|
||||||
from pretix.helpers.format import (
|
from pretix.helpers.format import SafeFormatter, format_map
|
||||||
FormattedString, PlainHtmlAlternativeString, SafeFormatter, format_map,
|
|
||||||
)
|
|
||||||
from pretix.helpers.hierarkey import clean_filename
|
from pretix.helpers.hierarkey import clean_filename
|
||||||
from pretix.multidomain.urlreverse import build_absolute_uri
|
from pretix.multidomain.urlreverse import build_absolute_uri
|
||||||
from pretix.presale.ical import get_private_icals
|
from pretix.presale.ical import get_private_icals
|
||||||
@@ -150,13 +147,13 @@ def prefix_subject(settings_holder, subject, highlight=False):
|
|||||||
return subject
|
return subject
|
||||||
|
|
||||||
|
|
||||||
def mail(email: Union[str, Sequence[str]], subject: Union[str, FormattedString], template: Union[str, LazyI18nString],
|
def mail(email: Union[str, Sequence[str]], subject: str, template: Union[str, LazyI18nString],
|
||||||
context: Dict[str, Any] = None, event: Event = None, locale: str = None, order: Order = None,
|
context: Dict[str, Any] = None, event: Event = None, locale: str = None, order: Order = None,
|
||||||
position: OrderPosition = None, *, headers: dict = None, sender: str = None, organizer: Organizer = None,
|
position: OrderPosition = None, *, headers: dict = None, sender: str = None, organizer: Organizer = None,
|
||||||
customer: Customer = None, invoices: Sequence = None, attach_tickets=False, auto_email=True, user=None,
|
customer: Customer = None, invoices: Sequence = None, attach_tickets=False, auto_email=True, user=None,
|
||||||
attach_ical=False, attach_cached_files: Sequence = None, attach_other_files: list=None,
|
attach_ical=False, attach_cached_files: Sequence = None, attach_other_files: list=None,
|
||||||
plain_text_only=False, no_order_links=False, cc: Sequence[str]=None, bcc: Sequence[str]=None,
|
plain_text_only=False, no_order_links=False, cc: Sequence[str]=None, bcc: Sequence[str]=None,
|
||||||
sensitive: bool=False) -> Optional[OutgoingMail]:
|
sensitive: bool=False):
|
||||||
"""
|
"""
|
||||||
Sends out an email to a user. The mail will be sent synchronously or asynchronously depending on the installation.
|
Sends out an email to a user. The mail will be sent synchronously or asynchronously depending on the installation.
|
||||||
|
|
||||||
@@ -221,9 +218,6 @@ def mail(email: Union[str, Sequence[str]], subject: Union[str, FormattedString],
|
|||||||
if email == INVALID_ADDRESS:
|
if email == INVALID_ADDRESS:
|
||||||
return
|
return
|
||||||
|
|
||||||
if isinstance(template, FormattedString):
|
|
||||||
raise TypeError("Cannot pass an already formatted body template")
|
|
||||||
|
|
||||||
if no_order_links and not plain_text_only:
|
if no_order_links and not plain_text_only:
|
||||||
raise ValueError('If you set no_order_links, you also need to set plain_text_only.')
|
raise ValueError('If you set no_order_links, you also need to set plain_text_only.')
|
||||||
|
|
||||||
@@ -257,33 +251,23 @@ def mail(email: Union[str, Sequence[str]], subject: Union[str, FormattedString],
|
|||||||
if event and attach_tickets and not event.settings.mail_attach_tickets:
|
if event and attach_tickets and not event.settings.mail_attach_tickets:
|
||||||
attach_tickets = False
|
attach_tickets = False
|
||||||
|
|
||||||
with language(locale), override(timezone):
|
with language(locale):
|
||||||
if isinstance(context, dict) and order:
|
if isinstance(context, dict) and order:
|
||||||
_autoextend_context(context, order)
|
_autoextend_context(context, order)
|
||||||
|
|
||||||
# Build raw content
|
# Build raw content
|
||||||
content = render_mail(template, context, placeholder_mode=None)
|
body_plain = render_mail(template, context, placeholder_mode=SafeFormatter.MODE_RICH_TO_PLAIN)
|
||||||
if settings_holder:
|
if settings_holder:
|
||||||
signature = str(settings_holder.settings.get('mail_text_signature'))
|
signature = str(settings_holder.settings.get('mail_text_signature'))
|
||||||
else:
|
else:
|
||||||
signature = ""
|
signature = ""
|
||||||
|
|
||||||
# Build full plain-text body
|
# Build full plain-text body
|
||||||
if isinstance(content, FormattedString):
|
|
||||||
# Already formatted by render_mail() from format_values
|
|
||||||
body_plain = content
|
|
||||||
elif isinstance(content, PlainHtmlAlternativeString):
|
|
||||||
# Already formatted by render_mail() form a django template
|
|
||||||
body_plain = content.plain
|
|
||||||
else:
|
|
||||||
# Not yet formatted
|
|
||||||
body_plain = format_map(content, context, mode=SafeFormatter.MODE_RICH_TO_PLAIN)
|
|
||||||
body_plain = _wrap_plain_body(body_plain, signature, event, order, position, no_order_links)
|
body_plain = _wrap_plain_body(body_plain, signature, event, order, position, no_order_links)
|
||||||
|
body_plain = format_map(body_plain, context, mode=SafeFormatter.MODE_RICH_TO_PLAIN)
|
||||||
|
|
||||||
# Build subject
|
# Build subject
|
||||||
if not isinstance(subject, FormattedString):
|
subject = str(subject).format_map(TolerantDict(context))
|
||||||
subject = format_map(subject, context)
|
|
||||||
|
|
||||||
subject = raw_subject = subject.replace('\n', ' ').replace('\r', '')[:900]
|
subject = raw_subject = subject.replace('\n', ' ').replace('\r', '')[:900]
|
||||||
if settings_holder:
|
if settings_holder:
|
||||||
subject = prefix_subject(settings_holder, subject)
|
subject = prefix_subject(settings_holder, subject)
|
||||||
@@ -302,24 +286,26 @@ def mail(email: Union[str, Sequence[str]], subject: Union[str, FormattedString],
|
|||||||
else:
|
else:
|
||||||
renderer = ClassicMailRenderer(None, organizer)
|
renderer = ClassicMailRenderer(None, organizer)
|
||||||
|
|
||||||
try:
|
with override(timezone):
|
||||||
if 'context' in inspect.signature(renderer.render).parameters:
|
content_plain = render_mail(template, context, placeholder_mode=None)
|
||||||
body_html = renderer.render(content, signature, raw_subject, order, position, context)
|
try:
|
||||||
elif 'position' in inspect.signature(renderer.render).parameters:
|
if 'context' in inspect.signature(renderer.render).parameters:
|
||||||
# Backwards compatibility
|
body_html = renderer.render(content_plain, signature, raw_subject, order, position, context)
|
||||||
warnings.warn('Email renderer called without context argument because context argument is not '
|
elif 'position' in inspect.signature(renderer.render).parameters:
|
||||||
'supported.',
|
# Backwards compatibility
|
||||||
DeprecationWarning)
|
warnings.warn('Email renderer called without context argument because context argument is not '
|
||||||
body_html = renderer.render(content, signature, raw_subject, order, position)
|
'supported.',
|
||||||
else:
|
DeprecationWarning)
|
||||||
# Backwards compatibility
|
body_html = renderer.render(content_plain, signature, raw_subject, order, position)
|
||||||
warnings.warn('Email renderer called without position argument because position argument is not '
|
else:
|
||||||
'supported.',
|
# Backwards compatibility
|
||||||
DeprecationWarning)
|
warnings.warn('Email renderer called without position argument because position argument is not '
|
||||||
body_html = renderer.render(content, signature, raw_subject, order)
|
'supported.',
|
||||||
except:
|
DeprecationWarning)
|
||||||
logger.exception('Could not render HTML body')
|
body_html = renderer.render(content_plain, signature, raw_subject, order)
|
||||||
body_html = None
|
except:
|
||||||
|
logger.exception('Could not render HTML body')
|
||||||
|
body_html = None
|
||||||
|
|
||||||
m = OutgoingMail.objects.create(
|
m = OutgoingMail.objects.create(
|
||||||
organizer=organizer,
|
organizer=organizer,
|
||||||
@@ -341,26 +327,14 @@ def mail(email: Union[str, Sequence[str]], subject: Union[str, FormattedString],
|
|||||||
should_attach_other_files=attach_other_files or [],
|
should_attach_other_files=attach_other_files or [],
|
||||||
sensitive=sensitive,
|
sensitive=sensitive,
|
||||||
)
|
)
|
||||||
m._prefetched_objects_cache = {}
|
|
||||||
if invoices and not position:
|
if invoices and not position:
|
||||||
m.should_attach_invoices.add(*invoices)
|
m.should_attach_invoices.add(*invoices)
|
||||||
# Hack: For logging, we'll later make a `should_attach_invoices.all()` call. We can prevent a useless
|
|
||||||
# DB query by filling the cache
|
|
||||||
m._prefetched_objects_cache[m.should_attach_invoices.prefetch_cache_name] = invoices
|
|
||||||
else:
|
|
||||||
m._prefetched_objects_cache[m.should_attach_invoices.prefetch_cache_name] = Invoice.objects.none()
|
|
||||||
if attach_cached_files:
|
if attach_cached_files:
|
||||||
cf_list = []
|
|
||||||
for cf in attach_cached_files:
|
for cf in attach_cached_files:
|
||||||
if not isinstance(cf, CachedFile):
|
if not isinstance(cf, CachedFile):
|
||||||
cf = CachedFile.objects.get(pk=cf)
|
m.should_attach_cached_files.add(CachedFile.objects.get(pk=cf))
|
||||||
m.should_attach_cached_files.add(cf)
|
else:
|
||||||
cf_list.append(cf)
|
m.should_attach_cached_files.add(cf)
|
||||||
# Hack: For logging, we'll later make a `should_attach_cached_files.all()` call. We can prevent a useless
|
|
||||||
# DB query by filling the cache
|
|
||||||
m._prefetched_objects_cache[m.should_attach_cached_files.prefetch_cache_name] = cf_list
|
|
||||||
else:
|
|
||||||
m._prefetched_objects_cache[m.should_attach_cached_files.prefetch_cache_name] = CachedFile.objects.none()
|
|
||||||
|
|
||||||
send_task = mail_send_task.si(
|
send_task = mail_send_task.si(
|
||||||
outgoing_mail=m.id
|
outgoing_mail=m.id
|
||||||
@@ -382,8 +356,6 @@ def mail(email: Union[str, Sequence[str]], subject: Union[str, FormattedString],
|
|||||||
lambda: chain(*task_chain).apply_async()
|
lambda: chain(*task_chain).apply_async()
|
||||||
)
|
)
|
||||||
|
|
||||||
return m
|
|
||||||
|
|
||||||
|
|
||||||
class CustomEmail(EmailMultiAlternatives):
|
class CustomEmail(EmailMultiAlternatives):
|
||||||
def _create_mime_attachment(self, content, mimetype):
|
def _create_mime_attachment(self, content, mimetype):
|
||||||
@@ -547,7 +519,6 @@ def mail_send_task(self, **kwargs) -> bool:
|
|||||||
)
|
)
|
||||||
except InvoiceAddress.DoesNotExist:
|
except InvoiceAddress.DoesNotExist:
|
||||||
pass
|
pass
|
||||||
expected_recipients = {e.lower() for e in expected_recipients if e}
|
|
||||||
if any(t in expected_recipients for t in outgoing_mail.to):
|
if any(t in expected_recipients for t in outgoing_mail.to):
|
||||||
invoices_to_mark_transmitted.append(inv)
|
invoices_to_mark_transmitted.append(inv)
|
||||||
|
|
||||||
@@ -816,22 +787,10 @@ def render_mail(template, context, placeholder_mode: Optional[int]=SafeFormatter
|
|||||||
body = str(template)
|
body = str(template)
|
||||||
if context and placeholder_mode:
|
if context and placeholder_mode:
|
||||||
body = format_map(body, context, mode=placeholder_mode)
|
body = format_map(body, context, mode=placeholder_mode)
|
||||||
return body
|
|
||||||
else:
|
else:
|
||||||
tpl = get_template(template)
|
tpl = get_template(template)
|
||||||
|
body = tpl.render(context)
|
||||||
plain_context = Context({
|
return body
|
||||||
k: v.plain if isinstance(v, PlainHtmlAlternativeString) else v
|
|
||||||
for k, v in context.items()
|
|
||||||
} | {"to_html": False}, autoescape=False)
|
|
||||||
html_context = Context({
|
|
||||||
k: v.html if isinstance(v, PlainHtmlAlternativeString) else v
|
|
||||||
for k, v in context.items()
|
|
||||||
} | {"to_html": True}, autoescape=True)
|
|
||||||
return PlainHtmlAlternativeString(
|
|
||||||
plain=tpl.template.render(plain_context),
|
|
||||||
html=tpl.template.render(html_context),
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def replace_images_with_cid_paths(body_html):
|
def replace_images_with_cid_paths(body_html):
|
||||||
@@ -976,7 +935,7 @@ def _wrap_plain_body(content_plain, signature, event, order, position, no_order_
|
|||||||
body_plain += "\r\n\r\n-- \r\n"
|
body_plain += "\r\n\r\n-- \r\n"
|
||||||
|
|
||||||
if signature:
|
if signature:
|
||||||
signature = format_map(signature, {"event": event.name if event else ''})
|
signature = signature.format(event=event.name if event else '')
|
||||||
body_plain += signature
|
body_plain += signature
|
||||||
body_plain += "\r\n\r\n-- \r\n"
|
body_plain += "\r\n\r\n-- \r\n"
|
||||||
|
|
||||||
@@ -988,7 +947,7 @@ def _wrap_plain_body(content_plain, signature, event, order, position, no_order_
|
|||||||
body_plain += _(
|
body_plain += _(
|
||||||
"You can view your order details at the following URL:\n{orderurl}."
|
"You can view your order details at the following URL:\n{orderurl}."
|
||||||
).replace("\n", "\r\n").format(
|
).replace("\n", "\r\n").format(
|
||||||
orderurl=build_absolute_uri(
|
event=event.name, orderurl=build_absolute_uri(
|
||||||
order.event, 'presale:event.order.position', kwargs={
|
order.event, 'presale:event.order.position', kwargs={
|
||||||
'order': order.code,
|
'order': order.code,
|
||||||
'secret': position.web_secret,
|
'secret': position.web_secret,
|
||||||
|
|||||||
@@ -247,15 +247,6 @@ def reactivate_order(order: Order, force: bool=False, user: User=None, auth=None
|
|||||||
for gc in position.issued_gift_cards.all():
|
for gc in position.issued_gift_cards.all():
|
||||||
gc = GiftCard.objects.select_for_update(of=OF_SELF).get(pk=gc.pk)
|
gc = GiftCard.objects.select_for_update(of=OF_SELF).get(pk=gc.pk)
|
||||||
gc.transactions.create(value=position.price, order=order, acceptor=order.event.organizer)
|
gc.transactions.create(value=position.price, order=order, acceptor=order.event.organizer)
|
||||||
gc.log_action(
|
|
||||||
action='pretix.giftcards.transaction.manual',
|
|
||||||
user=user,
|
|
||||||
auth=auth,
|
|
||||||
data={
|
|
||||||
'value': position.price,
|
|
||||||
'acceptor_id': order.event.organizer.id
|
|
||||||
}
|
|
||||||
)
|
|
||||||
break
|
break
|
||||||
|
|
||||||
for m in position.granted_memberships.all():
|
for m in position.granted_memberships.all():
|
||||||
@@ -557,14 +548,6 @@ def _cancel_order(order, user=None, send_mail: bool=True, api_token=None, device
|
|||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
gc.transactions.create(value=-position.price, order=order, acceptor=order.event.organizer)
|
gc.transactions.create(value=-position.price, order=order, acceptor=order.event.organizer)
|
||||||
gc.log_action(
|
|
||||||
action='pretix.giftcards.transaction.manual',
|
|
||||||
user=user,
|
|
||||||
data={
|
|
||||||
'value': -position.price,
|
|
||||||
'acceptor_id': order.event.organizer.id,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
for m in position.granted_memberships.all():
|
for m in position.granted_memberships.all():
|
||||||
m.canceled = True
|
m.canceled = True
|
||||||
@@ -2451,15 +2434,6 @@ class OrderChangeManager:
|
|||||||
))
|
))
|
||||||
else:
|
else:
|
||||||
gc.transactions.create(value=-position.price, order=self.order, acceptor=self.order.event.organizer)
|
gc.transactions.create(value=-position.price, order=self.order, acceptor=self.order.event.organizer)
|
||||||
gc.log_action(
|
|
||||||
action='pretix.giftcards.transaction.manual',
|
|
||||||
user=self.user,
|
|
||||||
auth=self.auth,
|
|
||||||
data={
|
|
||||||
'value': -position.price,
|
|
||||||
'acceptor_id': self.order.event.organizer.id
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
for m in position.granted_memberships.with_usages().all():
|
for m in position.granted_memberships.with_usages().all():
|
||||||
m.canceled = True
|
m.canceled = True
|
||||||
@@ -2477,15 +2451,6 @@ class OrderChangeManager:
|
|||||||
))
|
))
|
||||||
else:
|
else:
|
||||||
gc.transactions.create(value=-opa.position.price, order=self.order, acceptor=self.order.event.organizer)
|
gc.transactions.create(value=-opa.position.price, order=self.order, acceptor=self.order.event.organizer)
|
||||||
gc.log_action(
|
|
||||||
action='pretix.giftcards.transaction.manual',
|
|
||||||
user=self.user,
|
|
||||||
auth=self.auth,
|
|
||||||
data={
|
|
||||||
'value': -opa.position.price,
|
|
||||||
'acceptor_id': self.order.event.organizer.id
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
for m in opa.granted_memberships.with_usages().all():
|
for m in opa.granted_memberships.with_usages().all():
|
||||||
m.canceled = True
|
m.canceled = True
|
||||||
@@ -3154,10 +3119,7 @@ def _try_auto_refund(order, auto_refund=True, manual_refund=False, allow_partial
|
|||||||
customer=order.customer,
|
customer=order.customer,
|
||||||
testmode=order.testmode
|
testmode=order.testmode
|
||||||
)
|
)
|
||||||
giftcard.log_action(
|
giftcard.log_action('pretix.giftcards.created', data={})
|
||||||
action='pretix.giftcards.created',
|
|
||||||
data={}
|
|
||||||
)
|
|
||||||
r = order.refunds.create(
|
r = order.refunds.create(
|
||||||
order=order,
|
order=order,
|
||||||
payment=None,
|
payment=None,
|
||||||
@@ -3444,17 +3406,7 @@ def signal_listener_issue_giftcards(sender: Event, order: Order, **kwargs):
|
|||||||
currency=sender.currency, issued_in=p, testmode=order.testmode,
|
currency=sender.currency, issued_in=p, testmode=order.testmode,
|
||||||
expires=sender.organizer.default_gift_card_expiry,
|
expires=sender.organizer.default_gift_card_expiry,
|
||||||
)
|
)
|
||||||
gc.log_action(
|
gc.transactions.create(value=p.price - issued, order=order, acceptor=sender.organizer)
|
||||||
action='pretix.giftcards.created',
|
|
||||||
)
|
|
||||||
trans = gc.transactions.create(value=p.price - issued, order=order, acceptor=sender.organizer)
|
|
||||||
gc.log_action(
|
|
||||||
action='pretix.giftcards.transaction.manual',
|
|
||||||
data={
|
|
||||||
'value': trans.value,
|
|
||||||
'acceptor_id': order.event.organizer.id,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
any_giftcards = True
|
any_giftcards = True
|
||||||
p.secret = gc.secret
|
p.secret = gc.secret
|
||||||
p.save(update_fields=['secret'])
|
p.save(update_fields=['secret'])
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ def vouchers_send(event: Event, vouchers: list, subject: str, message: str, reci
|
|||||||
with language(event.settings.locale):
|
with language(event.settings.locale):
|
||||||
email_context = get_email_context(event=event, name=r.get('name') or '',
|
email_context = get_email_context(event=event, name=r.get('name') or '',
|
||||||
voucher_list=[v.code for v in voucher_list])
|
voucher_list=[v.code for v in voucher_list])
|
||||||
outgoing_mail = mail(
|
mail(
|
||||||
r['email'],
|
r['email'],
|
||||||
subject,
|
subject,
|
||||||
LazyI18nString(message),
|
LazyI18nString(message),
|
||||||
@@ -60,8 +60,8 @@ def vouchers_send(event: Event, vouchers: list, subject: str, message: str, reci
|
|||||||
data={
|
data={
|
||||||
'recipient': r['email'],
|
'recipient': r['email'],
|
||||||
'name': r.get('name'),
|
'name': r.get('name'),
|
||||||
'subject': outgoing_mail.subject,
|
'subject': subject,
|
||||||
'message': outgoing_mail.body_plain,
|
'message': message,
|
||||||
},
|
},
|
||||||
save=False
|
save=False
|
||||||
))
|
))
|
||||||
|
|||||||
@@ -2948,28 +2948,6 @@ If you did not request a new password, please ignore this email.
|
|||||||
|
|
||||||
Best regards,
|
Best regards,
|
||||||
|
|
||||||
Your {organizer} team""")) # noqa: W291
|
|
||||||
},
|
|
||||||
'mail_subject_customer_security_notice': {
|
|
||||||
'type': LazyI18nString,
|
|
||||||
'default': LazyI18nString.from_gettext(gettext_noop("Changes to your account at {organizer}")),
|
|
||||||
},
|
|
||||||
'mail_text_customer_security_notice': {
|
|
||||||
'type': LazyI18nString,
|
|
||||||
'default': LazyI18nString.from_gettext(gettext_noop("""Hello {name},
|
|
||||||
|
|
||||||
the following change has been made to your account at {organizer}:
|
|
||||||
|
|
||||||
{message}
|
|
||||||
|
|
||||||
You can review and change your account settings here:
|
|
||||||
|
|
||||||
{url}
|
|
||||||
|
|
||||||
If this change was not performed by you, please contact us immediately.
|
|
||||||
|
|
||||||
Best regards,
|
|
||||||
|
|
||||||
Your {organizer} team""")) # noqa: W291
|
Your {organizer} team""")) # noqa: W291
|
||||||
},
|
},
|
||||||
'smtp_use_custom': {
|
'smtp_use_custom': {
|
||||||
|
|||||||
@@ -363,7 +363,7 @@ class EmailAddressShredder(BaseDataShredder):
|
|||||||
le.save(update_fields=['data', 'shredded'])
|
le.save(update_fields=['data', 'shredded'])
|
||||||
else:
|
else:
|
||||||
shred_log_fields(le, banlist=[
|
shred_log_fields(le, banlist=[
|
||||||
'recipient', 'message', 'subject', 'full_mail', 'old_email', 'new_email', 'bcc', 'cc',
|
'recipient', 'message', 'subject', 'full_mail', 'old_email', 'new_email'
|
||||||
])
|
])
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -95,7 +95,6 @@ class OrganizerSlugBanlistValidator(BanlistValidator):
|
|||||||
'csp_report',
|
'csp_report',
|
||||||
'widget',
|
'widget',
|
||||||
'lead',
|
'lead',
|
||||||
'scheduling',
|
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,6 @@
|
|||||||
# <https://www.gnu.org/licenses/>.
|
# <https://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
import pycountry
|
import pycountry
|
||||||
from django.conf import settings
|
|
||||||
from django.http import JsonResponse
|
from django.http import JsonResponse
|
||||||
from django.shortcuts import get_object_or_404
|
from django.shortcuts import get_object_or_404
|
||||||
from django.utils.translation import gettext, pgettext, pgettext_lazy
|
from django.utils.translation import gettext, pgettext, pgettext_lazy
|
||||||
@@ -30,7 +29,6 @@ from django_scopes import scope
|
|||||||
from pretix.base.addressvalidation import (
|
from pretix.base.addressvalidation import (
|
||||||
COUNTRIES_WITH_STREET_ZIPCODE_AND_CITY_REQUIRED,
|
COUNTRIES_WITH_STREET_ZIPCODE_AND_CITY_REQUIRED,
|
||||||
)
|
)
|
||||||
from pretix.base.i18n import language
|
|
||||||
from pretix.base.invoicing.transmission import get_transmission_types
|
from pretix.base.invoicing.transmission import get_transmission_types
|
||||||
from pretix.base.models import Organizer
|
from pretix.base.models import Organizer
|
||||||
from pretix.base.models.tax import VAT_ID_COUNTRIES
|
from pretix.base.models.tax import VAT_ID_COUNTRIES
|
||||||
@@ -91,7 +89,7 @@ def _info(cc):
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def _address_form(request):
|
def address_form(request):
|
||||||
cc = request.GET.get("country", "DE")
|
cc = request.GET.get("country", "DE")
|
||||||
info = _info(cc)
|
info = _info(cc)
|
||||||
|
|
||||||
@@ -159,15 +157,4 @@ def _address_form(request):
|
|||||||
# The help text explains that it is optional, so we want to hide that if it is required
|
# The help text explains that it is optional, so we want to hide that if it is required
|
||||||
info["vat_id"]["helptext_visible"] = False
|
info["vat_id"]["helptext_visible"] = False
|
||||||
|
|
||||||
return info
|
|
||||||
|
|
||||||
|
|
||||||
def address_form(request):
|
|
||||||
locale = request.GET.get('locale')
|
|
||||||
if locale in dict(settings.LANGUAGES):
|
|
||||||
with language(locale):
|
|
||||||
info = _address_form(request)
|
|
||||||
else:
|
|
||||||
info = _address_form(request)
|
|
||||||
|
|
||||||
return JsonResponse(info)
|
return JsonResponse(info)
|
||||||
|
|||||||
@@ -2820,8 +2820,8 @@ class DeviceFilterForm(FilterForm):
|
|||||||
|
|
||||||
class OutgoingMailFilterForm(FilterForm):
|
class OutgoingMailFilterForm(FilterForm):
|
||||||
orders = {
|
orders = {
|
||||||
'date': 'created',
|
'date': 'd',
|
||||||
'-date': '-created',
|
'-date': '-d',
|
||||||
}
|
}
|
||||||
query = forms.CharField(
|
query = forms.CharField(
|
||||||
label=_('Search email address or subject'),
|
label=_('Search email address or subject'),
|
||||||
|
|||||||
@@ -635,16 +635,6 @@ class MailSettingsForm(SettingsForm):
|
|||||||
required=False,
|
required=False,
|
||||||
widget=I18nMarkdownTextarea,
|
widget=I18nMarkdownTextarea,
|
||||||
)
|
)
|
||||||
mail_subject_customer_security_notice = I18nFormField(
|
|
||||||
label=_("Subject"),
|
|
||||||
required=False,
|
|
||||||
widget=I18nTextInput,
|
|
||||||
)
|
|
||||||
mail_text_customer_security_notice = I18nFormField(
|
|
||||||
label=_("Text"),
|
|
||||||
required=False,
|
|
||||||
widget=I18nMarkdownTextarea,
|
|
||||||
)
|
|
||||||
|
|
||||||
base_context = {
|
base_context = {
|
||||||
'mail_text_customer_registration': ['customer', 'url'],
|
'mail_text_customer_registration': ['customer', 'url'],
|
||||||
@@ -653,8 +643,6 @@ class MailSettingsForm(SettingsForm):
|
|||||||
'mail_subject_customer_email_change': ['customer', 'url'],
|
'mail_subject_customer_email_change': ['customer', 'url'],
|
||||||
'mail_text_customer_reset': ['customer', 'url'],
|
'mail_text_customer_reset': ['customer', 'url'],
|
||||||
'mail_subject_customer_reset': ['customer', 'url'],
|
'mail_subject_customer_reset': ['customer', 'url'],
|
||||||
'mail_text_customer_security_notice': ['customer', 'url', 'message'],
|
|
||||||
'mail_subject_customer_security_notice': ['customer', 'url', 'message'],
|
|
||||||
}
|
}
|
||||||
|
|
||||||
def _get_sample_context(self, base_parameters):
|
def _get_sample_context(self, base_parameters):
|
||||||
@@ -668,9 +656,6 @@ class MailSettingsForm(SettingsForm):
|
|||||||
'presale:organizer.customer.activate'
|
'presale:organizer.customer.activate'
|
||||||
) + '?token=' + get_random_string(30)
|
) + '?token=' + get_random_string(30)
|
||||||
|
|
||||||
if 'message' in base_parameters:
|
|
||||||
placeholders['message'] = _('Your password has been changed.')
|
|
||||||
|
|
||||||
if 'customer' in base_parameters:
|
if 'customer' in base_parameters:
|
||||||
placeholders['name'] = pgettext_lazy('person_name_sample', 'John Doe')
|
placeholders['name'] = pgettext_lazy('person_name_sample', 'John Doe')
|
||||||
name_scheme = PERSON_NAME_SCHEMES[self.organizer.settings.name_scheme]
|
name_scheme = PERSON_NAME_SCHEMES[self.organizer.settings.name_scheme]
|
||||||
|
|||||||
@@ -801,8 +801,6 @@ class CoreUserImpersonatedLogEntryType(UserImpersonatedLogEntryType):
|
|||||||
'pretix.giftcards.created': _('The gift card has been created.'),
|
'pretix.giftcards.created': _('The gift card has been created.'),
|
||||||
'pretix.giftcards.modified': _('The gift card has been changed.'),
|
'pretix.giftcards.modified': _('The gift card has been changed.'),
|
||||||
'pretix.giftcards.transaction.manual': _('A manual transaction has been performed.'),
|
'pretix.giftcards.transaction.manual': _('A manual transaction has been performed.'),
|
||||||
'pretix.giftcards.transaction.payment': _('A payment has been performed.'),
|
|
||||||
'pretix.giftcards.transaction.refund': _('A refund has been performed. '),
|
|
||||||
'pretix.team.token.created': _('The token "{name}" has been created.'),
|
'pretix.team.token.created': _('The token "{name}" has been created.'),
|
||||||
'pretix.team.token.deleted': _('The token "{name}" has been revoked.'),
|
'pretix.team.token.deleted': _('The token "{name}" has been revoked.'),
|
||||||
'pretix.event.checkin.reset': _('The check-in and print log state has been reset.')
|
'pretix.event.checkin.reset': _('The check-in and print log state has been reset.')
|
||||||
|
|||||||
@@ -24,9 +24,7 @@
|
|||||||
{% if log.display %}
|
{% if log.display %}
|
||||||
<br/><span class="fa fa-fw fa-comment-o"></span> {{ log.display }}
|
<br/><span class="fa fa-fw fa-comment-o"></span> {{ log.display }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if log.parsed_data.to %}
|
{% if log.parsed_data.recipient %}
|
||||||
<br/><span class="fa fa-fw fa-envelope-o"></span> {{ log.parsed_data.to|join:", " }}
|
|
||||||
{% elif log.parsed_data.recipient %} {# legacy #}
|
|
||||||
<br/><span class="fa fa-fw fa-envelope-o"></span> {{ log.parsed_data.recipient }}
|
<br/><span class="fa fa-fw fa-envelope-o"></span> {{ log.parsed_data.recipient }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</p>
|
</p>
|
||||||
|
|||||||
@@ -65,9 +65,6 @@
|
|||||||
|
|
||||||
{% blocktrans asvar title_reset %}Customer account password reset{% endblocktrans %}
|
{% blocktrans asvar title_reset %}Customer account password reset{% endblocktrans %}
|
||||||
{% include "pretixcontrol/event/mail_settings_fragment.html" with pid="reset" title=title_reset items="mail_subject_customer_reset,mail_text_customer_reset" %}
|
{% include "pretixcontrol/event/mail_settings_fragment.html" with pid="reset" title=title_reset items="mail_subject_customer_reset,mail_text_customer_reset" %}
|
||||||
|
|
||||||
{% blocktrans asvar title_security_notice %}Customer account security notification{% endblocktrans %}
|
|
||||||
{% include "pretixcontrol/event/mail_settings_fragment.html" with pid="security_notice" title=title_security_notice items="mail_subject_customer_security_notice,mail_text_customer_security_notice" %}
|
|
||||||
</div>
|
</div>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
|
|
||||||
<dl class="dl-horizontal">
|
<dl class="dl-horizontal">
|
||||||
<dt>{% trans "From" context "email" %}</dt>
|
<dt>{% trans "From" context "email" %}</dt>
|
||||||
<dd>{{ sender }}</dd>
|
<dd>{{ mail.sender }}</dd>
|
||||||
<dt>{% trans "To" context "email" %}</dt>
|
<dt>{% trans "To" context "email" %}</dt>
|
||||||
<dd>{{ mail.to|join:", " }}</dd>
|
<dd>{{ mail.to|join:", " }}</dd>
|
||||||
{% if mail.cc %}
|
{% if mail.cc %}
|
||||||
|
|||||||
@@ -21,8 +21,6 @@
|
|||||||
#
|
#
|
||||||
import base64
|
import base64
|
||||||
import logging
|
import logging
|
||||||
from email.header import decode_header, make_header
|
|
||||||
from email.utils import parseaddr
|
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
@@ -126,12 +124,6 @@ class OutgoingMailDetailView(OrganizerDetailViewMixin, OrganizerPermissionRequir
|
|||||||
ctx = super().get_context_data(**kwargs)
|
ctx = super().get_context_data(**kwargs)
|
||||||
if self.object.body_html:
|
if self.object.body_html:
|
||||||
ctx['data_url'] = "data:text/html;charset=utf-8;base64," + base64.b64encode(self.object.body_html.encode()).decode()
|
ctx['data_url'] = "data:text/html;charset=utf-8;base64," + base64.b64encode(self.object.body_html.encode()).decode()
|
||||||
|
|
||||||
from_name, from_email = parseaddr(self.object.sender)
|
|
||||||
if from_name:
|
|
||||||
from_name = make_header(decode_header(from_name))
|
|
||||||
ctx['sender'] = "{} <{}>".format(from_name, from_email) if from_name else from_email
|
|
||||||
|
|
||||||
return ctx
|
return ctx
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1226,11 +1226,7 @@ class OrderRefundView(OrderView):
|
|||||||
customer=order.customer,
|
customer=order.customer,
|
||||||
testmode=order.testmode
|
testmode=order.testmode
|
||||||
)
|
)
|
||||||
giftcard.log_action(
|
giftcard.log_action('pretix.giftcards.created', user=self.request.user, data={})
|
||||||
action='pretix.giftcards.created',
|
|
||||||
user=self.request.user,
|
|
||||||
data={}
|
|
||||||
)
|
|
||||||
refunds.append(OrderRefund(
|
refunds.append(OrderRefund(
|
||||||
order=order,
|
order=order,
|
||||||
payment=None,
|
payment=None,
|
||||||
@@ -2413,9 +2409,9 @@ class OrderSendMail(EventPermissionRequiredMixin, OrderViewMixin, FormView):
|
|||||||
with language(order.locale, self.request.event.settings.region):
|
with language(order.locale, self.request.event.settings.region):
|
||||||
email_context = get_email_context(event=order.event, order=order)
|
email_context = get_email_context(event=order.event, order=order)
|
||||||
email_template = LazyI18nString(form.cleaned_data['message'])
|
email_template = LazyI18nString(form.cleaned_data['message'])
|
||||||
|
email_subject = format_map(str(form.cleaned_data['subject']), email_context)
|
||||||
|
email_content = render_mail(email_template, email_context)
|
||||||
if self.request.POST.get('action') == 'preview':
|
if self.request.POST.get('action') == 'preview':
|
||||||
email_subject = format_map(str(form.cleaned_data['subject']), email_context)
|
|
||||||
email_content = render_mail(email_template, email_context)
|
|
||||||
self.preview_output = {
|
self.preview_output = {
|
||||||
'subject': mark_safe(_('Subject: {subject}').format(
|
'subject': mark_safe(_('Subject: {subject}').format(
|
||||||
subject=prefix_subject(order.event, escape(email_subject), highlight=True)
|
subject=prefix_subject(order.event, escape(email_subject), highlight=True)
|
||||||
@@ -2477,9 +2473,9 @@ class OrderPositionSendMail(OrderSendMail):
|
|||||||
with language(position.order.locale, self.request.event.settings.region):
|
with language(position.order.locale, self.request.event.settings.region):
|
||||||
email_context = get_email_context(event=position.order.event, order=position.order, position=position)
|
email_context = get_email_context(event=position.order.event, order=position.order, position=position)
|
||||||
email_template = LazyI18nString(form.cleaned_data['message'])
|
email_template = LazyI18nString(form.cleaned_data['message'])
|
||||||
|
email_subject = format_map(str(form.cleaned_data['subject']), email_context)
|
||||||
|
email_content = render_mail(email_template, email_context)
|
||||||
if self.request.POST.get('action') == 'preview':
|
if self.request.POST.get('action') == 'preview':
|
||||||
email_subject = format_map(str(form.cleaned_data['subject']), email_context)
|
|
||||||
email_content = render_mail(email_template, email_context)
|
|
||||||
self.preview_output = {
|
self.preview_output = {
|
||||||
'subject': mark_safe(_('Subject: {subject}').format(
|
'subject': mark_safe(_('Subject: {subject}').format(
|
||||||
subject=prefix_subject(position.order.event, escape(email_subject), highlight=True))
|
subject=prefix_subject(position.order.event, escape(email_subject), highlight=True))
|
||||||
|
|||||||
@@ -1667,12 +1667,9 @@ class GiftCardAcceptanceInviteView(OrganizerDetailViewMixin, OrganizerPermission
|
|||||||
active=False,
|
active=False,
|
||||||
)
|
)
|
||||||
self.request.organizer.log_action(
|
self.request.organizer.log_action(
|
||||||
action='pretix.giftcards.acceptance.acceptor.invited',
|
'pretix.giftcards.acceptance.acceptor.invited',
|
||||||
data={
|
data={'acceptor': form.cleaned_data['acceptor'].slug,
|
||||||
'acceptor': form.cleaned_data['acceptor'].slug,
|
'reusable_media': form.cleaned_data['reusable_media']},
|
||||||
'issuer': self.request.organizer.slug,
|
|
||||||
'reusable_media': form.cleaned_data['reusable_media']
|
|
||||||
},
|
|
||||||
user=self.request.user
|
user=self.request.user
|
||||||
)
|
)
|
||||||
messages.success(self.request, _('The selected organizer has been invited.'))
|
messages.success(self.request, _('The selected organizer has been invited.'))
|
||||||
@@ -1708,11 +1705,8 @@ class GiftCardAcceptanceListView(OrganizerDetailViewMixin, OrganizerPermissionRe
|
|||||||
).delete()
|
).delete()
|
||||||
if done:
|
if done:
|
||||||
self.request.organizer.log_action(
|
self.request.organizer.log_action(
|
||||||
action='pretix.giftcards.acceptance.acceptor.removed',
|
'pretix.giftcards.acceptance.acceptor.removed',
|
||||||
data={
|
data={'acceptor': request.POST.get("delete_acceptor")},
|
||||||
'acceptor': request.POST.get("delete_acceptor"),
|
|
||||||
'issuer': self.request.organizer.slug
|
|
||||||
},
|
|
||||||
user=request.user
|
user=request.user
|
||||||
)
|
)
|
||||||
messages.success(self.request, _('The selected connection has been removed.'))
|
messages.success(self.request, _('The selected connection has been removed.'))
|
||||||
@@ -1722,11 +1716,8 @@ class GiftCardAcceptanceListView(OrganizerDetailViewMixin, OrganizerPermissionRe
|
|||||||
).delete()
|
).delete()
|
||||||
if done:
|
if done:
|
||||||
self.request.organizer.log_action(
|
self.request.organizer.log_action(
|
||||||
action='pretix.giftcards.acceptance.issuer.removed',
|
'pretix.giftcards.acceptance.issuer.removed',
|
||||||
data={
|
data={'issuer': request.POST.get("delete_acceptor")},
|
||||||
'issuer': request.POST.get("delete_acceptor"),
|
|
||||||
'acceptor': self.request.organizer.slug
|
|
||||||
},
|
|
||||||
user=request.user
|
user=request.user
|
||||||
)
|
)
|
||||||
messages.success(self.request, _('The selected connection has been removed.'))
|
messages.success(self.request, _('The selected connection has been removed.'))
|
||||||
@@ -1736,11 +1727,8 @@ class GiftCardAcceptanceListView(OrganizerDetailViewMixin, OrganizerPermissionRe
|
|||||||
).update(active=True)
|
).update(active=True)
|
||||||
if done:
|
if done:
|
||||||
self.request.organizer.log_action(
|
self.request.organizer.log_action(
|
||||||
action='pretix.giftcards.acceptance.issuer.accepted',
|
'pretix.giftcards.acceptance.issuer.accepted',
|
||||||
data={
|
data={'issuer': request.POST.get("accept_issuer")},
|
||||||
'issuer': request.POST.get("accept_issuer"),
|
|
||||||
'acceptor': self.request.organizer.slug
|
|
||||||
},
|
|
||||||
user=request.user
|
user=request.user
|
||||||
)
|
)
|
||||||
messages.success(self.request, _('The selected connection has been accepted.'))
|
messages.success(self.request, _('The selected connection has been accepted.'))
|
||||||
@@ -1846,11 +1834,10 @@ class GiftCardDetailView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMi
|
|||||||
acceptor=request.organizer,
|
acceptor=request.organizer,
|
||||||
)
|
)
|
||||||
self.object.log_action(
|
self.object.log_action(
|
||||||
action='pretix.giftcards.transaction.manual',
|
'pretix.giftcards.transaction.manual',
|
||||||
data={
|
data={
|
||||||
'value': value,
|
'value': value,
|
||||||
'text': request.POST.get('text'),
|
'text': request.POST.get('text')
|
||||||
'acceptor_id': self.request.organizer.id
|
|
||||||
},
|
},
|
||||||
user=self.request.user,
|
user=self.request.user,
|
||||||
)
|
)
|
||||||
@@ -1899,23 +1886,15 @@ class GiftCardCreateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMi
|
|||||||
messages.success(self.request, _('The gift card has been created and can now be used.'))
|
messages.success(self.request, _('The gift card has been created and can now be used.'))
|
||||||
form.instance.issuer = self.request.organizer
|
form.instance.issuer = self.request.organizer
|
||||||
super().form_valid(form)
|
super().form_valid(form)
|
||||||
form.instance.log_action(
|
form.instance.transactions.create(
|
||||||
action='pretix.giftcards.created',
|
acceptor=self.request.organizer,
|
||||||
user=self.request.user,
|
value=form.cleaned_data['value']
|
||||||
)
|
)
|
||||||
|
form.instance.log_action('pretix.giftcards.created', user=self.request.user, data={})
|
||||||
if form.cleaned_data['value']:
|
if form.cleaned_data['value']:
|
||||||
form.instance.transactions.create(
|
form.instance.log_action('pretix.giftcards.transaction.manual', user=self.request.user, data={
|
||||||
acceptor=self.request.organizer,
|
'value': form.cleaned_data['value']
|
||||||
value=form.cleaned_data['value']
|
})
|
||||||
)
|
|
||||||
form.instance.log_action(
|
|
||||||
action='pretix.giftcards.transaction.manual',
|
|
||||||
user=self.request.user,
|
|
||||||
data={
|
|
||||||
'value': form.cleaned_data['value'],
|
|
||||||
'acceptor_id': self.request.organizer.id
|
|
||||||
}
|
|
||||||
)
|
|
||||||
return redirect(reverse(
|
return redirect(reverse(
|
||||||
'control:organizer.giftcard',
|
'control:organizer.giftcard',
|
||||||
kwargs={
|
kwargs={
|
||||||
@@ -1943,11 +1922,7 @@ class GiftCardUpdateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMi
|
|||||||
def form_valid(self, form):
|
def form_valid(self, form):
|
||||||
messages.success(self.request, _('The gift card has been changed.'))
|
messages.success(self.request, _('The gift card has been changed.'))
|
||||||
super().form_valid(form)
|
super().form_valid(form)
|
||||||
form.instance.log_action(
|
form.instance.log_action('pretix.giftcards.modified', user=self.request.user, data=dict(form.cleaned_data))
|
||||||
action='pretix.giftcards.modified',
|
|
||||||
user=self.request.user,
|
|
||||||
data=dict(form.cleaned_data)
|
|
||||||
)
|
|
||||||
return redirect(reverse(
|
return redirect(reverse(
|
||||||
'control:organizer.giftcard',
|
'control:organizer.giftcard',
|
||||||
kwargs={
|
kwargs={
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
import logging
|
import logging
|
||||||
from string import Formatter
|
from string import Formatter
|
||||||
|
|
||||||
from django.core.exceptions import SuspiciousOperation
|
|
||||||
from django.utils.html import conditional_escape
|
from django.utils.html import conditional_escape
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
@@ -38,17 +37,6 @@ class PlainHtmlAlternativeString:
|
|||||||
return f"PlainHtmlAlternativeString('{self.plain}', '{self.html}')"
|
return f"PlainHtmlAlternativeString('{self.plain}', '{self.html}')"
|
||||||
|
|
||||||
|
|
||||||
class FormattedString(str):
|
|
||||||
"""
|
|
||||||
A str subclass that has been specifically marked as "already formatted" for email rendering
|
|
||||||
purposes to avoid duplicate formatting.
|
|
||||||
"""
|
|
||||||
__slots__ = ()
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return self
|
|
||||||
|
|
||||||
|
|
||||||
class SafeFormatter(Formatter):
|
class SafeFormatter(Formatter):
|
||||||
"""
|
"""
|
||||||
Customized version of ``str.format`` that (a) behaves just like ``str.format_map`` and
|
Customized version of ``str.format`` that (a) behaves just like ``str.format_map`` and
|
||||||
@@ -89,19 +77,8 @@ class SafeFormatter(Formatter):
|
|||||||
# Ignore format_spec
|
# Ignore format_spec
|
||||||
return super().format_field(self._prepare_value(value), '')
|
return super().format_field(self._prepare_value(value), '')
|
||||||
|
|
||||||
def convert_field(self, value, conversion):
|
|
||||||
# Ignore any conversions
|
|
||||||
if conversion is None:
|
|
||||||
return value
|
|
||||||
else:
|
|
||||||
return str(value)
|
|
||||||
|
|
||||||
|
def format_map(template, context, raise_on_missing=False, mode=SafeFormatter.MODE_RICH_TO_PLAIN, linkifier=None):
|
||||||
def format_map(template, context, raise_on_missing=False, mode=SafeFormatter.MODE_RICH_TO_PLAIN, linkifier=None) -> FormattedString:
|
|
||||||
if isinstance(template, FormattedString):
|
|
||||||
raise SuspiciousOperation("Calling format_map() on an already formatted string is likely unsafe.")
|
|
||||||
if not isinstance(template, str):
|
if not isinstance(template, str):
|
||||||
template = str(template)
|
template = str(template)
|
||||||
return FormattedString(
|
return SafeFormatter(context, raise_on_missing, mode=mode, linkifier=linkifier).format(template)
|
||||||
SafeFormatter(context, raise_on_missing, mode=mode, linkifier=linkifier).format(template)
|
|
||||||
)
|
|
||||||
|
|||||||
@@ -4,16 +4,16 @@ msgstr ""
|
|||||||
"Project-Id-Version: 1\n"
|
"Project-Id-Version: 1\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2026-01-26 13:19+0000\n"
|
"POT-Creation-Date: 2026-01-26 13:19+0000\n"
|
||||||
"PO-Revision-Date: 2026-02-03 17:12+0000\n"
|
"PO-Revision-Date: 2025-08-27 22:00+0000\n"
|
||||||
"Last-Translator: Mie Frydensbjerg <mif@aarhus.dk>\n"
|
"Last-Translator: Mie Frydensbjerg <mif@aarhus.dk>\n"
|
||||||
"Language-Team: Danish <https://translate.pretix.eu/projects/pretix/pretix/"
|
"Language-Team: Danish <https://translate.pretix.eu/projects/pretix/pretix/da/"
|
||||||
"da/>\n"
|
">\n"
|
||||||
"Language: da\n"
|
"Language: da\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||||
"X-Generator: Weblate 5.15.2\n"
|
"X-Generator: Weblate 5.13\n"
|
||||||
|
|
||||||
#: pretix/_base_settings.py:87
|
#: pretix/_base_settings.py:87
|
||||||
msgid "English"
|
msgid "English"
|
||||||
@@ -35175,31 +35175,30 @@ msgid "Yes, request cancellation"
|
|||||||
msgstr "Generér afbestilling"
|
msgstr "Generér afbestilling"
|
||||||
|
|
||||||
#: pretix/presale/templates/pretixpresale/event/order_change_confirm.html:19
|
#: pretix/presale/templates/pretixpresale/event/order_change_confirm.html:19
|
||||||
|
#, fuzzy
|
||||||
msgid "Please confirm the following changes to your order."
|
msgid "Please confirm the following changes to your order."
|
||||||
msgstr "Bekræft venligst følgende ændringer i din ordre."
|
msgstr "Kontroller venligst detaljerne nedenfor og bekræft din bestilling."
|
||||||
|
|
||||||
#: pretix/presale/templates/pretixpresale/event/order_giftcard.html:10
|
#: pretix/presale/templates/pretixpresale/event/order_giftcard.html:10
|
||||||
#: pretix/presale/templates/pretixpresale/event/position_giftcard.html:10
|
#: pretix/presale/templates/pretixpresale/event/position_giftcard.html:10
|
||||||
#, python-format
|
#, fuzzy, python-format
|
||||||
msgid "Gift card: %(code)s"
|
msgid "Gift card: %(code)s"
|
||||||
msgstr "Gavekort: %(code)s"
|
msgstr "Gavekort"
|
||||||
|
|
||||||
#: pretix/presale/templates/pretixpresale/event/order_modify.html:5
|
#: pretix/presale/templates/pretixpresale/event/order_modify.html:5
|
||||||
msgid "Modify order"
|
msgid "Modify order"
|
||||||
msgstr "Redigér ordre"
|
msgstr "Rediger bestilling"
|
||||||
|
|
||||||
#: pretix/presale/templates/pretixpresale/event/order_modify.html:8
|
#: pretix/presale/templates/pretixpresale/event/order_modify.html:8
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Modify order: %(code)s"
|
msgid "Modify order: %(code)s"
|
||||||
msgstr "Rediger ordre: %(code)s"
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/presale/templates/pretixpresale/event/order_modify.html:18
|
#: pretix/presale/templates/pretixpresale/event/order_modify.html:18
|
||||||
msgid ""
|
msgid ""
|
||||||
"Modifying your invoice address will not automatically generate a new "
|
"Modifying your invoice address will not automatically generate a new "
|
||||||
"invoice. Please contact us if you need a new invoice."
|
"invoice. Please contact us if you need a new invoice."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Ændring af din fakturaadresse vil ikke automatisk generere en ny faktura. "
|
|
||||||
"Kontakt os venligst, hvis du har brug for en ny faktura."
|
|
||||||
|
|
||||||
#: pretix/presale/templates/pretixpresale/event/order_modify.html:88
|
#: pretix/presale/templates/pretixpresale/event/order_modify.html:88
|
||||||
#: pretix/presale/templates/pretixpresale/event/position_modify.html:49
|
#: pretix/presale/templates/pretixpresale/event/position_modify.html:49
|
||||||
@@ -35211,22 +35210,19 @@ msgid "Change payment method"
|
|||||||
msgstr "Skift betalingsmetode"
|
msgstr "Skift betalingsmetode"
|
||||||
|
|
||||||
#: pretix/presale/templates/pretixpresale/event/order_pay_change.html:13
|
#: pretix/presale/templates/pretixpresale/event/order_pay_change.html:13
|
||||||
#, python-format
|
#, fuzzy, python-format
|
||||||
msgid "Choose payment method: %(code)s"
|
msgid "Choose payment method: %(code)s"
|
||||||
msgstr "Vælg betalingsmetode: %(code)s"
|
msgstr "Skift betalingsmetode: %(code)s"
|
||||||
|
|
||||||
#: pretix/presale/templates/pretixpresale/event/order_pay_change.html:19
|
#: pretix/presale/templates/pretixpresale/event/order_pay_change.html:19
|
||||||
msgid ""
|
msgid ""
|
||||||
"Please note: If you change your payment method, your order total will change "
|
"Please note: If you change your payment method, your order total will change "
|
||||||
"by the amount displayed to the right of each method."
|
"by the amount displayed to the right of each method."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Bemærk: Hvis du ændrer din betalingsmetode, ændres din ordres samlede beløb "
|
|
||||||
"med det beløb, der vises til højre for hver metode."
|
|
||||||
|
|
||||||
#: pretix/presale/templates/pretixpresale/event/order_pay_change.html:61
|
#: pretix/presale/templates/pretixpresale/event/order_pay_change.html:61
|
||||||
msgid "There are no alternative payment providers available for this order."
|
msgid "There are no alternative payment providers available for this order."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Der er ingen alternative betalingsudbydere tilgængelige for denne ordre."
|
|
||||||
|
|
||||||
#: pretix/presale/templates/pretixpresale/event/order_pay_confirm.html:16
|
#: pretix/presale/templates/pretixpresale/event/order_pay_confirm.html:16
|
||||||
msgid "Please confirm the following payment details."
|
msgid "Please confirm the following payment details."
|
||||||
@@ -35235,7 +35231,7 @@ msgstr "Bekræft venligst følgende betalingsoplysninger."
|
|||||||
#: pretix/presale/templates/pretixpresale/event/order_pay_confirm.html:22
|
#: pretix/presale/templates/pretixpresale/event/order_pay_confirm.html:22
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Total: %(total)s"
|
msgid "Total: %(total)s"
|
||||||
msgstr "Total: %(total)s"
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/presale/templates/pretixpresale/event/payment_qr_codes.html:17
|
#: pretix/presale/templates/pretixpresale/event/payment_qr_codes.html:17
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -35274,9 +35270,10 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/presale/templates/pretixpresale/event/position.html:63
|
#: pretix/presale/templates/pretixpresale/event/position.html:63
|
||||||
|
#, fuzzy
|
||||||
msgctxt "action"
|
msgctxt "action"
|
||||||
msgid "Change your ticket"
|
msgid "Change your ticket"
|
||||||
msgstr "Ændr din billet"
|
msgstr "Ændr pris til"
|
||||||
|
|
||||||
#: pretix/presale/templates/pretixpresale/event/position.html:68
|
#: pretix/presale/templates/pretixpresale/event/position.html:68
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -35359,36 +35356,30 @@ msgstr "Aktiver betalingsmetode"
|
|||||||
#: pretix/presale/templates/pretixpresale/event/voucher.html:36
|
#: pretix/presale/templates/pretixpresale/event/voucher.html:36
|
||||||
#: pretix/presale/templates/pretixpresale/event/voucher_form.html:9
|
#: pretix/presale/templates/pretixpresale/event/voucher_form.html:9
|
||||||
msgid "Voucher redemption"
|
msgid "Voucher redemption"
|
||||||
msgstr "Indløsning af rabatkode"
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/presale/templates/pretixpresale/event/voucher.html:20
|
#: pretix/presale/templates/pretixpresale/event/voucher.html:20
|
||||||
|
#, fuzzy
|
||||||
msgid "This voucher is valid only for the following specific date and time."
|
msgid "This voucher is valid only for the following specific date and time."
|
||||||
msgstr "Rabatkoden er ikke gyldig for denne dato."
|
msgstr "Voucheren er ikke gyldig for denne dato."
|
||||||
|
|
||||||
#: pretix/presale/templates/pretixpresale/event/voucher.html:43
|
#: pretix/presale/templates/pretixpresale/event/voucher.html:43
|
||||||
msgid ""
|
msgid ""
|
||||||
"For the selected date, there are currently no products available that can be "
|
"For the selected date, there are currently no products available that can be "
|
||||||
"bought with this voucher. Please try a different date or a different voucher."
|
"bought with this voucher. Please try a different date or a different voucher."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Der er i øjeblikket ingen produkter tilgængelige for den valgte dato, som "
|
|
||||||
"kan købes med denne rabatkode. Prøv venligst en anden dato eller en anden "
|
|
||||||
"rabatkode."
|
|
||||||
|
|
||||||
#: pretix/presale/templates/pretixpresale/event/voucher.html:47
|
#: pretix/presale/templates/pretixpresale/event/voucher.html:47
|
||||||
msgid ""
|
msgid ""
|
||||||
"There are currently no products available that can be bought with this "
|
"There are currently no products available that can be bought with this "
|
||||||
"voucher."
|
"voucher."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Der er i øjeblikket ingen produkter tilgængelige, der kan købes med denne "
|
|
||||||
"rabatkode."
|
|
||||||
|
|
||||||
#: pretix/presale/templates/pretixpresale/event/voucher.html:52
|
#: pretix/presale/templates/pretixpresale/event/voucher.html:52
|
||||||
msgid ""
|
msgid ""
|
||||||
"You entered a voucher code that allows you to buy one of the following "
|
"You entered a voucher code that allows you to buy one of the following "
|
||||||
"products at the specified price:"
|
"products at the specified price:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Du har indtastet en rabatkode, der giver dig mulighed for at købe et af "
|
|
||||||
"følgende produkter til den angivne pris:"
|
|
||||||
|
|
||||||
#: pretix/presale/templates/pretixpresale/event/voucher.html:112
|
#: pretix/presale/templates/pretixpresale/event/voucher.html:112
|
||||||
#, python-format
|
#, python-format
|
||||||
|
|||||||
@@ -3,16 +3,16 @@ msgstr ""
|
|||||||
"Project-Id-Version: HE PRETIX\n"
|
"Project-Id-Version: HE PRETIX\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2026-01-26 13:19+0000\n"
|
"POT-Creation-Date: 2026-01-26 13:19+0000\n"
|
||||||
"PO-Revision-Date: 2026-02-09 21:00+0000\n"
|
"PO-Revision-Date: 2025-05-21 10:46+0000\n"
|
||||||
"Last-Translator: roi belotsercovsky <rbelotsercovsky@gmail.com>\n"
|
"Last-Translator: Raphael Michel <michel@rami.io>\n"
|
||||||
"Language-Team: Hebrew <https://translate.pretix.eu/projects/pretix/pretix/"
|
"Language-Team: Hebrew <https://translate.pretix.eu/projects/pretix/pretix/he/"
|
||||||
"he/>\n"
|
">\n"
|
||||||
"Language: he\n"
|
"Language: he\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
"X-Generator: Weblate 5.15.2\n"
|
"X-Generator: Weblate 5.11.4\n"
|
||||||
|
|
||||||
#: pretix/_base_settings.py:87
|
#: pretix/_base_settings.py:87
|
||||||
msgid "English"
|
msgid "English"
|
||||||
@@ -84,7 +84,7 @@ msgstr "יוונית"
|
|||||||
|
|
||||||
#: pretix/_base_settings.py:104
|
#: pretix/_base_settings.py:104
|
||||||
msgid "Hebrew"
|
msgid "Hebrew"
|
||||||
msgstr "עברית"
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/_base_settings.py:105
|
#: pretix/_base_settings.py:105
|
||||||
msgid "Indonesian"
|
msgid "Indonesian"
|
||||||
@@ -140,7 +140,7 @@ msgstr "ספרדית"
|
|||||||
|
|
||||||
#: pretix/_base_settings.py:118
|
#: pretix/_base_settings.py:118
|
||||||
msgid "Spanish (Latin America)"
|
msgid "Spanish (Latin America)"
|
||||||
msgstr "ספרדית (אמריקה הלטינית)"
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/_base_settings.py:119
|
#: pretix/_base_settings.py:119
|
||||||
msgid "Turkish"
|
msgid "Turkish"
|
||||||
@@ -285,20 +285,28 @@ msgid "The bundled item must not have bundles on its own."
|
|||||||
msgstr "הפריט המצורף לא יכול להחזיק חבילות בעצמו."
|
msgstr "הפריט המצורף לא יכול להחזיק חבילות בעצמו."
|
||||||
|
|
||||||
#: pretix/api/serializers/item.py:235
|
#: pretix/api/serializers/item.py:235
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "The payment is too late to be accepted."
|
||||||
msgid "The program start must not be empty."
|
msgid "The program start must not be empty."
|
||||||
msgstr "תחילת התוכנית לא יכולה להיות ריקה."
|
msgstr "התשלום התקבל מאוחר מדי."
|
||||||
|
|
||||||
#: pretix/api/serializers/item.py:239
|
#: pretix/api/serializers/item.py:239
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "The payment is too late to be accepted."
|
||||||
msgid "The program end must not be empty."
|
msgid "The program end must not be empty."
|
||||||
msgstr "סוף התוכנית לא יכול להיות ריק."
|
msgstr "התשלום התקבל מאוחר מדי."
|
||||||
|
|
||||||
#: pretix/api/serializers/item.py:242 pretix/base/models/items.py:2322
|
#: pretix/api/serializers/item.py:242 pretix/base/models/items.py:2322
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "The maximum date must not be before the minimum value."
|
||||||
msgid "The program end must not be before the program start."
|
msgid "The program end must not be before the program start."
|
||||||
msgstr "סוף התוכנית לא יכול להיות לפני תחילת התוכנית."
|
msgstr "התאריך המרבי לא יכול להיות לפני הערך המינימלי."
|
||||||
|
|
||||||
#: pretix/api/serializers/item.py:247 pretix/base/models/items.py:2316
|
#: pretix/api/serializers/item.py:247 pretix/base/models/items.py:2316
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "You can not select a subevent if your event is not an event series."
|
||||||
msgid "You cannot use program times on an event series."
|
msgid "You cannot use program times on an event series."
|
||||||
msgstr "לא ניתן לבחור שעות תוכניות בסדרת אירועים."
|
msgstr "לא ניתן לבחור תת-אירוע אם האירוע שלך אינו סדרת אירועים."
|
||||||
|
|
||||||
#: pretix/api/serializers/item.py:337
|
#: pretix/api/serializers/item.py:337
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
@@ -561,15 +569,22 @@ msgid "Event series date deleted"
|
|||||||
msgstr "תאריך סדרת אירועים נמחק"
|
msgstr "תאריך סדרת אירועים נמחק"
|
||||||
|
|
||||||
#: pretix/api/webhooks.py:375
|
#: pretix/api/webhooks.py:375
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Product name"
|
||||||
msgid "Product changed"
|
msgid "Product changed"
|
||||||
msgstr "המוצר השתנה"
|
msgstr "שם המוצר"
|
||||||
|
|
||||||
#: pretix/api/webhooks.py:376
|
#: pretix/api/webhooks.py:376
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid ""
|
||||||
|
#| "Product changed (including product added or deleted and including changes "
|
||||||
|
#| "to nested objects like variations or bundles)"
|
||||||
msgid ""
|
msgid ""
|
||||||
"This includes product added or deleted and changes to nested objects like "
|
"This includes product added or deleted and changes to nested objects like "
|
||||||
"variations or bundles."
|
"variations or bundles."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"זה כולל מוצר שהוסף או נמחק ושונה לאובייקטים מקוננים כמו וריאציות או באנדלים"
|
"המוצר שונה (כולל הוספה או מחיקה של מוצר ושינויים לאובייקטים מקוננים כמו "
|
||||||
|
"וריאציות או חבילות)"
|
||||||
|
|
||||||
#: pretix/api/webhooks.py:381
|
#: pretix/api/webhooks.py:381
|
||||||
msgid "Shop taken live"
|
msgid "Shop taken live"
|
||||||
@@ -604,22 +619,28 @@ msgid "Waiting list entry received voucher"
|
|||||||
msgstr "רשומת רשימת המתנה קיבלה שובר"
|
msgstr "רשומת רשימת המתנה קיבלה שובר"
|
||||||
|
|
||||||
#: pretix/api/webhooks.py:413
|
#: pretix/api/webhooks.py:413
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Voucher code"
|
||||||
msgid "Voucher added"
|
msgid "Voucher added"
|
||||||
msgstr "קוד שובר הוסף"
|
msgstr "קוד שובר"
|
||||||
|
|
||||||
#: pretix/api/webhooks.py:417
|
#: pretix/api/webhooks.py:417
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Voucher assigned"
|
||||||
msgid "Voucher changed"
|
msgid "Voucher changed"
|
||||||
msgstr "שובר שונה"
|
msgstr "שובר הוקצה"
|
||||||
|
|
||||||
#: pretix/api/webhooks.py:418
|
#: pretix/api/webhooks.py:418
|
||||||
msgid ""
|
msgid ""
|
||||||
"Only includes explicit changes to the voucher, not e.g. an increase of the "
|
"Only includes explicit changes to the voucher, not e.g. an increase of the "
|
||||||
"number of redemptions."
|
"number of redemptions."
|
||||||
msgstr "כולל רק שינויים מפורשים לשובר, לא למשל העלאת מספר המימושים."
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/api/webhooks.py:422
|
#: pretix/api/webhooks.py:422
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Voucher redeemed"
|
||||||
msgid "Voucher deleted"
|
msgid "Voucher deleted"
|
||||||
msgstr "שובר נמחק"
|
msgstr "שובר מומש"
|
||||||
|
|
||||||
#: pretix/api/webhooks.py:426
|
#: pretix/api/webhooks.py:426
|
||||||
msgid "Customer account created"
|
msgid "Customer account created"
|
||||||
@@ -790,7 +811,7 @@ msgstr ""
|
|||||||
msgid ""
|
msgid ""
|
||||||
"Field \"{field_name}\" does not exist. Please check your {provider_name} "
|
"Field \"{field_name}\" does not exist. Please check your {provider_name} "
|
||||||
"settings."
|
"settings."
|
||||||
msgstr "שדה \"{field_name}\" לא קיים. נא לבדוק את הגדרות {provider_name}."
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/datasync/datasync.py:271
|
#: pretix/base/datasync/datasync.py:271
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
@@ -798,23 +819,25 @@ msgid ""
|
|||||||
"Field \"{field_name}\" requires {required_input}, but only got "
|
"Field \"{field_name}\" requires {required_input}, but only got "
|
||||||
"{available_inputs}. Please check your {provider_name} settings."
|
"{available_inputs}. Please check your {provider_name} settings."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"שדה \"{field_name}\" דורש {required_input}, אבל קיבל רק {available_inputs}"
|
|
||||||
". נא לבדוק הגדרות {provider_name}."
|
|
||||||
|
|
||||||
#: pretix/base/datasync/datasync.py:282
|
#: pretix/base/datasync/datasync.py:282
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Please update value mapping for field \"{field_name}\" - option \"{val}\" "
|
"Please update value mapping for field \"{field_name}\" - option \"{val}\" "
|
||||||
"not assigned"
|
"not assigned"
|
||||||
msgstr "נא לעדכן מיפוי ערכים לשדה \"{field_name}\" - אפשרות \"{val}\" לא מוקצה"
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/datasync/sourcefields.py:128
|
#: pretix/base/datasync/sourcefields.py:128
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Order positions"
|
||||||
msgid "Order position details"
|
msgid "Order position details"
|
||||||
msgstr "פרטי מצב הזמנה"
|
msgstr "פריטי הזמנה"
|
||||||
|
|
||||||
#: pretix/base/datasync/sourcefields.py:129
|
#: pretix/base/datasync/sourcefields.py:129
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Attendee email"
|
||||||
msgid "Attendee details"
|
msgid "Attendee details"
|
||||||
msgstr "פרטי משתתף"
|
msgstr "דוא\"ל משתתף"
|
||||||
|
|
||||||
#: pretix/base/datasync/sourcefields.py:130 pretix/base/exporters/answers.py:66
|
#: pretix/base/datasync/sourcefields.py:130 pretix/base/exporters/answers.py:66
|
||||||
#: pretix/base/models/items.py:1767 pretix/control/navigation.py:172
|
#: pretix/base/models/items.py:1767 pretix/control/navigation.py:172
|
||||||
@@ -824,8 +847,10 @@ msgid "Questions"
|
|||||||
msgstr "שאלות"
|
msgstr "שאלות"
|
||||||
|
|
||||||
#: pretix/base/datasync/sourcefields.py:131
|
#: pretix/base/datasync/sourcefields.py:131
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Product data"
|
||||||
msgid "Product details"
|
msgid "Product details"
|
||||||
msgstr "פרטי מוצר"
|
msgstr "נתוני מוצר"
|
||||||
|
|
||||||
#: pretix/base/datasync/sourcefields.py:132
|
#: pretix/base/datasync/sourcefields.py:132
|
||||||
#: pretix/control/templates/pretixcontrol/event/settings.html:279
|
#: pretix/control/templates/pretixcontrol/event/settings.html:279
|
||||||
@@ -850,13 +875,17 @@ msgid "Invoice address"
|
|||||||
msgstr "כתובת לחשבונית"
|
msgstr "כתובת לחשבונית"
|
||||||
|
|
||||||
#: pretix/base/datasync/sourcefields.py:134
|
#: pretix/base/datasync/sourcefields.py:134
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Meta information"
|
||||||
msgid "Event information"
|
msgid "Event information"
|
||||||
msgstr "מידע על האירוע"
|
msgstr "מידע מטא"
|
||||||
|
|
||||||
#: pretix/base/datasync/sourcefields.py:135
|
#: pretix/base/datasync/sourcefields.py:135
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Send recovery information"
|
||||||
msgctxt "subevent"
|
msgctxt "subevent"
|
||||||
msgid "Event or date information"
|
msgid "Event or date information"
|
||||||
msgstr "מידע על האירוע או התאריך"
|
msgstr "שלח פרטי שחזור"
|
||||||
|
|
||||||
#: pretix/base/datasync/sourcefields.py:175
|
#: pretix/base/datasync/sourcefields.py:175
|
||||||
#: pretix/base/exporters/orderlist.py:638
|
#: pretix/base/exporters/orderlist.py:638
|
||||||
@@ -881,8 +910,10 @@ msgstr "שם משתתף"
|
|||||||
#: pretix/base/datasync/sourcefields.py:187
|
#: pretix/base/datasync/sourcefields.py:187
|
||||||
#: pretix/base/datasync/sourcefields.py:604
|
#: pretix/base/datasync/sourcefields.py:604
|
||||||
#: pretix/base/datasync/sourcefields.py:628
|
#: pretix/base/datasync/sourcefields.py:628
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Attendee name"
|
||||||
msgid "Attendee"
|
msgid "Attendee"
|
||||||
msgstr "משתתף"
|
msgstr "שם משתתף"
|
||||||
|
|
||||||
#: pretix/base/datasync/sourcefields.py:207
|
#: pretix/base/datasync/sourcefields.py:207
|
||||||
#: pretix/base/exporters/orderlist.py:645 pretix/base/forms/questions.py:693
|
#: pretix/base/exporters/orderlist.py:645 pretix/base/forms/questions.py:693
|
||||||
@@ -896,8 +927,10 @@ msgid "Attendee email"
|
|||||||
msgstr "דוא\"ל משתתף"
|
msgstr "דוא\"ל משתתף"
|
||||||
|
|
||||||
#: pretix/base/datasync/sourcefields.py:219
|
#: pretix/base/datasync/sourcefields.py:219
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Attendee email"
|
||||||
msgid "Attendee or order email"
|
msgid "Attendee or order email"
|
||||||
msgstr "דוא\"ל משתתף או הזמנה"
|
msgstr "דוא\"ל משתתף"
|
||||||
|
|
||||||
#: pretix/base/datasync/sourcefields.py:232
|
#: pretix/base/datasync/sourcefields.py:232
|
||||||
#: pretix/base/exporters/orderlist.py:646 pretix/base/pdf.py:188
|
#: pretix/base/exporters/orderlist.py:646 pretix/base/pdf.py:188
|
||||||
@@ -910,8 +943,10 @@ msgid "Attendee company"
|
|||||||
msgstr "חברת המשתתף"
|
msgstr "חברת המשתתף"
|
||||||
|
|
||||||
#: pretix/base/datasync/sourcefields.py:241
|
#: pretix/base/datasync/sourcefields.py:241
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Attendee address"
|
||||||
msgid "Attendee address street"
|
msgid "Attendee address street"
|
||||||
msgstr "רחוב המשתתף"
|
msgstr "כתובת המשתתף"
|
||||||
|
|
||||||
#: pretix/base/datasync/sourcefields.py:250
|
#: pretix/base/datasync/sourcefields.py:250
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
@@ -920,12 +955,16 @@ msgid "Attendee address ZIP code"
|
|||||||
msgstr "מיקוד המשתתף"
|
msgstr "מיקוד המשתתף"
|
||||||
|
|
||||||
#: pretix/base/datasync/sourcefields.py:259
|
#: pretix/base/datasync/sourcefields.py:259
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Attendee address"
|
||||||
msgid "Attendee address city"
|
msgid "Attendee address city"
|
||||||
msgstr "עיר המשתתף"
|
msgstr "כתובת המשתתף"
|
||||||
|
|
||||||
#: pretix/base/datasync/sourcefields.py:268
|
#: pretix/base/datasync/sourcefields.py:268
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Attendee address"
|
||||||
msgid "Attendee address country"
|
msgid "Attendee address country"
|
||||||
msgstr "מדינת המשתתף"
|
msgstr "כתובת המשתתף"
|
||||||
|
|
||||||
#: pretix/base/datasync/sourcefields.py:279
|
#: pretix/base/datasync/sourcefields.py:279
|
||||||
#: pretix/base/exporters/orderlist.py:687 pretix/base/pdf.py:346
|
#: pretix/base/exporters/orderlist.py:687 pretix/base/pdf.py:346
|
||||||
@@ -961,12 +1000,16 @@ msgid "Invoice address country"
|
|||||||
msgstr "מדינת כתובת לחשבונית"
|
msgstr "מדינת כתובת לחשבונית"
|
||||||
|
|
||||||
#: pretix/base/datasync/sourcefields.py:353
|
#: pretix/base/datasync/sourcefields.py:353
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Order details"
|
||||||
msgid "Order email"
|
msgid "Order email"
|
||||||
msgstr "דוא\"ל הזמנה"
|
msgstr "פרטי הזמנה"
|
||||||
|
|
||||||
#: pretix/base/datasync/sourcefields.py:362
|
#: pretix/base/datasync/sourcefields.py:362
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Organizer domain"
|
||||||
msgid "Order email domain"
|
msgid "Order email domain"
|
||||||
msgstr "דומיין מייל הזמנה"
|
msgstr "דומיין מארגן"
|
||||||
|
|
||||||
#: pretix/base/datasync/sourcefields.py:371
|
#: pretix/base/datasync/sourcefields.py:371
|
||||||
#: pretix/base/exporters/invoices.py:203 pretix/base/exporters/invoices.py:332
|
#: pretix/base/exporters/invoices.py:203 pretix/base/exporters/invoices.py:332
|
||||||
@@ -998,8 +1041,10 @@ msgid "Order code"
|
|||||||
msgstr "קוד הזמנה"
|
msgstr "קוד הזמנה"
|
||||||
|
|
||||||
#: pretix/base/datasync/sourcefields.py:380
|
#: pretix/base/datasync/sourcefields.py:380
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "End order date"
|
||||||
msgid "Event and order code"
|
msgid "Event and order code"
|
||||||
msgstr "אירוע וקוד הזמנה"
|
msgstr "תאריך סיום הזמנה"
|
||||||
|
|
||||||
#: pretix/base/datasync/sourcefields.py:389
|
#: pretix/base/datasync/sourcefields.py:389
|
||||||
#: pretix/base/exporters/orderlist.py:283 pretix/base/notifications.py:201
|
#: pretix/base/exporters/orderlist.py:283 pretix/base/notifications.py:201
|
||||||
@@ -1024,12 +1069,16 @@ msgid "Product ID"
|
|||||||
msgstr "מזהה מוצר"
|
msgstr "מזהה מוצר"
|
||||||
|
|
||||||
#: pretix/base/datasync/sourcefields.py:419
|
#: pretix/base/datasync/sourcefields.py:419
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Non-admission product"
|
||||||
msgid "Product is admission product"
|
msgid "Product is admission product"
|
||||||
msgstr "מוצר שהינו כרטיס כניסה"
|
msgstr "מוצר שאינו עבור כניסה"
|
||||||
|
|
||||||
#: pretix/base/datasync/sourcefields.py:428
|
#: pretix/base/datasync/sourcefields.py:428
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Event short name"
|
||||||
msgid "Event short form"
|
msgid "Event short form"
|
||||||
msgstr "טופס האירוע המקוצר"
|
msgstr "שם האירוע המקוצר"
|
||||||
|
|
||||||
#: pretix/base/datasync/sourcefields.py:437 pretix/base/exporters/events.py:57
|
#: pretix/base/datasync/sourcefields.py:437 pretix/base/exporters/events.py:57
|
||||||
#: pretix/base/exporters/orderlist.py:283
|
#: pretix/base/exporters/orderlist.py:283
|
||||||
@@ -1072,8 +1121,10 @@ msgid "Order code and position number"
|
|||||||
msgstr "קוד הזמנה ומספר פריט"
|
msgstr "קוד הזמנה ומספר פריט"
|
||||||
|
|
||||||
#: pretix/base/datasync/sourcefields.py:482
|
#: pretix/base/datasync/sourcefields.py:482
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Ticket page"
|
||||||
msgid "Ticket price"
|
msgid "Ticket price"
|
||||||
msgstr "מחיר כרטיס"
|
msgstr "דף כרטיס"
|
||||||
|
|
||||||
#: pretix/base/datasync/sourcefields.py:491 pretix/base/notifications.py:204
|
#: pretix/base/datasync/sourcefields.py:491 pretix/base/notifications.py:204
|
||||||
#: pretix/control/forms/filter.py:220 pretix/control/forms/filter.py:1242
|
#: pretix/control/forms/filter.py:220 pretix/control/forms/filter.py:1242
|
||||||
@@ -1082,16 +1133,22 @@ msgid "Order status"
|
|||||||
msgstr "סטטוס הזמנה"
|
msgstr "סטטוס הזמנה"
|
||||||
|
|
||||||
#: pretix/base/datasync/sourcefields.py:500
|
#: pretix/base/datasync/sourcefields.py:500
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Device status"
|
||||||
msgid "Ticket status"
|
msgid "Ticket status"
|
||||||
msgstr "סטטוס כרטיס"
|
msgstr "סטטוס מכשיר"
|
||||||
|
|
||||||
#: pretix/base/datasync/sourcefields.py:509
|
#: pretix/base/datasync/sourcefields.py:509
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Purchase date and time"
|
||||||
msgid "Order date and time"
|
msgid "Order date and time"
|
||||||
msgstr "תאריך ושעת ההזמנה"
|
msgstr "תאריך ושעת הקנייה"
|
||||||
|
|
||||||
#: pretix/base/datasync/sourcefields.py:518
|
#: pretix/base/datasync/sourcefields.py:518
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Printing date and time"
|
||||||
msgid "Payment date and time"
|
msgid "Payment date and time"
|
||||||
msgstr "תאריך ושעת התשלום"
|
msgstr "תאריך ושעת ההדפסה"
|
||||||
|
|
||||||
#: pretix/base/datasync/sourcefields.py:527
|
#: pretix/base/datasync/sourcefields.py:527
|
||||||
#: pretix/base/exporters/orderlist.py:292
|
#: pretix/base/exporters/orderlist.py:292
|
||||||
@@ -1102,27 +1159,35 @@ msgid "Order locale"
|
|||||||
msgstr "שפת הזמנה"
|
msgstr "שפת הזמנה"
|
||||||
|
|
||||||
#: pretix/base/datasync/sourcefields.py:536
|
#: pretix/base/datasync/sourcefields.py:536
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Order position"
|
||||||
msgid "Order position ID"
|
msgid "Order position ID"
|
||||||
msgstr "מספר עמדת הזמנה"
|
msgstr "עמדת הזמנה"
|
||||||
|
|
||||||
#: pretix/base/datasync/sourcefields.py:545
|
#: pretix/base/datasync/sourcefields.py:545
|
||||||
#: pretix/base/exporters/orderlist.py:312
|
#: pretix/base/exporters/orderlist.py:312
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Order time"
|
||||||
msgid "Order link"
|
msgid "Order link"
|
||||||
msgstr "קישור הזמנה"
|
msgstr "שעת הזמנה"
|
||||||
|
|
||||||
#: pretix/base/datasync/sourcefields.py:560
|
#: pretix/base/datasync/sourcefields.py:560
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Ticket block"
|
||||||
msgid "Ticket link"
|
msgid "Ticket link"
|
||||||
msgstr "קישור כרטיס"
|
msgstr "חסימת כרטיס"
|
||||||
|
|
||||||
#: pretix/base/datasync/sourcefields.py:578
|
#: pretix/base/datasync/sourcefields.py:578
|
||||||
#, python-brace-format
|
#, fuzzy, python-brace-format
|
||||||
|
#| msgid "Check-in list {val}"
|
||||||
msgid "Check-in datetime on list {}"
|
msgid "Check-in datetime on list {}"
|
||||||
msgstr "צ'ק-אין בתאריך-זמן ברשימה {}"
|
msgstr "רשימת הצ'ק-אין {val}"
|
||||||
|
|
||||||
#: pretix/base/datasync/sourcefields.py:590
|
#: pretix/base/datasync/sourcefields.py:590
|
||||||
#, python-brace-format
|
#, fuzzy, python-brace-format
|
||||||
|
#| msgid "Question: %(name)s"
|
||||||
msgid "Question: {name}"
|
msgid "Question: {name}"
|
||||||
msgstr "שאלה: {name}"
|
msgstr "שאלה: %(name)s"
|
||||||
|
|
||||||
#: pretix/base/datasync/sourcefields.py:604
|
#: pretix/base/datasync/sourcefields.py:604
|
||||||
#: pretix/base/datasync/sourcefields.py:614 pretix/base/settings.py:3691
|
#: pretix/base/datasync/sourcefields.py:614 pretix/base/settings.py:3691
|
||||||
@@ -2263,8 +2328,6 @@ msgid ""
|
|||||||
"contain at least one position of this product. The order totals etc. still "
|
"contain at least one position of this product. The order totals etc. still "
|
||||||
"include all products contained in the order."
|
"include all products contained in the order."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"אם אף אחד מהם לא נבחר, כל המוצרים כלולים. הפקודות נכללות אם הן כוללות לפחות "
|
|
||||||
"עמדה אחת של המוצר. סך ההזמנות וכו'. עדיין כולל את כל המוצרים הכלולים בהזמנה."
|
|
||||||
|
|
||||||
#: pretix/base/exporters/orderlist.py:283
|
#: pretix/base/exporters/orderlist.py:283
|
||||||
#: pretix/base/exporters/orderlist.py:478
|
#: pretix/base/exporters/orderlist.py:478
|
||||||
@@ -2528,8 +2591,10 @@ msgid "Voucher"
|
|||||||
msgstr "שובר"
|
msgstr "שובר"
|
||||||
|
|
||||||
#: pretix/base/exporters/orderlist.py:653
|
#: pretix/base/exporters/orderlist.py:653
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Voucher code used:"
|
||||||
msgid "Voucher budget usage"
|
msgid "Voucher budget usage"
|
||||||
msgstr "שימוש בתקציב השוברים"
|
msgstr "השתמש בקוד שובר:"
|
||||||
|
|
||||||
#: pretix/base/exporters/orderlist.py:654
|
#: pretix/base/exporters/orderlist.py:654
|
||||||
msgid "Pseudonymization ID"
|
msgid "Pseudonymization ID"
|
||||||
@@ -2621,8 +2686,10 @@ msgid "Check-in lists"
|
|||||||
msgstr "רשימות צ'ק-אין"
|
msgstr "רשימות צ'ק-אין"
|
||||||
|
|
||||||
#: pretix/base/exporters/orderlist.py:706
|
#: pretix/base/exporters/orderlist.py:706
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Resend order link"
|
||||||
msgid "Position order link"
|
msgid "Position order link"
|
||||||
msgstr "עמדת קישור הזמנה"
|
msgstr "שלח את קישור ההזמנה שוב"
|
||||||
|
|
||||||
#: pretix/base/exporters/orderlist.py:876
|
#: pretix/base/exporters/orderlist.py:876
|
||||||
msgid "Order transaction data"
|
msgid "Order transaction data"
|
||||||
@@ -3259,8 +3326,10 @@ msgid "Repeat password"
|
|||||||
msgstr "חזור על הסיסמה"
|
msgstr "חזור על הסיסמה"
|
||||||
|
|
||||||
#: pretix/base/forms/auth.py:220 pretix/base/forms/user.py:99
|
#: pretix/base/forms/auth.py:220 pretix/base/forms/user.py:99
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Email address"
|
||||||
msgid "Your email address"
|
msgid "Your email address"
|
||||||
msgstr "כתובת הדוא\"ל שלך"
|
msgstr "כתובת דוא\"ל"
|
||||||
|
|
||||||
#: pretix/base/forms/auth.py:327 pretix/control/forms/orders.py:1041
|
#: pretix/base/forms/auth.py:327 pretix/control/forms/orders.py:1041
|
||||||
#: pretix/control/templates/pretixcontrol/shredder/download.html:53
|
#: pretix/control/templates/pretixcontrol/shredder/download.html:53
|
||||||
@@ -3341,12 +3410,14 @@ msgstr ""
|
|||||||
"למדינתך ומדינת המוכר."
|
"למדינתך ומדינת המוכר."
|
||||||
|
|
||||||
#: pretix/base/forms/questions.py:1185
|
#: pretix/base/forms/questions.py:1185
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Cancellation requested"
|
||||||
msgid "No invoice requested"
|
msgid "No invoice requested"
|
||||||
msgstr "לא התבקשה חשבונית"
|
msgstr "בקשת ביטול"
|
||||||
|
|
||||||
#: pretix/base/forms/questions.py:1187
|
#: pretix/base/forms/questions.py:1187
|
||||||
msgid "Invoice transmission method"
|
msgid "Invoice transmission method"
|
||||||
msgstr "שיטת שידור חשבונית"
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/forms/questions.py:1333
|
#: pretix/base/forms/questions.py:1333
|
||||||
msgid "You need to provide a company name."
|
msgid "You need to provide a company name."
|
||||||
@@ -3360,24 +3431,25 @@ msgstr "עליך לספק את שמך."
|
|||||||
msgid ""
|
msgid ""
|
||||||
"If you enter an invoice address, you also need to select an invoice "
|
"If you enter an invoice address, you also need to select an invoice "
|
||||||
"transmission method."
|
"transmission method."
|
||||||
msgstr "אם אתה מזין כתובת לחשבונית, עליך גם לבחור שיטת שידור חשבונית."
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/forms/questions.py:1403
|
#: pretix/base/forms/questions.py:1403
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "The selected media type is not enabled in your organizer settings."
|
||||||
msgid ""
|
msgid ""
|
||||||
"The selected transmission type is not available in your country or for your "
|
"The selected transmission type is not available in your country or for your "
|
||||||
"type of address."
|
"type of address."
|
||||||
msgstr "סוג השידור שנבחר אינו זמין במדינתך או בסוג הכתובת שבחרת."
|
msgstr "סוג המדיה שנבחר אינו מופעל בהגדרות הארגון שלכם."
|
||||||
|
|
||||||
#: pretix/base/forms/questions.py:1412
|
#: pretix/base/forms/questions.py:1412
|
||||||
msgid ""
|
msgid ""
|
||||||
"The selected type of invoice transmission requires a field that is currently "
|
"The selected type of invoice transmission requires a field that is currently "
|
||||||
"not available, please reach out to the organizer."
|
"not available, please reach out to the organizer."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"סוג שידור החשבונית שנבחר דורש שדה שאינו זמין כרגע, נא ליצור קשר עם המארגן."
|
|
||||||
|
|
||||||
#: pretix/base/forms/questions.py:1416
|
#: pretix/base/forms/questions.py:1416
|
||||||
msgid "This field is required for the selected type of invoice transmission."
|
msgid "This field is required for the selected type of invoice transmission."
|
||||||
msgstr "שדה זה הינו חובה לסוג שידור החשבונית שנבחר."
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/forms/user.py:54 pretix/control/forms/organizer.py:458
|
#: pretix/base/forms/user.py:54 pretix/control/forms/organizer.py:458
|
||||||
#: pretix/control/forms/users.py:58
|
#: pretix/control/forms/users.py:58
|
||||||
@@ -3393,8 +3465,10 @@ msgstr ""
|
|||||||
"באזור הזמן של האירוע עצמו."
|
"באזור הזמן של האירוע עצמו."
|
||||||
|
|
||||||
#: pretix/base/forms/user.py:77
|
#: pretix/base/forms/user.py:77
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Attendee email address"
|
||||||
msgid "Change email address"
|
msgid "Change email address"
|
||||||
msgstr "שינוי כתובת דוא\"ל"
|
msgstr "כתובת דוא\"ל של המשתתף"
|
||||||
|
|
||||||
#: pretix/base/forms/user.py:83
|
#: pretix/base/forms/user.py:83
|
||||||
msgid "Device name"
|
msgid "Device name"
|
||||||
@@ -3442,12 +3516,16 @@ msgid ""
|
|||||||
msgstr "כבר קיים חשבון הקשור לכתובת האימייל הזו. אנא בחר כתובת אחרת."
|
msgstr "כבר קיים חשבון הקשור לכתובת האימייל הזו. אנא בחר כתובת אחרת."
|
||||||
|
|
||||||
#: pretix/base/forms/user.py:179
|
#: pretix/base/forms/user.py:179
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Email address"
|
||||||
msgid "Old email address"
|
msgid "Old email address"
|
||||||
msgstr "כתובת דוא\"ל ישנה"
|
msgstr "כתובת דוא\"ל"
|
||||||
|
|
||||||
#: pretix/base/forms/user.py:180
|
#: pretix/base/forms/user.py:180
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Email address"
|
||||||
msgid "New email address"
|
msgid "New email address"
|
||||||
msgstr "כתובת דוא\"ל חדשה"
|
msgstr "כתובת דוא\"ל"
|
||||||
|
|
||||||
#: pretix/base/forms/validators.py:51
|
#: pretix/base/forms/validators.py:51
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -3491,47 +3569,60 @@ msgid "Individual customer"
|
|||||||
msgstr "לקוח פרטי"
|
msgstr "לקוח פרטי"
|
||||||
|
|
||||||
#: pretix/base/invoicing/email.py:50
|
#: pretix/base/invoicing/email.py:50
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid ""
|
||||||
|
#| "Please additionally send my invoice directly to our accounting department"
|
||||||
msgid "Email invoice directly to accounting department"
|
msgid "Email invoice directly to accounting department"
|
||||||
msgstr "שלח חשבונית בדוא\"ל ישירות למחלקת הנהלת חשבונות."
|
msgstr "אנא שלח בנוסף את החשבונית ישירות למחלקת הנהלת החשבונות שלנו"
|
||||||
|
|
||||||
#: pretix/base/invoicing/email.py:51
|
#: pretix/base/invoicing/email.py:51
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "The invoice was sent to the designated email address."
|
||||||
msgid ""
|
msgid ""
|
||||||
"If not selected, the invoice will be sent to you using the email address "
|
"If not selected, the invoice will be sent to you using the email address "
|
||||||
"listed above."
|
"listed above."
|
||||||
msgstr "אם לא ייבחר, בחשבונית תישלח לכתובת הדוא\"ל המצויינת מעלה."
|
msgstr "החשבונית נשלחה לכתובת הדוא\"ל שהוגדרה."
|
||||||
|
|
||||||
#: pretix/base/invoicing/email.py:55
|
#: pretix/base/invoicing/email.py:55
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Email address verified"
|
||||||
msgid "Email address for invoice"
|
msgid "Email address for invoice"
|
||||||
msgstr "כתובת דוא\"ל לחשבונית"
|
msgstr "כתובת דוא\"ל מאומתת"
|
||||||
|
|
||||||
#: pretix/base/invoicing/email.py:91
|
#: pretix/base/invoicing/email.py:91
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Preview email"
|
||||||
msgid "PDF via email"
|
msgid "PDF via email"
|
||||||
msgstr "PDF באמצעות דוא\"ל"
|
msgstr "הצג תצוגה מקדימה של המייל"
|
||||||
|
|
||||||
#: pretix/base/invoicing/national.py:37
|
#: pretix/base/invoicing/national.py:37
|
||||||
msgctxt "italian_invoice"
|
msgctxt "italian_invoice"
|
||||||
msgid "Italian Exchange System (SdI)"
|
msgid "Italian Exchange System (SdI)"
|
||||||
msgstr "מערכת ההחלפה האיטלקית (SdI)"
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/invoicing/national.py:38
|
#: pretix/base/invoicing/national.py:38
|
||||||
msgctxt "italian_invoice"
|
msgctxt "italian_invoice"
|
||||||
msgid "Exchange System (SdI)"
|
msgid "Exchange System (SdI)"
|
||||||
msgstr "מערכת ההחלפה (SdI)"
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/invoicing/national.py:51
|
#: pretix/base/invoicing/national.py:51
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Gift card code"
|
||||||
msgctxt "italian_invoice"
|
msgctxt "italian_invoice"
|
||||||
msgid "Fiscal code"
|
msgid "Fiscal code"
|
||||||
msgstr "קוד פיסקלי"
|
msgstr "קוד כרטיס מתנה"
|
||||||
|
|
||||||
#: pretix/base/invoicing/national.py:55
|
#: pretix/base/invoicing/national.py:55
|
||||||
msgctxt "italian_invoice"
|
msgctxt "italian_invoice"
|
||||||
msgid "Address for certified electronic mail"
|
msgid "Address for certified electronic mail"
|
||||||
msgstr "כתובת לדואר אלקטרוני מאושר."
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/invoicing/national.py:59
|
#: pretix/base/invoicing/national.py:59
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Recipient"
|
||||||
msgctxt "italian_invoice"
|
msgctxt "italian_invoice"
|
||||||
msgid "Recipient code"
|
msgid "Recipient code"
|
||||||
msgstr "קוד נמען"
|
msgstr "נמען"
|
||||||
|
|
||||||
#: pretix/base/invoicing/national.py:83
|
#: pretix/base/invoicing/national.py:83
|
||||||
msgctxt "italian_invoice"
|
msgctxt "italian_invoice"
|
||||||
@@ -3541,9 +3632,6 @@ msgid ""
|
|||||||
"in accordance with the procedures and terms set forth in No. 89757/2018 of "
|
"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."
|
"April 30, 2018, issued by the Director of the Revenue Agency."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"קובץ PDF זה הוא העתק ויזואלי של החשבונית ואינו מהווה חשבונית לצרכי מע\"מ. "
|
|
||||||
"החשבונית מונפקת בפורמט XML, ומשודרת בהתאם לנהלים ולתנאים המפורטים בתקנה "
|
|
||||||
"89757/2018 מה30 באפריל, 2016 שפורסמה על ידי מנהל סוכנות ההכנסות."
|
|
||||||
|
|
||||||
#: pretix/base/invoicing/pdf.py:142
|
#: pretix/base/invoicing/pdf.py:142
|
||||||
#, python-format
|
#, python-format
|
||||||
@@ -3724,10 +3812,12 @@ msgid "Remaining amount"
|
|||||||
msgstr "הסכום שנותר"
|
msgstr "הסכום שנותר"
|
||||||
|
|
||||||
#: pretix/base/invoicing/pdf.py:1008
|
#: pretix/base/invoicing/pdf.py:1008
|
||||||
#, python-brace-format
|
#, fuzzy, python-brace-format
|
||||||
|
#| msgctxt "invoice"
|
||||||
|
#| msgid "Event date: {date_range}"
|
||||||
msgctxt "invoice"
|
msgctxt "invoice"
|
||||||
msgid "Invoice period: {daterange}"
|
msgid "Invoice period: {daterange}"
|
||||||
msgstr "תקופת החשבונית: {daterange}"
|
msgstr "תאריך אירוע: {date_range}"
|
||||||
|
|
||||||
#: pretix/base/invoicing/pdf.py:1039
|
#: pretix/base/invoicing/pdf.py:1039
|
||||||
msgctxt "invoice"
|
msgctxt "invoice"
|
||||||
@@ -3790,7 +3880,7 @@ msgstr "תאריך אירוע: {date_range}"
|
|||||||
#: pretix/base/invoicing/peppol.py:136
|
#: pretix/base/invoicing/peppol.py:136
|
||||||
msgid ""
|
msgid ""
|
||||||
"A Peppol participant ID always starts with a prefix, followed by a colon (:)."
|
"A Peppol participant ID always starts with a prefix, followed by a colon (:)."
|
||||||
msgstr "מזהה משתתף של פפול תמיד מתחיל בתחילית ואחריה נקודתיים(:)."
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/invoicing/peppol.py:140
|
#: pretix/base/invoicing/peppol.py:140
|
||||||
#, python-format
|
#, python-format
|
||||||
@@ -3798,8 +3888,6 @@ msgid ""
|
|||||||
"The Peppol participant ID prefix %(number)s is not known to our system. "
|
"The Peppol participant ID prefix %(number)s is not known to our system. "
|
||||||
"Please reach out to us if you are sure this ID is correct."
|
"Please reach out to us if you are sure this ID is correct."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"תחילית מזהה המשתתף של פפול %(number)s אינה מוכרת למערכת. צור עימנו קשר אם "
|
|
||||||
"אתה בטוח שזהו המזהה הנכון."
|
|
||||||
|
|
||||||
#: pretix/base/invoicing/peppol.py:144
|
#: pretix/base/invoicing/peppol.py:144
|
||||||
#, python-format
|
#, python-format
|
||||||
@@ -3807,21 +3895,21 @@ msgid ""
|
|||||||
"The Peppol participant ID does not match the validation rules for the prefix "
|
"The Peppol participant ID does not match the validation rules for the prefix "
|
||||||
"%(number)s. Please reach out to us if you are sure this ID is correct."
|
"%(number)s. Please reach out to us if you are sure this ID is correct."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"מזהה המשתתף של פפול אינו תואם לחוקי הולידציה של התחילית %(number)s. צור "
|
|
||||||
"עימנו קשר אם אתה בטוח שהמזהה נכון."
|
|
||||||
|
|
||||||
#: pretix/base/invoicing/peppol.py:166
|
#: pretix/base/invoicing/peppol.py:166
|
||||||
msgid "The Peppol participant ID is not registered on the Peppol network."
|
msgid "The Peppol participant ID is not registered on the Peppol network."
|
||||||
msgstr "מזהה המשתתף של פפול אינו רשום ברשת פפול."
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/invoicing/peppol.py:192
|
#: pretix/base/invoicing/peppol.py:192
|
||||||
msgid "Peppol participant ID"
|
msgid "Peppol participant ID"
|
||||||
msgstr "מזהה משתתף פפול"
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/invoicing/peppol.py:208
|
#: pretix/base/invoicing/peppol.py:208
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Gift card code"
|
||||||
msgctxt "peppol_invoice"
|
msgctxt "peppol_invoice"
|
||||||
msgid "Visual copy"
|
msgid "Visual copy"
|
||||||
msgstr "עותק ויזואלי"
|
msgstr "קוד כרטיס מתנה"
|
||||||
|
|
||||||
#: pretix/base/invoicing/peppol.py:213
|
#: pretix/base/invoicing/peppol.py:213
|
||||||
msgctxt "peppol_invoice"
|
msgctxt "peppol_invoice"
|
||||||
@@ -3830,8 +3918,6 @@ msgid ""
|
|||||||
"invoice for VAT purposes. The original invoice is issued in XML format and "
|
"invoice for VAT purposes. The original invoice is issued in XML format and "
|
||||||
"transmitted through the Peppol network."
|
"transmitted through the Peppol network."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"קובץ PDF זה הינו העתק ויזואלי של החשבונית ואינו מהווה חשבונית לצרכי מע\"מ. "
|
|
||||||
"החשבונית המקורית מופקת בפורמט XML ומשודרת דרך רשת פפול."
|
|
||||||
|
|
||||||
#: pretix/base/logentrytype_registry.py:43
|
#: pretix/base/logentrytype_registry.py:43
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -3944,7 +4030,7 @@ msgstr "נמצאו מספר תאריכים תואמים."
|
|||||||
|
|
||||||
#: pretix/base/modelimport_orders.py:73
|
#: pretix/base/modelimport_orders.py:73
|
||||||
msgid "Grouping"
|
msgid "Grouping"
|
||||||
msgstr "קיבוץ"
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/modelimport_orders.py:75
|
#: pretix/base/modelimport_orders.py:75
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -3952,8 +4038,6 @@ msgid ""
|
|||||||
"together...\". Lines with the same grouping value will be put in the same "
|
"together...\". Lines with the same grouping value will be put in the same "
|
||||||
"order, but MUST be consecutive lines of the input file."
|
"order, but MUST be consecutive lines of the input file."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"ישים רק כש\"מצב יבוא\" מוגדר ל\"קיבוץ מספר שורות יחד...\". שורות עם אותו ערך "
|
|
||||||
"קיבוץ יוצבו באותו סדר, אך חייבים להיות שורות רציפות של קובץ הקלט."
|
|
||||||
|
|
||||||
#: pretix/base/modelimport_orders.py:101
|
#: pretix/base/modelimport_orders.py:101
|
||||||
msgid "Enter a valid phone number."
|
msgid "Enter a valid phone number."
|
||||||
@@ -3965,8 +4049,6 @@ msgid ""
|
|||||||
"The date can be specified through its full name, full date and time, or "
|
"The date can be specified through its full name, full date and time, or "
|
||||||
"internal ID, provided only one date in the system matches the input."
|
"internal ID, provided only one date in the system matches the input."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"התאריך ניתן לציון דרך השם המלא, התאריך והשעה המלאים, או מזהה פנימי בתנאי "
|
|
||||||
"שהמזהה תואם רק תאריך אחד."
|
|
||||||
|
|
||||||
#: pretix/base/modelimport_orders.py:120 pretix/presale/views/waiting.py:157
|
#: pretix/base/modelimport_orders.py:120 pretix/presale/views/waiting.py:157
|
||||||
msgctxt "subevent"
|
msgctxt "subevent"
|
||||||
@@ -3976,7 +4058,7 @@ msgstr "עליך לבחור תאריך."
|
|||||||
#: pretix/base/modelimport_orders.py:131
|
#: pretix/base/modelimport_orders.py:131
|
||||||
msgid ""
|
msgid ""
|
||||||
"The product can be specified by its internal ID, full name or internal name."
|
"The product can be specified by its internal ID, full name or internal name."
|
||||||
msgstr "המוצר ניתן לציון ע\"י מזהה פנימי, שם מלא או שם פנימי."
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/modelimport_orders.py:149
|
#: pretix/base/modelimport_orders.py:149
|
||||||
#: pretix/base/modelimport_vouchers.py:194
|
#: pretix/base/modelimport_vouchers.py:194
|
||||||
@@ -3996,7 +4078,7 @@ msgstr "וריאציית מוצר"
|
|||||||
|
|
||||||
#: pretix/base/modelimport_orders.py:161
|
#: pretix/base/modelimport_orders.py:161
|
||||||
msgid "The variation can be specified by its internal ID or full name."
|
msgid "The variation can be specified by its internal ID or full name."
|
||||||
msgstr "הוריאציה ניתנת לציון לפי מזהה פנימי או שם מלא."
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/modelimport_orders.py:181
|
#: pretix/base/modelimport_orders.py:181
|
||||||
#: pretix/base/modelimport_vouchers.py:225
|
#: pretix/base/modelimport_vouchers.py:225
|
||||||
@@ -4015,8 +4097,10 @@ msgid "You need to select a variation for this product."
|
|||||||
msgstr "עליך לבחור וריאציה למוצר זה."
|
msgstr "עליך לבחור וריאציה למוצר זה."
|
||||||
|
|
||||||
#: pretix/base/modelimport_orders.py:265 pretix/base/modelimport_orders.py:417
|
#: pretix/base/modelimport_orders.py:265 pretix/base/modelimport_orders.py:417
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "The count needs to be equal to or greater than zero."
|
||||||
msgid "The country needs to be specified using a two-letter country code."
|
msgid "The country needs to be specified using a two-letter country code."
|
||||||
msgstr "המדינה נדרשת להזנה לפי קוד מדינה בין 2 אותיות."
|
msgstr "הכמות צריכה להיות שווה או גדולה מאפס."
|
||||||
|
|
||||||
#: pretix/base/modelimport_orders.py:281 pretix/base/modelimport_orders.py:432
|
#: pretix/base/modelimport_orders.py:281 pretix/base/modelimport_orders.py:432
|
||||||
msgid "Please enter a valid country code."
|
msgid "Please enter a valid country code."
|
||||||
@@ -4024,7 +4108,7 @@ msgstr "נא להזין קוד ארץ תקין."
|
|||||||
|
|
||||||
#: pretix/base/modelimport_orders.py:290 pretix/base/modelimport_orders.py:441
|
#: pretix/base/modelimport_orders.py:290 pretix/base/modelimport_orders.py:441
|
||||||
msgid "The state can be specified by its short form or full name."
|
msgid "The state can be specified by its short form or full name."
|
||||||
msgstr "המדינה ניתנת להזנה ע\"י שימוש בקיצור או בשמה המלא."
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/modelimport_orders.py:300 pretix/base/modelimport_orders.py:450
|
#: pretix/base/modelimport_orders.py:300 pretix/base/modelimport_orders.py:450
|
||||||
msgid "States are not supported for this country."
|
msgid "States are not supported for this country."
|
||||||
@@ -4080,15 +4164,17 @@ msgstr "אנא הזן קוד שפה תקין."
|
|||||||
msgid ""
|
msgid ""
|
||||||
"The sales channel can be specified by it's internal identifier or its full "
|
"The sales channel can be specified by it's internal identifier or its full "
|
||||||
"name."
|
"name."
|
||||||
msgstr "ערוץ המכירה ניתן להזנה ע\"י מזהה פנימי או שם מלא."
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/modelimport_orders.py:599 pretix/base/modelimport_orders.py:601
|
#: pretix/base/modelimport_orders.py:599 pretix/base/modelimport_orders.py:601
|
||||||
msgid "Please enter a valid sales channel."
|
msgid "Please enter a valid sales channel."
|
||||||
msgstr "אנא הזן ערוץ מכירות תקין."
|
msgstr "אנא הזן ערוץ מכירות תקין."
|
||||||
|
|
||||||
#: pretix/base/modelimport_orders.py:611
|
#: pretix/base/modelimport_orders.py:611
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "The refund amount needs to be positive and less than {}."
|
||||||
msgid "The seat needs to be specified by its internal ID."
|
msgid "The seat needs to be specified by its internal ID."
|
||||||
msgstr "המושב חייב להיות מצויין לפי המזהה הפנימי."
|
msgstr "סכום ההחזר חייב להיות חיובי ופחות מ-{}."
|
||||||
|
|
||||||
#: pretix/base/modelimport_orders.py:626
|
#: pretix/base/modelimport_orders.py:626
|
||||||
#: pretix/base/modelimport_vouchers.py:291
|
#: pretix/base/modelimport_vouchers.py:291
|
||||||
@@ -4290,17 +4376,17 @@ msgid ""
|
|||||||
"to confirm changing your email address from {old_email}\n"
|
"to confirm changing your email address from {old_email}\n"
|
||||||
"to {new_email}, use the following code:"
|
"to {new_email}, use the following code:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"לאימות שינוי כתובת הדוא\"ל מ{old_email} \n"
|
|
||||||
"ל {new_email}, השתמש בקוד הבא:"
|
|
||||||
|
|
||||||
#: pretix/base/models/auth.py:377
|
#: pretix/base/models/auth.py:377
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"to confirm that your email address {email} belongs to your pretix account, "
|
"to confirm that your email address {email} belongs to your pretix account, "
|
||||||
"use the following code:"
|
"use the following code:"
|
||||||
msgstr "לאימות שכתובת הדוא\"ל {email} שייכת לחשבונך, השתמש בקוד הבא:"
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/models/auth.py:391
|
#: pretix/base/models/auth.py:391
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Confirmation code"
|
||||||
msgid "pretix confirmation code"
|
msgid "pretix confirmation code"
|
||||||
msgstr "קוד אישור"
|
msgstr "קוד אישור"
|
||||||
|
|
||||||
@@ -4560,19 +4646,21 @@ msgstr "הפרד בין ערכים מרובים באמצעות רווחים"
|
|||||||
|
|
||||||
#: pretix/base/models/datasync.py:53
|
#: pretix/base/models/datasync.py:53
|
||||||
msgid "Temporary error, auto-retry limit exceeded"
|
msgid "Temporary error, auto-retry limit exceeded"
|
||||||
msgstr "שגיאה זמנית, מכסת הניסיונות מחדש האוטומטיים נחרגה"
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/models/datasync.py:54
|
#: pretix/base/models/datasync.py:54
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Stripe reported an error: %s"
|
||||||
msgid "Provider reported a permanent error"
|
msgid "Provider reported a permanent error"
|
||||||
msgstr "הספק דיווח על שגיאה קבועה"
|
msgstr "Stripe דיווח על שגיאה: %s"
|
||||||
|
|
||||||
#: pretix/base/models/datasync.py:55
|
#: pretix/base/models/datasync.py:55
|
||||||
msgid "Misconfiguration, please check provider settings"
|
msgid "Misconfiguration, please check provider settings"
|
||||||
msgstr "שגיאת הגדרה, בדוק את הגדרות הספק"
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/models/datasync.py:56 pretix/base/models/datasync.py:57
|
#: pretix/base/models/datasync.py:56 pretix/base/models/datasync.py:57
|
||||||
msgid "System error, needs manual intervention"
|
msgid "System error, needs manual intervention"
|
||||||
msgstr "תקלת מערכת, נדרשת התערבות ידנית"
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/models/devices.py:70 pretix/base/models/items.py:1675
|
#: pretix/base/models/devices.py:70 pretix/base/models/items.py:1675
|
||||||
msgid "Internal identifier"
|
msgid "Internal identifier"
|
||||||
@@ -4820,15 +4908,13 @@ msgstr "לא חובה. לא יימכרו מוצרים לפני תאריך זה."
|
|||||||
|
|
||||||
#: pretix/base/models/event.py:644
|
#: pretix/base/models/event.py:644
|
||||||
msgid "This event is remote or partially remote."
|
msgid "This event is remote or partially remote."
|
||||||
msgstr "אירוע זה הינו אירוע וירטואלי או חלקית וירטואלי."
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/models/event.py:645
|
#: pretix/base/models/event.py:645
|
||||||
msgid ""
|
msgid ""
|
||||||
"This will be used to let users know if the event is in a different timezone "
|
"This will be used to let users know if the event is in a different timezone "
|
||||||
"and let’s us calculate users’ local times."
|
"and let’s us calculate users’ local times."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"זה ישמש לעדכן את המשתמשים לדעת אם השעה המצויינת הינה באזור זמן שונה ויאפשר "
|
|
||||||
"לנו לחשב את השעה בהתאם לשעון המקומי של המשתמשים."
|
|
||||||
|
|
||||||
#: pretix/base/models/event.py:665 pretix/base/models/organizer.py:97
|
#: pretix/base/models/event.py:665 pretix/base/models/organizer.py:97
|
||||||
#: pretix/control/navigation.py:65 pretix/control/navigation.py:499
|
#: pretix/control/navigation.py:65 pretix/control/navigation.py:499
|
||||||
@@ -5105,7 +5191,7 @@ msgstr "יתרה ממתינה"
|
|||||||
|
|
||||||
#: pretix/base/models/invoices.py:123
|
#: pretix/base/models/invoices.py:123
|
||||||
msgid "currently being transmitted"
|
msgid "currently being transmitted"
|
||||||
msgstr "משודר כרגע"
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/models/invoices.py:124
|
#: pretix/base/models/invoices.py:124
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
@@ -6000,8 +6086,6 @@ msgid ""
|
|||||||
"with changing the type of question without data loss. Consider hiding this "
|
"with changing the type of question without data loss. Consider hiding this "
|
||||||
"question and creating a new one instead."
|
"question and creating a new one instead."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"המערכת כבר כוללת תשובות לשאלה זו שאינם מאפשרות שינוי סוג השאלה מבלי לאבד "
|
|
||||||
"מידע. מומלץ לשקול להסתיר את שאלה זו וליצור חדשה במקום."
|
|
||||||
|
|
||||||
#: pretix/base/models/items.py:1961
|
#: pretix/base/models/items.py:1961
|
||||||
#: pretix/control/templates/pretixcontrol/items/question.html:75
|
#: pretix/control/templates/pretixcontrol/items/question.html:75
|
||||||
@@ -7942,9 +8026,6 @@ msgid ""
|
|||||||
"2017-05-31 14:00 – 16:00\n"
|
"2017-05-31 14:00 – 16:00\n"
|
||||||
"2017-05-31 14:00 – 2017-06-01 14:00"
|
"2017-05-31 14:00 – 2017-06-01 14:00"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"2017-05-31 10:00 – 12:00\n"
|
|
||||||
"2017-05-31 14:00 – 16:00\n"
|
|
||||||
"2017-05-31 14:00 – 2017-06-01 14:00"
|
|
||||||
|
|
||||||
#: pretix/base/pdf.py:500
|
#: pretix/base/pdf.py:500
|
||||||
msgid "Reusable Medium ID"
|
msgid "Reusable Medium ID"
|
||||||
@@ -8153,7 +8234,7 @@ msgstr "בחרת מוצר שאינו זמין למכירה."
|
|||||||
msgid ""
|
msgid ""
|
||||||
"Some products can no longer be purchased and have been removed from your "
|
"Some products can no longer be purchased and have been removed from your "
|
||||||
"cart for the following reason: %s"
|
"cart for the following reason: %s"
|
||||||
msgstr "חלק מהמוצרים לא ניתנים לרכישה יותר והוסרו מעגלת הקניות מהסיבה הבאה: %s"
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/services/cart.py:117
|
#: pretix/base/services/cart.py:117
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -8903,7 +8984,7 @@ msgstr "ההזמנה אינה יכולה להכיל יותר מ־%(max)s עמד
|
|||||||
msgid ""
|
msgid ""
|
||||||
"The grouping \"%(value)s\" occurs on non-consecutive lines (seen again on "
|
"The grouping \"%(value)s\" occurs on non-consecutive lines (seen again on "
|
||||||
"line %(row)s)."
|
"line %(row)s)."
|
||||||
msgstr "הקיבוץ \"%(value)s\" מתקיים בשורות לא רציפות (נראה שוב בשורה %(row)s)."
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/services/modelimport.py:154
|
#: pretix/base/services/modelimport.py:154
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
@@ -8911,8 +8992,6 @@ msgid ""
|
|||||||
"Inconsistent data in row {row}: Column {col} contains value \"{val_line}\", "
|
"Inconsistent data in row {row}: Column {col} contains value \"{val_line}\", "
|
||||||
"but for this order, the value has already been set to \"{val_order}\"."
|
"but for this order, the value has already been set to \"{val_order}\"."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"מידע לא רציף בשורה {row}: טור {col} מכיל ערך \"{val_line}\", אך להזמנה זו, "
|
|
||||||
"הערך כבר הוגדר ל \"{val_order}\"."
|
|
||||||
|
|
||||||
#: pretix/base/services/modelimport.py:168
|
#: pretix/base/services/modelimport.py:168
|
||||||
#: pretix/base/services/modelimport.py:289
|
#: pretix/base/services/modelimport.py:289
|
||||||
@@ -9354,15 +9433,15 @@ msgstr "השובר נשלח ל-{recipient}."
|
|||||||
|
|
||||||
#: pretix/base/settings.py:82
|
#: pretix/base/settings.py:82
|
||||||
msgid "Compute taxes for every line individually"
|
msgid "Compute taxes for every line individually"
|
||||||
msgstr "חשב מיסים לכל שורה בנפרד"
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/settings.py:83
|
#: pretix/base/settings.py:83
|
||||||
msgid "Compute taxes based on net total"
|
msgid "Compute taxes based on net total"
|
||||||
msgstr "חשב מיסים תוך ביסוס על סה\"כ נטו"
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/settings.py:84
|
#: pretix/base/settings.py:84
|
||||||
msgid "Compute taxes based on net total with stable gross prices"
|
msgid "Compute taxes based on net total with stable gross prices"
|
||||||
msgstr "חשב מיסים על סה\"כ נטו עם ברוטו יציב"
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/settings.py:134
|
#: pretix/base/settings.py:134
|
||||||
msgid "Allow usage of restricted plugins"
|
msgid "Allow usage of restricted plugins"
|
||||||
@@ -9391,7 +9470,7 @@ msgstr "אם אפשרות זו מושבתת, תצטרך לחבר ספקי זיה
|
|||||||
|
|
||||||
#: pretix/base/settings.py:189
|
#: pretix/base/settings.py:189
|
||||||
msgid "Require login to access order confirmation pages"
|
msgid "Require login to access order confirmation pages"
|
||||||
msgstr "דרוש כניסה למשתמש על מנת לגשת לדפי אישור הזמנה"
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/settings.py:190
|
#: pretix/base/settings.py:190
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -9400,9 +9479,6 @@ msgid ""
|
|||||||
"placing an order, the restriction only becomes active after the customer "
|
"placing an order, the restriction only becomes active after the customer "
|
||||||
"account is activated."
|
"account is activated."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"אם מופעל, משתמשים שהיו מחוברים לאתר בזמן רכישה יצטרכו להתחבר לחשבונם באתר על "
|
|
||||||
"מנת לגשת לפרטי ההזמנה שלהם. אם החשבון נוצר במהלך הרכישה, ההגבלה נכנסת לתוקף "
|
|
||||||
"רק לאחר הפעלת החשבון."
|
|
||||||
|
|
||||||
#: pretix/base/settings.py:202
|
#: pretix/base/settings.py:202
|
||||||
msgid "Match orders based on email address"
|
msgid "Match orders based on email address"
|
||||||
@@ -9582,8 +9658,6 @@ msgid ""
|
|||||||
"for tax reporting, you need to make sure to account for possible rounding "
|
"for tax reporting, you need to make sure to account for possible rounding "
|
||||||
"differences if your external system rounds differently than pretix."
|
"differences if your external system rounds differently than pretix."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"שים לב- במידה ותייצא את נתוני המכירות שלך למערכת חיצונית לדיווח מס, עלייך "
|
|
||||||
"לקחת בחשבון כי ייתכנו פערים אם המערכת החיצונית מבצעת עיגול בצורה שונה."
|
|
||||||
|
|
||||||
#: pretix/base/settings.py:514
|
#: pretix/base/settings.py:514
|
||||||
msgid "Ask for invoice address"
|
msgid "Ask for invoice address"
|
||||||
@@ -9712,8 +9786,6 @@ msgid ""
|
|||||||
"ID in all countries. VAT ID will be required for all business addresses in "
|
"ID in all countries. VAT ID will be required for all business addresses in "
|
||||||
"the selected countries."
|
"the selected countries."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"מספר עסק מגדר כרשות כברירת מחדל מאחר ובחלק מהמדינות ישנם עסקים שלא מוקצה להם "
|
|
||||||
"מספר עסק. מספר עסק יוגדר כחובה בכל המדינות הנבחרות."
|
|
||||||
|
|
||||||
#: pretix/base/settings.py:685
|
#: pretix/base/settings.py:685
|
||||||
msgid "Invoice address explanation"
|
msgid "Invoice address explanation"
|
||||||
@@ -10100,12 +10172,10 @@ msgid ""
|
|||||||
"Automatic based on ticket-specific validity, membership validity, event "
|
"Automatic based on ticket-specific validity, membership validity, event "
|
||||||
"series date, or event date"
|
"series date, or event date"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"אוטומטי בהתאם לזמינות הכרטיס הספציפי, זמינות המנוי, תאריכי סדרת האירועים או "
|
|
||||||
"תאריך האירוע"
|
|
||||||
|
|
||||||
#: pretix/base/settings.py:1179 pretix/base/settings.py:1190
|
#: pretix/base/settings.py:1179 pretix/base/settings.py:1190
|
||||||
msgid "Automatic, but prefer invoice date over event date"
|
msgid "Automatic, but prefer invoice date over event date"
|
||||||
msgstr "אוטומטי, אבל העדף תאריך חשבונית על תאריך אירוע"
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/settings.py:1182 pretix/base/settings.py:1193
|
#: pretix/base/settings.py:1182 pretix/base/settings.py:1193
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
@@ -10126,7 +10196,6 @@ msgid ""
|
|||||||
"This controls what dates are shown on the invoice, but is especially "
|
"This controls what dates are shown on the invoice, but is especially "
|
||||||
"important for electronic invoicing."
|
"important for electronic invoicing."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"זה שולט על איזה תאריכים מוצגים על החשבונית, ובמיוחד חשוב לחשבוניות דיגיטליות."
|
|
||||||
|
|
||||||
#: pretix/base/settings.py:1206
|
#: pretix/base/settings.py:1206
|
||||||
msgid "Automatically cancel and reissue invoice on address changes"
|
msgid "Automatically cancel and reissue invoice on address changes"
|
||||||
@@ -12698,7 +12767,7 @@ msgstr "אם זה לוקח יותר מכמה דקות, רענן את הדף או
|
|||||||
#: pretix/base/templates/pretixbase/email/cancel_confirm.txt:2
|
#: pretix/base/templates/pretixbase/email/cancel_confirm.txt:2
|
||||||
msgid ""
|
msgid ""
|
||||||
"You have requested us to cancel an event which includes a larger bulk-refund:"
|
"You have requested us to cancel an event which includes a larger bulk-refund:"
|
||||||
msgstr "ביקשת מאיתנו לבטל אירוע שכולל החזר כספי גדול יותר:"
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/base/templates/pretixbase/email/cancel_confirm.txt:6
|
#: pretix/base/templates/pretixbase/email/cancel_confirm.txt:6
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
@@ -12711,7 +12780,6 @@ msgid ""
|
|||||||
"Please confirm that you want to proceed by coping the following confirmation "
|
"Please confirm that you want to proceed by coping the following confirmation "
|
||||||
"code into the cancellation form:"
|
"code into the cancellation form:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"נא לאשר שברצונך להמשיך באמצעות העתקה של קוד האימות הבא לתוך טופס הביטול:"
|
|
||||||
|
|
||||||
#: pretix/base/templates/pretixbase/email/email_footer.html:3
|
#: pretix/base/templates/pretixbase/email/email_footer.html:3
|
||||||
#, python-format
|
#, python-format
|
||||||
@@ -13389,7 +13457,7 @@ msgstr "כל השערים"
|
|||||||
|
|
||||||
#: pretix/control/forms/checkin.py:222
|
#: pretix/control/forms/checkin.py:222
|
||||||
msgid "I am sure that the check-in state of the entire event should be reset."
|
msgid "I am sure that the check-in state of the entire event should be reset."
|
||||||
msgstr "אני בטוח שמצב הצ'ק אין של האירוע צריך לעבור איפוס."
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/forms/event.py:91
|
#: pretix/control/forms/event.py:91
|
||||||
msgid "Use languages"
|
msgid "Use languages"
|
||||||
@@ -13488,7 +13556,7 @@ msgstr "ברירת מחדל ({value})"
|
|||||||
|
|
||||||
#: pretix/control/forms/event.py:381
|
#: pretix/control/forms/event.py:381
|
||||||
msgid "The currency cannot be changed because orders already exist."
|
msgid "The currency cannot be changed because orders already exist."
|
||||||
msgstr "לא ניתן לבצע שינוי בסוג המטבע מאחר והזמנות כבר קיימות."
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/forms/event.py:392 pretix/control/forms/event.py:405
|
#: pretix/control/forms/event.py:392 pretix/control/forms/event.py:405
|
||||||
msgid "Domain"
|
msgid "Domain"
|
||||||
@@ -13576,7 +13644,7 @@ msgstr "כולל כל המיסים"
|
|||||||
|
|
||||||
#: pretix/control/forms/event.py:815
|
#: pretix/control/forms/event.py:815
|
||||||
msgid "Recommended if you sell tickets at least partly to consumers."
|
msgid "Recommended if you sell tickets at least partly to consumers."
|
||||||
msgstr "מומלץ אם תמכור כרטיסים לפחות חלקית ללקוחות."
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/forms/event.py:819
|
#: pretix/control/forms/event.py:819
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
@@ -13587,7 +13655,7 @@ msgstr "כל העתיד (לא כולל היום)"
|
|||||||
|
|
||||||
#: pretix/control/forms/event.py:820
|
#: pretix/control/forms/event.py:820
|
||||||
msgid "Recommended only if you sell tickets primarily to business customers."
|
msgid "Recommended only if you sell tickets primarily to business customers."
|
||||||
msgstr "מומלץ רק אם תמכור כרטיסים בעיקר ללקוחות עסקיים."
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/forms/event.py:856
|
#: pretix/control/forms/event.py:856
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
@@ -13817,7 +13885,6 @@ msgid ""
|
|||||||
"This will only be used if the invoice is sent to a different email address "
|
"This will only be used if the invoice is sent to a different email address "
|
||||||
"or at a different time than the order confirmation."
|
"or at a different time than the order confirmation."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"זה ישומש רק אם החשבונית תישלח לכתובת מייל אחרת או בזמן אחר מאישור ההזמנה."
|
|
||||||
|
|
||||||
#: pretix/control/forms/event.py:1321
|
#: pretix/control/forms/event.py:1321
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -14268,7 +14335,7 @@ msgstr "שולם"
|
|||||||
#: pretix/control/forms/filter.py:1304
|
#: pretix/control/forms/filter.py:1304
|
||||||
msgctxt "subevent"
|
msgctxt "subevent"
|
||||||
msgid "Date doesn't start in selected date range."
|
msgid "Date doesn't start in selected date range."
|
||||||
msgstr "תאריך לא מתחיל בטווח התאריכים שנבחר."
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/forms/filter.py:1360 pretix/control/forms/filter.py:1827
|
#: pretix/control/forms/filter.py:1360 pretix/control/forms/filter.py:1827
|
||||||
msgid "Shop live and presale running"
|
msgid "Shop live and presale running"
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -8,8 +8,8 @@ msgstr ""
|
|||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2026-01-26 13:19+0000\n"
|
"POT-Creation-Date: 2026-01-26 13:19+0000\n"
|
||||||
"PO-Revision-Date: 2026-02-10 16:49+0000\n"
|
"PO-Revision-Date: 2025-12-19 00:00+0000\n"
|
||||||
"Last-Translator: Michele Pagnozzi <michele.pagnozzi@gmail.com>\n"
|
"Last-Translator: Daniel Branda <daniel.branda.ad@gmail.com>\n"
|
||||||
"Language-Team: Italian <https://translate.pretix.eu/projects/pretix/pretix/"
|
"Language-Team: Italian <https://translate.pretix.eu/projects/pretix/pretix/"
|
||||||
"it/>\n"
|
"it/>\n"
|
||||||
"Language: it\n"
|
"Language: it\n"
|
||||||
@@ -17,7 +17,7 @@ msgstr ""
|
|||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||||
"X-Generator: Weblate 5.15.2\n"
|
"X-Generator: Weblate 5.15\n"
|
||||||
|
|
||||||
#: pretix/_base_settings.py:87
|
#: pretix/_base_settings.py:87
|
||||||
msgid "English"
|
msgid "English"
|
||||||
@@ -966,7 +966,7 @@ msgstr "Indirizzo di fatturazione dell'azienda"
|
|||||||
#: pretix/base/exporters/orderlist.py:688
|
#: pretix/base/exporters/orderlist.py:688
|
||||||
#: pretix/base/exporters/orderlist.py:692 pretix/base/pdf.py:341
|
#: pretix/base/exporters/orderlist.py:692 pretix/base/pdf.py:341
|
||||||
msgid "Invoice address name"
|
msgid "Invoice address name"
|
||||||
msgstr "Indirizzo di fatturazione"
|
msgstr "Nome dell'indirizzo di fatturazione"
|
||||||
|
|
||||||
#: pretix/base/datasync/sourcefields.py:317
|
#: pretix/base/datasync/sourcefields.py:317
|
||||||
#: pretix/base/exporters/orderlist.py:694 pretix/base/pdf.py:351
|
#: pretix/base/exporters/orderlist.py:694 pretix/base/pdf.py:351
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ msgstr ""
|
|||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2026-01-26 09:10+0000\n"
|
"POT-Creation-Date: 2026-01-26 09:10+0000\n"
|
||||||
"PO-Revision-Date: 2026-02-10 16:49+0000\n"
|
"PO-Revision-Date: 2025-05-05 09:40+0000\n"
|
||||||
"Last-Translator: Raffaele Doretto <ced@comune.portogruaro.ve.it>\n"
|
"Last-Translator: \"Luca Martinelli [Sannita]\" <sannita@gmail.com>\n"
|
||||||
"Language-Team: Italian <https://translate.pretix.eu/projects/pretix/pretix-"
|
"Language-Team: Italian <https://translate.pretix.eu/projects/pretix/pretix-"
|
||||||
"js/it/>\n"
|
"js/it/>\n"
|
||||||
"Language: it\n"
|
"Language: it\n"
|
||||||
@@ -17,7 +17,7 @@ msgstr ""
|
|||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||||
"X-Generator: Weblate 5.15.2\n"
|
"X-Generator: Weblate 5.11.1\n"
|
||||||
|
|
||||||
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
|
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
|
||||||
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
|
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
|
||||||
@@ -1134,9 +1134,6 @@ msgid ""
|
|||||||
"add yourself to the waiting list. We will then notify if seats are available "
|
"add yourself to the waiting list. We will then notify if seats are available "
|
||||||
"again."
|
"again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Alcune o tutte le categorie di biglietti sono attualmente esaurite. Se lo "
|
|
||||||
"desideri, puoi aggiungerti alla lista d'attesa. Ti informeremo se i posti "
|
|
||||||
"saranno nuovamente disponibili."
|
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js:76
|
#: pretix/static/pretixpresale/js/widget/widget.js:76
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -8,8 +8,8 @@ msgstr ""
|
|||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2026-01-26 09:10+0000\n"
|
"POT-Creation-Date: 2026-01-26 09:10+0000\n"
|
||||||
"PO-Revision-Date: 2026-02-12 20:00+0000\n"
|
"PO-Revision-Date: 2026-01-28 18:00+0000\n"
|
||||||
"Last-Translator: Yasunobu YesNo Kawaguchi <kawaguti@gmail.com>\n"
|
"Last-Translator: Ryo Tagami <rtagami@airstrip.jp>\n"
|
||||||
"Language-Team: Japanese <https://translate.pretix.eu/projects/pretix/pretix-"
|
"Language-Team: Japanese <https://translate.pretix.eu/projects/pretix/pretix-"
|
||||||
"js/ja/>\n"
|
"js/ja/>\n"
|
||||||
"Language: ja\n"
|
"Language: ja\n"
|
||||||
@@ -27,7 +27,7 @@ msgstr "支払い済み"
|
|||||||
|
|
||||||
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:76
|
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:76
|
||||||
msgid "Comment:"
|
msgid "Comment:"
|
||||||
msgstr "コメント:"
|
msgstr "注釈:"
|
||||||
|
|
||||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:34
|
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:34
|
||||||
msgid "PayPal"
|
msgid "PayPal"
|
||||||
@@ -157,7 +157,7 @@ msgstr "受注件数"
|
|||||||
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:15
|
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:15
|
||||||
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:63
|
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:63
|
||||||
msgid "Paid orders"
|
msgid "Paid orders"
|
||||||
msgstr "支払い済み件数"
|
msgstr "支払い済みの注文"
|
||||||
|
|
||||||
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:27
|
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:27
|
||||||
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:39
|
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:39
|
||||||
@@ -167,7 +167,7 @@ msgstr "参加者 (注文済み)"
|
|||||||
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:27
|
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:27
|
||||||
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:39
|
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:39
|
||||||
msgid "Attendees (paid)"
|
msgid "Attendees (paid)"
|
||||||
msgstr "参加者 (支払い済み)"
|
msgstr "参加者 (有料)"
|
||||||
|
|
||||||
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:51
|
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:51
|
||||||
msgid "Total revenue"
|
msgid "Total revenue"
|
||||||
@@ -215,7 +215,7 @@ msgstr "このチケットは特別な対応が必要です"
|
|||||||
|
|
||||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:37
|
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:37
|
||||||
msgid "Switch direction"
|
msgid "Switch direction"
|
||||||
msgstr "向きを切り替え"
|
msgstr "方向転換"
|
||||||
|
|
||||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:38
|
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:38
|
||||||
msgid "Entry"
|
msgid "Entry"
|
||||||
@@ -223,7 +223,7 @@ msgstr "入場"
|
|||||||
|
|
||||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:39
|
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:39
|
||||||
msgid "Exit"
|
msgid "Exit"
|
||||||
msgstr "退場"
|
msgstr "退出"
|
||||||
|
|
||||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:40
|
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:40
|
||||||
msgid "Scan a ticket or search and press return…"
|
msgid "Scan a ticket or search and press return…"
|
||||||
@@ -297,7 +297,7 @@ msgstr "不明なチケット"
|
|||||||
|
|
||||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:59
|
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:59
|
||||||
msgid "Ticket type not allowed here"
|
msgid "Ticket type not allowed here"
|
||||||
msgstr "この種類のチケットはここでは使用できません"
|
msgstr "この種類のチケットは使用できません"
|
||||||
|
|
||||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:61
|
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:61
|
||||||
msgid "Entry not allowed"
|
msgid "Entry not allowed"
|
||||||
@@ -321,7 +321,7 @@ msgstr "注文がキャンセルされました"
|
|||||||
|
|
||||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:66
|
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:66
|
||||||
msgid "Ticket code is ambiguous on list"
|
msgid "Ticket code is ambiguous on list"
|
||||||
msgstr "リスト上でチケットコードが一意に特定できません"
|
msgstr "リストのチケットコードは曖昧です"
|
||||||
|
|
||||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:67
|
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:67
|
||||||
msgid "Order not approved"
|
msgid "Order not approved"
|
||||||
@@ -358,7 +358,7 @@ msgstr "閉じる"
|
|||||||
#: pretix/static/pretixbase/js/addressform.js:101
|
#: pretix/static/pretixbase/js/addressform.js:101
|
||||||
#: pretix/static/pretixpresale/js/ui/main.js:529
|
#: pretix/static/pretixpresale/js/ui/main.js:529
|
||||||
msgid "required"
|
msgid "required"
|
||||||
msgstr "必須"
|
msgstr "必要"
|
||||||
|
|
||||||
#: pretix/static/pretixbase/js/asynctask.js:13
|
#: pretix/static/pretixbase/js/asynctask.js:13
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -370,7 +370,8 @@ msgstr ""
|
|||||||
|
|
||||||
#: pretix/static/pretixbase/js/asynctask.js:17
|
#: pretix/static/pretixbase/js/asynctask.js:17
|
||||||
msgid "Your request has been queued on the server and will soon be processed."
|
msgid "Your request has been queued on the server and will soon be processed."
|
||||||
msgstr "お客様のリクエストはサーバーで受け付けられました。まもなく処理されます。"
|
msgstr ""
|
||||||
|
"サーバへ送信されたリクエスト順にお応えしています。今しばらくお待ちください。"
|
||||||
|
|
||||||
#: pretix/static/pretixbase/js/asynctask.js:21
|
#: pretix/static/pretixbase/js/asynctask.js:21
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -393,7 +394,8 @@ msgstr "{code} のエラーが発生しました。"
|
|||||||
msgid ""
|
msgid ""
|
||||||
"We currently cannot reach the server, but we keep trying. Last error code: "
|
"We currently cannot reach the server, but we keep trying. Last error code: "
|
||||||
"{code}"
|
"{code}"
|
||||||
msgstr "現在サーバへの接続ができませんが、接続試行中です。最新のエラーコード: {code}"
|
msgstr ""
|
||||||
|
"現在サーバへの接続ができませんが、接続試行中です。エラーコード: {code}"
|
||||||
|
|
||||||
#: pretix/static/pretixbase/js/asynctask.js:162
|
#: pretix/static/pretixbase/js/asynctask.js:162
|
||||||
#: pretix/static/pretixcontrol/js/ui/mail.js:21
|
#: pretix/static/pretixcontrol/js/ui/mail.js:21
|
||||||
@@ -417,8 +419,9 @@ msgid ""
|
|||||||
"than one minute, please check your internet connection and then reload this "
|
"than one minute, please check your internet connection and then reload this "
|
||||||
"page and try again."
|
"page and try again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"現在リクエストをサーバへ送信中です。1分以上経っても応答がない場合は、"
|
"リクエストがサーバへ送信されました。1分以上経っても応答がない場合は、イン"
|
||||||
"インターネット接続を確認し、このページを再読み込みして再試行してください。"
|
"ターネット接続を確認してください。確認完了後、ウェブページを再度読込み、再試"
|
||||||
|
"行してください。"
|
||||||
|
|
||||||
#: pretix/static/pretixbase/js/asynctask.js:276
|
#: pretix/static/pretixbase/js/asynctask.js:276
|
||||||
msgid "If this takes longer than a few minutes, please contact us."
|
msgid "If this takes longer than a few minutes, please contact us."
|
||||||
@@ -426,7 +429,7 @@ msgstr "数分以上かかる場合は、お問い合わせください。"
|
|||||||
|
|
||||||
#: pretix/static/pretixbase/js/asynctask.js:331
|
#: pretix/static/pretixbase/js/asynctask.js:331
|
||||||
msgid "Close message"
|
msgid "Close message"
|
||||||
msgstr "メッセージを閉じる"
|
msgstr "閉じる"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/clipboard.js:23
|
#: pretix/static/pretixcontrol/js/clipboard.js:23
|
||||||
msgid "Copied!"
|
msgid "Copied!"
|
||||||
@@ -440,7 +443,7 @@ msgstr "Ctrl-Cを押してコピー!"
|
|||||||
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:18
|
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:18
|
||||||
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:24
|
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:24
|
||||||
msgid "is one of"
|
msgid "is one of"
|
||||||
msgstr "次のいずれか"
|
msgstr "の一つです"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:30
|
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:30
|
||||||
msgid "is before"
|
msgid "is before"
|
||||||
@@ -520,7 +523,7 @@ msgstr "以下のすべての条件(AND)"
|
|||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:183
|
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:183
|
||||||
msgid "At least one of the conditions below (OR)"
|
msgid "At least one of the conditions below (OR)"
|
||||||
msgstr "以下の条件のうち、最低1つ(OR)"
|
msgstr "以下の条件のうち、最低1つ(または)"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:184
|
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:184
|
||||||
msgid "Event start"
|
msgid "Event start"
|
||||||
@@ -561,16 +564,16 @@ msgstr "複製"
|
|||||||
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:193
|
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:193
|
||||||
msgctxt "entry_status"
|
msgctxt "entry_status"
|
||||||
msgid "present"
|
msgid "present"
|
||||||
msgstr "入場中"
|
msgstr "出席"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:194
|
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:194
|
||||||
msgctxt "entry_status"
|
msgctxt "entry_status"
|
||||||
msgid "absent"
|
msgid "absent"
|
||||||
msgstr "未入場"
|
msgstr "欠席"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:289
|
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:289
|
||||||
msgid "Error: Product not found!"
|
msgid "Error: Product not found!"
|
||||||
msgstr "エラー:商品が見つかりません!"
|
msgstr "エラー:製品が見つかりません!"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:296
|
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:296
|
||||||
msgid "Error: Variation not found!"
|
msgid "Error: Variation not found!"
|
||||||
@@ -582,7 +585,7 @@ msgstr "チェックイン用QRコード"
|
|||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/editor.js:549
|
#: pretix/static/pretixcontrol/js/ui/editor.js:549
|
||||||
msgid "The PDF background file could not be loaded for the following reason:"
|
msgid "The PDF background file could not be loaded for the following reason:"
|
||||||
msgstr "以下の理由によりPDF背景ファイルの読み込みに失敗しました:"
|
msgstr "以下の理由によりPDFファイルの読み込みに失敗しました:"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/editor.js:904
|
#: pretix/static/pretixcontrol/js/ui/editor.js:904
|
||||||
msgid "Group of objects"
|
msgid "Group of objects"
|
||||||
@@ -590,7 +593,7 @@ msgstr "オブジェクトグループ"
|
|||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/editor.js:909
|
#: pretix/static/pretixcontrol/js/ui/editor.js:909
|
||||||
msgid "Text object (deprecated)"
|
msgid "Text object (deprecated)"
|
||||||
msgstr "テキストオブジェクト(非推奨)"
|
msgstr "テキストオブジェクト (廃止済)"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/editor.js:911
|
#: pretix/static/pretixcontrol/js/ui/editor.js:911
|
||||||
msgid "Text box"
|
msgid "Text box"
|
||||||
@@ -606,7 +609,7 @@ msgstr "画像エリア"
|
|||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/editor.js:917
|
#: pretix/static/pretixcontrol/js/ui/editor.js:917
|
||||||
msgid "Powered by pretix"
|
msgid "Powered by pretix"
|
||||||
msgstr "Powered by pretix"
|
msgstr "Pretixのイベントチケット売り場"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/editor.js:919
|
#: pretix/static/pretixcontrol/js/ui/editor.js:919
|
||||||
msgid "Object"
|
msgid "Object"
|
||||||
@@ -644,24 +647,24 @@ msgstr "不明なエラー。"
|
|||||||
#: pretix/static/pretixcontrol/js/ui/main.js:309
|
#: pretix/static/pretixcontrol/js/ui/main.js:309
|
||||||
msgid "Your color has great contrast and will provide excellent accessibility."
|
msgid "Your color has great contrast and will provide excellent accessibility."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"選択した色は素晴らしいコントラストを持ち、優れたアクセシビリティを提供します"
|
"あなたの色は素晴らしいコントラストを持ち、優れたアクセシビリティを提供しま"
|
||||||
"。"
|
"す。"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:313
|
#: pretix/static/pretixcontrol/js/ui/main.js:313
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has decent contrast and is sufficient for minimum accessibility "
|
"Your color has decent contrast and is sufficient for minimum accessibility "
|
||||||
"requirements."
|
"requirements."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"選択した色は適切なコントラストを持ち、最小限のアクセシビリティ要件に十分です"
|
"あなたの色は適切なコントラストを持ち、最小限のアクセシビリティ要件に十分で"
|
||||||
"。"
|
"す。"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:317
|
#: pretix/static/pretixcontrol/js/ui/main.js:317
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your color has insufficient contrast to white. Accessibility of your site "
|
"Your color has insufficient contrast to white. Accessibility of your site "
|
||||||
"will be impacted."
|
"will be impacted."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"選択した色は白に対して十分なコントラストがありません。サイトの"
|
"あなたの色は白に対して十分なコントラストがありません。サイトのアクセシビリ"
|
||||||
"アクセシビリティに影響します。"
|
"ティに影響します。"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:443
|
#: pretix/static/pretixcontrol/js/ui/main.js:443
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:463
|
#: pretix/static/pretixcontrol/js/ui/main.js:463
|
||||||
@@ -674,7 +677,7 @@ msgstr "全て"
|
|||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:462
|
#: pretix/static/pretixcontrol/js/ui/main.js:462
|
||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr "なし"
|
msgstr "ない"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:466
|
#: pretix/static/pretixcontrol/js/ui/main.js:466
|
||||||
msgid "Selected only"
|
msgid "Selected only"
|
||||||
@@ -690,7 +693,7 @@ msgstr "無効なページ番号。"
|
|||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1000
|
#: pretix/static/pretixcontrol/js/ui/main.js:1000
|
||||||
msgid "Use a different name internally"
|
msgid "Use a different name internally"
|
||||||
msgstr "内部で別の名前を使用する"
|
msgstr "内部で別の名前を使用してください"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:1040
|
#: pretix/static/pretixcontrol/js/ui/main.js:1040
|
||||||
msgid "Click to close"
|
msgid "Click to close"
|
||||||
@@ -719,15 +722,15 @@ msgstr "カウント"
|
|||||||
#: pretix/static/pretixcontrol/js/ui/subevent.js:112
|
#: pretix/static/pretixcontrol/js/ui/subevent.js:112
|
||||||
msgid "(one more date)"
|
msgid "(one more date)"
|
||||||
msgid_plural "({num} more dates)"
|
msgid_plural "({num} more dates)"
|
||||||
msgstr[0] "(他に{num}件の日程)"
|
msgstr[0] "({num} 他の日程)"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/ui/cart.js:47
|
#: pretix/static/pretixpresale/js/ui/cart.js:47
|
||||||
msgid ""
|
msgid ""
|
||||||
"The items in your cart are no longer reserved for you. You can still "
|
"The items in your cart are no longer reserved for you. You can still "
|
||||||
"complete your order as long as they’re available."
|
"complete your order as long as they’re available."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"カート内のアイテムの予約が解除されました。在庫がある限り、引き続き注文を完了"
|
"カートに入っている商品は現在売り切れです。在庫があれば、このまま注文を完了す"
|
||||||
"できます。"
|
"ることができます。"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/ui/cart.js:49
|
#: pretix/static/pretixpresale/js/ui/cart.js:49
|
||||||
msgid "Cart expired"
|
msgid "Cart expired"
|
||||||
@@ -741,27 +744,27 @@ msgstr "カートの有効期限が近づいています。"
|
|||||||
#: pretix/static/pretixpresale/js/ui/cart.js:62
|
#: pretix/static/pretixpresale/js/ui/cart.js:62
|
||||||
msgid "The items in your cart are reserved for you for one minute."
|
msgid "The items in your cart are reserved for you for one minute."
|
||||||
msgid_plural "The items in your cart are reserved for you for {num} minutes."
|
msgid_plural "The items in your cart are reserved for you for {num} minutes."
|
||||||
msgstr[0] "カート内の商品はあと {num} 分間確保されています。"
|
msgstr[0] "カート内の商品の予約は {num} 分以内に完了します。"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/ui/cart.js:83
|
#: pretix/static/pretixpresale/js/ui/cart.js:83
|
||||||
msgid "Your cart has expired."
|
msgid "Your cart has expired."
|
||||||
msgstr "カートの有効期限が切れています。"
|
msgstr "カートの保存期限が切れています。"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/ui/cart.js:86
|
#: pretix/static/pretixpresale/js/ui/cart.js:86
|
||||||
msgid ""
|
msgid ""
|
||||||
"The items in your cart are no longer reserved for you. You can still "
|
"The items in your cart are no longer reserved for you. You can still "
|
||||||
"complete your order as long as they're available."
|
"complete your order as long as they're available."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"カート内の商品の確保期限が切れました。在庫があれば、このまま注文を完了するこ"
|
"カート内の商品の予約期限が切れました。在庫があれば、このまま注文を完了するこ"
|
||||||
"とができます。"
|
"とができます。"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/ui/cart.js:87
|
#: pretix/static/pretixpresale/js/ui/cart.js:87
|
||||||
msgid "Do you want to renew the reservation period?"
|
msgid "Do you want to renew the reservation period?"
|
||||||
msgstr "確保期間を更新しますか?"
|
msgstr "予約の期間を更新しますか?"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/ui/cart.js:90
|
#: pretix/static/pretixpresale/js/ui/cart.js:90
|
||||||
msgid "Renew reservation"
|
msgid "Renew reservation"
|
||||||
msgstr "確保を更新"
|
msgstr "予約を更新"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/ui/main.js:194
|
#: pretix/static/pretixpresale/js/ui/main.js:194
|
||||||
msgid "The organizer keeps %(currency)s %(amount)s"
|
msgid "The organizer keeps %(currency)s %(amount)s"
|
||||||
@@ -777,7 +780,7 @@ msgstr "主催者が留保する料金を入力してください。"
|
|||||||
|
|
||||||
#: pretix/static/pretixpresale/js/ui/main.js:577
|
#: pretix/static/pretixpresale/js/ui/main.js:577
|
||||||
msgid "Your local time:"
|
msgid "Your local time:"
|
||||||
msgstr "お使いの地域の時刻:"
|
msgstr "現地時間:"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/walletdetection.js:39
|
#: pretix/static/pretixpresale/js/walletdetection.js:39
|
||||||
msgid "Google Pay"
|
msgid "Google Pay"
|
||||||
@@ -860,7 +863,7 @@ msgstr "登録"
|
|||||||
#: pretix/static/pretixpresale/js/widget/widget.js:30
|
#: pretix/static/pretixpresale/js/widget/widget.js:30
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
msgid "Reserved"
|
msgid "Reserved"
|
||||||
msgstr "予約済み"
|
msgstr "予約完了"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js:31
|
#: pretix/static/pretixpresale/js/widget/widget.js:31
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
@@ -876,7 +879,7 @@ msgstr "%(currency)s %(price)sから"
|
|||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
msgid "Image of %s"
|
msgid "Image of %s"
|
||||||
msgstr "%sの画像"
|
msgstr "%sのイメージ"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js:34
|
#: pretix/static/pretixpresale/js/widget/widget.js:34
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
@@ -886,7 +889,7 @@ msgstr "%(rate)s% %(taxname)s込"
|
|||||||
#: pretix/static/pretixpresale/js/widget/widget.js:35
|
#: pretix/static/pretixpresale/js/widget/widget.js:35
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
msgid "plus %(rate)s% %(taxname)s"
|
msgid "plus %(rate)s% %(taxname)s"
|
||||||
msgstr "別途%(rate)s% %(taxname)s"
|
msgstr "%(rate)s% %(taxname)s抜"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js:36
|
#: pretix/static/pretixpresale/js/widget/widget.js:36
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
@@ -896,13 +899,13 @@ msgstr "税込"
|
|||||||
#: pretix/static/pretixpresale/js/widget/widget.js:37
|
#: pretix/static/pretixpresale/js/widget/widget.js:37
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
msgid "plus taxes"
|
msgid "plus taxes"
|
||||||
msgstr "税別"
|
msgstr "税抜"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js:38
|
#: pretix/static/pretixpresale/js/widget/widget.js:38
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
msgid "currently available: %s"
|
msgid "currently available: %s"
|
||||||
msgstr "現在の残数: %s"
|
msgstr "現在%s使用可能"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js:39
|
#: pretix/static/pretixpresale/js/widget/widget.js:39
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
@@ -918,7 +921,7 @@ msgstr "提供開始前"
|
|||||||
#: pretix/static/pretixpresale/js/widget/widget.js:41
|
#: pretix/static/pretixpresale/js/widget/widget.js:41
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
msgid "Not available anymore"
|
msgid "Not available anymore"
|
||||||
msgstr "提供終了"
|
msgstr "今後の提供不可"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js:42
|
#: pretix/static/pretixpresale/js/widget/widget.js:42
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
@@ -934,7 +937,7 @@ msgstr "最小注文数量:%s"
|
|||||||
#: pretix/static/pretixpresale/js/widget/widget.js:45
|
#: pretix/static/pretixpresale/js/widget/widget.js:45
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
msgid "Close ticket shop"
|
msgid "Close ticket shop"
|
||||||
msgstr "チケットショップを閉じる"
|
msgstr "チケットショップ閉店"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js:46
|
#: pretix/static/pretixpresale/js/widget/widget.js:46
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
@@ -947,8 +950,8 @@ msgid ""
|
|||||||
"There are currently a lot of users in this ticket shop. Please open the shop "
|
"There are currently a lot of users in this ticket shop. Please open the shop "
|
||||||
"in a new tab to continue."
|
"in a new tab to continue."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"現在チケットショップが混み合っています。新しいタブでチケットショップを開いて"
|
"現在チケットショップが混み合っています。新しいタブでチケットショップを開き続"
|
||||||
"続行してください。"
|
"行してください。"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js:49
|
#: pretix/static/pretixpresale/js/widget/widget.js:49
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
@@ -972,7 +975,7 @@ msgid ""
|
|||||||
"this ticket shop. Please click \"Continue\" to retry in a new tab."
|
"this ticket shop. Please click \"Continue\" to retry in a new tab."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"現在チケットショップが混雑しているため、お客様のカートを作ることができません"
|
"現在チケットショップが混雑しているため、お客様のカートを作ることができません"
|
||||||
"でした。\"続ける\"をクリックして、新しいタブで再試行してください。"
|
"でした。新しいタブを開き「次へ」をクリックしてください。"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js:54
|
#: pretix/static/pretixpresale/js/widget/widget.js:54
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
@@ -985,8 +988,8 @@ msgid ""
|
|||||||
"You currently have an active cart for this event. If you select more "
|
"You currently have an active cart for this event. If you select more "
|
||||||
"products, they will be added to your existing cart."
|
"products, they will be added to your existing cart."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"このイベントのカートに商品が入っています。商品を追加すると、既存のカートに追"
|
"お客様のカートはイベントの申し込みに有効です。商品を選択し、カートへ追加して"
|
||||||
"加されます。"
|
"ください。"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js:57
|
#: pretix/static/pretixpresale/js/widget/widget.js:57
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
@@ -1076,7 +1079,7 @@ msgstr "前週"
|
|||||||
#: pretix/static/pretixpresale/js/widget/widget.js:74
|
#: pretix/static/pretixpresale/js/widget/widget.js:74
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
msgid "Open seat selection"
|
msgid "Open seat selection"
|
||||||
msgstr "座席選択を開く"
|
msgstr "座席一覧を開く"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js:75
|
#: pretix/static/pretixpresale/js/widget/widget.js:75
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
|
|||||||
@@ -8,16 +8,16 @@ msgstr ""
|
|||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2026-01-26 13:19+0000\n"
|
"POT-Creation-Date: 2026-01-26 13:19+0000\n"
|
||||||
"PO-Revision-Date: 2026-02-01 21:00+0000\n"
|
"PO-Revision-Date: 2025-12-03 23:00+0000\n"
|
||||||
"Last-Translator: z3rrry <z3rrry@gmail.com>\n"
|
"Last-Translator: SJang1 <git@sjang.dev>\n"
|
||||||
"Language-Team: Korean <https://translate.pretix.eu/projects/pretix/pretix/"
|
"Language-Team: Korean <https://translate.pretix.eu/projects/pretix/pretix/ko/"
|
||||||
"ko/>\n"
|
">\n"
|
||||||
"Language: ko\n"
|
"Language: ko\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||||
"X-Generator: Weblate 5.15.2\n"
|
"X-Generator: Weblate 5.14.3\n"
|
||||||
|
|
||||||
#: pretix/_base_settings.py:87
|
#: pretix/_base_settings.py:87
|
||||||
msgid "English"
|
msgid "English"
|
||||||
@@ -2283,9 +2283,6 @@ msgid ""
|
|||||||
"contain at least one position of this product. The order totals etc. still "
|
"contain at least one position of this product. The order totals etc. still "
|
||||||
"include all products contained in the order."
|
"include all products contained in the order."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"아무것도 선택하지 않으면, 모든 상품이 포함됩니다. 상품이 1개 이상 포함되는 "
|
|
||||||
"경우에 주문이 포함됩니다. 주문 합계 등에는 주문에 포함된 모든 상품이 "
|
|
||||||
"포함됩니다."
|
|
||||||
|
|
||||||
#: pretix/base/exporters/orderlist.py:283
|
#: pretix/base/exporters/orderlist.py:283
|
||||||
#: pretix/base/exporters/orderlist.py:478
|
#: pretix/base/exporters/orderlist.py:478
|
||||||
@@ -2549,8 +2546,10 @@ msgid "Voucher"
|
|||||||
msgstr "바우처"
|
msgstr "바우처"
|
||||||
|
|
||||||
#: pretix/base/exporters/orderlist.py:653
|
#: pretix/base/exporters/orderlist.py:653
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Voucher deleted"
|
||||||
msgid "Voucher budget usage"
|
msgid "Voucher budget usage"
|
||||||
msgstr "바우처 예산 사용량"
|
msgstr "바우처 제거됨"
|
||||||
|
|
||||||
#: pretix/base/exporters/orderlist.py:654
|
#: pretix/base/exporters/orderlist.py:654
|
||||||
msgid "Pseudonymization ID"
|
msgid "Pseudonymization ID"
|
||||||
@@ -26785,11 +26784,11 @@ msgstr ""
|
|||||||
|
|
||||||
#: pretix/control/views/dashboards.py:114
|
#: pretix/control/views/dashboards.py:114
|
||||||
msgid "Attendees (ordered)"
|
msgid "Attendees (ordered)"
|
||||||
msgstr "참가자 (정렬된)"
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/views/dashboards.py:124
|
#: pretix/control/views/dashboards.py:124
|
||||||
msgid "Attendees (paid)"
|
msgid "Attendees (paid)"
|
||||||
msgstr "참가자 (결제된)"
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/control/views/dashboards.py:136
|
#: pretix/control/views/dashboards.py:136
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ msgstr ""
|
|||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2026-01-26 09:10+0000\n"
|
"POT-Creation-Date: 2026-01-26 09:10+0000\n"
|
||||||
"PO-Revision-Date: 2026-02-01 21:00+0000\n"
|
"PO-Revision-Date: 2025-11-18 17:00+0000\n"
|
||||||
"Last-Translator: z3rrry <z3rrry@gmail.com>\n"
|
"Last-Translator: Hijiri Umemoto <hijiri@umemoto.org>\n"
|
||||||
"Language-Team: Korean <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
"Language-Team: Korean <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
||||||
"ko/>\n"
|
"ko/>\n"
|
||||||
"Language: ko\n"
|
"Language: ko\n"
|
||||||
@@ -17,7 +17,7 @@ msgstr ""
|
|||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||||
"X-Generator: Weblate 5.15.2\n"
|
"X-Generator: Weblate 5.14.3\n"
|
||||||
|
|
||||||
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
|
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
|
||||||
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
|
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
|
||||||
@@ -175,12 +175,12 @@ msgstr "유료 주문"
|
|||||||
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:27
|
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:27
|
||||||
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:39
|
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:39
|
||||||
msgid "Attendees (ordered)"
|
msgid "Attendees (ordered)"
|
||||||
msgstr "참가자 (정렬된)"
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:27
|
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:27
|
||||||
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:39
|
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:39
|
||||||
msgid "Attendees (paid)"
|
msgid "Attendees (paid)"
|
||||||
msgstr "참가자 (결제된)"
|
msgstr ""
|
||||||
|
|
||||||
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:51
|
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:51
|
||||||
msgid "Total revenue"
|
msgid "Total revenue"
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ msgstr ""
|
|||||||
"Project-Id-Version: 1\n"
|
"Project-Id-Version: 1\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2026-01-26 09:10+0000\n"
|
"POT-Creation-Date: 2026-01-26 09:10+0000\n"
|
||||||
"PO-Revision-Date: 2026-02-05 23:00+0000\n"
|
"PO-Revision-Date: 2026-01-28 00:00+0000\n"
|
||||||
"Last-Translator: Ruud Hendrickx <ruud@leckxicon.eu>\n"
|
"Last-Translator: Ruud Hendrickx <ruud@leckxicon.eu>\n"
|
||||||
"Language-Team: Dutch <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
"Language-Team: Dutch <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
||||||
"nl/>\n"
|
"nl/>\n"
|
||||||
@@ -55,7 +55,7 @@ msgstr "Kredietkaart"
|
|||||||
|
|
||||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:40
|
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:40
|
||||||
msgid "PayPal Pay Later"
|
msgid "PayPal Pay Later"
|
||||||
msgstr "PayPal - Later betalen"
|
msgstr "PayPal Pay Later"
|
||||||
|
|
||||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:41
|
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:41
|
||||||
msgid "iDEAL"
|
msgid "iDEAL"
|
||||||
@@ -186,15 +186,15 @@ msgstr "Verbinding maken met uw bank …"
|
|||||||
|
|
||||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:30
|
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:30
|
||||||
msgid "Select a check-in list"
|
msgid "Select a check-in list"
|
||||||
msgstr "Kies een check-in-lijst"
|
msgstr "Kies een inchecklijst"
|
||||||
|
|
||||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:31
|
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:31
|
||||||
msgid "No active check-in lists found."
|
msgid "No active check-in lists found."
|
||||||
msgstr "Geen actieve check-in-lijsten gevonden."
|
msgstr "Geen actieve check-inlijsten gevonden."
|
||||||
|
|
||||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:32
|
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:32
|
||||||
msgid "Switch check-in list"
|
msgid "Switch check-in list"
|
||||||
msgstr "Andere check-in-lijst kiezen"
|
msgstr "Andere inchecklijst kiezen"
|
||||||
|
|
||||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:33
|
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:33
|
||||||
msgid "Search results"
|
msgid "Search results"
|
||||||
@@ -251,7 +251,7 @@ msgstr "Bevestigd"
|
|||||||
|
|
||||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:47
|
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:47
|
||||||
msgid "Approval pending"
|
msgid "Approval pending"
|
||||||
msgstr "Goedkeuring in behandeling"
|
msgstr "Goedkeuring in afwachting"
|
||||||
|
|
||||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:48
|
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:48
|
||||||
msgid "Redeemed"
|
msgid "Redeemed"
|
||||||
@@ -336,7 +336,7 @@ msgstr "Geldige tickets"
|
|||||||
|
|
||||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:70
|
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:70
|
||||||
msgid "Currently inside"
|
msgid "Currently inside"
|
||||||
msgstr "Nu binnen"
|
msgstr "Op dit moment binnen"
|
||||||
|
|
||||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:71
|
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:71
|
||||||
#: pretix/static/pretixcontrol/js/ui/question.js:136
|
#: pretix/static/pretixcontrol/js/ui/question.js:136
|
||||||
@@ -406,8 +406,8 @@ msgstr "De aanvraag duurde te lang. Probeer het opnieuw."
|
|||||||
msgid ""
|
msgid ""
|
||||||
"We currently cannot reach the server. Please try again. Error code: {code}"
|
"We currently cannot reach the server. Please try again. Error code: {code}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"De server is op dit moment niet bereikbaar. Probeer het opnieuw. Foutcode: "
|
"De server is op dit moment niet bereikbaar. Probeer het alstublieft opnieuw. "
|
||||||
"{code}"
|
"Foutcode: {code}"
|
||||||
|
|
||||||
#: pretix/static/pretixbase/js/asynctask.js:216
|
#: pretix/static/pretixbase/js/asynctask.js:216
|
||||||
msgid "We are processing your request …"
|
msgid "We are processing your request …"
|
||||||
@@ -602,11 +602,11 @@ msgstr "Tekstvak"
|
|||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/editor.js:913
|
#: pretix/static/pretixcontrol/js/ui/editor.js:913
|
||||||
msgid "Barcode area"
|
msgid "Barcode area"
|
||||||
msgstr "Ruimte voor streepjescode"
|
msgstr "Barcode gebied"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/editor.js:915
|
#: pretix/static/pretixcontrol/js/ui/editor.js:915
|
||||||
msgid "Image area"
|
msgid "Image area"
|
||||||
msgstr "Ruimte voor afbeelding"
|
msgstr "Afbeeldingsgebied"
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/editor.js:917
|
#: pretix/static/pretixcontrol/js/ui/editor.js:917
|
||||||
msgid "Powered by pretix"
|
msgid "Powered by pretix"
|
||||||
@@ -664,8 +664,8 @@ msgid ""
|
|||||||
"Your color has insufficient contrast to white. Accessibility of your site "
|
"Your color has insufficient contrast to white. Accessibility of your site "
|
||||||
"will be impacted."
|
"will be impacted."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Uw kleur heeft onvoldoende contrast met wit. Dit heeft invloed op de "
|
"Uw kleur heeft te weinig contrast met wit. De toegankelijkheid van uw site "
|
||||||
"toegankelijkheid van uw website."
|
"wordt negatief beïnvloed."
|
||||||
|
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:443
|
#: pretix/static/pretixcontrol/js/ui/main.js:443
|
||||||
#: pretix/static/pretixcontrol/js/ui/main.js:463
|
#: pretix/static/pretixcontrol/js/ui/main.js:463
|
||||||
@@ -736,7 +736,7 @@ msgstr ""
|
|||||||
|
|
||||||
#: pretix/static/pretixpresale/js/ui/cart.js:49
|
#: pretix/static/pretixpresale/js/ui/cart.js:49
|
||||||
msgid "Cart expired"
|
msgid "Cart expired"
|
||||||
msgstr "Winkelwagen verlopen"
|
msgstr "Winkelwagen is verlopen"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/ui/cart.js:58
|
#: pretix/static/pretixpresale/js/ui/cart.js:58
|
||||||
#: pretix/static/pretixpresale/js/ui/cart.js:84
|
#: pretix/static/pretixpresale/js/ui/cart.js:84
|
||||||
@@ -936,12 +936,12 @@ msgstr "Momenteel niet beschikbaar"
|
|||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
msgid "minimum amount to order: %s"
|
msgid "minimum amount to order: %s"
|
||||||
msgstr "minimale bestelhoeveelheid: %s"
|
msgstr "minimale hoeveelheid om te bestellen: %s"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js:45
|
#: pretix/static/pretixpresale/js/widget/widget.js:45
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
msgid "Close ticket shop"
|
msgid "Close ticket shop"
|
||||||
msgstr "Sluit ticketwinkel"
|
msgstr "Sluit ticketverkoop"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js:46
|
#: pretix/static/pretixpresale/js/widget/widget.js:46
|
||||||
msgctxt "widget"
|
msgctxt "widget"
|
||||||
@@ -1160,51 +1160,51 @@ msgstr "zondag"
|
|||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js:94
|
#: pretix/static/pretixpresale/js/widget/widget.js:94
|
||||||
msgid "January"
|
msgid "January"
|
||||||
msgstr "januari"
|
msgstr "Januari"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js:95
|
#: pretix/static/pretixpresale/js/widget/widget.js:95
|
||||||
msgid "February"
|
msgid "February"
|
||||||
msgstr "februari"
|
msgstr "Februari"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js:96
|
#: pretix/static/pretixpresale/js/widget/widget.js:96
|
||||||
msgid "March"
|
msgid "March"
|
||||||
msgstr "maart"
|
msgstr "Maart"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js:97
|
#: pretix/static/pretixpresale/js/widget/widget.js:97
|
||||||
msgid "April"
|
msgid "April"
|
||||||
msgstr "april"
|
msgstr "April"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js:98
|
#: pretix/static/pretixpresale/js/widget/widget.js:98
|
||||||
msgid "May"
|
msgid "May"
|
||||||
msgstr "mei"
|
msgstr "Mei"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js:99
|
#: pretix/static/pretixpresale/js/widget/widget.js:99
|
||||||
msgid "June"
|
msgid "June"
|
||||||
msgstr "juni"
|
msgstr "Juni"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js:100
|
#: pretix/static/pretixpresale/js/widget/widget.js:100
|
||||||
msgid "July"
|
msgid "July"
|
||||||
msgstr "juli"
|
msgstr "Juli"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js:101
|
#: pretix/static/pretixpresale/js/widget/widget.js:101
|
||||||
msgid "August"
|
msgid "August"
|
||||||
msgstr "augustus"
|
msgstr "Augustus"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js:102
|
#: pretix/static/pretixpresale/js/widget/widget.js:102
|
||||||
msgid "September"
|
msgid "September"
|
||||||
msgstr "september"
|
msgstr "September"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js:103
|
#: pretix/static/pretixpresale/js/widget/widget.js:103
|
||||||
msgid "October"
|
msgid "October"
|
||||||
msgstr "oktober"
|
msgstr "Oktober"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js:104
|
#: pretix/static/pretixpresale/js/widget/widget.js:104
|
||||||
msgid "November"
|
msgid "November"
|
||||||
msgstr "november"
|
msgstr "November"
|
||||||
|
|
||||||
#: pretix/static/pretixpresale/js/widget/widget.js:105
|
#: pretix/static/pretixpresale/js/widget/widget.js:105
|
||||||
msgid "December"
|
msgid "December"
|
||||||
msgstr "december"
|
msgstr "December"
|
||||||
|
|
||||||
#~ msgid "Time zone:"
|
#~ msgid "Time zone:"
|
||||||
#~ msgstr "Tijdzone:"
|
#~ msgstr "Tijdzone:"
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -38,10 +38,13 @@ from i18nfield.strings import LazyI18nString
|
|||||||
|
|
||||||
from pretix.base.email import get_email_context
|
from pretix.base.email import get_email_context
|
||||||
from pretix.base.i18n import language
|
from pretix.base.i18n import language
|
||||||
from pretix.base.models import Checkin, Event, InvoiceAddress, Order, User
|
from pretix.base.models import (
|
||||||
|
CachedFile, Checkin, Event, InvoiceAddress, Order, User,
|
||||||
|
)
|
||||||
from pretix.base.services.mail import mail
|
from pretix.base.services.mail import mail
|
||||||
from pretix.base.services.tasks import ProfiledEventTask
|
from pretix.base.services.tasks import ProfiledEventTask
|
||||||
from pretix.celery_app import app
|
from pretix.celery_app import app
|
||||||
|
from pretix.helpers.format import format_map
|
||||||
|
|
||||||
|
|
||||||
def _chunks(lst, n):
|
def _chunks(lst, n):
|
||||||
@@ -61,6 +64,7 @@ def send_mails_to_orders(event: Event, user: int, subject: dict, message: dict,
|
|||||||
user = User.objects.get(pk=user) if user else None
|
user = User.objects.get(pk=user) if user else None
|
||||||
subject = LazyI18nString(subject)
|
subject = LazyI18nString(subject)
|
||||||
message = LazyI18nString(message)
|
message = LazyI18nString(message)
|
||||||
|
attachments_for_log = [cf.filename for cf in CachedFile.objects.filter(pk__in=attachments)] if attachments else []
|
||||||
|
|
||||||
def _send_to_order(o):
|
def _send_to_order(o):
|
||||||
send_to_order = recipients in ('both', 'orders')
|
send_to_order = recipients in ('both', 'orders')
|
||||||
@@ -118,7 +122,7 @@ def send_mails_to_orders(event: Event, user: int, subject: dict, message: dict,
|
|||||||
|
|
||||||
with language(o.locale, event.settings.region):
|
with language(o.locale, event.settings.region):
|
||||||
email_context = get_email_context(event=event, order=o, invoice_address=ia, position=p)
|
email_context = get_email_context(event=event, order=o, invoice_address=ia, position=p)
|
||||||
outgoing_mail = mail(
|
mail(
|
||||||
p.attendee_email,
|
p.attendee_email,
|
||||||
subject,
|
subject,
|
||||||
message,
|
message,
|
||||||
@@ -131,17 +135,25 @@ def send_mails_to_orders(event: Event, user: int, subject: dict, message: dict,
|
|||||||
attach_ical=attach_ical,
|
attach_ical=attach_ical,
|
||||||
attach_cached_files=attachments
|
attach_cached_files=attachments
|
||||||
)
|
)
|
||||||
if outgoing_mail:
|
o.log_action(
|
||||||
o.log_action(
|
'pretix.plugins.sendmail.order.email.sent.attendee',
|
||||||
'pretix.plugins.sendmail.order.email.sent.attendee',
|
user=user,
|
||||||
user=user,
|
data={
|
||||||
data=outgoing_mail.log_data(),
|
'position': p.positionid,
|
||||||
)
|
'subject': format_map(subject.localize(o.locale), email_context),
|
||||||
|
'message': format_map(message.localize(o.locale), email_context),
|
||||||
|
'recipient': p.attendee_email,
|
||||||
|
'attach_tickets': attach_tickets,
|
||||||
|
'attach_ical': attach_ical,
|
||||||
|
'attach_other_files': [],
|
||||||
|
'attach_cached_files': attachments_for_log,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
if send_to_order and o.email:
|
if send_to_order and o.email:
|
||||||
with language(o.locale, event.settings.region):
|
with language(o.locale, event.settings.region):
|
||||||
email_context = get_email_context(event=event, order=o, invoice_address=ia)
|
email_context = get_email_context(event=event, order=o, invoice_address=ia)
|
||||||
outgoing_mail = mail(
|
mail(
|
||||||
o.email,
|
o.email,
|
||||||
subject,
|
subject,
|
||||||
message,
|
message,
|
||||||
@@ -153,12 +165,19 @@ def send_mails_to_orders(event: Event, user: int, subject: dict, message: dict,
|
|||||||
attach_ical=attach_ical,
|
attach_ical=attach_ical,
|
||||||
attach_cached_files=attachments,
|
attach_cached_files=attachments,
|
||||||
)
|
)
|
||||||
if outgoing_mail:
|
o.log_action(
|
||||||
o.log_action(
|
'pretix.plugins.sendmail.order.email.sent',
|
||||||
'pretix.plugins.sendmail.order.email.sent',
|
user=user,
|
||||||
user=user,
|
data={
|
||||||
data=outgoing_mail.log_data(),
|
'subject': format_map(subject.localize(o.locale), email_context),
|
||||||
)
|
'message': format_map(message.localize(o.locale), email_context),
|
||||||
|
'recipient': o.email,
|
||||||
|
'attach_tickets': attach_tickets,
|
||||||
|
'attach_ical': attach_ical,
|
||||||
|
'attach_other_files': [],
|
||||||
|
'attach_cached_files': attachments_for_log,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
for chunk in _chunks(objects, 1000):
|
for chunk in _chunks(objects, 1000):
|
||||||
orders = Order.objects.filter(pk__in=chunk, event=event)
|
orders = Order.objects.filter(pk__in=chunk, event=event)
|
||||||
|
|||||||
@@ -179,7 +179,6 @@ def _default_context(request):
|
|||||||
ctx['html_page_header'] = "".join(h for h in _html_page_header if h)
|
ctx['html_page_header'] = "".join(h for h in _html_page_header if h)
|
||||||
ctx['footer'] = _footer
|
ctx['footer'] = _footer
|
||||||
ctx['site_url'] = settings.SITE_URL
|
ctx['site_url'] = settings.SITE_URL
|
||||||
ctx['request_get_items'] = request.GET.items()
|
|
||||||
|
|
||||||
ctx['js_datetime_format'] = get_javascript_format_without_seconds('DATETIME_INPUT_FORMATS')
|
ctx['js_datetime_format'] = get_javascript_format_without_seconds('DATETIME_INPUT_FORMATS')
|
||||||
ctx['js_date_format'] = get_javascript_format_without_seconds('DATE_INPUT_FORMATS')
|
ctx['js_date_format'] = get_javascript_format_without_seconds('DATE_INPUT_FORMATS')
|
||||||
|
|||||||
@@ -42,7 +42,7 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
<div id="invoice" class="profile-scope"
|
<div id="invoice" class="profile-scope"
|
||||||
data-profiles-id="addresses_json"
|
data-profiles-id="addresses_json"
|
||||||
data-address-information-url="{% url "js_helpers.address_form" %}?invoice=true&organizer={{ event.organizer.slug|urlencode }}&event={{ event.slug|urlencode }}&locale={{ request.LANGUAGE_CODE }}">
|
data-address-information-url="{% url "js_helpers.address_form" %}?invoice=true&organizer={{ event.organizer.slug|urlencode }}&event={{ event.slug|urlencode }}">
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
{% if addresses_data %}
|
{% if addresses_data %}
|
||||||
<div class="form-group profile-select-container js-do-not-copy-answers">
|
<div class="form-group profile-select-container js-do-not-copy-answers">
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li class="text-center">
|
<li class="text-center">
|
||||||
<form class="form-inline" method="get" id="monthselform" action="{% eventurl event "presale:event.index" cart_namespace=cart_namespace %}">
|
<form class="form-inline" method="get" id="monthselform" action="{% eventurl event "presale:event.index" cart_namespace=cart_namespace %}">
|
||||||
{% for f, v in request_get_items %}
|
{% for f, v in request.GET.items %}
|
||||||
{% if f != "date" %}
|
{% if f != "date" %}
|
||||||
<input type="hidden" name="{{ f }}" value="{{ v }}">
|
<input type="hidden" name="{{ f }}" value="{{ v }}">
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li class="text-center">
|
<li class="text-center">
|
||||||
<form class="form-inline" method="get" id="monthselform" action="{% eventurl event "presale:event.index" cart_namespace=cart_namespace %}">
|
<form class="form-inline" method="get" id="monthselform" action="{% eventurl event "presale:event.index" cart_namespace=cart_namespace %}">
|
||||||
{% for f, v in request_get_items %}
|
{% for f, v in request.GET.items %}
|
||||||
{% if f != "date" %}
|
{% if f != "date" %}
|
||||||
<input type="hidden" name="{{ f }}" value="{{ v }}">
|
<input type="hidden" name="{{ f }}" value="{{ v }}">
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|||||||
@@ -304,7 +304,7 @@
|
|||||||
<dt>{% trans "Phone number" %}</dt>
|
<dt>{% trans "Phone number" %}</dt>
|
||||||
<dd>{{ order.phone|phone_format }}</dd>
|
<dd>{{ order.phone|phone_format }}</dd>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if invoice_address_asked and order.invoice_address.is_business %}
|
{% if invoice_address_asked %}
|
||||||
<dt>{% trans "Company" %}</dt>
|
<dt>{% trans "Company" %}</dt>
|
||||||
<dd>{{ order.invoice_address.company }}</dd>
|
<dd>{{ order.invoice_address.company }}</dd>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|||||||
@@ -36,7 +36,7 @@
|
|||||||
</h4>
|
</h4>
|
||||||
</summary>
|
</summary>
|
||||||
<div id="invoice" class="panel-collapse"
|
<div id="invoice" class="panel-collapse"
|
||||||
data-address-information-url="{% url "js_helpers.address_form" %}?invoice=true&organizer={{ event.organizer.slug|urlencode }}&event={{ event.slug|urlencode }}&locale={{ request.LANGUAGE_CODE }}">
|
data-address-information-url="{% url "js_helpers.address_form" %}?invoice=true&organizer={{ event.organizer.slug|urlencode }}&event={{ event.slug|urlencode }}">
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
{% if event.settings.invoice_address_explanation_text %}
|
{% if event.settings.invoice_address_explanation_text %}
|
||||||
<div>
|
<div>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
{% if filter_form.fields %}
|
{% if filter_form.fields %}
|
||||||
<form class="event-list-filter-form" method="get" data-save-scrollpos>
|
<form class="event-list-filter-form" method="get" data-save-scrollpos>
|
||||||
<input type="hidden" name="filtered" value="1">
|
<input type="hidden" name="filtered" value="1">
|
||||||
{% for f, v in request_get_items %}
|
{% for f, v in request.GET.items %}
|
||||||
{% if f not in filter_form.fields and f != "page" %}
|
{% if f not in filter_form.fields and f != "page" %}
|
||||||
<input type="hidden" name="{{ f }}" value="{{ v }}">
|
<input type="hidden" name="{{ f }}" value="{{ v }}">
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|||||||
@@ -47,7 +47,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li class="text-center">
|
<li class="text-center">
|
||||||
<form class="form-inline" method="get" id="monthselform" action="{% eventurl request.organizer "presale:organizer.index" %}">
|
<form class="form-inline" method="get" id="monthselform" action="{% eventurl request.organizer "presale:organizer.index" %}">
|
||||||
{% for f, v in request_get_items %}
|
{% for f, v in request.GET.items %}
|
||||||
{% if f != "date" %}
|
{% if f != "date" %}
|
||||||
<input type="hidden" name="{{ f }}" value="{{ v }}">
|
<input type="hidden" name="{{ f }}" value="{{ v }}">
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|||||||
@@ -47,7 +47,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li class="text-center">
|
<li class="text-center">
|
||||||
<form class="form-inline" method="get" id="monthselform" action="{% eventurl request.organizer "presale:organizer.index" %}">
|
<form class="form-inline" method="get" id="monthselform" action="{% eventurl request.organizer "presale:organizer.index" %}">
|
||||||
{% for f, v in request_get_items %}
|
{% for f, v in request.GET.items %}
|
||||||
{% if f != "date" %}
|
{% if f != "date" %}
|
||||||
<input type="hidden" name="{{ f }}" value="{{ v }}">
|
<input type="hidden" name="{{ f }}" value="{{ v }}">
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|||||||
@@ -47,7 +47,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li class="text-center">
|
<li class="text-center">
|
||||||
<form class="form-inline" method="get" id="monthselform" action="{% eventurl request.organizer "presale:organizer.index" %}">
|
<form class="form-inline" method="get" id="monthselform" action="{% eventurl request.organizer "presale:organizer.index" %}">
|
||||||
{% for f, v in request_get_items %}
|
{% for f, v in request.GET.items %}
|
||||||
{% if f != "date" %}
|
{% if f != "date" %}
|
||||||
<input type="hidden" name="{{ f }}" value="{{ v }}">
|
<input type="hidden" name="{{ f }}" value="{{ v }}">
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|||||||
@@ -286,7 +286,6 @@ class SetPasswordView(FormView):
|
|||||||
self.customer.is_verified = True
|
self.customer.is_verified = True
|
||||||
self.customer.save()
|
self.customer.save()
|
||||||
self.customer.log_action('pretix.customer.password.set', {})
|
self.customer.log_action('pretix.customer.password.set', {})
|
||||||
self.customer.send_security_notice(_("Your password has been changed."))
|
|
||||||
messages.success(
|
messages.success(
|
||||||
self.request,
|
self.request,
|
||||||
_('Your new password has been set! You can now use it to log in.'),
|
_('Your new password has been set! You can now use it to log in.'),
|
||||||
@@ -542,7 +541,6 @@ class ChangePasswordView(CustomerAccountBaseMixin, FormView):
|
|||||||
customer.set_password(form.cleaned_data['password'])
|
customer.set_password(form.cleaned_data['password'])
|
||||||
customer.save()
|
customer.save()
|
||||||
messages.success(self.request, _('Your changes have been saved.'))
|
messages.success(self.request, _('Your changes have been saved.'))
|
||||||
customer.send_security_notice(_("Your password has been changed."))
|
|
||||||
update_customer_session_auth_hash(self.request, customer)
|
update_customer_session_auth_hash(self.request, customer)
|
||||||
return HttpResponseRedirect(self.get_success_url())
|
return HttpResponseRedirect(self.get_success_url())
|
||||||
|
|
||||||
@@ -633,15 +631,11 @@ class ConfirmChangeView(View):
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
with transaction.atomic():
|
with transaction.atomic():
|
||||||
old_email = customer.email
|
|
||||||
customer.email = data['email']
|
customer.email = data['email']
|
||||||
customer.save()
|
customer.save()
|
||||||
customer.log_action('pretix.customer.changed', {
|
customer.log_action('pretix.customer.changed', {
|
||||||
'email': data['email']
|
'email': data['email']
|
||||||
})
|
})
|
||||||
msg = _('Your email address has been changed from {old_email} to {email}.').format(old_email=old_email, email=customer.email)
|
|
||||||
customer.send_security_notice(msg, email=old_email)
|
|
||||||
customer.send_security_notice(msg, email=customer.email)
|
|
||||||
except IntegrityError:
|
except IntegrityError:
|
||||||
messages.success(request, _('Your email address has not been updated since the address is already in use '
|
messages.success(request, _('Your email address has not been updated since the address is already in use '
|
||||||
'for another customer account.'))
|
'for another customer account.'))
|
||||||
|
|||||||
@@ -674,10 +674,11 @@ var editor = {
|
|||||||
$("#toolbox").find("button[data-action=middle]").toggleClass('active', o.verticalAlign === 'middle');
|
$("#toolbox").find("button[data-action=middle]").toggleClass('active', o.verticalAlign === 'middle');
|
||||||
$("#toolbox").find("button[data-action=bottom]").toggleClass('active', o.verticalAlign === 'bottom');
|
$("#toolbox").find("button[data-action=bottom]").toggleClass('active', o.verticalAlign === 'bottom');
|
||||||
|
|
||||||
|
console.log("_update_toolbox_values", o.scaleY, o.scaleX)
|
||||||
if (o.scaleY !== 1 || o.scaleX !== 1) {
|
if (o.scaleY !== 1 || o.scaleX !== 1) {
|
||||||
o.set({
|
o.set({
|
||||||
height: o.height * o.scaleY,
|
height: Math.max(o.height * o.scaleY, editor._mm2px(10.01)),
|
||||||
width: o.width * o.scaleX,
|
width: Math.max(o.width * o.scaleX, editor._mm2px(10.01)),
|
||||||
scaleX: 1,
|
scaleX: 1,
|
||||||
scaleY: 1
|
scaleY: 1
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -252,7 +252,7 @@ Vue.component('availbox', {
|
|||||||
variation: Object
|
variation: Object
|
||||||
},
|
},
|
||||||
mounted: function() {
|
mounted: function() {
|
||||||
if (!this.$root.cart_exists && this.$root.itemnum === 1 && (!this.$root.categories[0].items[0].has_variations || this.$root.categories[0].items[0].variations.length < 2) && !this.$root.has_seating_plan ? 1 : 0) {
|
if (this.$root.itemnum === 1 && (!this.$root.categories[0].items[0].has_variations || this.$root.categories[0].items[0].variations.length < 2) && !this.$root.has_seating_plan ? 1 : 0) {
|
||||||
this.$refs.quantity.value = 1;
|
this.$refs.quantity.value = 1;
|
||||||
if (this.order_max === 1) {
|
if (this.order_max === 1) {
|
||||||
this.$refs.quantity.checked = true;
|
this.$refs.quantity.checked = true;
|
||||||
|
|||||||
@@ -32,10 +32,8 @@
|
|||||||
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
# 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.
|
# License for the specific language governing permissions and limitations under the License.
|
||||||
|
|
||||||
import datetime
|
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
from decimal import Decimal
|
|
||||||
from email.mime.text import MIMEText
|
from email.mime.text import MIMEText
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
@@ -44,13 +42,11 @@ from django.core import mail as djmail
|
|||||||
from django.test import override_settings
|
from django.test import override_settings
|
||||||
from django.utils.timezone import now
|
from django.utils.timezone import now
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
from django_scopes import scope, scopes_disabled
|
from django_scopes import scope
|
||||||
from i18nfield.strings import LazyI18nString
|
from i18nfield.strings import LazyI18nString
|
||||||
|
|
||||||
from pretix.base.email import get_email_context
|
from pretix.base.email import get_email_context
|
||||||
from pretix.base.models import (
|
from pretix.base.models import Event, Organizer, OutgoingMail, User
|
||||||
Event, InvoiceAddress, Order, Organizer, OutgoingMail, User,
|
|
||||||
)
|
|
||||||
from pretix.base.services.mail import mail, mail_send_task
|
from pretix.base.services.mail import mail, mail_send_task
|
||||||
|
|
||||||
|
|
||||||
@@ -72,45 +68,6 @@ def env():
|
|||||||
yield event, user, o
|
yield event, user, o
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
|
||||||
@scopes_disabled()
|
|
||||||
def item(env):
|
|
||||||
return env[0].items.create(name="Budget Ticket", default_price=23)
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
|
||||||
@scopes_disabled()
|
|
||||||
def order(env, item):
|
|
||||||
event, _, _ = env
|
|
||||||
o = Order.objects.create(
|
|
||||||
code="FOO",
|
|
||||||
event=event,
|
|
||||||
email="dummy@dummy.test",
|
|
||||||
status=Order.STATUS_PENDING,
|
|
||||||
secret="k24fiuwvu8kxz3y1",
|
|
||||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
|
||||||
datetime=datetime.datetime(2017, 12, 1, 10, 0, 0, tzinfo=datetime.timezone.utc),
|
|
||||||
expires=datetime.datetime(2017, 12, 10, 10, 0, 0, tzinfo=datetime.timezone.utc),
|
|
||||||
total=23,
|
|
||||||
locale="en",
|
|
||||||
)
|
|
||||||
o.positions.create(
|
|
||||||
order=o,
|
|
||||||
item=item,
|
|
||||||
variation=None,
|
|
||||||
price=Decimal("23"),
|
|
||||||
attendee_email="peter@example.org",
|
|
||||||
attendee_name_parts={"given_name": "Peter", "family_name": "Miller"},
|
|
||||||
secret="z3fsn8jyufm5kpk768q69gkbyr5f4h6w",
|
|
||||||
pseudonymization_id="ABCDEFGHKL",
|
|
||||||
)
|
|
||||||
InvoiceAddress.objects.create(
|
|
||||||
order=o,
|
|
||||||
name_parts={"given_name": "Peter", "family_name": "Miller"},
|
|
||||||
)
|
|
||||||
return o
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.django_db
|
@pytest.mark.django_db
|
||||||
def test_send_mail_with_prefix(env):
|
def test_send_mail_with_prefix(env):
|
||||||
djmail.outbox = []
|
djmail.outbox = []
|
||||||
@@ -213,6 +170,7 @@ def test_queue_state_sent(env):
|
|||||||
subject='Test',
|
subject='Test',
|
||||||
body_plain='Test',
|
body_plain='Test',
|
||||||
sender='sender@example.com',
|
sender='sender@example.com',
|
||||||
|
headers={},
|
||||||
)
|
)
|
||||||
assert m.status == OutgoingMail.STATUS_QUEUED
|
assert m.status == OutgoingMail.STATUS_QUEUED
|
||||||
mail_send_task.apply(kwargs={
|
mail_send_task.apply(kwargs={
|
||||||
@@ -230,6 +188,7 @@ def test_queue_state_permanent_failure(env):
|
|||||||
subject='Test',
|
subject='Test',
|
||||||
body_plain='Test',
|
body_plain='Test',
|
||||||
sender='sender@example.com',
|
sender='sender@example.com',
|
||||||
|
headers={},
|
||||||
)
|
)
|
||||||
assert m.status == OutgoingMail.STATUS_QUEUED
|
assert m.status == OutgoingMail.STATUS_QUEUED
|
||||||
mail_send_task.apply(kwargs={
|
mail_send_task.apply(kwargs={
|
||||||
@@ -251,6 +210,7 @@ def test_queue_state_retry_failure(env, monkeypatch):
|
|||||||
subject='Test',
|
subject='Test',
|
||||||
body_plain='Test',
|
body_plain='Test',
|
||||||
sender='sender@example.com',
|
sender='sender@example.com',
|
||||||
|
headers={},
|
||||||
)
|
)
|
||||||
assert m.status == OutgoingMail.STATUS_QUEUED
|
assert m.status == OutgoingMail.STATUS_QUEUED
|
||||||
mail_send_task.apply(kwargs={
|
mail_send_task.apply(kwargs={
|
||||||
@@ -276,6 +236,7 @@ def test_queue_state_foreign_key_handling():
|
|||||||
subject='Test',
|
subject='Test',
|
||||||
body_plain='Test',
|
body_plain='Test',
|
||||||
sender='sender@example.com',
|
sender='sender@example.com',
|
||||||
|
headers={},
|
||||||
)
|
)
|
||||||
mail_sent = OutgoingMail.objects.create(
|
mail_sent = OutgoingMail.objects.create(
|
||||||
organizer=o,
|
organizer=o,
|
||||||
@@ -284,6 +245,7 @@ def test_queue_state_foreign_key_handling():
|
|||||||
subject='Test',
|
subject='Test',
|
||||||
body_plain='Test',
|
body_plain='Test',
|
||||||
sender='sender@example.com',
|
sender='sender@example.com',
|
||||||
|
headers={},
|
||||||
status=OutgoingMail.STATUS_SENT,
|
status=OutgoingMail.STATUS_SENT,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -322,7 +284,7 @@ def _extract_html(mail):
|
|||||||
def test_placeholder_html_rendering_from_template(env):
|
def test_placeholder_html_rendering_from_template(env):
|
||||||
djmail.outbox = []
|
djmail.outbox = []
|
||||||
event, user, organizer = env
|
event, user, organizer = env
|
||||||
event.name = "<strong>event & co. kg</strong> {currency}"
|
event.name = "<strong>event & co. kg</strong>"
|
||||||
event.save()
|
event.save()
|
||||||
mail('dummy@dummy.dummy', '{event} Test subject', 'mailtest.txt', get_email_context(
|
mail('dummy@dummy.dummy', '{event} Test subject', 'mailtest.txt', get_email_context(
|
||||||
event=event,
|
event=event,
|
||||||
@@ -331,29 +293,25 @@ def test_placeholder_html_rendering_from_template(env):
|
|||||||
|
|
||||||
assert len(djmail.outbox) == 1
|
assert len(djmail.outbox) == 1
|
||||||
assert djmail.outbox[0].to == [user.email]
|
assert djmail.outbox[0].to == [user.email]
|
||||||
assert 'Event name: <strong>event & co. kg</strong> {currency}' in djmail.outbox[0].body
|
assert 'Event name: <strong>event & co. kg</strong>' in djmail.outbox[0].body
|
||||||
assert 'Event: <strong>event & co. kg</strong> {currency}' in djmail.outbox[0].body
|
|
||||||
assert '**IBAN**: 123 \n**BIC**: 456' in djmail.outbox[0].body
|
assert '**IBAN**: 123 \n**BIC**: 456' in djmail.outbox[0].body
|
||||||
assert '**Meta**: *Beep*' in djmail.outbox[0].body
|
assert '**Meta**: *Beep*' in djmail.outbox[0].body
|
||||||
assert 'Event website: [<strong>event & co. kg</strong> {currency}](https://example.org/dummy)' in djmail.outbox[0].body
|
assert 'Event website: [<strong>event & co. kg</strong>](https://example.org/dummy)' in djmail.outbox[0].body
|
||||||
assert '<a ' not in djmail.outbox[0].body
|
assert 'Other website: [<strong>event & co. kg</strong>](https://example.com)' in djmail.outbox[0].body
|
||||||
assert '<' not in djmail.outbox[0].body
|
assert '<' not in djmail.outbox[0].body
|
||||||
assert '&' not in djmail.outbox[0].body
|
assert '&' not in djmail.outbox[0].body
|
||||||
assert 'Unevaluated placeholder: {currency}' in djmail.outbox[0].body
|
|
||||||
assert 'EUR' not in djmail.outbox[0].body
|
|
||||||
html = _extract_html(djmail.outbox[0])
|
html = _extract_html(djmail.outbox[0])
|
||||||
|
|
||||||
assert '<strong>event' not in html
|
assert '<strong>event' not in html
|
||||||
assert 'Event name: <strong>event & co. kg</strong> {currency}' in html
|
assert 'Event name: <strong>event & co. kg</strong>' in html
|
||||||
assert '<strong>IBAN</strong>: 123<br/>\n<strong>BIC</strong>: 456' in html
|
assert '<strong>IBAN</strong>: 123<br/>\n<strong>BIC</strong>: 456' in html
|
||||||
assert '**Meta**: <em>Beep</em>' in html
|
assert '<strong>Meta</strong>: <em>Beep</em>' in html
|
||||||
assert 'Unevaluated placeholder: {currency}' in html
|
|
||||||
assert 'EUR' not in html
|
|
||||||
assert 'Event website: [<strong>event & co. kg</strong> {currency}](https://example.org/dummy)' in html
|
|
||||||
# Links are from raw HTML and therefore trusted, rel and target is not added automatically
|
|
||||||
assert re.search(
|
assert re.search(
|
||||||
r'Event: <a href="https://example.com/dummy" style="[^"]+">'
|
r'Event website: <a href="https://example.org/dummy" rel="noopener" style="[^"]+" target="_blank"><strong>event & co. kg</strong></a>',
|
||||||
r'<strong>event & co. kg</strong> {currency}</a>',
|
html
|
||||||
|
)
|
||||||
|
assert re.search(
|
||||||
|
r'Other website: <a href="https://example.com" rel="noopener" style="[^"]+" target="_blank"><strong>event & co. kg</strong></a>',
|
||||||
html
|
html
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -371,7 +329,7 @@ def test_placeholder_html_rendering_from_string(env):
|
|||||||
})
|
})
|
||||||
djmail.outbox = []
|
djmail.outbox = []
|
||||||
event, user, organizer = env
|
event, user, organizer = env
|
||||||
event.name = "<strong>event & co. kg</strong> {currency}"
|
event.name = "<strong>event & co. kg</strong>"
|
||||||
event.save()
|
event.save()
|
||||||
ctx = get_email_context(
|
ctx = get_email_context(
|
||||||
event=event,
|
event=event,
|
||||||
@@ -382,9 +340,9 @@ def test_placeholder_html_rendering_from_string(env):
|
|||||||
|
|
||||||
assert len(djmail.outbox) == 1
|
assert len(djmail.outbox) == 1
|
||||||
assert djmail.outbox[0].to == [user.email]
|
assert djmail.outbox[0].to == [user.email]
|
||||||
assert 'Event name: <strong>event & co. kg</strong> {currency}' in djmail.outbox[0].body
|
assert 'Event name: <strong>event & co. kg</strong>' in djmail.outbox[0].body
|
||||||
assert 'Event website: [<strong>event & co. kg</strong> {currency}](https://example.org/dummy)' in djmail.outbox[0].body
|
assert 'Event website: [<strong>event & co. kg</strong>](https://example.org/dummy)' in djmail.outbox[0].body
|
||||||
assert 'Other website: [<strong>event & co. kg</strong> {currency}](https://example.com)' in djmail.outbox[0].body
|
assert 'Other website: [<strong>event & co. kg</strong>](https://example.com)' in djmail.outbox[0].body
|
||||||
assert '**IBAN**: 123 \n**BIC**: 456' in djmail.outbox[0].body
|
assert '**IBAN**: 123 \n**BIC**: 456' in djmail.outbox[0].body
|
||||||
assert '**Meta**: *Beep*' in djmail.outbox[0].body
|
assert '**Meta**: *Beep*' in djmail.outbox[0].body
|
||||||
assert 'URL: https://google.com' in djmail.outbox[0].body
|
assert 'URL: https://google.com' in djmail.outbox[0].body
|
||||||
@@ -399,13 +357,11 @@ def test_placeholder_html_rendering_from_string(env):
|
|||||||
assert '<strong>IBAN</strong>: 123<br/>\n<strong>BIC</strong>: 456' in html
|
assert '<strong>IBAN</strong>: 123<br/>\n<strong>BIC</strong>: 456' in html
|
||||||
assert '<strong>Meta</strong>: <em>Beep</em>' in html
|
assert '<strong>Meta</strong>: <em>Beep</em>' in html
|
||||||
assert re.search(
|
assert re.search(
|
||||||
r'Event website: <a href="https://example.org/dummy" rel="noopener" style="[^"]+" target="_blank">'
|
r'Event website: <a href="https://example.org/dummy" rel="noopener" style="[^"]+" target="_blank"><strong>event & co. kg</strong></a>',
|
||||||
r'<strong>event & co. kg</strong> {currency}</a>',
|
|
||||||
html
|
html
|
||||||
)
|
)
|
||||||
assert re.search(
|
assert re.search(
|
||||||
r'Other website: <a href="https://example.com" rel="noopener" style="[^"]+" target="_blank">'
|
r'Other website: <a href="https://example.com" rel="noopener" style="[^"]+" target="_blank"><strong>event & co. kg</strong></a>',
|
||||||
r'<strong>event & co. kg</strong> {currency}</a>',
|
|
||||||
html
|
html
|
||||||
)
|
)
|
||||||
assert re.search(
|
assert re.search(
|
||||||
@@ -426,141 +382,3 @@ def test_placeholder_html_rendering_from_string(env):
|
|||||||
r'style="[^"]+" target="_blank">Link & Text</a>',
|
r'style="[^"]+" target="_blank">Link & Text</a>',
|
||||||
html
|
html
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.django_db
|
|
||||||
def test_nested_placeholder_inclusion_full_process(env, order):
|
|
||||||
# Test that it is not possible to sneak in a placeholder like {url_cancel} inside a user-controlled
|
|
||||||
# placeholder value like {invoice_company}
|
|
||||||
event, user, organizer = env
|
|
||||||
position = order.positions.get()
|
|
||||||
order.invoice_address.company = "{url_cancel} Corp"
|
|
||||||
order.invoice_address.save()
|
|
||||||
event.settings.mail_text_resend_link = LazyI18nString({"en": "Ticket for {invoice_company}"})
|
|
||||||
event.settings.mail_subject_resend_link_attendee = LazyI18nString({"en": "Ticket for {invoice_company}"})
|
|
||||||
|
|
||||||
djmail.outbox = []
|
|
||||||
position.resend_link()
|
|
||||||
assert len(djmail.outbox) == 1
|
|
||||||
assert djmail.outbox[0].to == [position.attendee_email]
|
|
||||||
assert "Ticket for {url_cancel} Corp" == djmail.outbox[0].subject
|
|
||||||
assert "/cancel" not in djmail.outbox[0].body
|
|
||||||
assert "/order" not in djmail.outbox[0].body
|
|
||||||
html, plain = _extract_html(djmail.outbox[0]), djmail.outbox[0].body
|
|
||||||
for part in (html, plain):
|
|
||||||
assert "Ticket for {url_cancel} Corp" in part
|
|
||||||
assert "/order/" not in part
|
|
||||||
assert "/cancel" not in part
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.django_db
|
|
||||||
def test_nested_placeholder_inclusion_mail_service(env):
|
|
||||||
# test that it is not possible to have placeholders within the values of placeholders when
|
|
||||||
# the mail() function is called directly
|
|
||||||
template = LazyI18nString("Event name: {event}")
|
|
||||||
djmail.outbox = []
|
|
||||||
event, user, organizer = env
|
|
||||||
event.name = "event & {currency} co. kg"
|
|
||||||
event.slug = "event-co-ag-slug"
|
|
||||||
event.save()
|
|
||||||
|
|
||||||
mail(
|
|
||||||
"dummy@dummy.dummy",
|
|
||||||
"{event} Test subject",
|
|
||||||
template,
|
|
||||||
get_email_context(
|
|
||||||
event=event,
|
|
||||||
payment_info="**IBAN**: 123 \n**BIC**: 456 {event}",
|
|
||||||
),
|
|
||||||
event,
|
|
||||||
)
|
|
||||||
|
|
||||||
assert len(djmail.outbox) == 1
|
|
||||||
assert djmail.outbox[0].to == [user.email]
|
|
||||||
html, plain = _extract_html(djmail.outbox[0]), djmail.outbox[0].body
|
|
||||||
for part in (html, plain, djmail.outbox[0].subject):
|
|
||||||
assert "event & {currency} co. kg" in part or "event & {currency} co. kg" in part
|
|
||||||
assert "EUR" not in part
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.django_db
|
|
||||||
@pytest.mark.parametrize("tpl", [
|
|
||||||
"Event: {event.__class__}",
|
|
||||||
"Event: {{event.__class__}}",
|
|
||||||
"Event: {{{event.__class__}}}",
|
|
||||||
])
|
|
||||||
def test_variable_inclusion_from_string_full_process(env, tpl, order):
|
|
||||||
# Test that it is not possible to use placeholders that leak system information in templates
|
|
||||||
# when run through system processes
|
|
||||||
event, user, organizer = env
|
|
||||||
event.name = "event & co. kg"
|
|
||||||
event.save()
|
|
||||||
position = order.positions.get()
|
|
||||||
event.settings.mail_text_resend_link = LazyI18nString({"en": tpl})
|
|
||||||
event.settings.mail_subject_resend_link_attendee = LazyI18nString({"en": tpl})
|
|
||||||
|
|
||||||
position.resend_link()
|
|
||||||
assert len(djmail.outbox) == 1
|
|
||||||
html, plain = _extract_html(djmail.outbox[0]), djmail.outbox[0].body
|
|
||||||
for part in (html, plain, djmail.outbox[0].subject):
|
|
||||||
assert "{event.__class__}" in part
|
|
||||||
assert "LazyI18nString" not in part
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.django_db
|
|
||||||
@pytest.mark.parametrize("tpl", [
|
|
||||||
"Event: {event.__class__}",
|
|
||||||
"Event: {{event.__class__}}",
|
|
||||||
"Event: {{{event.__class__}}}",
|
|
||||||
])
|
|
||||||
def test_variable_inclusion_from_string_mail_service(env, tpl):
|
|
||||||
# Test that it is not possible to use placeholders that leak system information in templates
|
|
||||||
# when run through mail() directly
|
|
||||||
event, user, organizer = env
|
|
||||||
event.name = "event & co. kg"
|
|
||||||
event.save()
|
|
||||||
|
|
||||||
djmail.outbox = []
|
|
||||||
mail(
|
|
||||||
"dummy@dummy.dummy",
|
|
||||||
tpl,
|
|
||||||
LazyI18nString(tpl),
|
|
||||||
get_email_context(
|
|
||||||
event=event,
|
|
||||||
payment_info="**IBAN**: 123 \n**BIC**: 456\n" + tpl,
|
|
||||||
),
|
|
||||||
event,
|
|
||||||
)
|
|
||||||
assert len(djmail.outbox) == 1
|
|
||||||
html, plain = _extract_html(djmail.outbox[0]), djmail.outbox[0].body
|
|
||||||
for part in (html, plain, djmail.outbox[0].subject):
|
|
||||||
assert "{event.__class__}" in part
|
|
||||||
assert "LazyI18nString" not in part
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.django_db
|
|
||||||
def test_escaped_braces_mail_services(env):
|
|
||||||
# Test that braces can be escaped by doubling
|
|
||||||
template = LazyI18nString("Event name: -{{currency}}-")
|
|
||||||
djmail.outbox = []
|
|
||||||
event, user, organizer = env
|
|
||||||
event.name = "event & co. kg"
|
|
||||||
event.save()
|
|
||||||
|
|
||||||
mail(
|
|
||||||
"dummy@dummy.dummy",
|
|
||||||
"-{{currency}}- Test subject",
|
|
||||||
template,
|
|
||||||
get_email_context(
|
|
||||||
event=event,
|
|
||||||
payment_info="**IBAN**: 123 \n**BIC**: 456 {event}",
|
|
||||||
),
|
|
||||||
event,
|
|
||||||
)
|
|
||||||
|
|
||||||
assert len(djmail.outbox) == 1
|
|
||||||
assert djmail.outbox[0].to == [user.email]
|
|
||||||
html, plain = _extract_html(djmail.outbox[0]), djmail.outbox[0].body
|
|
||||||
for part in (html, plain, djmail.outbox[0].subject):
|
|
||||||
assert "EUR" not in part
|
|
||||||
assert "-{currency}-" in part
|
|
||||||
|
|||||||
@@ -29,8 +29,6 @@ def test_format_map():
|
|||||||
assert format_map("Foo {baz}", {"bar": 3}) == "Foo {baz}"
|
assert format_map("Foo {baz}", {"bar": 3}) == "Foo {baz}"
|
||||||
assert format_map("Foo {bar.__module__}", {"bar": 3}) == "Foo {bar.__module__}"
|
assert format_map("Foo {bar.__module__}", {"bar": 3}) == "Foo {bar.__module__}"
|
||||||
assert format_map("Foo {bar!s}", {"bar": 3}) == "Foo 3"
|
assert format_map("Foo {bar!s}", {"bar": 3}) == "Foo 3"
|
||||||
assert format_map("Foo {bar!r}", {"bar": '3'}) == "Foo 3"
|
|
||||||
assert format_map("Foo {bar!a}", {"bar": '3'}) == "Foo 3"
|
|
||||||
assert format_map("Foo {bar:<20}", {"bar": 3}) == "Foo 3"
|
assert format_map("Foo {bar:<20}", {"bar": 3}) == "Foo 3"
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -164,7 +164,6 @@ def test_org_resetpw(env, client):
|
|||||||
customer.refresh_from_db()
|
customer.refresh_from_db()
|
||||||
assert customer.check_password('PANioMR62')
|
assert customer.check_password('PANioMR62')
|
||||||
assert customer.is_verified
|
assert customer.is_verified
|
||||||
assert len(djmail.outbox) == 2
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.django_db
|
@pytest.mark.django_db
|
||||||
@@ -624,7 +623,6 @@ def test_change_email(env, client):
|
|||||||
customer.refresh_from_db()
|
customer.refresh_from_db()
|
||||||
assert customer.email == 'john@example.org'
|
assert customer.email == 'john@example.org'
|
||||||
assert len(djmail.outbox) == 1
|
assert len(djmail.outbox) == 1
|
||||||
assert djmail.outbox[0].to == ['john@example.com']
|
|
||||||
|
|
||||||
token = dumps({
|
token = dumps({
|
||||||
'customer': customer.pk,
|
'customer': customer.pk,
|
||||||
@@ -634,9 +632,6 @@ def test_change_email(env, client):
|
|||||||
assert r.status_code == 302
|
assert r.status_code == 302
|
||||||
customer.refresh_from_db()
|
customer.refresh_from_db()
|
||||||
assert customer.email == 'john@example.com'
|
assert customer.email == 'john@example.com'
|
||||||
assert len(djmail.outbox) == 3
|
|
||||||
assert djmail.outbox[1].to == ['john@example.org']
|
|
||||||
assert djmail.outbox[2].to == ['john@example.com']
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.django_db
|
@pytest.mark.django_db
|
||||||
@@ -678,7 +673,6 @@ def test_change_pw(env, client, client2):
|
|||||||
|
|
||||||
r = client.get('/bigevents/account/password')
|
r = client.get('/bigevents/account/password')
|
||||||
assert r.status_code == 200
|
assert r.status_code == 200
|
||||||
assert len(djmail.outbox) == 1
|
|
||||||
|
|
||||||
# Client 2 got logged out
|
# Client 2 got logged out
|
||||||
r = client2.post('/bigevents/account/password')
|
r = client2.post('/bigevents/account/password')
|
||||||
|
|||||||
@@ -1,29 +1,13 @@
|
|||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
This is a test file for sending mails.
|
This is a test file for sending mails.
|
||||||
|
Event name: {event}
|
||||||
Django variables will get evaluated:
|
|
||||||
|
|
||||||
Event name: {{ event }}
|
|
||||||
|
|
||||||
pretix variables will not in a template rendering:
|
|
||||||
|
|
||||||
Unevaluated placeholder: {currency}
|
|
||||||
|
|
||||||
We can use advanced Django things:
|
|
||||||
|
|
||||||
{% get_current_language as LANGUAGE_CODE %}
|
{% get_current_language as LANGUAGE_CODE %}
|
||||||
The language code used for rendering this email is {{ LANGUAGE_CODE }}.
|
The language code used for rendering this email is {{ LANGUAGE_CODE }}.
|
||||||
|
|
||||||
Custom content is rendered safely without HTML/Markdown/parameter injection
|
|
||||||
unless the parameter is marked as "HTML-safe":
|
|
||||||
|
|
||||||
Payment info:
|
Payment info:
|
||||||
{{ payment_info }}
|
{payment_info}
|
||||||
|
|
||||||
**Meta**: {{ meta_Test }}
|
**Meta**: {meta_Test}
|
||||||
|
|
||||||
Markdown will not be evaluated when coming from a template file!
|
Event website: [{event}](https://example.org/{event_slug})
|
||||||
|
Other website: [{event}]({meta_Website})
|
||||||
Event website: [{{event}}](https://example.org/{{event_slug}})
|
|
||||||
|
|
||||||
Event: {% if to_html %}<a href="https://example.com/{{event_slug}}">{% endif %}{{ event }}{% if to_html %}</a>{% endif %}
|
|
||||||
Reference in New Issue
Block a user