Compare commits

...

23 Commits

Author SHA1 Message Date
Raphael Michel
2fd81a2d20 Disable scopes for a management command 2019-06-17 10:46:10 +02:00
Raphael Michel
4271245a4a Disable scopes for get_Events_with_any_permission 2019-06-17 10:16:53 +02:00
Raphael Michel
b41139a143 Fix tests after rebase 2019-06-17 10:08:42 +02:00
Raphael Michel
a68b225529 Remove unused import 2019-06-17 10:04:54 +02:00
Raphael Michel
c12ba88ad8 Fix remaining tests 2019-06-17 10:04:54 +02:00
Raphael Michel
69a80f2540 Update tasks and cronjobs 2019-06-17 10:04:54 +02:00
Raphael Michel
867667cd12 Fix tests.api 2019-06-17 10:04:54 +02:00
Raphael Michel
5c06c41a5b Install django-scopes 2019-06-17 10:04:54 +02:00
Martin Gross
b1db5dbb3e Decrement voucher usage counter when deleting testmode orders (#1321)
* Decrement voucher usage counter when deleting testmode orders

* Only decrement voucher usage counter for uncancelled orders and on uncancelled positions

* Have the tests actually test something
2019-06-14 12:41:07 +02:00
Raphael Michel
fed389b990 Remove plugins task from travis 2019-06-14 12:21:34 +02:00
Raphael Michel
1ce613ff89 Add new signal nav_item 2019-06-14 12:20:27 +02:00
Raphael Michel
44bef85b66 Require recent django-localflavor 2019-06-12 12:49:22 +02:00
Raphael Michel
49c4acefd0 Fix critical error in previous commit 2019-06-10 17:18:08 +02:00
Raphael Michel
61e111742d Avoid unneccesary logs in some highly-used API endpoints 2019-06-09 23:54:48 +02:00
Raphael Michel
b2274039b3 Sendmail: Fix using old log entries 2019-06-06 11:40:21 +02:00
Raphael Michel
4913190730 Update from Weblate (#1312)
Update from Weblate
2019-06-06 11:25:58 +02:00
Raphael Michel
276a087fdb Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (3125 of 3125 strings)

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

powered by weblate
2019-06-06 09:24:50 +00:00
Raphael Michel
3639f2cea1 Translated on translate.pretix.eu (German)
Currently translated at 100.0% (3125 of 3125 strings)

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

powered by weblate
2019-06-06 09:24:49 +00:00
Raphael Michel
692e9c38f1 Update po files
[CI skip]

Signed-off-by: Raphael Michel <mail@raphaelmichel.de>
2019-06-06 11:11:46 +02:00
Raphael Michel
dd4075b2cc Clarify UX around subevent selection 2019-06-06 11:10:51 +02:00
Raphael Michel
b549cb451a Fix invalid signature 2019-06-05 16:44:49 +02:00
Raphael Michel
576132b2d0 Bump to 2.9.0.dev0 2019-06-05 16:28:49 +02:00
Raphael Michel
e0c432d014 [SECURITY] Do not allow to enumerate organizers 2019-06-05 16:27:21 +02:00
187 changed files with 7249 additions and 5071 deletions

View File

@@ -25,8 +25,6 @@ matrix:
env: JOB=tests PRETIX_CONFIG_FILE=tests/travis_postgres.cfg
- python: 3.5
env: JOB=tests PRETIX_CONFIG_FILE=tests/travis_postgres.cfg
- python: 3.7
env: JOB=plugins
- python: 3.7
env: JOB=doc-spelling
- python: 3.7

View File

@@ -45,7 +45,7 @@ Backend
.. automodule:: pretix.control.signals
:members: nav_event, html_head, html_page_start, quota_detail_html, nav_topbar, nav_global, nav_organizer, nav_event_settings,
order_info, event_settings_widget, oauth_application_registered, order_position_buttons
order_info, event_settings_widget, oauth_application_registered, order_position_buttons, nav_item
.. automodule:: pretix.base.signals

View File

@@ -1 +1 @@
__version__ = "2.8.0"
__version__ = "2.9.0.dev0"

View File

@@ -1,4 +1,5 @@
from django.contrib.auth.models import AnonymousUser
from django_scopes import scopes_disabled
from rest_framework import exceptions
from rest_framework.authentication import TokenAuthentication
@@ -12,7 +13,8 @@ class DeviceTokenAuthentication(TokenAuthentication):
def authenticate_credentials(self, key):
model = self.get_model()
try:
device = model.objects.select_related('organizer').get(api_token=key)
with scopes_disabled():
device = model.objects.select_related('organizer').get(api_token=key)
except model.DoesNotExist:
raise exceptions.AuthenticationFailed('Invalid token.')

View File

@@ -3,7 +3,7 @@ from rest_framework.permissions import SAFE_METHODS, BasePermission
from pretix.api.models import OAuthAccessToken
from pretix.base.models import Device, Event, User
from pretix.base.models.auth import SuperuserPermissionSet
from pretix.base.models.organizer import Organizer, TeamAPIToken
from pretix.base.models.organizer import TeamAPIToken
from pretix.helpers.security import (
SessionInvalid, SessionReauthRequired, assert_session_valid,
)
@@ -50,9 +50,6 @@ class EventPermission(BasePermission):
return False
elif 'organizer' in request.resolver_match.kwargs:
request.organizer = Organizer.objects.filter(
slug=request.resolver_match.kwargs['organizer'],
).first()
if not request.organizer or not perm_holder.has_organizer_permission(request.organizer, request=request):
return False
if isinstance(perm_holder, User) and perm_holder.has_active_staff_session(request.session.session_key):

View File

@@ -4,10 +4,13 @@ from hashlib import sha1
from django.conf import settings
from django.db import transaction
from django.http import HttpRequest, HttpResponse, JsonResponse
from django.urls import resolve
from django.utils.timezone import now
from django_scopes import scope
from rest_framework import status
from pretix.api.models import ApiCall
from pretix.base.models import Organizer
class IdempotencyMiddleware:
@@ -89,3 +92,21 @@ class IdempotencyMiddleware:
for k, v in json.loads(call.response_headers).values():
r[k] = v
return r
class ApiScopeMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request: HttpRequest):
if not request.path.startswith('/api/'):
return self.get_response(request)
url = resolve(request.path_info)
if 'organizer' in url.kwargs:
request.organizer = Organizer.objects.filter(
slug=url.kwargs['organizer'],
).first()
with scope(organizer=getattr(request, 'organizer', None)):
return self.get_response(request)

View File

@@ -2,6 +2,7 @@ from datetime import timedelta
from django.dispatch import Signal, receiver
from django.utils.timezone import now
from django_scopes import scopes_disabled
from pretix.api.models import ApiCall, WebHookCall
from pretix.base.signals import periodic_task
@@ -17,10 +18,12 @@ instances.
@receiver(periodic_task)
@scopes_disabled()
def cleanup_webhook_logs(sender, **kwargs):
WebHookCall.objects.filter(datetime__lte=now() - timedelta(days=30)).delete()
@receiver(periodic_task)
@scopes_disabled()
def cleanup_api_logs(sender, **kwargs):
ApiCall.objects.filter(created__lte=now() - timedelta(hours=24)).delete()

View File

@@ -6,6 +6,7 @@ from django.shortcuts import get_object_or_404
from django.utils.functional import cached_property
from django.utils.timezone import now
from django_filters.rest_framework import DjangoFilterBackend, FilterSet
from django_scopes import scopes_disabled
from rest_framework import viewsets
from rest_framework.decorators import action
from rest_framework.fields import DateTimeField
@@ -24,11 +25,11 @@ from pretix.base.services.checkin import (
)
from pretix.helpers.database import FixedOrderBy
class CheckinListFilter(FilterSet):
class Meta:
model = CheckinList
fields = ['subevent']
with scopes_disabled():
class CheckinListFilter(FilterSet):
class Meta:
model = CheckinList
fields = ['subevent']
class CheckinListViewSet(viewsets.ModelViewSet):
@@ -146,15 +147,16 @@ class CheckinListViewSet(viewsets.ModelViewSet):
return Response(response)
class CheckinOrderPositionFilter(OrderPositionFilter):
with scopes_disabled():
class CheckinOrderPositionFilter(OrderPositionFilter):
def has_checkin_qs(self, queryset, name, value):
return queryset.filter(last_checked_in__isnull=not value)
def has_checkin_qs(self, queryset, name, value):
return queryset.filter(last_checked_in__isnull=not value)
class CheckinListPositionViewSet(viewsets.ReadOnlyModelViewSet):
serializer_class = CheckinListOrderPositionSerializer
queryset = OrderPosition.objects.none()
queryset = OrderPosition.all.none()
filter_backends = (DjangoFilterBackend, RichOrderingFilter)
ordering = ('attendee_name_cached', 'positionid')
ordering_fields = (

View File

@@ -3,6 +3,7 @@ from django.db import transaction
from django.db.models import ProtectedError, Q
from django.utils.timezone import now
from django_filters.rest_framework import DjangoFilterBackend, FilterSet
from django_scopes import scopes_disabled
from rest_framework import filters, viewsets
from rest_framework.exceptions import PermissionDenied
@@ -18,51 +19,51 @@ from pretix.base.models import (
from pretix.base.models.event import SubEvent
from pretix.helpers.dicts import merge_dicts
with scopes_disabled():
class EventFilter(FilterSet):
is_past = django_filters.rest_framework.BooleanFilter(method='is_past_qs')
is_future = django_filters.rest_framework.BooleanFilter(method='is_future_qs')
ends_after = django_filters.rest_framework.IsoDateTimeFilter(method='ends_after_qs')
class EventFilter(FilterSet):
is_past = django_filters.rest_framework.BooleanFilter(method='is_past_qs')
is_future = django_filters.rest_framework.BooleanFilter(method='is_future_qs')
ends_after = django_filters.rest_framework.IsoDateTimeFilter(method='ends_after_qs')
class Meta:
model = Event
fields = ['is_public', 'live', 'has_subevents']
class Meta:
model = Event
fields = ['is_public', 'live', 'has_subevents']
def ends_after_qs(self, queryset, name, value):
expr = (
Q(has_subevents=False) &
Q(
Q(Q(date_to__isnull=True) & Q(date_from__gte=value))
| Q(Q(date_to__isnull=False) & Q(date_to__gte=value))
def ends_after_qs(self, queryset, name, value):
expr = (
Q(has_subevents=False) &
Q(
Q(Q(date_to__isnull=True) & Q(date_from__gte=value))
| Q(Q(date_to__isnull=False) & Q(date_to__gte=value))
)
)
)
return queryset.filter(expr)
def is_past_qs(self, queryset, name, value):
expr = (
Q(has_subevents=False) &
Q(
Q(Q(date_to__isnull=True) & Q(date_from__lt=now()))
| Q(Q(date_to__isnull=False) & Q(date_to__lt=now()))
)
)
if value:
return queryset.filter(expr)
else:
return queryset.exclude(expr)
def is_future_qs(self, queryset, name, value):
expr = (
Q(has_subevents=False) &
Q(
Q(Q(date_to__isnull=True) & Q(date_from__gte=now()))
| Q(Q(date_to__isnull=False) & Q(date_to__gte=now()))
def is_past_qs(self, queryset, name, value):
expr = (
Q(has_subevents=False) &
Q(
Q(Q(date_to__isnull=True) & Q(date_from__lt=now()))
| Q(Q(date_to__isnull=False) & Q(date_to__lt=now()))
)
)
)
if value:
return queryset.filter(expr)
else:
return queryset.exclude(expr)
if value:
return queryset.filter(expr)
else:
return queryset.exclude(expr)
def is_future_qs(self, queryset, name, value):
expr = (
Q(has_subevents=False) &
Q(
Q(Q(date_to__isnull=True) & Q(date_from__gte=now()))
| Q(Q(date_to__isnull=False) & Q(date_to__gte=now()))
)
)
if value:
return queryset.filter(expr)
else:
return queryset.exclude(expr)
class EventViewSet(viewsets.ModelViewSet):
@@ -182,41 +183,42 @@ class CloneEventViewSet(viewsets.ModelViewSet):
)
class SubEventFilter(FilterSet):
is_past = django_filters.rest_framework.BooleanFilter(method='is_past_qs')
is_future = django_filters.rest_framework.BooleanFilter(method='is_future_qs')
ends_after = django_filters.rest_framework.IsoDateTimeFilter(method='ends_after_qs')
with scopes_disabled():
class SubEventFilter(FilterSet):
is_past = django_filters.rest_framework.BooleanFilter(method='is_past_qs')
is_future = django_filters.rest_framework.BooleanFilter(method='is_future_qs')
ends_after = django_filters.rest_framework.IsoDateTimeFilter(method='ends_after_qs')
class Meta:
model = SubEvent
fields = ['active', 'event__live']
class Meta:
model = SubEvent
fields = ['active', 'event__live']
def ends_after_qs(self, queryset, name, value):
expr = Q(
Q(Q(date_to__isnull=True) & Q(date_from__gte=value))
| Q(Q(date_to__isnull=False) & Q(date_to__gte=value))
)
return queryset.filter(expr)
def is_past_qs(self, queryset, name, value):
expr = Q(
Q(Q(date_to__isnull=True) & Q(date_from__lt=now()))
| Q(Q(date_to__isnull=False) & Q(date_to__lt=now()))
)
if value:
def ends_after_qs(self, queryset, name, value):
expr = Q(
Q(Q(date_to__isnull=True) & Q(date_from__gte=value))
| Q(Q(date_to__isnull=False) & Q(date_to__gte=value))
)
return queryset.filter(expr)
else:
return queryset.exclude(expr)
def is_future_qs(self, queryset, name, value):
expr = Q(
Q(Q(date_to__isnull=True) & Q(date_from__gte=now()))
| Q(Q(date_to__isnull=False) & Q(date_to__gte=now()))
)
if value:
return queryset.filter(expr)
else:
return queryset.exclude(expr)
def is_past_qs(self, queryset, name, value):
expr = Q(
Q(Q(date_to__isnull=True) & Q(date_from__lt=now()))
| Q(Q(date_to__isnull=False) & Q(date_to__lt=now()))
)
if value:
return queryset.filter(expr)
else:
return queryset.exclude(expr)
def is_future_qs(self, queryset, name, value):
expr = Q(
Q(Q(date_to__isnull=True) & Q(date_from__gte=now()))
| Q(Q(date_to__isnull=False) & Q(date_to__gte=now()))
)
if value:
return queryset.filter(expr)
else:
return queryset.exclude(expr)
class SubEventViewSet(ConditionalListView, viewsets.ModelViewSet):
@@ -244,8 +246,14 @@ class SubEventViewSet(ConditionalListView, viewsets.ModelViewSet):
)
def perform_update(self, serializer):
original_data = self.get_serializer(instance=serializer.instance).data
super().perform_update(serializer)
if serializer.data == original_data:
# Performance optimization: If nothing was changed, we do not need to save or log anything.
# This costs us a few cycles on save, but avoids thousands of lines in our log.
return
serializer.instance.log_action(
'pretix.subevent.changed',
user=self.request.user,

View File

@@ -3,6 +3,7 @@ from django.db.models import Q
from django.shortcuts import get_object_or_404
from django.utils.functional import cached_property
from django_filters.rest_framework import DjangoFilterBackend, FilterSet
from django_scopes import scopes_disabled
from rest_framework import viewsets
from rest_framework.decorators import action
from rest_framework.exceptions import PermissionDenied
@@ -21,19 +22,19 @@ from pretix.base.models import (
)
from pretix.helpers.dicts import merge_dicts
with scopes_disabled():
class ItemFilter(FilterSet):
tax_rate = django_filters.CharFilter(method='tax_rate_qs')
class ItemFilter(FilterSet):
tax_rate = django_filters.CharFilter(method='tax_rate_qs')
def tax_rate_qs(self, queryset, name, value):
if value in ("0", "None", "0.00"):
return queryset.filter(Q(tax_rule__isnull=True) | Q(tax_rule__rate=0))
else:
return queryset.filter(tax_rule__rate=value)
def tax_rate_qs(self, queryset, name, value):
if value in ("0", "None", "0.00"):
return queryset.filter(Q(tax_rule__isnull=True) | Q(tax_rule__rate=0))
else:
return queryset.filter(tax_rule__rate=value)
class Meta:
model = Item
fields = ['active', 'category', 'admission', 'tax_rate', 'free_price']
class Meta:
model = Item
fields = ['active', 'category', 'admission', 'tax_rate', 'free_price']
class ItemViewSet(ConditionalListView, viewsets.ModelViewSet):
@@ -65,7 +66,14 @@ class ItemViewSet(ConditionalListView, viewsets.ModelViewSet):
return ctx
def perform_update(self, serializer):
original_data = self.get_serializer(instance=serializer.instance).data
serializer.save(event=self.request.event)
if serializer.data == original_data:
# Performance optimization: If nothing was changed, we do not need to save or log anything.
# This costs us a few cycles on save, but avoids thousands of lines in our log.
return
serializer.instance.log_action(
'pretix.event.item.changed',
user=self.request.user,
@@ -312,10 +320,11 @@ class ItemCategoryViewSet(ConditionalListView, viewsets.ModelViewSet):
super().perform_destroy(instance)
class QuestionFilter(FilterSet):
class Meta:
model = Question
fields = ['ask_during_checkin', 'required', 'identifier']
with scopes_disabled():
class QuestionFilter(FilterSet):
class Meta:
model = Question
fields = ['ask_during_checkin', 'required', 'identifier']
class QuestionViewSet(ConditionalListView, viewsets.ModelViewSet):
@@ -411,10 +420,11 @@ class QuestionOptionViewSet(viewsets.ModelViewSet):
super().perform_destroy(instance)
class QuotaFilter(FilterSet):
class Meta:
model = Quota
fields = ['subevent']
with scopes_disabled():
class QuotaFilter(FilterSet):
class Meta:
model = Quota
fields = ['subevent']
class QuotaViewSet(ConditionalListView, viewsets.ModelViewSet):
@@ -452,9 +462,17 @@ class QuotaViewSet(ConditionalListView, viewsets.ModelViewSet):
return ctx
def perform_update(self, serializer):
original_data = self.get_serializer(instance=serializer.instance).data
current_subevent = serializer.instance.subevent
serializer.save(event=self.request.event)
request_subevent = serializer.instance.subevent
if serializer.data == original_data:
# Performance optimization: If nothing was changed, we do not need to save or log anything.
# This costs us a few cycles on save, but avoids thousands of lines in our log.
return
serializer.instance.log_action(
'pretix.event.quota.changed',
user=self.request.user,

View File

@@ -11,6 +11,7 @@ from django.shortcuts import get_object_or_404
from django.utils.timezone import make_aware, now
from django.utils.translation import ugettext as _
from django_filters.rest_framework import DjangoFilterBackend, FilterSet
from django_scopes import scopes_disabled
from rest_framework import mixins, serializers, status, viewsets
from rest_framework.decorators import action
from rest_framework.exceptions import (
@@ -50,17 +51,17 @@ from pretix.base.signals import (
)
from pretix.base.templatetags.money import money_filter
with scopes_disabled():
class OrderFilter(FilterSet):
email = django_filters.CharFilter(field_name='email', lookup_expr='iexact')
code = django_filters.CharFilter(field_name='code', lookup_expr='iexact')
status = django_filters.CharFilter(field_name='status', lookup_expr='iexact')
modified_since = django_filters.IsoDateTimeFilter(field_name='last_modified', lookup_expr='gte')
created_since = django_filters.IsoDateTimeFilter(field_name='datetime', lookup_expr='gte')
class OrderFilter(FilterSet):
email = django_filters.CharFilter(field_name='email', lookup_expr='iexact')
code = django_filters.CharFilter(field_name='code', lookup_expr='iexact')
status = django_filters.CharFilter(field_name='status', lookup_expr='iexact')
modified_since = django_filters.IsoDateTimeFilter(field_name='last_modified', lookup_expr='gte')
created_since = django_filters.IsoDateTimeFilter(field_name='datetime', lookup_expr='gte')
class Meta:
model = Order
fields = ['code', 'status', 'email', 'locale', 'testmode', 'require_approval']
class Meta:
model = Order
fields = ['code', 'status', 'email', 'locale', 'testmode', 'require_approval']
class OrderViewSet(viewsets.ModelViewSet):
@@ -531,48 +532,49 @@ class OrderViewSet(viewsets.ModelViewSet):
self.get_object().gracefully_delete(user=self.request.user if self.request.user.is_authenticated else None, auth=self.request.auth)
class OrderPositionFilter(FilterSet):
order = django_filters.CharFilter(field_name='order', lookup_expr='code__iexact')
has_checkin = django_filters.rest_framework.BooleanFilter(method='has_checkin_qs')
attendee_name = django_filters.CharFilter(method='attendee_name_qs')
search = django_filters.CharFilter(method='search_qs')
with scopes_disabled():
class OrderPositionFilter(FilterSet):
order = django_filters.CharFilter(field_name='order', lookup_expr='code__iexact')
has_checkin = django_filters.rest_framework.BooleanFilter(method='has_checkin_qs')
attendee_name = django_filters.CharFilter(method='attendee_name_qs')
search = django_filters.CharFilter(method='search_qs')
def search_qs(self, queryset, name, value):
return queryset.filter(
Q(secret__istartswith=value)
| Q(attendee_name_cached__icontains=value)
| Q(addon_to__attendee_name_cached__icontains=value)
| Q(attendee_email__icontains=value)
| Q(addon_to__attendee_email__icontains=value)
| Q(order__code__istartswith=value)
| Q(order__invoice_address__name_cached__icontains=value)
| Q(order__email__icontains=value)
)
def search_qs(self, queryset, name, value):
return queryset.filter(
Q(secret__istartswith=value)
| Q(attendee_name_cached__icontains=value)
| Q(addon_to__attendee_name_cached__icontains=value)
| Q(attendee_email__icontains=value)
| Q(addon_to__attendee_email__icontains=value)
| Q(order__code__istartswith=value)
| Q(order__invoice_address__name_cached__icontains=value)
| Q(order__email__icontains=value)
)
def has_checkin_qs(self, queryset, name, value):
return queryset.filter(checkins__isnull=not value)
def has_checkin_qs(self, queryset, name, value):
return queryset.filter(checkins__isnull=not value)
def attendee_name_qs(self, queryset, name, value):
return queryset.filter(Q(attendee_name_cached__iexact=value) | Q(addon_to__attendee_name_cached__iexact=value))
def attendee_name_qs(self, queryset, name, value):
return queryset.filter(Q(attendee_name_cached__iexact=value) | Q(addon_to__attendee_name_cached__iexact=value))
class Meta:
model = OrderPosition
fields = {
'item': ['exact', 'in'],
'variation': ['exact', 'in'],
'secret': ['exact'],
'order__status': ['exact', 'in'],
'addon_to': ['exact', 'in'],
'subevent': ['exact', 'in'],
'pseudonymization_id': ['exact'],
'voucher__code': ['exact'],
'voucher': ['exact'],
}
class Meta:
model = OrderPosition
fields = {
'item': ['exact', 'in'],
'variation': ['exact', 'in'],
'secret': ['exact'],
'order__status': ['exact', 'in'],
'addon_to': ['exact', 'in'],
'subevent': ['exact', 'in'],
'pseudonymization_id': ['exact'],
'voucher__code': ['exact'],
'voucher': ['exact'],
}
class OrderPositionViewSet(mixins.DestroyModelMixin, viewsets.ReadOnlyModelViewSet):
serializer_class = OrderPositionSerializer
queryset = OrderPosition.objects.none()
queryset = OrderPosition.all.none()
filter_backends = (DjangoFilterBackend, OrderingFilter)
ordering = ('order__datetime', 'positionid')
ordering_fields = ('order__code', 'order__datetime', 'positionid', 'attendee_name', 'order__status',)
@@ -960,22 +962,23 @@ class RefundViewSet(CreateModelMixin, viewsets.ReadOnlyModelViewSet):
serializer.save()
class InvoiceFilter(FilterSet):
refers = django_filters.CharFilter(method='refers_qs')
number = django_filters.CharFilter(method='nr_qs')
order = django_filters.CharFilter(field_name='order', lookup_expr='code__iexact')
with scopes_disabled():
class InvoiceFilter(FilterSet):
refers = django_filters.CharFilter(method='refers_qs')
number = django_filters.CharFilter(method='nr_qs')
order = django_filters.CharFilter(field_name='order', lookup_expr='code__iexact')
def refers_qs(self, queryset, name, value):
return queryset.annotate(
refers_nr=Concat('refers__prefix', 'refers__invoice_no')
).filter(refers_nr__iexact=value)
def refers_qs(self, queryset, name, value):
return queryset.annotate(
refers_nr=Concat('refers__prefix', 'refers__invoice_no')
).filter(refers_nr__iexact=value)
def nr_qs(self, queryset, name, value):
return queryset.filter(nr__iexact=value)
def nr_qs(self, queryset, name, value):
return queryset.filter(nr__iexact=value)
class Meta:
model = Invoice
fields = ['order', 'number', 'is_cancellation', 'refers', 'locale']
class Meta:
model = Invoice
fields = ['order', 'number', 'is_cancellation', 'refers', 'locale']
class RetryException(APIException):

View File

@@ -6,6 +6,7 @@ from django.utils.timezone import now
from django_filters.rest_framework import (
BooleanFilter, DjangoFilterBackend, FilterSet,
)
from django_scopes import scopes_disabled
from rest_framework import status, viewsets
from rest_framework.decorators import action
from rest_framework.exceptions import PermissionDenied
@@ -15,22 +16,22 @@ from rest_framework.response import Response
from pretix.api.serializers.voucher import VoucherSerializer
from pretix.base.models import Voucher
with scopes_disabled():
class VoucherFilter(FilterSet):
active = BooleanFilter(method='filter_active')
class VoucherFilter(FilterSet):
active = BooleanFilter(method='filter_active')
class Meta:
model = Voucher
fields = ['code', 'max_usages', 'redeemed', 'block_quota', 'allow_ignore_quota',
'price_mode', 'value', 'item', 'variation', 'quota', 'tag', 'subevent']
class Meta:
model = Voucher
fields = ['code', 'max_usages', 'redeemed', 'block_quota', 'allow_ignore_quota',
'price_mode', 'value', 'item', 'variation', 'quota', 'tag', 'subevent']
def filter_active(self, queryset, name, value):
if value:
return queryset.filter(Q(redeemed__lt=F('max_usages')) &
(Q(valid_until__isnull=True) | Q(valid_until__gt=now())))
else:
return queryset.filter(Q(redeemed__gte=F('max_usages')) |
(Q(valid_until__isnull=False) & Q(valid_until__lte=now())))
def filter_active(self, queryset, name, value):
if value:
return queryset.filter(Q(redeemed__lt=F('max_usages')) &
(Q(valid_until__isnull=True) | Q(valid_until__gt=now())))
else:
return queryset.filter(Q(redeemed__gte=F('max_usages')) |
(Q(valid_until__isnull=False) & Q(valid_until__lte=now())))
class VoucherViewSet(viewsets.ModelViewSet):

View File

@@ -1,5 +1,6 @@
import django_filters
from django_filters.rest_framework import DjangoFilterBackend, FilterSet
from django_scopes import scopes_disabled
from rest_framework import viewsets
from rest_framework.decorators import action
from rest_framework.exceptions import PermissionDenied, ValidationError
@@ -10,16 +11,16 @@ from pretix.api.serializers.waitinglist import WaitingListSerializer
from pretix.base.models import WaitingListEntry
from pretix.base.models.waitinglist import WaitingListException
with scopes_disabled():
class WaitingListFilter(FilterSet):
has_voucher = django_filters.rest_framework.BooleanFilter(method='has_voucher_qs')
class WaitingListFilter(FilterSet):
has_voucher = django_filters.rest_framework.BooleanFilter(method='has_voucher_qs')
def has_voucher_qs(self, queryset, name, value):
return queryset.filter(voucher__isnull=not value)
def has_voucher_qs(self, queryset, name, value):
return queryset.filter(voucher__isnull=not value)
class Meta:
model = WaitingListEntry
fields = ['item', 'variation', 'email', 'locale', 'has_voucher', 'subevent']
class Meta:
model = WaitingListEntry
fields = ['item', 'variation', 'email', 'locale', 'has_voucher', 'subevent']
class WaitingListViewSet(viewsets.ModelViewSet):

View File

@@ -8,6 +8,7 @@ from celery.exceptions import MaxRetriesExceededError
from django.db.models import Exists, OuterRef, Q
from django.dispatch import receiver
from django.utils.translation import ugettext_lazy as _
from django_scopes import scope, scopes_disabled
from requests import RequestException
from pretix.api.models import WebHook, WebHookCall, WebHookEventListener
@@ -203,51 +204,52 @@ def notify_webhooks(logentry_id: int):
@app.task(base=ProfiledTask, bind=True, max_retries=9)
def send_webhook(self, logentry_id: int, action_type: str, webhook_id: int):
# 9 retries with 2**(2*x) timing is roughly 72 hours
logentry = LogEntry.all.get(id=logentry_id)
webhook = WebHook.objects.get(id=webhook_id)
with scopes_disabled():
webhook = WebHook.objects.get(id=webhook_id)
with scope(organizer=webhook.organizer):
logentry = LogEntry.all.get(id=logentry_id)
types = get_all_webhook_events()
event_type = types.get(action_type)
if not event_type or not webhook.enabled:
return # Ignore, e.g. plugin not installed
types = get_all_webhook_events()
event_type = types.get(action_type)
if not event_type or not webhook.enabled:
return # Ignore, e.g. plugin not installed
payload = event_type.build_payload(logentry)
t = time.time()
payload = event_type.build_payload(logentry)
t = time.time()
try:
try:
resp = requests.post(
webhook.target_url,
json=payload,
allow_redirects=False
)
WebHookCall.objects.create(
webhook=webhook,
action_type=logentry.action_type,
target_url=webhook.target_url,
is_retry=self.request.retries > 0,
execution_time=time.time() - t,
return_code=resp.status_code,
payload=json.dumps(payload),
response_body=resp.text[:1024 * 1024],
success=200 <= resp.status_code <= 299
)
if resp.status_code == 410:
webhook.enabled = False
webhook.save()
elif resp.status_code > 299:
try:
resp = requests.post(
webhook.target_url,
json=payload,
allow_redirects=False
)
WebHookCall.objects.create(
webhook=webhook,
action_type=logentry.action_type,
target_url=webhook.target_url,
is_retry=self.request.retries > 0,
execution_time=time.time() - t,
return_code=resp.status_code,
payload=json.dumps(payload),
response_body=resp.text[:1024 * 1024],
success=200 <= resp.status_code <= 299
)
if resp.status_code == 410:
webhook.enabled = False
webhook.save()
elif resp.status_code > 299:
raise self.retry(countdown=2 ** (self.request.retries * 2))
except RequestException as e:
WebHookCall.objects.create(
webhook=webhook,
action_type=logentry.action_type,
target_url=webhook.target_url,
is_retry=self.request.retries > 0,
execution_time=time.time() - t,
return_code=0,
payload=json.dumps(payload),
response_body=str(e)[:1024 * 1024]
)
raise self.retry(countdown=2 ** (self.request.retries * 2))
except RequestException as e:
WebHookCall.objects.create(
webhook=webhook,
action_type=logentry.action_type,
target_url=webhook.target_url,
is_retry=self.request.retries > 0,
execution_time=time.time() - t,
return_code=0,
payload=json.dumps(payload),
response_body=str(e)[:1024 * 1024]
)
raise self.retry(countdown=2 ** (self.request.retries * 2))
except MaxRetriesExceededError:
pass
except MaxRetriesExceededError:
pass

View File

@@ -12,6 +12,7 @@ from django.utils.crypto import get_random_string
from django.utils.timezone import now
from django.utils.translation import ugettext_lazy as _
from django_otp.models import Device
from django_scopes import scopes_disabled
from pretix.base.i18n import language
from pretix.helpers.urls import build_absolute_uri
@@ -283,6 +284,7 @@ class User(AbstractBaseUser, PermissionsMixin, LoggingMixin):
return True
return False
@scopes_disabled()
def get_events_with_any_permission(self, request=None):
"""
Returns a queryset of events the user has any permissions to.
@@ -300,6 +302,7 @@ class User(AbstractBaseUser, PermissionsMixin, LoggingMixin):
| Q(id__in=self.teams.values_list('limit_events__id', flat=True))
)
@scopes_disabled()
def get_events_with_permission(self, permission, request=None):
"""
Returns a queryset of events the user has a specific permissions to.

View File

@@ -3,6 +3,7 @@ from django.db.models import Case, Count, F, OuterRef, Q, Subquery, When
from django.db.models.functions import Coalesce
from django.utils.timezone import now
from django.utils.translation import pgettext_lazy, ugettext_lazy as _
from django_scopes import ScopedManager
from pretix.base.models import LoggedModel
@@ -20,6 +21,8 @@ class CheckinList(LoggedModel):
'order have not been paid. This only works with pretixdesk '
'0.3.0 or newer or pretixdroid 1.9 or newer.'))
objects = ScopedManager(organizer='event__organizer')
class Meta:
ordering = ('subevent__date_from', 'name')
@@ -167,6 +170,8 @@ class Checkin(models.Model):
'pretixbase.CheckinList', related_name='checkins', on_delete=models.PROTECT,
)
objects = ScopedManager(organizer='position__order__event__organizer')
class Meta:
unique_together = (('list', 'position'),)

View File

@@ -4,6 +4,7 @@ from django.db import models
from django.db.models import Max
from django.utils.crypto import get_random_string
from django.utils.translation import ugettext_lazy as _
from django_scopes import ScopedManager
from pretix.base.models import LoggedModel
@@ -71,6 +72,8 @@ class Device(LoggedModel):
null=True, blank=True
)
objects = ScopedManager(organizer='organizer')
class Meta:
unique_together = (('organizer', 'device_id'),)

View File

@@ -17,6 +17,7 @@ from django.utils.crypto import get_random_string
from django.utils.functional import cached_property
from django.utils.timezone import make_aware, now
from django.utils.translation import ugettext_lazy as _
from django_scopes import ScopedManager
from i18nfield.fields import I18nCharField, I18nTextField
from pretix.base.models.base import LoggedModel
@@ -336,6 +337,8 @@ class Event(EventMixin, LoggedModel):
default=False
)
objects = ScopedManager(organizer='organizer')
class Meta:
verbose_name = _("Event")
verbose_name_plural = _("Events")
@@ -875,6 +878,8 @@ class SubEvent(EventMixin, LoggedModel):
items = models.ManyToManyField('Item', through='SubEventItem')
variations = models.ManyToManyField('ItemVariation', through='SubEventItemVariation')
objects = ScopedManager(organizer='event__organizer')
class Meta:
verbose_name = _("Date in event series")
verbose_name_plural = _("Dates in event series")

View File

@@ -9,6 +9,7 @@ from django.utils.crypto import get_random_string
from django.utils.functional import cached_property
from django.utils.translation import pgettext
from django_countries.fields import CountryField
from django_scopes import ScopedManager
def invoice_filename(instance, filename: str) -> str:
@@ -107,6 +108,8 @@ class Invoice(models.Model):
file = models.FileField(null=True, blank=True, upload_to=invoice_filename, max_length=255)
internal_reference = models.TextField(blank=True)
objects = ScopedManager(organizer='event__organizer')
@staticmethod
def _to_numeric_invoice_number(number):
return '{:05d}'.format(int(number))

View File

@@ -17,6 +17,7 @@ from django.utils.functional import cached_property
from django.utils.timezone import is_naive, make_aware, now
from django.utils.translation import pgettext_lazy, ugettext_lazy as _
from django_countries.fields import Country
from django_scopes import ScopedManager
from i18nfield.fields import I18nCharField, I18nTextField
from pretix.base.models import fields
@@ -155,28 +156,41 @@ class SubEventItemVariation(models.Model):
self.subevent.event.cache.clear()
def filter_available(qs, channel='web', voucher=None, allow_addons=False):
q = (
# IMPORTANT: If this is updated, also update the ItemVariation query
# in models/event.py: EventMixin.annotated()
Q(active=True)
& Q(Q(available_from__isnull=True) | Q(available_from__lte=now()))
& Q(Q(available_until__isnull=True) | Q(available_until__gte=now()))
& Q(sales_channels__contains=channel) & Q(require_bundling=False)
)
if not allow_addons:
q &= Q(Q(category__isnull=True) | Q(category__is_addon=False))
qs = qs.filter(q)
vouchq = Q(hide_without_voucher=False)
if voucher:
if voucher.item_id:
vouchq |= Q(pk=voucher.item_id)
qs = qs.filter(pk=voucher.item_id)
elif voucher.quota_id:
qs = qs.filter(quotas__in=[voucher.quota_id])
return qs.filter(vouchq)
class ItemQuerySet(models.QuerySet):
def filter_available(self, channel='web', voucher=None, allow_addons=False):
q = (
# IMPORTANT: If this is updated, also update the ItemVariation query
# in models/event.py: EventMixin.annotated()
Q(active=True)
& Q(Q(available_from__isnull=True) | Q(available_from__lte=now()))
& Q(Q(available_until__isnull=True) | Q(available_until__gte=now()))
& Q(sales_channels__contains=channel) & Q(require_bundling=False)
)
if not allow_addons:
q &= Q(Q(category__isnull=True) | Q(category__is_addon=False))
qs = self.filter(q)
return filter_available(self, channel, voucher, allow_addons)
vouchq = Q(hide_without_voucher=False)
if voucher:
if voucher.item_id:
vouchq |= Q(pk=voucher.item_id)
qs = qs.filter(pk=voucher.item_id)
elif voucher.quota_id:
qs = qs.filter(quotas__in=[voucher.quota_id])
return qs.filter(vouchq)
class ItemQuerySetManager(ScopedManager(organizer='event__organizer').__class__):
def __init__(self):
super().__init__()
self._queryset_class = ItemQuerySet
def filter_available(self, channel='web', voucher=None, allow_addons=False):
return filter_available(self.get_queryset(), channel, voucher, allow_addons)
class Item(LoggedModel):
@@ -226,7 +240,7 @@ class Item(LoggedModel):
:type sales_channels: bool
"""
objects = ItemQuerySet.as_manager()
objects = ItemQuerySetManager()
event = models.ForeignKey(
Event,
@@ -591,6 +605,8 @@ class ItemVariation(models.Model):
'discounted one. This is just a cosmetic setting and will not actually impact pricing.')
)
objects = ScopedManager(organizer='item__event__organizer')
class Meta:
verbose_name = _("Product variation")
verbose_name_plural = _("Product variations")
@@ -985,6 +1001,8 @@ class Question(LoggedModel):
)
dependency_value = models.TextField(null=True, blank=True)
objects = ScopedManager(organizer='event__organizer')
class Meta:
verbose_name = _("Question")
verbose_name_plural = _("Questions")
@@ -1234,6 +1252,8 @@ class Quota(LoggedModel):
cached_availability_paid_orders = models.PositiveIntegerField(null=True, blank=True)
cached_availability_time = models.DateTimeField(null=True, blank=True)
objects = ScopedManager(organizer='event__organizer')
class Meta:
verbose_name = _("Quota")
verbose_name_plural = _("Quotas")

View File

@@ -15,7 +15,7 @@ from django.db import models, transaction
from django.db.models import (
Case, Exists, F, Max, OuterRef, Q, Subquery, Sum, Value, When,
)
from django.db.models.functions import Coalesce
from django.db.models.functions import Coalesce, Greatest
from django.db.models.signals import post_delete
from django.dispatch import receiver
from django.urls import reverse
@@ -26,6 +26,7 @@ from django.utils.functional import cached_property
from django.utils.timezone import make_aware, now
from django.utils.translation import pgettext_lazy, ugettext_lazy as _
from django_countries.fields import Country, CountryField
from django_scopes import ScopedManager, scopes_disabled
from i18nfield.strings import LazyI18nString
from jsonfallback.fields import FallbackJSONField
@@ -186,6 +187,8 @@ class Order(LockModel, LoggedModel):
verbose_name=_('E-mail address verified')
)
objects = ScopedManager(organizer='event__organizer')
class Meta:
verbose_name = _("Order")
verbose_name_plural = _("Orders")
@@ -195,6 +198,8 @@ class Order(LockModel, LoggedModel):
return self.full_code
def gracefully_delete(self, user=None, auth=None):
from . import Voucher
if not self.testmode:
raise TypeError("Only test mode orders can be deleted.")
self.event.log_action(
@@ -203,6 +208,12 @@ class Order(LockModel, LoggedModel):
'code': self.code,
}
)
if self.status != Order.STATUS_CANCELED:
for position in self.positions.all():
if position.voucher:
Voucher.objects.filter(pk=position.voucher.pk).update(redeemed=Greatest(0, F('redeemed') - 1))
OrderPosition.all.filter(order=self, addon_to__isnull=False).delete()
OrderPosition.all.filter(order=self).delete()
OrderFee.all.filter(order=self).delete()
@@ -223,6 +234,7 @@ class Order(LockModel, LoggedModel):
return self.all_fees(manager='objects')
@cached_property
@scopes_disabled()
def count_positions(self):
if hasattr(self, 'pcnt'):
return self.pcnt or 0
@@ -246,6 +258,7 @@ class Order(LockModel, LoggedModel):
return None
@property
@scopes_disabled()
def payment_refund_sum(self):
payment_sum = self.payments.filter(
state__in=(OrderPayment.PAYMENT_STATE_CONFIRMED, OrderPayment.PAYMENT_STATE_REFUNDED)
@@ -257,6 +270,7 @@ class Order(LockModel, LoggedModel):
return payment_sum - refund_sum
@property
@scopes_disabled()
def pending_sum(self):
total = self.total
if self.status == Order.STATUS_CANCELED:
@@ -431,6 +445,7 @@ class Order(LockModel, LoggedModel):
return round_decimal(fee, self.event.currency)
@property
@scopes_disabled()
def user_cancel_allowed(self) -> bool:
"""
Returns whether or not this order can be canceled by the user.
@@ -814,6 +829,8 @@ class QuestionAnswer(models.Model):
max_length=255
)
objects = ScopedManager(organizer='question__event__organizer')
@property
def backend_file_url(self):
if self.file:
@@ -1137,6 +1154,8 @@ class OrderPayment(models.Model):
)
migrated = models.BooleanField(default=False)
objects = ScopedManager(organizer='order__event__organizer')
class Meta:
ordering = ('local_id',)
@@ -1493,6 +1512,8 @@ class OrderRefund(models.Model):
null=True, blank=True
)
objects = ScopedManager(organizer='order__event__organizer')
class Meta:
ordering = ('local_id',)
@@ -1554,7 +1575,7 @@ class OrderRefund(models.Model):
super().save(*args, **kwargs)
class ActivePositionManager(models.Manager):
class ActivePositionManager(ScopedManager(organizer='order__event__organizer').__class__):
def get_queryset(self):
return super().get_queryset().filter(canceled=False)
@@ -1631,7 +1652,7 @@ class OrderFee(models.Model):
)
canceled = models.BooleanField(default=False)
all = models.Manager()
all = ScopedManager(organizer='order__event__organizer')
objects = ActivePositionManager()
@property
@@ -1736,7 +1757,7 @@ class OrderPosition(AbstractPosition):
)
canceled = models.BooleanField(default=False)
all = models.Manager()
all = ScopedManager(organizer='order__event__organizer')
objects = ActivePositionManager()
class Meta:
@@ -1943,6 +1964,8 @@ class CartPosition(AbstractPosition):
)
is_bundled = models.BooleanField(default=False)
objects = ScopedManager(organizer='event__organizer')
class Meta:
verbose_name = _("Cart position")
verbose_name_plural = _("Cart positions")
@@ -1992,6 +2015,8 @@ class InvoiceAddress(models.Model):
blank=True
)
objects = ScopedManager(organizer='order__event__organizer')
def save(self, **kwargs):
if self.order:
self.order.touch()

View File

@@ -8,6 +8,7 @@ from django.db.models import Q
from django.utils.crypto import get_random_string
from django.utils.timezone import now
from django.utils.translation import pgettext_lazy, ugettext_lazy as _
from django_scopes import ScopedManager
from ..decimal import round_decimal
from .base import LoggedModel
@@ -173,6 +174,8 @@ class Voucher(LoggedModel):
"convenience.")
)
objects = ScopedManager(organizer='event__organizer')
class Meta:
verbose_name = _("Voucher")
verbose_name_plural = _("Vouchers")

View File

@@ -4,6 +4,7 @@ from django.core.exceptions import ValidationError
from django.db import models, transaction
from django.utils.timezone import now
from django.utils.translation import pgettext_lazy, ugettext_lazy as _
from django_scopes import ScopedManager
from pretix.base.i18n import language
from pretix.base.models import Voucher
@@ -67,6 +68,8 @@ class WaitingListEntry(LoggedModel):
)
priority = models.IntegerField(default=0)
objects = ScopedManager(organizer='event__organizer')
class Meta:
verbose_name = _("Waiting list entry")
verbose_name_plural = _("Waiting list entries")

View File

@@ -10,6 +10,7 @@ from django.db.models import Q
from django.dispatch import receiver
from django.utils.timezone import make_aware, now
from django.utils.translation import pgettext_lazy, ugettext as _
from django_scopes import scopes_disabled
from pretix.base.i18n import language
from pretix.base.models import (
@@ -23,7 +24,7 @@ from pretix.base.reldate import RelativeDateWrapper
from pretix.base.services.checkin import _save_answers
from pretix.base.services.locking import LockTimeoutException, NoLockManager
from pretix.base.services.pricing import get_price
from pretix.base.services.tasks import ProfiledTask
from pretix.base.services.tasks import ProfiledEventTask
from pretix.base.settings import PERSON_NAME_SCHEMES
from pretix.base.templatetags.rich_text import rich_text
from pretix.celery_app import app
@@ -902,7 +903,7 @@ def get_fees(event, request, total, invoice_address, provider):
return fees
@app.task(base=ProfiledTask, bind=True, max_retries=5, default_retry_delay=1, throws=(CartError,))
@app.task(base=ProfiledEventTask, bind=True, max_retries=5, default_retry_delay=1, throws=(CartError,))
def add_items_to_cart(self, event: int, items: List[dict], cart_id: str=None, locale='en',
invoice_address: int=None, widget_data=None, sales_channel='web') -> None:
"""
@@ -913,12 +914,11 @@ def add_items_to_cart(self, event: int, items: List[dict], cart_id: str=None, lo
:raises CartError: On any error that occured
"""
with language(locale):
event = Event.objects.get(id=event)
ia = False
if invoice_address:
try:
ia = InvoiceAddress.objects.get(pk=invoice_address)
with scopes_disabled():
ia = InvoiceAddress.objects.get(pk=invoice_address)
except InvoiceAddress.DoesNotExist:
pass
@@ -934,8 +934,8 @@ def add_items_to_cart(self, event: int, items: List[dict], cart_id: str=None, lo
raise CartError(error_messages['busy'])
@app.task(base=ProfiledTask, bind=True, max_retries=5, default_retry_delay=1, throws=(CartError,))
def remove_cart_position(self, event: int, position: int, cart_id: str=None, locale='en') -> None:
@app.task(base=ProfiledEventTask, bind=True, max_retries=5, default_retry_delay=1, throws=(CartError,))
def remove_cart_position(self, event: Event, position: int, cart_id: str=None, locale='en') -> None:
"""
Removes a list of items from a user's cart.
:param event: The event ID in question
@@ -943,7 +943,6 @@ def remove_cart_position(self, event: int, position: int, cart_id: str=None, loc
:param session: Session ID of a guest
"""
with language(locale):
event = Event.objects.get(id=event)
try:
try:
cm = CartManager(event=event, cart_id=cart_id)
@@ -955,15 +954,14 @@ def remove_cart_position(self, event: int, position: int, cart_id: str=None, loc
raise CartError(error_messages['busy'])
@app.task(base=ProfiledTask, bind=True, max_retries=5, default_retry_delay=1, throws=(CartError,))
def clear_cart(self, event: int, cart_id: str=None, locale='en') -> None:
@app.task(base=ProfiledEventTask, bind=True, max_retries=5, default_retry_delay=1, throws=(CartError,))
def clear_cart(self, event: Event, cart_id: str=None, locale='en') -> None:
"""
Removes a list of items from a user's cart.
:param event: The event ID in question
:param session: Session ID of a guest
"""
with language(locale):
event = Event.objects.get(id=event)
try:
try:
cm = CartManager(event=event, cart_id=cart_id)
@@ -975,8 +973,8 @@ def clear_cart(self, event: int, cart_id: str=None, locale='en') -> None:
raise CartError(error_messages['busy'])
@app.task(base=ProfiledTask, bind=True, max_retries=5, default_retry_delay=1, throws=(CartError,))
def set_cart_addons(self, event: int, addons: List[dict], cart_id: str=None, locale='en',
@app.task(base=ProfiledEventTask, bind=True, max_retries=5, default_retry_delay=1, throws=(CartError,))
def set_cart_addons(self, event: Event, addons: List[dict], cart_id: str=None, locale='en',
invoice_address: int=None, sales_channel='web') -> None:
"""
Removes a list of items from a user's cart.
@@ -985,12 +983,11 @@ def set_cart_addons(self, event: int, addons: List[dict], cart_id: str=None, loc
:param session: Session ID of a guest
"""
with language(locale):
event = Event.objects.get(id=event)
ia = False
if invoice_address:
try:
ia = InvoiceAddress.objects.get(pk=invoice_address)
with scopes_disabled():
ia = InvoiceAddress.objects.get(pk=invoice_address)
except InvoiceAddress.DoesNotExist:
pass
try:

View File

@@ -2,6 +2,7 @@ from datetime import timedelta
from django.dispatch import receiver
from django.utils.timezone import now
from django_scopes import scopes_disabled
from pretix.base.models import CachedCombinedTicket, CachedTicket
@@ -10,6 +11,7 @@ from ..signals import periodic_task
@receiver(signal=periodic_task)
@scopes_disabled()
def clean_cart_positions(sender, **kwargs):
for cp in CartPosition.objects.filter(expires__lt=now() - timedelta(days=14), addon_to__isnull=False):
cp.delete()
@@ -20,12 +22,14 @@ def clean_cart_positions(sender, **kwargs):
@receiver(signal=periodic_task)
@scopes_disabled()
def clean_cached_files(sender, **kwargs):
for cf in CachedFile.objects.filter(expires__isnull=False, expires__lt=now()):
cf.delete()
@receiver(signal=periodic_task)
@scopes_disabled()
def clean_cached_tickets(sender, **kwargs):
for cf in CachedTicket.objects.filter(created__lte=now() - timedelta(days=30)):
cf.delete()

View File

@@ -6,7 +6,7 @@ from django.utils.translation import ugettext
from pretix.base.i18n import LazyLocaleException, language
from pretix.base.models import CachedFile, Event, cachedfile_name
from pretix.base.services.tasks import ProfiledTask
from pretix.base.services.tasks import ProfiledEventTask
from pretix.base.signals import register_data_exporters
from pretix.celery_app import app
@@ -15,9 +15,8 @@ class ExportError(LazyLocaleException):
pass
@app.task(base=ProfiledTask, throws=(ExportError,))
def export(event: str, fileid: str, provider: str, form_data: Dict[str, Any]) -> None:
event = Event.objects.get(id=event)
@app.task(base=ProfiledEventTask, throws=(ExportError,))
def export(event: Event, fileid: str, provider: str, form_data: Dict[str, Any]) -> None:
file = CachedFile.objects.get(id=fileid)
with language(event.settings.locale), override(event.settings.timezone):
responses = register_data_exporters.send(event)

View File

@@ -15,6 +15,7 @@ from django.utils import timezone
from django.utils.timezone import now
from django.utils.translation import pgettext, ugettext as _
from django_countries.fields import Country
from django_scopes import scope, scopes_disabled
from i18nfield.strings import LazyI18nString
from pretix.base.i18n import language
@@ -244,16 +245,18 @@ def generate_invoice(order: Order, trigger_pdf=True):
@app.task(base=TransactionAwareTask)
def invoice_pdf_task(invoice: int):
i = Invoice.objects.get(pk=invoice)
if i.shredded:
return None
if i.file:
i.file.delete()
with language(i.locale):
fname, ftype, fcontent = i.event.invoice_renderer.generate(i)
i.file.save(fname, ContentFile(fcontent))
i.save()
return i.file.name
with scopes_disabled():
i = Invoice.objects.get(pk=invoice)
with scope(organizer=i.order.event.organizer):
if i.shredded:
return None
if i.file:
i.file.delete()
with language(i.locale):
fname, ftype, fcontent = i.event.invoice_renderer.generate(i)
i.file.save(fname, ContentFile(fcontent))
i.save()
return i.file.name
def invoice_qualified(order: Order):

View File

@@ -10,6 +10,7 @@ from django.conf import settings
from django.core.mail import EmailMultiAlternatives, get_connection
from django.template.loader import get_template
from django.utils.translation import ugettext as _
from django_scopes import scope, scopes_disabled
from i18nfield.strings import LazyI18nString
from pretix.base.email import ClassicMailRenderer
@@ -234,83 +235,87 @@ def mail_send_task(self, *args, to: List[str], subject: str, body: str, html: st
pass
if event:
event = Event.objects.get(id=event)
with scopes_disabled():
event = Event.objects.get(id=event)
backend = event.get_mail_backend()
cm = lambda: scope(organizer=event.organizer) # noqa
else:
backend = get_connection(fail_silently=False)
cm = lambda: scopes_disabled() # noqa
if event:
if order:
try:
order = event.orders.get(pk=order)
except Order.DoesNotExist:
order = None
else:
if position:
try:
position = order.positions.get(pk=position)
except OrderPosition.DoesNotExist:
attach_tickets = False
if attach_tickets:
args = []
attach_size = 0
for name, ct in get_tickets_for_order(order, base_position=position):
content = ct.file.read()
args.append((name, content, ct.type))
attach_size += len(content)
with cm():
if event:
if order:
try:
order = event.orders.get(pk=order)
except Order.DoesNotExist:
order = None
else:
if position:
try:
position = order.positions.get(pk=position)
except OrderPosition.DoesNotExist:
attach_tickets = False
if attach_tickets:
args = []
attach_size = 0
for name, ct in get_tickets_for_order(order, base_position=position):
content = ct.file.read()
args.append((name, content, ct.type))
attach_size += len(content)
if attach_size < 4 * 1024 * 1024:
# Do not attach more than 4MB, it will bounce way to often.
for a in args:
try:
email.attach(*a)
except:
pass
else:
order.log_action(
'pretix.event.order.email.attachments.skipped',
data={
'subject': 'Attachments skipped',
'message': 'Attachment have not been send because {} bytes are likely too large to arrive.'.format(attach_size),
'recipient': '',
'invoices': [],
}
)
if attach_size < 4 * 1024 * 1024:
# Do not attach more than 4MB, it will bounce way to often.
for a in args:
try:
email.attach(*a)
except:
pass
else:
order.log_action(
'pretix.event.order.email.attachments.skipped',
data={
'subject': 'Attachments skipped',
'message': 'Attachment have not been send because {} bytes are likely too large to arrive.'.format(attach_size),
'recipient': '',
'invoices': [],
}
)
email = email_filter.send_chained(event, 'message', message=email, order=order)
email = email_filter.send_chained(event, 'message', message=email, order=order)
try:
backend.send_messages([email])
except smtplib.SMTPResponseException as e:
if e.smtp_code in (101, 111, 421, 422, 431, 442, 447, 452):
self.retry(max_retries=5, countdown=2 ** (self.request.retries * 2))
logger.exception('Error sending email')
try:
backend.send_messages([email])
except smtplib.SMTPResponseException as e:
if e.smtp_code in (101, 111, 421, 422, 431, 442, 447, 452):
self.retry(max_retries=5, countdown=2 ** (self.request.retries * 2))
logger.exception('Error sending email')
if order:
order.log_action(
'pretix.event.order.email.error',
data={
'subject': 'SMTP code {}'.format(e.smtp_code),
'message': e.smtp_error.decode() if isinstance(e.smtp_error, bytes) else str(e.smtp_error),
'recipient': '',
'invoices': [],
}
)
if order:
order.log_action(
'pretix.event.order.email.error',
data={
'subject': 'SMTP code {}'.format(e.smtp_code),
'message': e.smtp_error.decode() if isinstance(e.smtp_error, bytes) else str(e.smtp_error),
'recipient': '',
'invoices': [],
}
)
raise SendMailException('Failed to send an email to {}.'.format(to))
except Exception as e:
if order:
order.log_action(
'pretix.event.order.email.error',
data={
'subject': 'Internal error',
'message': str(e),
'recipient': '',
'invoices': [],
}
)
logger.exception('Error sending email')
raise SendMailException('Failed to send an email to {}.'.format(to))
raise SendMailException('Failed to send an email to {}.'.format(to))
except Exception as e:
if order:
order.log_action(
'pretix.event.order.email.error',
data={
'subject': 'Internal error',
'message': str(e),
'recipient': '',
'invoices': [],
}
)
logger.exception('Error sending email')
raise SendMailException('Failed to send an email to {}.'.format(to))
def mail_send(*args, **kwargs):

View File

@@ -1,5 +1,6 @@
from django.conf import settings
from django.template.loader import get_template
from django_scopes import scope, scopes_disabled
from inlinestyler.utils import inline_css
from pretix.base.i18n import language
@@ -12,6 +13,7 @@ from pretix.helpers.urls import build_absolute_uri
@app.task(base=TransactionAwareTask)
@scopes_disabled()
def notify(logentry_id: int):
logentry = LogEntry.all.get(id=logentry_id)
if not logentry.event:
@@ -66,17 +68,22 @@ def notify(logentry_id: int):
@app.task(base=ProfiledTask)
def send_notification(logentry_id: int, action_type: str, user_id: int, method: str):
logentry = LogEntry.all.get(id=logentry_id)
user = User.objects.get(id=user_id)
types = get_all_notification_types(logentry.event)
notification_type = types.get(action_type)
if not notification_type:
return # Ignore, e.g. plugin not active for this event
if logentry.event:
sm = lambda: scope(organizer=logentry.event.organizer) # noqa
else:
sm = lambda: scopes_disabled() # noqa
with sm():
user = User.objects.get(id=user_id)
types = get_all_notification_types(logentry.event)
notification_type = types.get(action_type)
if not notification_type:
return # Ignore, e.g. plugin not active for this event
with language(user.locale):
notification = notification_type.build_notification(logentry)
with language(user.locale):
notification = notification_type.build_notification(logentry)
if method == "mail":
send_notification_mail(notification, user)
if method == "mail":
send_notification_mail(notification, user)
def send_notification_mail(notification: Notification, user: User):

View File

@@ -16,6 +16,7 @@ from django.utils.formats import date_format
from django.utils.functional import cached_property
from django.utils.timezone import make_aware, now
from django.utils.translation import ugettext as _
from django_scopes import scopes_disabled
from pretix.api.models import OAuthApplication
from pretix.base.i18n import (
@@ -42,7 +43,7 @@ from pretix.base.services.invoices import (
from pretix.base.services.locking import LockTimeoutException, NoLockManager
from pretix.base.services.mail import SendMailException
from pretix.base.services.pricing import get_price
from pretix.base.services.tasks import ProfiledTask
from pretix.base.services.tasks import ProfiledEventTask, ProfiledTask
from pretix.base.settings import PERSON_NAME_SCHEMES
from pretix.base.signals import (
allow_ticket_download, order_approved, order_canceled, order_changed,
@@ -715,10 +716,8 @@ def _order_placed_email_attendee(event: Event, order: Order, position: OrderPosi
logger.exception('Order received email could not be sent to attendee')
def _perform_order(event: str, payment_provider: str, position_ids: List[str],
def _perform_order(event: Event, payment_provider: str, position_ids: List[str],
email: str, locale: str, address: int, meta_info: dict=None, sales_channel: str='web'):
event = Event.objects.get(id=event)
if payment_provider:
pprov = event.get_payment_providers().get(payment_provider)
if not pprov:
@@ -732,7 +731,8 @@ def _perform_order(event: str, payment_provider: str, position_ids: List[str],
addr = None
if address is not None:
try:
addr = InvoiceAddress.objects.get(pk=address)
with scopes_disabled():
addr = InvoiceAddress.objects.get(pk=address)
except InvoiceAddress.DoesNotExist:
pass
@@ -804,6 +804,7 @@ def _perform_order(event: str, payment_provider: str, position_ids: List[str],
@receiver(signal=periodic_task)
@scopes_disabled()
def expire_orders(sender, **kwargs):
eventcache = {}
@@ -818,6 +819,7 @@ def expire_orders(sender, **kwargs):
@receiver(signal=periodic_task)
@scopes_disabled()
def send_expiry_warnings(sender, **kwargs):
eventcache = {}
today = now().replace(hour=0, minute=0, second=0)
@@ -875,6 +877,7 @@ def send_expiry_warnings(sender, **kwargs):
@receiver(signal=periodic_task)
@scopes_disabled()
def send_download_reminders(sender, **kwargs):
today = now().replace(hour=0, minute=0, second=0, microsecond=0)
@@ -1497,8 +1500,8 @@ class OrderChangeManager:
return pprov
@app.task(base=ProfiledTask, bind=True, max_retries=5, default_retry_delay=1, throws=(OrderError,))
def perform_order(self, event: str, payment_provider: str, positions: List[str],
@app.task(base=ProfiledEventTask, bind=True, max_retries=5, default_retry_delay=1, throws=(OrderError,))
def perform_order(self, event: Event, payment_provider: str, positions: List[str],
email: str=None, locale: str=None, address: int=None, meta_info: dict=None,
sales_channel: str='web'):
with language(locale):
@@ -1513,6 +1516,7 @@ def perform_order(self, event: str, payment_provider: str, positions: List[str],
@app.task(base=ProfiledTask, bind=True, max_retries=5, default_retry_delay=1, throws=(OrderError,))
@scopes_disabled()
def cancel_order(self, order: int, user: int=None, send_mail: bool=True, api_token=None, oauth_application=None,
device=None, cancellation_fee=None, try_auto_refund=False):
try:

View File

@@ -4,6 +4,7 @@ from django.conf import settings
from django.db.models import Max, Q
from django.dispatch import receiver
from django.utils.timezone import now
from django_scopes import scopes_disabled
from pretix.base.models import Event, LogEntry
from pretix.celery_app import app
@@ -17,6 +18,7 @@ def build_all_quota_caches(sender, **kwargs):
@app.task
@scopes_disabled()
def refresh_quota_caches():
# Active events
active = LogEntry.objects.using(settings.DATABASE_REPLICA).filter(

View File

@@ -11,14 +11,13 @@ from django.utils.timezone import now
from django.utils.translation import ugettext_lazy as _
from pretix.base.models import CachedFile, Event, cachedfile_name
from pretix.base.services.tasks import ProfiledTask
from pretix.base.services.tasks import ProfiledEventTask
from pretix.base.shredder import ShredError
from pretix.celery_app import app
@app.task(base=ProfiledTask)
def export(event: str, shredders: List[str]) -> None:
event = Event.objects.get(id=event)
@app.task(base=ProfiledEventTask)
def export(event: Event, shredders: List[str]) -> None:
known_shredders = event.get_data_shredders()
with NamedTemporaryFile() as rawfile:
@@ -63,9 +62,8 @@ def export(event: str, shredders: List[str]) -> None:
return cf.pk
@app.task(base=ProfiledTask, throws=(ShredError,))
def shred(event: str, fileid: str, confirm_code: str) -> None:
event = Event.objects.get(id=event)
@app.task(base=ProfiledEventTask, throws=(ShredError,))
def shred(event: Event, fileid: str, confirm_code: str) -> None:
known_shredders = event.get_data_shredders()
try:
cf = CachedFile.objects.get(pk=fileid)

View File

@@ -14,10 +14,12 @@ import time
from django.conf import settings
from django.db import transaction
from django_scopes import scope, scopes_disabled
from pretix.base.metrics import (
pretix_task_duration_seconds, pretix_task_runs_total,
)
from pretix.base.models import Event
from pretix.celery_app import app
@@ -61,6 +63,35 @@ class ProfiledTask(app.Task):
return super().on_success(retval, task_id, args, kwargs)
class EventTask(app.Task):
def __call__(self, *args, **kwargs):
if 'event_id' in kwargs:
event_id = kwargs.get('event_id')
with scopes_disabled():
event = Event.objects.select_related('organizer').get(pk=event_id)
del kwargs['event_id']
kwargs['event'] = event
elif 'event' in kwargs:
event_id = kwargs.get('event')
with scopes_disabled():
event = Event.objects.select_related('organizer').get(pk=event_id)
kwargs['event'] = event
else:
args = list(args)
event_id = args[0]
with scopes_disabled():
event = Event.objects.select_related('organizer').get(pk=event_id)
args[0] = event
with scope(organizer=event.organizer):
ret = super().__call__(*args, **kwargs)
return ret
class ProfiledEventTask(ProfiledTask, EventTask):
pass
class TransactionAwareTask(ProfiledTask):
"""
Task class which is aware of django db transactions and only executes tasks

View File

@@ -4,13 +4,14 @@ import os
from django.core.files.base import ContentFile
from django.utils.timezone import now
from django.utils.translation import ugettext as _
from django_scopes import scopes_disabled
from pretix.base.i18n import language
from pretix.base.models import (
CachedCombinedTicket, CachedTicket, Event, InvoiceAddress, Order,
OrderPosition,
)
from pretix.base.services.tasks import ProfiledTask
from pretix.base.services.tasks import EventTask, ProfiledTask
from pretix.base.settings import PERSON_NAME_SCHEMES
from pretix.base.signals import allow_ticket_download, register_ticket_outputs
from pretix.celery_app import app
@@ -57,10 +58,11 @@ def generate_order(order: int, provider: str):
@app.task(base=ProfiledTask)
def generate(model: str, pk: int, provider: str):
if model == 'order':
return generate_order(pk, provider)
elif model == 'orderposition':
return generate_orderposition(pk, provider)
with scopes_disabled():
if model == 'order':
return generate_order(pk, provider)
elif model == 'orderposition':
return generate_orderposition(pk, provider)
class DummyRollbackException(Exception):
@@ -165,9 +167,8 @@ def get_tickets_for_order(order, base_position=None):
return tickets
@app.task(base=ProfiledTask)
def invalidate_cache(event: int, item: int=None, provider: str=None, order: int=None, **kwargs):
event = Event.objects.get(id=event)
@app.task(base=EventTask)
def invalidate_cache(event: Event, item: int=None, provider: str=None, order: int=None, **kwargs):
qs = CachedTicket.objects.filter(order_position__order__event=event)
qsc = CachedCombinedTicket.objects.filter(order__event=event)

View File

@@ -6,6 +6,7 @@ import requests
from django.dispatch import receiver
from django.utils.timezone import now
from django.utils.translation import ugettext_lazy as _, ugettext_noop
from django_scopes import scopes_disabled
from i18nfield.strings import LazyI18nString
from pretix import __version__
@@ -29,6 +30,7 @@ def run_update_check(sender, **kwargs):
@app.task
@scopes_disabled()
def update_check():
gs = GlobalSettingsObject()

View File

@@ -1,17 +1,17 @@
import sys
from django.dispatch import receiver
from django_scopes import scopes_disabled
from pretix.base.models import Event, User, WaitingListEntry
from pretix.base.models.waitinglist import WaitingListException
from pretix.base.services.tasks import ProfiledTask
from pretix.base.services.tasks import EventTask
from pretix.base.signals import periodic_task
from pretix.celery_app import app
@app.task(base=ProfiledTask)
def assign_automatically(event_id: int, user_id: int=None, subevent_id: int=None):
event = Event.objects.get(id=event_id)
@app.task(base=EventTask)
def assign_automatically(event: Event, user_id: int=None, subevent_id: int=None):
if user_id:
user = User.objects.get(id=user_id)
else:
@@ -69,6 +69,7 @@ def assign_automatically(event_id: int, user_id: int=None, subevent_id: int=None
@receiver(signal=periodic_task)
@scopes_disabled()
def process_waitinglist(sender, **kwargs):
qs = Event.objects.filter(
live=True

View File

@@ -3,6 +3,7 @@ import hmac
from django.conf import settings
from django.http import HttpResponse
from django_scopes import scopes_disabled
from .. import metrics
@@ -15,6 +16,7 @@ def unauthed_response():
return response
@scopes_disabled()
def serve_metrics(request):
if not settings.METRICS_ENABLED:
return unauthed_response()

View File

@@ -5,6 +5,7 @@ from django.conf import settings
from django.db.models import Q
from django.urls import Resolver404, get_script_prefix, resolve
from django.utils.translation import get_language
from django_scopes import scope
from pretix.base.models.auth import StaffSession
from pretix.base.settings import GlobalSettingsObject
@@ -53,10 +54,11 @@ def contextprocessor(request):
ctx['has_domain'] = request.event.organizer.domains.exists()
if not request.event.testmode:
complain_testmode_orders = request.event.cache.get('complain_testmode_orders')
if complain_testmode_orders is None:
complain_testmode_orders = request.event.orders.filter(testmode=True).exists()
request.event.cache.set('complain_testmode_orders', complain_testmode_orders, 30)
with scope(organizer=request.organizer):
complain_testmode_orders = request.event.cache.get('complain_testmode_orders')
if complain_testmode_orders is None:
complain_testmode_orders = request.event.orders.filter(testmode=True).exists()
request.event.cache.set('complain_testmode_orders', complain_testmode_orders, 30)
ctx['complain_testmode_orders'] = complain_testmode_orders
else:
ctx['complain_testmode_orders'] = False

View File

@@ -1,6 +1,9 @@
from django import forms
from django.urls import reverse
from django.utils.translation import pgettext_lazy
from django_scopes.forms import (
SafeModelChoiceField, SafeModelMultipleChoiceField,
)
from pretix.base.models.checkin import CheckinList
from pretix.control.forms.widgets import Select2
@@ -44,3 +47,7 @@ class CheckinListForm(forms.ModelForm):
'data-inverse-dependency': '<[name$=all_products]'
}),
}
field_classes = {
'limit_products': SafeModelMultipleChoiceField,
'subevent': SafeModelChoiceField,
}

View File

@@ -6,6 +6,9 @@ from django.urls import reverse
from django.utils.translation import (
pgettext_lazy, ugettext as __, ugettext_lazy as _,
)
from django_scopes.forms import (
SafeModelChoiceField, SafeModelMultipleChoiceField,
)
from i18nfield.forms import I18nFormField, I18nTextarea
from pretix.base.channels import get_all_sales_channels
@@ -94,6 +97,10 @@ class QuestionForm(I18nModelForm):
),
'dependency_value': forms.Select,
}
field_classes = {
'items': SafeModelMultipleChoiceField,
'dependency_question': SafeModelChoiceField,
}
class QuestionOptionForm(I18nModelForm):
@@ -159,6 +166,9 @@ class QuotaForm(I18nModelForm):
'size',
'subevent'
]
field_classes = {
'subevent': SafeModelChoiceField,
}
def save(self, *args, **kwargs):
creating = not self.instance.pk

View File

@@ -192,7 +192,7 @@ class OrderPositionAddForm(forms.Form):
label=_('Product')
)
addon_to = forms.ModelChoiceField(
OrderPosition.objects.none(),
OrderPosition.all.none(),
required=False,
label=_('Add-on to'),
)

View File

@@ -6,6 +6,7 @@ from django.core.exceptions import ValidationError
from django.core.validators import RegexValidator
from django.utils.safestring import mark_safe
from django.utils.translation import pgettext_lazy, ugettext_lazy as _
from django_scopes.forms import SafeModelMultipleChoiceField
from i18nfield.forms import I18nFormField, I18nTextarea
from pretix.api.models import WebHook
@@ -149,6 +150,9 @@ class TeamForm(forms.ModelForm):
'data-inverse-dependency': '#id_all_events'
}),
}
field_classes = {
'limit_events': SafeModelMultipleChoiceField
}
def clean(self):
data = super().clean()
@@ -177,6 +181,9 @@ class DeviceForm(forms.ModelForm):
'data-inverse-dependency': '#id_all_events'
}),
}
field_classes = {
'limit_events': SafeModelMultipleChoiceField
}
class OrganizerSettingsForm(SettingsForm):
@@ -307,3 +314,6 @@ class WebHookForm(forms.ModelForm):
'data-inverse-dependency': '#id_all_events'
}),
}
field_classes = {
'limit_events': SafeModelMultipleChoiceField
}

View File

@@ -3,6 +3,7 @@ from django.core.exceptions import ObjectDoesNotExist, ValidationError
from django.db.models.functions import Lower
from django.urls import reverse
from django.utils.translation import pgettext_lazy, ugettext_lazy as _
from django_scopes.forms import SafeModelChoiceField
from pretix.base.forms import I18nModelForm
from pretix.base.models import Item, Voucher
@@ -35,6 +36,7 @@ class VoucherForm(I18nModelForm):
]
field_classes = {
'valid_until': SplitDateTimeField,
'subevent': SafeModelChoiceField,
}
widgets = {
'valid_until': SplitDateTimePickerWidget(),
@@ -199,6 +201,7 @@ class VoucherBulkForm(VoucherForm):
]
field_classes = {
'valid_until': SplitDateTimeField,
'subevent': SafeModelChoiceField,
}
widgets = {
'valid_until': SplitDateTimePickerWidget(),

View File

@@ -4,10 +4,11 @@ from django.conf import settings
from django.contrib.auth import REDIRECT_FIELD_NAME, logout
from django.http import Http404
from django.shortcuts import get_object_or_404, redirect, resolve_url
from django.template.response import TemplateResponse
from django.urls import get_script_prefix, resolve, reverse
from django.utils.deprecation import MiddlewareMixin
from django.utils.encoding import force_str
from django.utils.translation import ugettext as _
from django_scopes import scope
from hijack.templatetags.hijack_tags import is_hijacked
from pretix.base.models import Event, Organizer
@@ -17,7 +18,7 @@ from pretix.helpers.security import (
)
class PermissionMiddleware(MiddlewareMixin):
class PermissionMiddleware:
"""
This middleware enforces all requests to the control app to require login.
Additionally, it enforces all requests to "control:event." URLs
@@ -34,6 +35,10 @@ class PermissionMiddleware(MiddlewareMixin):
"user.settings.notifications.off",
)
def __init__(self, get_response=None):
self.get_response = get_response
super().__init__()
def _login_redirect(self, request):
# Taken from django/contrib/auth/decorators.py
path = request.build_absolute_uri()
@@ -52,19 +57,19 @@ class PermissionMiddleware(MiddlewareMixin):
return redirect_to_login(
path, resolved_login_url, REDIRECT_FIELD_NAME)
def process_request(self, request):
def __call__(self, request):
url = resolve(request.path_info)
url_name = url.url_name
if not request.path.startswith(get_script_prefix() + 'control'):
# This middleware should only touch the /control subpath
return
return self.get_response(request)
if hasattr(request, 'organizer'):
# If the user is on a organizer's subdomain, he should be redirected to pretix
return redirect(urljoin(settings.SITE_URL, request.get_full_path()))
if url_name in self.EXCEPTIONS:
return
return self.get_response(request)
if not request.user.is_authenticated:
return self._login_redirect(request)
@@ -79,10 +84,11 @@ class PermissionMiddleware(MiddlewareMixin):
return redirect(reverse('control:user.reauth') + '?next=' + quote(request.get_full_path()))
if 'event' in url.kwargs and 'organizer' in url.kwargs:
request.event = Event.objects.filter(
slug=url.kwargs['event'],
organizer__slug=url.kwargs['organizer'],
).select_related('organizer').first()
with scope(organizer=None):
request.event = Event.objects.filter(
slug=url.kwargs['event'],
organizer__slug=url.kwargs['organizer'],
).select_related('organizer').first()
if not request.event or not request.user.has_event_permission(request.event.organizer, request.event,
request=request):
raise Http404(_("The selected event was not found or you "
@@ -104,6 +110,12 @@ class PermissionMiddleware(MiddlewareMixin):
else:
request.orgapermset = request.user.get_organizer_permission_set(request.organizer)
with scope(organizer=getattr(request, 'organizer', None)):
r = self.get_response(request)
if isinstance(r, TemplateResponse):
r = r.render()
return r
class AuditLogMiddleware:

View File

@@ -237,6 +237,24 @@ As with all plugin signals, the ``sender`` keyword argument will contain the eve
A second keyword argument ``request`` will contain the request object.
"""
nav_item = EventPluginSignal(
providing_args=['request', 'item']
)
"""
This signal is sent out to include tab links on the settings page of an item.
Receivers are expected to return a list of dictionaries. The dictionaries
should contain at least the keys ``label`` and ``url``. You should also return
an ``active`` key with a boolean set to ``True``, when this item should be marked
as active.
If your linked view should stay in the tab-like context of this page, we recommend
that you use ``pretix.control.views.item.ItemDetailMixin`` for your view
and your template inherits from ``pretixcontrol/item/base.html``.
As with all plugin signals, the ``sender`` keyword argument will contain the event.
A second keyword argument ``request`` will contain the request object.
"""
event_settings_widget = EventPluginSignal(
providing_args=['request']
)

View File

@@ -27,6 +27,13 @@
{% trans "Bundled products" %}
</a>
</li>
{% for n in extra_nav %}
<li {% if n.active %}class="active"{% endif %}>
<a href="{{ n.url }}">
{{ n.label }}
</a>
</li>
{% endfor %}
</ul>
{% else %}
<h1>{% trans "Create product" %}</h1>

View File

@@ -33,7 +33,7 @@ from pretix.control.forms.item import (
from pretix.control.permissions import (
EventPermissionRequiredMixin, event_permission_required,
)
from pretix.control.signals import item_forms
from pretix.control.signals import item_forms, nav_item
from . import ChartContainingView, CreateView, PaginationMixin, UpdateView
@@ -782,6 +782,18 @@ class ItemDetailMixin(SingleObjectMixin):
model = Item
context_object_name = 'item'
def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs)
nav = sorted(
sum(
(list(a[1]) for a in nav_item.send(self.request.event, request=self.request, item=self.get_object())),
[]
),
key=lambda r: str(r['label'])
)
ctx['extra_nav'] = nav
return ctx
def get_object(self, queryset=None) -> Item:
try:
if not hasattr(self, 'object') or not self.object:

View File

@@ -149,10 +149,16 @@ def nav_context_list(request):
]
if show_user and organizer:
organizer = serialize_orga(Organizer.objects.get(pk=organizer))
if organizer in results:
results.remove(organizer)
results.insert(1, organizer)
try:
organizer = Organizer.objects.get(pk=organizer)
except Organizer.DoesNotExist:
pass
else:
if request.user.has_organizer_permission(organizer, request=request):
organizer = serialize_orga(organizer)
if organizer in results:
results.remove(organizer)
results.insert(1, organizer)
doc = {
'results': results,

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: 2018-07-23 23:00+0000\n"
"Last-Translator: Muhammad Hewedy <mhewedy@gmail.com>\n"
"Language-Team: Arabic <https://translate.pretix.eu/projects/pretix/pretix/ar/"
@@ -2644,7 +2644,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/vouchers/index.html:98
#: pretix/control/views/vouchers.py:61 pretix/control/views/waitinglist.py:199
#: pretix/plugins/checkinlists/exporters.py:322
#: pretix/presale/templates/pretixpresale/event/index.html:235
#: pretix/presale/templates/pretixpresale/event/index.html:252
msgid "Voucher code"
msgstr ""
@@ -5949,13 +5949,13 @@ msgid "Search voucher"
msgstr ""
#: pretix/control/forms/filter.py:823 pretix/control/forms/vouchers.py:92
#: pretix/control/views/typeahead.py:311
#: pretix/control/views/typeahead.py:317
#, python-brace-format
msgid "{product} Any variation"
msgstr ""
#: pretix/control/forms/filter.py:829 pretix/control/forms/vouchers.py:83
#: pretix/control/views/typeahead.py:319 pretix/control/views/typeahead.py:323
#: pretix/control/views/typeahead.py:325 pretix/control/views/typeahead.py:329
#: pretix/control/views/vouchers.py:73
#, python-brace-format
msgid "Any product in quota \"{quota}\""
@@ -7328,6 +7328,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/subevents/bulk.html:19
#: pretix/control/templates/pretixcontrol/subevents/index.html:5
#: pretix/control/templates/pretixcontrol/subevents/index.html:7
#: pretix/presale/templates/pretixpresale/event/index.html:115
msgctxt "subevent"
msgid "Dates"
msgstr ""
@@ -15120,7 +15121,7 @@ msgid "We're trying to reserve another one for you!"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:104
#: pretix/presale/templates/pretixpresale/event/index.html:201
#: pretix/presale/templates/pretixpresale/event/index.html:218
#: pretix/presale/templates/pretixpresale/event/voucher.html:26
#, python-format
msgid ""
@@ -15272,77 +15273,86 @@ msgstr ""
msgid "Proceed with checkout"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:99
#: pretix/presale/templates/pretixpresale/event/index.html:100
msgid "Add tickets for a different date"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:104
msgid "View other date"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:102
#: pretix/presale/templates/pretixpresale/event/index.html:108
msgid "Choose date to buy a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:129
#: pretix/presale/templates/pretixpresale/event/index.html:113
msgctxt "subevent"
msgid "Other dates"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:146
#: pretix/presale/views/widget.py:471
msgid "The presale period for this event is over."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:134
#: pretix/presale/templates/pretixpresale/event/index.html:151
#: pretix/presale/views/widget.py:473
#, python-format
msgid "The presale for this event will start on %(date)s at %(time)s."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:138
#: pretix/presale/templates/pretixpresale/event/index.html:155
#: pretix/presale/views/widget.py:478
msgid "The presale for this event has not yet started."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:160
#: pretix/presale/templates/pretixpresale/event/index.html:177
#, python-format
msgid "Begin: %(time)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:165
#: pretix/presale/templates/pretixpresale/event/index.html:182
#, python-format
msgid "End: %(time)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:173
#: pretix/presale/templates/pretixpresale/event/index.html:190
#, python-format
msgid "Admission: %(time)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:177
#: pretix/presale/templates/pretixpresale/event/index.html:194
#, python-format
msgid "Admission: %(datetime)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:188
#: pretix/presale/templates/pretixpresale/event/index.html:205
msgid "Add to Calendar"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:200
#: pretix/presale/templates/pretixpresale/event/index.html:217
#: pretix/presale/templates/pretixpresale/event/voucher.html:25
msgid "We're now trying to reserve this for you!"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:211
#: pretix/presale/templates/pretixpresale/event/index.html:228
#: pretix/presale/templates/pretixpresale/event/voucher.html:291
msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:223
#: pretix/presale/templates/pretixpresale/event/index.html:240
msgid "Redeem a voucher"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:241
#: pretix/presale/templates/pretixpresale/event/index.html:258
msgid "Redeem voucher"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:252
#: pretix/presale/templates/pretixpresale/event/index.html:269
msgid "If you already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:256
#: pretix/presale/templates/pretixpresale/event/index.html:273
msgid ""
"If you want to see or change the status and details of your order, click on "
"the link in one of the emails we sent you during the order process. If you "
@@ -15350,7 +15360,7 @@ msgid ""
"your order to be sent to you again."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:265
#: pretix/presale/templates/pretixpresale/event/index.html:282
#: pretix/presale/templates/pretixpresale/event/resend_link.html:4
#: pretix/presale/templates/pretixpresale/event/resend_link.html:7
msgid "Resend order links"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
@@ -250,7 +250,7 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
#: pretix/static/pretixpresale/js/ui/main.js:201
#: pretix/static/pretixpresale/js/ui/main.js:202
msgid "Please enter a quantity for one of the ticket types."
msgstr ""

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: 2019-04-11 22:00+0000\n"
"Last-Translator: mussol <muzzol@gmail.com>\n"
"Language-Team: Catalan <https://translate.pretix.eu/projects/pretix/pretix/"
@@ -2829,7 +2829,7 @@ msgstr "Redueix el preu del producte en (%)"
#: pretix/control/templates/pretixcontrol/vouchers/index.html:98
#: pretix/control/views/vouchers.py:61 pretix/control/views/waitinglist.py:199
#: pretix/plugins/checkinlists/exporters.py:322
#: pretix/presale/templates/pretixpresale/event/index.html:235
#: pretix/presale/templates/pretixpresale/event/index.html:252
msgid "Voucher code"
msgstr "Codi de val"
@@ -6820,13 +6820,13 @@ msgid "Search voucher"
msgstr ""
#: pretix/control/forms/filter.py:823 pretix/control/forms/vouchers.py:92
#: pretix/control/views/typeahead.py:311
#: pretix/control/views/typeahead.py:317
#, python-brace-format
msgid "{product} Any variation"
msgstr ""
#: pretix/control/forms/filter.py:829 pretix/control/forms/vouchers.py:83
#: pretix/control/views/typeahead.py:319 pretix/control/views/typeahead.py:323
#: pretix/control/views/typeahead.py:325 pretix/control/views/typeahead.py:329
#: pretix/control/views/vouchers.py:73
#, python-brace-format
msgid "Any product in quota \"{quota}\""
@@ -8213,6 +8213,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/subevents/bulk.html:19
#: pretix/control/templates/pretixcontrol/subevents/index.html:5
#: pretix/control/templates/pretixcontrol/subevents/index.html:7
#: pretix/presale/templates/pretixpresale/event/index.html:115
msgctxt "subevent"
msgid "Dates"
msgstr ""
@@ -16015,7 +16016,7 @@ msgid "We're trying to reserve another one for you!"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:104
#: pretix/presale/templates/pretixpresale/event/index.html:201
#: pretix/presale/templates/pretixpresale/event/index.html:218
#: pretix/presale/templates/pretixpresale/event/voucher.html:26
#, python-format
msgid ""
@@ -16167,77 +16168,90 @@ msgstr ""
msgid "Proceed with checkout"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:99
#: pretix/presale/templates/pretixpresale/event/index.html:100
#, fuzzy
#| msgid "This file is from a different event."
msgid "Add tickets for a different date"
msgstr "Aquest fitxer és d'un esdeveniment diferent."
#: pretix/presale/templates/pretixpresale/event/index.html:104
msgid "View other date"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:102
#: pretix/presale/templates/pretixpresale/event/index.html:108
msgid "Choose date to buy a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:129
#: pretix/presale/templates/pretixpresale/event/index.html:113
#, fuzzy
#| msgid "Order date"
msgctxt "subevent"
msgid "Other dates"
msgstr "Data de la comanda"
#: pretix/presale/templates/pretixpresale/event/index.html:146
#: pretix/presale/views/widget.py:471
msgid "The presale period for this event is over."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:134
#: pretix/presale/templates/pretixpresale/event/index.html:151
#: pretix/presale/views/widget.py:473
#, python-format
msgid "The presale for this event will start on %(date)s at %(time)s."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:138
#: pretix/presale/templates/pretixpresale/event/index.html:155
#: pretix/presale/views/widget.py:478
msgid "The presale for this event has not yet started."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:160
#: pretix/presale/templates/pretixpresale/event/index.html:177
#, python-format
msgid "Begin: %(time)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:165
#: pretix/presale/templates/pretixpresale/event/index.html:182
#, python-format
msgid "End: %(time)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:173
#: pretix/presale/templates/pretixpresale/event/index.html:190
#, python-format
msgid "Admission: %(time)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:177
#: pretix/presale/templates/pretixpresale/event/index.html:194
#, python-format
msgid "Admission: %(datetime)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:188
#: pretix/presale/templates/pretixpresale/event/index.html:205
msgid "Add to Calendar"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:200
#: pretix/presale/templates/pretixpresale/event/index.html:217
#: pretix/presale/templates/pretixpresale/event/voucher.html:25
msgid "We're now trying to reserve this for you!"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:211
#: pretix/presale/templates/pretixpresale/event/index.html:228
#: pretix/presale/templates/pretixpresale/event/voucher.html:291
msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:223
#: pretix/presale/templates/pretixpresale/event/index.html:240
msgid "Redeem a voucher"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:241
#: pretix/presale/templates/pretixpresale/event/index.html:258
msgid "Redeem voucher"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:252
#: pretix/presale/templates/pretixpresale/event/index.html:269
msgid "If you already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:256
#: pretix/presale/templates/pretixpresale/event/index.html:273
msgid ""
"If you want to see or change the status and details of your order, click on "
"the link in one of the emails we sent you during the order process. If you "
@@ -16245,7 +16259,7 @@ msgid ""
"your order to be sent to you again."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:265
#: pretix/presale/templates/pretixpresale/event/index.html:282
#: pretix/presale/templates/pretixpresale/event/resend_link.html:4
#: pretix/presale/templates/pretixpresale/event/resend_link.html:7
msgid "Resend order links"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
@@ -241,7 +241,7 @@ msgid_plural "The items in your cart are reserved for you for {num} minutes."
msgstr[0] ""
msgstr[1] ""
#: pretix/static/pretixpresale/js/ui/main.js:201
#: pretix/static/pretixpresale/js/ui/main.js:202
msgid "Please enter a quantity for one of the ticket types."
msgstr ""

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
@@ -2641,7 +2641,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/vouchers/index.html:98
#: pretix/control/views/vouchers.py:61 pretix/control/views/waitinglist.py:199
#: pretix/plugins/checkinlists/exporters.py:322
#: pretix/presale/templates/pretixpresale/event/index.html:235
#: pretix/presale/templates/pretixpresale/event/index.html:252
msgid "Voucher code"
msgstr ""
@@ -5946,13 +5946,13 @@ msgid "Search voucher"
msgstr ""
#: pretix/control/forms/filter.py:823 pretix/control/forms/vouchers.py:92
#: pretix/control/views/typeahead.py:311
#: pretix/control/views/typeahead.py:317
#, python-brace-format
msgid "{product} Any variation"
msgstr ""
#: pretix/control/forms/filter.py:829 pretix/control/forms/vouchers.py:83
#: pretix/control/views/typeahead.py:319 pretix/control/views/typeahead.py:323
#: pretix/control/views/typeahead.py:325 pretix/control/views/typeahead.py:329
#: pretix/control/views/vouchers.py:73
#, python-brace-format
msgid "Any product in quota \"{quota}\""
@@ -7325,6 +7325,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/subevents/bulk.html:19
#: pretix/control/templates/pretixcontrol/subevents/index.html:5
#: pretix/control/templates/pretixcontrol/subevents/index.html:7
#: pretix/presale/templates/pretixpresale/event/index.html:115
msgctxt "subevent"
msgid "Dates"
msgstr ""
@@ -15106,7 +15107,7 @@ msgid "We're trying to reserve another one for you!"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:104
#: pretix/presale/templates/pretixpresale/event/index.html:201
#: pretix/presale/templates/pretixpresale/event/index.html:218
#: pretix/presale/templates/pretixpresale/event/voucher.html:26
#, python-format
msgid ""
@@ -15258,77 +15259,86 @@ msgstr ""
msgid "Proceed with checkout"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:99
#: pretix/presale/templates/pretixpresale/event/index.html:100
msgid "Add tickets for a different date"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:104
msgid "View other date"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:102
#: pretix/presale/templates/pretixpresale/event/index.html:108
msgid "Choose date to buy a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:129
#: pretix/presale/templates/pretixpresale/event/index.html:113
msgctxt "subevent"
msgid "Other dates"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:146
#: pretix/presale/views/widget.py:471
msgid "The presale period for this event is over."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:134
#: pretix/presale/templates/pretixpresale/event/index.html:151
#: pretix/presale/views/widget.py:473
#, python-format
msgid "The presale for this event will start on %(date)s at %(time)s."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:138
#: pretix/presale/templates/pretixpresale/event/index.html:155
#: pretix/presale/views/widget.py:478
msgid "The presale for this event has not yet started."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:160
#: pretix/presale/templates/pretixpresale/event/index.html:177
#, python-format
msgid "Begin: %(time)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:165
#: pretix/presale/templates/pretixpresale/event/index.html:182
#, python-format
msgid "End: %(time)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:173
#: pretix/presale/templates/pretixpresale/event/index.html:190
#, python-format
msgid "Admission: %(time)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:177
#: pretix/presale/templates/pretixpresale/event/index.html:194
#, python-format
msgid "Admission: %(datetime)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:188
#: pretix/presale/templates/pretixpresale/event/index.html:205
msgid "Add to Calendar"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:200
#: pretix/presale/templates/pretixpresale/event/index.html:217
#: pretix/presale/templates/pretixpresale/event/voucher.html:25
msgid "We're now trying to reserve this for you!"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:211
#: pretix/presale/templates/pretixpresale/event/index.html:228
#: pretix/presale/templates/pretixpresale/event/voucher.html:291
msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:223
#: pretix/presale/templates/pretixpresale/event/index.html:240
msgid "Redeem a voucher"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:241
#: pretix/presale/templates/pretixpresale/event/index.html:258
msgid "Redeem voucher"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:252
#: pretix/presale/templates/pretixpresale/event/index.html:269
msgid "If you already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:256
#: pretix/presale/templates/pretixpresale/event/index.html:273
msgid ""
"If you want to see or change the status and details of your order, click on "
"the link in one of the emails we sent you during the order process. If you "
@@ -15336,7 +15346,7 @@ msgid ""
"your order to be sent to you again."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:265
#: pretix/presale/templates/pretixpresale/event/index.html:282
#: pretix/presale/templates/pretixpresale/event/resend_link.html:4
#: pretix/presale/templates/pretixpresale/event/resend_link.html:7
msgid "Resend order links"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
@@ -243,7 +243,7 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#: pretix/static/pretixpresale/js/ui/main.js:201
#: pretix/static/pretixpresale/js/ui/main.js:202
msgid "Please enter a quantity for one of the ticket types."
msgstr ""

View File

@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: 2018-11-16 13:13+0000\n"
"Last-Translator: Mikkel Ricky <rimi@aarhus.dk>\n"
"Language-Team: Danish <https://translate.pretix.eu/projects/pretix/pretix/da/"
@@ -2895,7 +2895,7 @@ msgstr "Nedsæt produktpris med (%)"
#: pretix/control/templates/pretixcontrol/vouchers/index.html:98
#: pretix/control/views/vouchers.py:61 pretix/control/views/waitinglist.py:199
#: pretix/plugins/checkinlists/exporters.py:322
#: pretix/presale/templates/pretixpresale/event/index.html:235
#: pretix/presale/templates/pretixpresale/event/index.html:252
msgid "Voucher code"
msgstr "Voucherkode"
@@ -6853,13 +6853,13 @@ msgid "Search voucher"
msgstr "Find rabatkode"
#: pretix/control/forms/filter.py:823 pretix/control/forms/vouchers.py:92
#: pretix/control/views/typeahead.py:311
#: pretix/control/views/typeahead.py:317
#, python-brace-format
msgid "{product} Any variation"
msgstr "{product} Vilkårlig variant"
#: pretix/control/forms/filter.py:829 pretix/control/forms/vouchers.py:83
#: pretix/control/views/typeahead.py:319 pretix/control/views/typeahead.py:323
#: pretix/control/views/typeahead.py:325 pretix/control/views/typeahead.py:329
#: pretix/control/views/vouchers.py:73
#, python-brace-format
msgid "Any product in quota \"{quota}\""
@@ -8365,6 +8365,7 @@ msgstr "Indstillinger"
#: pretix/control/templates/pretixcontrol/subevents/bulk.html:19
#: pretix/control/templates/pretixcontrol/subevents/index.html:5
#: pretix/control/templates/pretixcontrol/subevents/index.html:7
#: pretix/presale/templates/pretixpresale/event/index.html:115
msgctxt "subevent"
msgid "Dates"
msgstr "Datoer"
@@ -16761,7 +16762,7 @@ msgid "We're trying to reserve another one for you!"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:104
#: pretix/presale/templates/pretixpresale/event/index.html:201
#: pretix/presale/templates/pretixpresale/event/index.html:218
#: pretix/presale/templates/pretixpresale/event/voucher.html:26
#, python-format
msgid ""
@@ -16923,77 +16924,90 @@ msgstr "Tøm kurv"
msgid "Proceed with checkout"
msgstr "Gå til kassen"
#: pretix/presale/templates/pretixpresale/event/index.html:99
#: pretix/presale/templates/pretixpresale/event/index.html:100
#, fuzzy
#| msgid "This identifier is already used for a different question."
msgid "Add tickets for a different date"
msgstr "Dette id bruges allerede af et andet spørgsmål."
#: pretix/presale/templates/pretixpresale/event/index.html:104
msgid "View other date"
msgstr "Se anden dato"
#: pretix/presale/templates/pretixpresale/event/index.html:102
#: pretix/presale/templates/pretixpresale/event/index.html:108
msgid "Choose date to buy a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:129
#: pretix/presale/templates/pretixpresale/event/index.html:113
#, fuzzy
#| msgid "Order date"
msgctxt "subevent"
msgid "Other dates"
msgstr "Bestillingsdato"
#: pretix/presale/templates/pretixpresale/event/index.html:146
#: pretix/presale/views/widget.py:471
msgid "The presale period for this event is over."
msgstr "Forsalget for dette arrangement er slut."
#: pretix/presale/templates/pretixpresale/event/index.html:134
#: pretix/presale/templates/pretixpresale/event/index.html:151
#: pretix/presale/views/widget.py:473
#, python-format
msgid "The presale for this event will start on %(date)s at %(time)s."
msgstr "Forsalget for dette arrangement starter %(date)s, kl.%(time)s."
#: pretix/presale/templates/pretixpresale/event/index.html:138
#: pretix/presale/templates/pretixpresale/event/index.html:155
#: pretix/presale/views/widget.py:478
msgid "The presale for this event has not yet started."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:160
#: pretix/presale/templates/pretixpresale/event/index.html:177
#, python-format
msgid "Begin: %(time)s"
msgstr "Start: %(time)s"
#: pretix/presale/templates/pretixpresale/event/index.html:165
#: pretix/presale/templates/pretixpresale/event/index.html:182
#, python-format
msgid "End: %(time)s"
msgstr "Slut: %(time)s"
#: pretix/presale/templates/pretixpresale/event/index.html:173
#: pretix/presale/templates/pretixpresale/event/index.html:190
#, python-format
msgid "Admission: %(time)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:177
#: pretix/presale/templates/pretixpresale/event/index.html:194
#, python-format
msgid "Admission: %(datetime)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:188
#: pretix/presale/templates/pretixpresale/event/index.html:205
msgid "Add to Calendar"
msgstr "Tilføj til kalender"
#: pretix/presale/templates/pretixpresale/event/index.html:200
#: pretix/presale/templates/pretixpresale/event/index.html:217
#: pretix/presale/templates/pretixpresale/event/voucher.html:25
msgid "We're now trying to reserve this for you!"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:211
#: pretix/presale/templates/pretixpresale/event/index.html:228
#: pretix/presale/templates/pretixpresale/event/voucher.html:291
msgid "Add to cart"
msgstr "Læg i kurv"
#: pretix/presale/templates/pretixpresale/event/index.html:223
#: pretix/presale/templates/pretixpresale/event/index.html:240
msgid "Redeem a voucher"
msgstr "Brug en rabatkode"
#: pretix/presale/templates/pretixpresale/event/index.html:241
#: pretix/presale/templates/pretixpresale/event/index.html:258
msgid "Redeem voucher"
msgstr "Brug rabatkode"
#: pretix/presale/templates/pretixpresale/event/index.html:252
#: pretix/presale/templates/pretixpresale/event/index.html:269
msgid "If you already ordered a ticket"
msgstr "Hvis du allerede har bestilt en billet"
#: pretix/presale/templates/pretixpresale/event/index.html:256
#: pretix/presale/templates/pretixpresale/event/index.html:273
msgid ""
"If you want to see or change the status and details of your order, click on "
"the link in one of the emails we sent you during the order process. If you "
@@ -17004,7 +17018,7 @@ msgstr ""
"ændre i din bestilling. Hvis du ikke kan finde linket, så klik på knappen "
"for at få gensendt din bestillingsmail."
#: pretix/presale/templates/pretixpresale/event/index.html:265
#: pretix/presale/templates/pretixpresale/event/index.html:282
#: pretix/presale/templates/pretixpresale/event/resend_link.html:4
#: pretix/presale/templates/pretixpresale/event/resend_link.html:7
msgid "Resend order links"

View File

@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: 2018-04-24 14:22+0000\n"
"Last-Translator: Pernille Thorsen <perth@aarhus.dk>\n"
"Language-Team: Danish <https://translate.pretix.eu/projects/pretix/pretix-js/"
@@ -262,7 +262,7 @@ msgid_plural "The items in your cart are reserved for you for {num} minutes."
msgstr[0] "Varerne i din kurv er reserveret for dig i et minut."
msgstr[1] "Varerne i din kurv er reserveret for dig i {num} minutter."
#: pretix/static/pretixpresale/js/ui/main.js:201
#: pretix/static/pretixpresale/js/ui/main.js:202
msgid "Please enter a quantity for one of the ticket types."
msgstr ""

View File

@@ -4,8 +4,8 @@ msgid ""
msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"PO-Revision-Date: 2019-06-05 11:38+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: 2019-06-06 09:24+0000\n"
"Last-Translator: Raphael Michel <michel@rami.io>\n"
"Language-Team: German <https://translate.pretix.eu/projects/pretix/pretix/de/"
">\n"
@@ -2823,7 +2823,7 @@ msgstr "Produktpreis reduzieren um (%)"
#: pretix/control/templates/pretixcontrol/vouchers/index.html:98
#: pretix/control/views/vouchers.py:61 pretix/control/views/waitinglist.py:199
#: pretix/plugins/checkinlists/exporters.py:322
#: pretix/presale/templates/pretixpresale/event/index.html:235
#: pretix/presale/templates/pretixpresale/event/index.html:252
msgid "Voucher code"
msgstr "Gutscheincode"
@@ -6760,13 +6760,13 @@ msgid "Search voucher"
msgstr "Gutschein suchen"
#: pretix/control/forms/filter.py:823 pretix/control/forms/vouchers.py:92
#: pretix/control/views/typeahead.py:311
#: pretix/control/views/typeahead.py:317
#, python-brace-format
msgid "{product} Any variation"
msgstr "{product} - Beliebige Variante"
#: pretix/control/forms/filter.py:829 pretix/control/forms/vouchers.py:83
#: pretix/control/views/typeahead.py:319 pretix/control/views/typeahead.py:323
#: pretix/control/views/typeahead.py:325 pretix/control/views/typeahead.py:329
#: pretix/control/views/vouchers.py:73
#, python-brace-format
msgid "Any product in quota \"{quota}\""
@@ -8260,6 +8260,7 @@ msgstr "Einstellungen"
#: pretix/control/templates/pretixcontrol/subevents/bulk.html:19
#: pretix/control/templates/pretixcontrol/subevents/index.html:5
#: pretix/control/templates/pretixcontrol/subevents/index.html:7
#: pretix/presale/templates/pretixpresale/event/index.html:115
msgctxt "subevent"
msgid "Dates"
msgstr "Termine"
@@ -16929,7 +16930,7 @@ msgid "We're trying to reserve another one for you!"
msgstr "Okay, wir versuchen mehr für Sie zu reservieren!"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:104
#: pretix/presale/templates/pretixpresale/event/index.html:201
#: pretix/presale/templates/pretixpresale/event/index.html:218
#: pretix/presale/templates/pretixpresale/event/voucher.html:26
#, python-format
msgid ""
@@ -17086,20 +17087,29 @@ msgstr "Warenkorb leeren"
msgid "Proceed with checkout"
msgstr "Zur Kasse"
#: pretix/presale/templates/pretixpresale/event/index.html:99
#: pretix/presale/templates/pretixpresale/event/index.html:100
msgid "Add tickets for a different date"
msgstr "Tickets für anderen Termin hinzufügen"
#: pretix/presale/templates/pretixpresale/event/index.html:104
msgid "View other date"
msgstr "Zu anderem Termin wechseln"
#: pretix/presale/templates/pretixpresale/event/index.html:102
#: pretix/presale/templates/pretixpresale/event/index.html:108
msgid "Choose date to buy a ticket"
msgstr "Wählen Sie einen Termin aus"
#: pretix/presale/templates/pretixpresale/event/index.html:129
#: pretix/presale/templates/pretixpresale/event/index.html:113
msgctxt "subevent"
msgid "Other dates"
msgstr "Andere Termine"
#: pretix/presale/templates/pretixpresale/event/index.html:146
#: pretix/presale/views/widget.py:471
msgid "The presale period for this event is over."
msgstr "Der Vorverkaufszeitraum für diese Veranstaltung ist vorüber."
#: pretix/presale/templates/pretixpresale/event/index.html:134
#: pretix/presale/templates/pretixpresale/event/index.html:151
#: pretix/presale/views/widget.py:473
#, python-format
msgid "The presale for this event will start on %(date)s at %(time)s."
@@ -17107,58 +17117,58 @@ msgstr ""
"Der Vorverkauf für diese Veranstaltung wird am %(date)s um %(time)s Uhr "
"beginnen."
#: pretix/presale/templates/pretixpresale/event/index.html:138
#: pretix/presale/templates/pretixpresale/event/index.html:155
#: pretix/presale/views/widget.py:478
msgid "The presale for this event has not yet started."
msgstr "Der Vorverkauf für diese Veranstaltung hat noch nicht begonnen."
#: pretix/presale/templates/pretixpresale/event/index.html:160
#: pretix/presale/templates/pretixpresale/event/index.html:177
#, python-format
msgid "Begin: %(time)s"
msgstr "Beginn: %(time)s"
#: pretix/presale/templates/pretixpresale/event/index.html:165
#: pretix/presale/templates/pretixpresale/event/index.html:182
#, python-format
msgid "End: %(time)s"
msgstr "Ende: %(time)s"
#: pretix/presale/templates/pretixpresale/event/index.html:173
#: pretix/presale/templates/pretixpresale/event/index.html:190
#, python-format
msgid "Admission: %(time)s"
msgstr "Einlass: %(time)s"
#: pretix/presale/templates/pretixpresale/event/index.html:177
#: pretix/presale/templates/pretixpresale/event/index.html:194
#, python-format
msgid "Admission: %(datetime)s"
msgstr "Einlass: %(datetime)s"
#: pretix/presale/templates/pretixpresale/event/index.html:188
#: pretix/presale/templates/pretixpresale/event/index.html:205
msgid "Add to Calendar"
msgstr "Zum Kalender hinzufügen"
#: pretix/presale/templates/pretixpresale/event/index.html:200
#: pretix/presale/templates/pretixpresale/event/index.html:217
#: pretix/presale/templates/pretixpresale/event/voucher.html:25
msgid "We're now trying to reserve this for you!"
msgstr "Wir versuchen nun, die ausgewählten Produkte für Sie zu reservieren!"
#: pretix/presale/templates/pretixpresale/event/index.html:211
#: pretix/presale/templates/pretixpresale/event/index.html:228
#: pretix/presale/templates/pretixpresale/event/voucher.html:291
msgid "Add to cart"
msgstr "Zum Warenkorb hinzufügen"
#: pretix/presale/templates/pretixpresale/event/index.html:223
#: pretix/presale/templates/pretixpresale/event/index.html:240
msgid "Redeem a voucher"
msgstr "Gutschein einlösen"
#: pretix/presale/templates/pretixpresale/event/index.html:241
#: pretix/presale/templates/pretixpresale/event/index.html:258
msgid "Redeem voucher"
msgstr "Gutschein einlösen"
#: pretix/presale/templates/pretixpresale/event/index.html:252
#: pretix/presale/templates/pretixpresale/event/index.html:269
msgid "If you already ordered a ticket"
msgstr "Wenn Sie bereits ein Ticket bestellt haben"
#: pretix/presale/templates/pretixpresale/event/index.html:256
#: pretix/presale/templates/pretixpresale/event/index.html:273
msgid ""
"If you want to see or change the status and details of your order, click on "
"the link in one of the emails we sent you during the order process. If you "
@@ -17171,7 +17181,7 @@ msgstr ""
"klicken Sie auf den folgenden Button, um ein erneutes Zusenden des Links "
"anzufordern."
#: pretix/presale/templates/pretixpresale/event/index.html:265
#: pretix/presale/templates/pretixpresale/event/index.html:282
#: pretix/presale/templates/pretixpresale/event/resend_link.html:4
#: pretix/presale/templates/pretixpresale/event/resend_link.html:7
msgid "Resend order links"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: 2019-05-01 12:13+0000\n"
"Last-Translator: Raphael Michel <michel@rami.io>\n"
"Language-Team: German <https://translate.pretix.eu/projects/pretix/pretix-js/"
@@ -263,7 +263,7 @@ msgstr[0] ""
msgstr[1] ""
"Die Produkte in Ihrem Warenkorb sind noch {num} Minuten für Sie reserviert."
#: pretix/static/pretixpresale/js/ui/main.js:201
#: pretix/static/pretixpresale/js/ui/main.js:202
msgid "Please enter a quantity for one of the ticket types."
msgstr "Bitte tragen Sie eine Menge für eines der Produkte ein."

View File

@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"PO-Revision-Date: 2019-06-05 11:38+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: 2019-06-06 09:24+0000\n"
"Last-Translator: Raphael Michel <michel@rami.io>\n"
"Language-Team: German (informal) <https://translate.pretix.eu/projects/"
"pretix/pretix/de_Informal/>\n"
@@ -2823,7 +2823,7 @@ msgstr "Produktpreis reduzieren um (%)"
#: pretix/control/templates/pretixcontrol/vouchers/index.html:98
#: pretix/control/views/vouchers.py:61 pretix/control/views/waitinglist.py:199
#: pretix/plugins/checkinlists/exporters.py:322
#: pretix/presale/templates/pretixpresale/event/index.html:235
#: pretix/presale/templates/pretixpresale/event/index.html:252
msgid "Voucher code"
msgstr "Gutscheincode"
@@ -6747,13 +6747,13 @@ msgid "Search voucher"
msgstr "Gutschein suchen"
#: pretix/control/forms/filter.py:823 pretix/control/forms/vouchers.py:92
#: pretix/control/views/typeahead.py:311
#: pretix/control/views/typeahead.py:317
#, python-brace-format
msgid "{product} Any variation"
msgstr "{product} - Beliebige Variante"
#: pretix/control/forms/filter.py:829 pretix/control/forms/vouchers.py:83
#: pretix/control/views/typeahead.py:319 pretix/control/views/typeahead.py:323
#: pretix/control/views/typeahead.py:325 pretix/control/views/typeahead.py:329
#: pretix/control/views/vouchers.py:73
#, python-brace-format
msgid "Any product in quota \"{quota}\""
@@ -8242,6 +8242,7 @@ msgstr "Einstellungen"
#: pretix/control/templates/pretixcontrol/subevents/bulk.html:19
#: pretix/control/templates/pretixcontrol/subevents/index.html:5
#: pretix/control/templates/pretixcontrol/subevents/index.html:7
#: pretix/presale/templates/pretixpresale/event/index.html:115
msgctxt "subevent"
msgid "Dates"
msgstr "Termine"
@@ -16892,7 +16893,7 @@ msgid "We're trying to reserve another one for you!"
msgstr "Okay, wir versuchen dir mehr zu reservieren!"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:104
#: pretix/presale/templates/pretixpresale/event/index.html:201
#: pretix/presale/templates/pretixpresale/event/index.html:218
#: pretix/presale/templates/pretixpresale/event/voucher.html:26
#, python-format
msgid ""
@@ -17048,20 +17049,29 @@ msgstr "Warenkorb leeren"
msgid "Proceed with checkout"
msgstr "Zur Kasse"
#: pretix/presale/templates/pretixpresale/event/index.html:99
#: pretix/presale/templates/pretixpresale/event/index.html:100
msgid "Add tickets for a different date"
msgstr "Tickets für anderen Termin hinzufügen"
#: pretix/presale/templates/pretixpresale/event/index.html:104
msgid "View other date"
msgstr "Zu anderem Termin wechseln"
#: pretix/presale/templates/pretixpresale/event/index.html:102
#: pretix/presale/templates/pretixpresale/event/index.html:108
msgid "Choose date to buy a ticket"
msgstr "Wähle einen Termin aus"
#: pretix/presale/templates/pretixpresale/event/index.html:129
#: pretix/presale/templates/pretixpresale/event/index.html:113
msgctxt "subevent"
msgid "Other dates"
msgstr "Andere Termine"
#: pretix/presale/templates/pretixpresale/event/index.html:146
#: pretix/presale/views/widget.py:471
msgid "The presale period for this event is over."
msgstr "Der Vorverkaufszeitraum für diese Veranstaltung ist vorüber."
#: pretix/presale/templates/pretixpresale/event/index.html:134
#: pretix/presale/templates/pretixpresale/event/index.html:151
#: pretix/presale/views/widget.py:473
#, python-format
msgid "The presale for this event will start on %(date)s at %(time)s."
@@ -17069,58 +17079,58 @@ msgstr ""
"Der Vorverkauf für diese Veranstaltung wird am %(date)s um %(time)s Uhr "
"beginnen."
#: pretix/presale/templates/pretixpresale/event/index.html:138
#: pretix/presale/templates/pretixpresale/event/index.html:155
#: pretix/presale/views/widget.py:478
msgid "The presale for this event has not yet started."
msgstr "Der Vorverkauf für diese Veranstaltung hat noch nicht begonnen."
#: pretix/presale/templates/pretixpresale/event/index.html:160
#: pretix/presale/templates/pretixpresale/event/index.html:177
#, python-format
msgid "Begin: %(time)s"
msgstr "Beginn: %(time)s"
#: pretix/presale/templates/pretixpresale/event/index.html:165
#: pretix/presale/templates/pretixpresale/event/index.html:182
#, python-format
msgid "End: %(time)s"
msgstr "Ende: %(time)s"
#: pretix/presale/templates/pretixpresale/event/index.html:173
#: pretix/presale/templates/pretixpresale/event/index.html:190
#, python-format
msgid "Admission: %(time)s"
msgstr "Einlass: %(time)s"
#: pretix/presale/templates/pretixpresale/event/index.html:177
#: pretix/presale/templates/pretixpresale/event/index.html:194
#, python-format
msgid "Admission: %(datetime)s"
msgstr "Einlass: %(datetime)s"
#: pretix/presale/templates/pretixpresale/event/index.html:188
#: pretix/presale/templates/pretixpresale/event/index.html:205
msgid "Add to Calendar"
msgstr "Zum Kalender hinzufügen"
#: pretix/presale/templates/pretixpresale/event/index.html:200
#: pretix/presale/templates/pretixpresale/event/index.html:217
#: pretix/presale/templates/pretixpresale/event/voucher.html:25
msgid "We're now trying to reserve this for you!"
msgstr "Wir versuchen nun, die ausgewählten Produkte für dich zu reservieren!"
#: pretix/presale/templates/pretixpresale/event/index.html:211
#: pretix/presale/templates/pretixpresale/event/index.html:228
#: pretix/presale/templates/pretixpresale/event/voucher.html:291
msgid "Add to cart"
msgstr "Zum Warenkorb hinzufügen"
#: pretix/presale/templates/pretixpresale/event/index.html:223
#: pretix/presale/templates/pretixpresale/event/index.html:240
msgid "Redeem a voucher"
msgstr "Gutschein einlösen"
#: pretix/presale/templates/pretixpresale/event/index.html:241
#: pretix/presale/templates/pretixpresale/event/index.html:258
msgid "Redeem voucher"
msgstr "Gutschein einlösen"
#: pretix/presale/templates/pretixpresale/event/index.html:252
#: pretix/presale/templates/pretixpresale/event/index.html:269
msgid "If you already ordered a ticket"
msgstr "Wenn du bereits ein Ticket bestellt hast"
#: pretix/presale/templates/pretixpresale/event/index.html:256
#: pretix/presale/templates/pretixpresale/event/index.html:273
msgid ""
"If you want to see or change the status and details of your order, click on "
"the link in one of the emails we sent you during the order process. If you "
@@ -17132,7 +17142,7 @@ msgstr ""
"Bestellvorgang geschickt haben. Wenn du den Link nicht finden kannst, klicke "
"auf den folgenden Button, um ein erneutes Zusenden des Links anzufordern."
#: pretix/presale/templates/pretixpresale/event/index.html:265
#: pretix/presale/templates/pretixpresale/event/index.html:282
#: pretix/presale/templates/pretixpresale/event/resend_link.html:4
#: pretix/presale/templates/pretixpresale/event/resend_link.html:7
msgid "Resend order links"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: 2019-05-01 12:12+0000\n"
"Last-Translator: Raphael Michel <michel@rami.io>\n"
"Language-Team: German (informal) <https://translate.pretix.eu/projects/"
@@ -262,7 +262,7 @@ msgstr[0] ""
msgstr[1] ""
"Die Produkte in deinem Warenkorb sind noch {num} Minuten für dich reserviert."
#: pretix/static/pretixpresale/js/ui/main.js:201
#: pretix/static/pretixpresale/js/ui/main.js:202
msgid "Please enter a quantity for one of the ticket types."
msgstr "Bitte trage eine Menge für eines der Produkte ein."

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -2642,7 +2642,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/vouchers/index.html:98
#: pretix/control/views/vouchers.py:61 pretix/control/views/waitinglist.py:199
#: pretix/plugins/checkinlists/exporters.py:322
#: pretix/presale/templates/pretixpresale/event/index.html:235
#: pretix/presale/templates/pretixpresale/event/index.html:252
msgid "Voucher code"
msgstr ""
@@ -5947,13 +5947,13 @@ msgid "Search voucher"
msgstr ""
#: pretix/control/forms/filter.py:823 pretix/control/forms/vouchers.py:92
#: pretix/control/views/typeahead.py:311
#: pretix/control/views/typeahead.py:317
#, python-brace-format
msgid "{product} Any variation"
msgstr ""
#: pretix/control/forms/filter.py:829 pretix/control/forms/vouchers.py:83
#: pretix/control/views/typeahead.py:319 pretix/control/views/typeahead.py:323
#: pretix/control/views/typeahead.py:325 pretix/control/views/typeahead.py:329
#: pretix/control/views/vouchers.py:73
#, python-brace-format
msgid "Any product in quota \"{quota}\""
@@ -7326,6 +7326,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/subevents/bulk.html:19
#: pretix/control/templates/pretixcontrol/subevents/index.html:5
#: pretix/control/templates/pretixcontrol/subevents/index.html:7
#: pretix/presale/templates/pretixpresale/event/index.html:115
msgctxt "subevent"
msgid "Dates"
msgstr ""
@@ -15104,7 +15105,7 @@ msgid "We're trying to reserve another one for you!"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:104
#: pretix/presale/templates/pretixpresale/event/index.html:201
#: pretix/presale/templates/pretixpresale/event/index.html:218
#: pretix/presale/templates/pretixpresale/event/voucher.html:26
#, python-format
msgid ""
@@ -15256,77 +15257,86 @@ msgstr ""
msgid "Proceed with checkout"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:99
#: pretix/presale/templates/pretixpresale/event/index.html:100
msgid "Add tickets for a different date"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:104
msgid "View other date"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:102
#: pretix/presale/templates/pretixpresale/event/index.html:108
msgid "Choose date to buy a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:129
#: pretix/presale/templates/pretixpresale/event/index.html:113
msgctxt "subevent"
msgid "Other dates"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:146
#: pretix/presale/views/widget.py:471
msgid "The presale period for this event is over."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:134
#: pretix/presale/templates/pretixpresale/event/index.html:151
#: pretix/presale/views/widget.py:473
#, python-format
msgid "The presale for this event will start on %(date)s at %(time)s."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:138
#: pretix/presale/templates/pretixpresale/event/index.html:155
#: pretix/presale/views/widget.py:478
msgid "The presale for this event has not yet started."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:160
#: pretix/presale/templates/pretixpresale/event/index.html:177
#, python-format
msgid "Begin: %(time)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:165
#: pretix/presale/templates/pretixpresale/event/index.html:182
#, python-format
msgid "End: %(time)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:173
#: pretix/presale/templates/pretixpresale/event/index.html:190
#, python-format
msgid "Admission: %(time)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:177
#: pretix/presale/templates/pretixpresale/event/index.html:194
#, python-format
msgid "Admission: %(datetime)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:188
#: pretix/presale/templates/pretixpresale/event/index.html:205
msgid "Add to Calendar"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:200
#: pretix/presale/templates/pretixpresale/event/index.html:217
#: pretix/presale/templates/pretixpresale/event/voucher.html:25
msgid "We're now trying to reserve this for you!"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:211
#: pretix/presale/templates/pretixpresale/event/index.html:228
#: pretix/presale/templates/pretixpresale/event/voucher.html:291
msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:223
#: pretix/presale/templates/pretixpresale/event/index.html:240
msgid "Redeem a voucher"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:241
#: pretix/presale/templates/pretixpresale/event/index.html:258
msgid "Redeem voucher"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:252
#: pretix/presale/templates/pretixpresale/event/index.html:269
msgid "If you already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:256
#: pretix/presale/templates/pretixpresale/event/index.html:273
msgid ""
"If you want to see or change the status and details of your order, click on "
"the link in one of the emails we sent you during the order process. If you "
@@ -15334,7 +15344,7 @@ msgid ""
"your order to be sent to you again."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:265
#: pretix/presale/templates/pretixpresale/event/index.html:282
#: pretix/presale/templates/pretixpresale/event/resend_link.html:4
#: pretix/presale/templates/pretixpresale/event/resend_link.html:7
msgid "Resend order links"

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -242,7 +242,7 @@ msgid_plural "The items in your cart are reserved for you for {num} minutes."
msgstr[0] ""
msgstr[1] ""
#: pretix/static/pretixpresale/js/ui/main.js:201
#: pretix/static/pretixpresale/js/ui/main.js:202
msgid "Please enter a quantity for one of the ticket types."
msgstr ""

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: 2019-06-04 16:00+0000\n"
"Last-Translator: ThanosTeste <testebasisth@unisystems.eu>\n"
"Language-Team: Greek <https://translate.pretix.eu/projects/pretix/pretix/el/"
@@ -2834,7 +2834,7 @@ msgstr "Μειώστε την τιμή του προϊόντος κατά (%)"
#: pretix/control/templates/pretixcontrol/vouchers/index.html:98
#: pretix/control/views/vouchers.py:61 pretix/control/views/waitinglist.py:199
#: pretix/plugins/checkinlists/exporters.py:322
#: pretix/presale/templates/pretixpresale/event/index.html:235
#: pretix/presale/templates/pretixpresale/event/index.html:252
msgid "Voucher code"
msgstr "Κωδικός κουπονιού"
@@ -6822,13 +6822,13 @@ msgid "Search voucher"
msgstr "Αναζήτηση κουπονιού"
#: pretix/control/forms/filter.py:823 pretix/control/forms/vouchers.py:92
#: pretix/control/views/typeahead.py:311
#: pretix/control/views/typeahead.py:317
#, python-brace-format
msgid "{product} Any variation"
msgstr "{product} - Οποιαδήποτε παραλλαγή"
#: pretix/control/forms/filter.py:829 pretix/control/forms/vouchers.py:83
#: pretix/control/views/typeahead.py:319 pretix/control/views/typeahead.py:323
#: pretix/control/views/typeahead.py:325 pretix/control/views/typeahead.py:329
#: pretix/control/views/vouchers.py:73
#, python-brace-format
msgid "Any product in quota \"{quota}\""
@@ -8348,6 +8348,7 @@ msgstr "Ρυθμίσεις"
#: pretix/control/templates/pretixcontrol/subevents/bulk.html:19
#: pretix/control/templates/pretixcontrol/subevents/index.html:5
#: pretix/control/templates/pretixcontrol/subevents/index.html:7
#: pretix/presale/templates/pretixpresale/event/index.html:115
msgctxt "subevent"
msgid "Dates"
msgstr "Ημερομηνίες"
@@ -17115,7 +17116,7 @@ msgid "We're trying to reserve another one for you!"
msgstr "Προσπαθούμε να κατοχυρώσουμε ένα άλλο για εσάς!"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:104
#: pretix/presale/templates/pretixpresale/event/index.html:201
#: pretix/presale/templates/pretixpresale/event/index.html:218
#: pretix/presale/templates/pretixpresale/event/voucher.html:26
#, python-format
msgid ""
@@ -17274,78 +17275,91 @@ msgstr "Αδειάστε το καλάθι αγορών"
msgid "Proceed with checkout"
msgstr "Ολοκλήρωση αγοράς"
#: pretix/presale/templates/pretixpresale/event/index.html:99
#: pretix/presale/templates/pretixpresale/event/index.html:100
#, fuzzy
#| msgid "This file is from a different event."
msgid "Add tickets for a different date"
msgstr "Αυτό το αρχείο προέρχεται από διαφορετική εκδήλωση."
#: pretix/presale/templates/pretixpresale/event/index.html:104
msgid "View other date"
msgstr "Δείτε άλλη ημερομηνία"
#: pretix/presale/templates/pretixpresale/event/index.html:102
#: pretix/presale/templates/pretixpresale/event/index.html:108
msgid "Choose date to buy a ticket"
msgstr "Επιλέξτε ημερομηνία για να αγοράσετε ένα εισιτήριο"
#: pretix/presale/templates/pretixpresale/event/index.html:129
#: pretix/presale/templates/pretixpresale/event/index.html:113
#, fuzzy
#| msgid "Other features"
msgctxt "subevent"
msgid "Other dates"
msgstr "Αλλα χαρακτηριστικά"
#: pretix/presale/templates/pretixpresale/event/index.html:146
#: pretix/presale/views/widget.py:471
msgid "The presale period for this event is over."
msgstr "Η περίοδος προπώλησης γι' αυτήν την εκδήλωση τελείωσε."
#: pretix/presale/templates/pretixpresale/event/index.html:134
#: pretix/presale/templates/pretixpresale/event/index.html:151
#: pretix/presale/views/widget.py:473
#, python-format
msgid "The presale for this event will start on %(date)s at %(time)s."
msgstr ""
"Η προπώληση γι' αυτήν την εκδήλωση θα ξεκινήσεις στις %(date)s στις %(time)s."
#: pretix/presale/templates/pretixpresale/event/index.html:138
#: pretix/presale/templates/pretixpresale/event/index.html:155
#: pretix/presale/views/widget.py:478
msgid "The presale for this event has not yet started."
msgstr "Η προπώληση γι' αυτήν την εκδήλωση δεν έχει ξεκινήσει ακόμα."
#: pretix/presale/templates/pretixpresale/event/index.html:160
#: pretix/presale/templates/pretixpresale/event/index.html:177
#, python-format
msgid "Begin: %(time)s"
msgstr "Ξεκινήστε: %(time)s"
#: pretix/presale/templates/pretixpresale/event/index.html:165
#: pretix/presale/templates/pretixpresale/event/index.html:182
#, python-format
msgid "End: %(time)s"
msgstr "Τέλος: %(time)s"
#: pretix/presale/templates/pretixpresale/event/index.html:173
#: pretix/presale/templates/pretixpresale/event/index.html:190
#, python-format
msgid "Admission: %(time)s"
msgstr "Είσοδος: %(time)s"
#: pretix/presale/templates/pretixpresale/event/index.html:177
#: pretix/presale/templates/pretixpresale/event/index.html:194
#, python-format
msgid "Admission: %(datetime)s"
msgstr "Είσοδος: %(datetime)s"
#: pretix/presale/templates/pretixpresale/event/index.html:188
#: pretix/presale/templates/pretixpresale/event/index.html:205
msgid "Add to Calendar"
msgstr "Προσθήκη Εκδήλωσης στο Ημερολόγιο"
#: pretix/presale/templates/pretixpresale/event/index.html:200
#: pretix/presale/templates/pretixpresale/event/index.html:217
#: pretix/presale/templates/pretixpresale/event/voucher.html:25
msgid "We're now trying to reserve this for you!"
msgstr "Τώρα προσπαθούμε να το κρατήσουμε αυτό για σας!"
#: pretix/presale/templates/pretixpresale/event/index.html:211
#: pretix/presale/templates/pretixpresale/event/index.html:228
#: pretix/presale/templates/pretixpresale/event/voucher.html:291
msgid "Add to cart"
msgstr "Προσθήκη στο καλάθι"
#: pretix/presale/templates/pretixpresale/event/index.html:223
#: pretix/presale/templates/pretixpresale/event/index.html:240
msgid "Redeem a voucher"
msgstr "Εξαργυρώστε ένα κουπόνι"
#: pretix/presale/templates/pretixpresale/event/index.html:241
#: pretix/presale/templates/pretixpresale/event/index.html:258
msgid "Redeem voucher"
msgstr "Εξαργύρωση κουπονιού"
#: pretix/presale/templates/pretixpresale/event/index.html:252
#: pretix/presale/templates/pretixpresale/event/index.html:269
msgid "If you already ordered a ticket"
msgstr "Αν έχετε ήδη αγοράσει κάποιο εισιτήριο"
#: pretix/presale/templates/pretixpresale/event/index.html:256
#: pretix/presale/templates/pretixpresale/event/index.html:273
msgid ""
"If you want to see or change the status and details of your order, click on "
"the link in one of the emails we sent you during the order process. If you "
@@ -17358,7 +17372,7 @@ msgstr ""
"βρείτε, κάντε κλικ στο διπλανό κουμπί για να ζητήσετε να σας σταλεί εκ νέου "
"ο σύνδεσμος που αφορά την παραγγελία σας."
#: pretix/presale/templates/pretixpresale/event/index.html:265
#: pretix/presale/templates/pretixpresale/event/index.html:282
#: pretix/presale/templates/pretixpresale/event/resend_link.html:4
#: pretix/presale/templates/pretixpresale/event/resend_link.html:7
msgid "Resend order links"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: 2019-06-04 16:00+0000\n"
"Last-Translator: ThanosTeste <testebasisth@unisystems.eu>\n"
"Language-Team: Greek <https://translate.pretix.eu/projects/pretix/pretix-js/"
@@ -264,7 +264,7 @@ msgid_plural "The items in your cart are reserved for you for {num} minutes."
msgstr[0] "Τα είδη στο καλάθι θα παραμείνουν δεσμευμένα για ένα λεπτό."
msgstr[1] "Τα είδη στο καλάθι θα παραμείνουν δεσμευμένα για {num} λεπτά."
#: pretix/static/pretixpresale/js/ui/main.js:201
#: pretix/static/pretixpresale/js/ui/main.js:202
msgid "Please enter a quantity for one of the ticket types."
msgstr "Εισαγάγετε μια ποσότητα για έναν από τους τύπους εισιτηρίων."

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: 2019-05-01 23:00+0000\n"
"Last-Translator: Alvaro Enrique Ruano <alvaro.ruano90@outlook.com>\n"
"Language-Team: Spanish <https://translate.pretix.eu/projects/pretix/pretix/"
@@ -2840,7 +2840,7 @@ msgstr "Reducir el precio del producto en (%)"
#: pretix/control/templates/pretixcontrol/vouchers/index.html:98
#: pretix/control/views/vouchers.py:61 pretix/control/views/waitinglist.py:199
#: pretix/plugins/checkinlists/exporters.py:322
#: pretix/presale/templates/pretixpresale/event/index.html:235
#: pretix/presale/templates/pretixpresale/event/index.html:252
msgid "Voucher code"
msgstr "Código del recibo"
@@ -6876,13 +6876,13 @@ msgid "Search voucher"
msgstr "Buscar recibo"
#: pretix/control/forms/filter.py:823 pretix/control/forms/vouchers.py:92
#: pretix/control/views/typeahead.py:311
#: pretix/control/views/typeahead.py:317
#, python-brace-format
msgid "{product} Any variation"
msgstr "{product} - Cualquier variación"
#: pretix/control/forms/filter.py:829 pretix/control/forms/vouchers.py:83
#: pretix/control/views/typeahead.py:319 pretix/control/views/typeahead.py:323
#: pretix/control/views/typeahead.py:325 pretix/control/views/typeahead.py:329
#: pretix/control/views/vouchers.py:73
#, python-brace-format
msgid "Any product in quota \"{quota}\""
@@ -8401,6 +8401,7 @@ msgstr "Ajustes"
#: pretix/control/templates/pretixcontrol/subevents/bulk.html:19
#: pretix/control/templates/pretixcontrol/subevents/index.html:5
#: pretix/control/templates/pretixcontrol/subevents/index.html:7
#: pretix/presale/templates/pretixpresale/event/index.html:115
msgctxt "subevent"
msgid "Dates"
msgstr "Fechas"
@@ -17100,7 +17101,7 @@ msgid "We're trying to reserve another one for you!"
msgstr "¡Estamos tratando de reservar otro para ti!"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:104
#: pretix/presale/templates/pretixpresale/event/index.html:201
#: pretix/presale/templates/pretixpresale/event/index.html:218
#: pretix/presale/templates/pretixpresale/event/voucher.html:26
#, python-format
msgid ""
@@ -17256,77 +17257,90 @@ msgstr "Carrito vacío"
msgid "Proceed with checkout"
msgstr "Proceder con la compra"
#: pretix/presale/templates/pretixpresale/event/index.html:99
#: pretix/presale/templates/pretixpresale/event/index.html:100
#, fuzzy
#| msgid "This file is from a different event."
msgid "Add tickets for a different date"
msgstr "Este archivo es de un evento diferente."
#: pretix/presale/templates/pretixpresale/event/index.html:104
msgid "View other date"
msgstr "Ver otra fecha"
#: pretix/presale/templates/pretixpresale/event/index.html:102
#: pretix/presale/templates/pretixpresale/event/index.html:108
msgid "Choose date to buy a ticket"
msgstr "Elija la fecha para comprar un ticket"
#: pretix/presale/templates/pretixpresale/event/index.html:129
#: pretix/presale/templates/pretixpresale/event/index.html:113
#, fuzzy
#| msgid "Other features"
msgctxt "subevent"
msgid "Other dates"
msgstr "Otras características"
#: pretix/presale/templates/pretixpresale/event/index.html:146
#: pretix/presale/views/widget.py:471
msgid "The presale period for this event is over."
msgstr "El período de preventa para este evento ha terminado."
#: pretix/presale/templates/pretixpresale/event/index.html:134
#: pretix/presale/templates/pretixpresale/event/index.html:151
#: pretix/presale/views/widget.py:473
#, python-format
msgid "The presale for this event will start on %(date)s at %(time)s."
msgstr "La preventa para este evento comenzará en %(date)s a %(time)s."
#: pretix/presale/templates/pretixpresale/event/index.html:138
#: pretix/presale/templates/pretixpresale/event/index.html:155
#: pretix/presale/views/widget.py:478
msgid "The presale for this event has not yet started."
msgstr "La preventa de este evento aún no ha comenzado."
#: pretix/presale/templates/pretixpresale/event/index.html:160
#: pretix/presale/templates/pretixpresale/event/index.html:177
#, python-format
msgid "Begin: %(time)s"
msgstr "Inicio: %(time)s"
#: pretix/presale/templates/pretixpresale/event/index.html:165
#: pretix/presale/templates/pretixpresale/event/index.html:182
#, python-format
msgid "End: %(time)s"
msgstr "Fin: %(time)s"
#: pretix/presale/templates/pretixpresale/event/index.html:173
#: pretix/presale/templates/pretixpresale/event/index.html:190
#, python-format
msgid "Admission: %(time)s"
msgstr "Entrada: %(time)s"
#: pretix/presale/templates/pretixpresale/event/index.html:177
#: pretix/presale/templates/pretixpresale/event/index.html:194
#, python-format
msgid "Admission: %(datetime)s"
msgstr "Entrada: %(datetime)s"
#: pretix/presale/templates/pretixpresale/event/index.html:188
#: pretix/presale/templates/pretixpresale/event/index.html:205
msgid "Add to Calendar"
msgstr "Añadir al Calendario"
#: pretix/presale/templates/pretixpresale/event/index.html:200
#: pretix/presale/templates/pretixpresale/event/index.html:217
#: pretix/presale/templates/pretixpresale/event/voucher.html:25
msgid "We're now trying to reserve this for you!"
msgstr "¡Estamos tratando de reservar esto para ti!"
#: pretix/presale/templates/pretixpresale/event/index.html:211
#: pretix/presale/templates/pretixpresale/event/index.html:228
#: pretix/presale/templates/pretixpresale/event/voucher.html:291
msgid "Add to cart"
msgstr "Añadir al carrito"
#: pretix/presale/templates/pretixpresale/event/index.html:223
#: pretix/presale/templates/pretixpresale/event/index.html:240
msgid "Redeem a voucher"
msgstr "Canjee un recibo"
#: pretix/presale/templates/pretixpresale/event/index.html:241
#: pretix/presale/templates/pretixpresale/event/index.html:258
msgid "Redeem voucher"
msgstr "Canjear recibo"
#: pretix/presale/templates/pretixpresale/event/index.html:252
#: pretix/presale/templates/pretixpresale/event/index.html:269
msgid "If you already ordered a ticket"
msgstr "Si ya ha pedido un ticket"
#: pretix/presale/templates/pretixpresale/event/index.html:256
#: pretix/presale/templates/pretixpresale/event/index.html:273
msgid ""
"If you want to see or change the status and details of your order, click on "
"the link in one of the emails we sent you during the order process. If you "
@@ -17339,7 +17353,7 @@ msgstr ""
"siguiente botón para solicitar que se le envíe de nuevo el enlace a su "
"pedido."
#: pretix/presale/templates/pretixpresale/event/index.html:265
#: pretix/presale/templates/pretixpresale/event/index.html:282
#: pretix/presale/templates/pretixpresale/event/resend_link.html:4
#: pretix/presale/templates/pretixpresale/event/resend_link.html:7
msgid "Resend order links"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: 2019-03-31 08:00+0000\n"
"Last-Translator: oocf <oswaldocerna@gmail.com>\n"
"Language-Team: Spanish <https://translate.pretix.eu/projects/pretix/pretix-"
@@ -266,7 +266,7 @@ msgstr[0] ""
msgstr[1] ""
"Los elementos en su carrito de compras se han reservado por {num} minutos."
#: pretix/static/pretixpresale/js/ui/main.js:201
#: pretix/static/pretixpresale/js/ui/main.js:202
msgid "Please enter a quantity for one of the ticket types."
msgstr ""

View File

@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: 2019-04-22 19:00+0000\n"
"Last-Translator: David100mark <david.hundertmark@gmx.net>\n"
"Language-Team: French <https://translate.pretix.eu/projects/pretix/pretix/fr/"
@@ -2894,7 +2894,7 @@ msgstr "Réduire le prix des produits de (%)"
#: pretix/control/templates/pretixcontrol/vouchers/index.html:98
#: pretix/control/views/vouchers.py:61 pretix/control/views/waitinglist.py:199
#: pretix/plugins/checkinlists/exporters.py:322
#: pretix/presale/templates/pretixpresale/event/index.html:235
#: pretix/presale/templates/pretixpresale/event/index.html:252
msgid "Voucher code"
msgstr "code de réduction"
@@ -7089,13 +7089,13 @@ msgid "Search voucher"
msgstr "Chercher un bon de réduction"
#: pretix/control/forms/filter.py:823 pretix/control/forms/vouchers.py:92
#: pretix/control/views/typeahead.py:311
#: pretix/control/views/typeahead.py:317
#, python-brace-format
msgid "{product} Any variation"
msgstr "{product} - Toute les variantes"
#: pretix/control/forms/filter.py:829 pretix/control/forms/vouchers.py:83
#: pretix/control/views/typeahead.py:319 pretix/control/views/typeahead.py:323
#: pretix/control/views/typeahead.py:325 pretix/control/views/typeahead.py:329
#: pretix/control/views/vouchers.py:73
#, python-brace-format
msgid "Any product in quota \"{quota}\""
@@ -8680,6 +8680,7 @@ msgstr "Réglages"
#: pretix/control/templates/pretixcontrol/subevents/bulk.html:19
#: pretix/control/templates/pretixcontrol/subevents/index.html:5
#: pretix/control/templates/pretixcontrol/subevents/index.html:7
#: pretix/presale/templates/pretixpresale/event/index.html:115
msgctxt "subevent"
msgid "Dates"
msgstr "Dates"
@@ -17852,7 +17853,7 @@ msgid "We're trying to reserve another one for you!"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:104
#: pretix/presale/templates/pretixpresale/event/index.html:201
#: pretix/presale/templates/pretixpresale/event/index.html:218
#: pretix/presale/templates/pretixpresale/event/voucher.html:26
#, python-format
msgid ""
@@ -18015,77 +18016,90 @@ msgstr "Vider le panier"
msgid "Proceed with checkout"
msgstr "Procéder au paiement"
#: pretix/presale/templates/pretixpresale/event/index.html:99
#: pretix/presale/templates/pretixpresale/event/index.html:100
#, fuzzy
#| msgid "This file is from a different event."
msgid "Add tickets for a different date"
msgstr "Ce fichier provient d'un événement différent."
#: pretix/presale/templates/pretixpresale/event/index.html:104
msgid "View other date"
msgstr "Afficher une autre date"
#: pretix/presale/templates/pretixpresale/event/index.html:102
#: pretix/presale/templates/pretixpresale/event/index.html:108
msgid "Choose date to buy a ticket"
msgstr "Choisissez la date d'achat du billet"
#: pretix/presale/templates/pretixpresale/event/index.html:129
#: pretix/presale/templates/pretixpresale/event/index.html:113
#, fuzzy
#| msgid "Other features"
msgctxt "subevent"
msgid "Other dates"
msgstr "Autres caractéristiques"
#: pretix/presale/templates/pretixpresale/event/index.html:146
#: pretix/presale/views/widget.py:471
msgid "The presale period for this event is over."
msgstr "La période de prévente pour cet événement est terminée."
#: pretix/presale/templates/pretixpresale/event/index.html:134
#: pretix/presale/templates/pretixpresale/event/index.html:151
#: pretix/presale/views/widget.py:473
#, python-format
msgid "The presale for this event will start on %(date)s at %(time)s."
msgstr "La prévente de cet événement débutera le %(date)s à %(time)s."
#: pretix/presale/templates/pretixpresale/event/index.html:138
#: pretix/presale/templates/pretixpresale/event/index.html:155
#: pretix/presale/views/widget.py:478
msgid "The presale for this event has not yet started."
msgstr "La prévente de cet événement n' a pas encore commencé."
#: pretix/presale/templates/pretixpresale/event/index.html:160
#: pretix/presale/templates/pretixpresale/event/index.html:177
#, python-format
msgid "Begin: %(time)s"
msgstr "Début: %(time)s"
#: pretix/presale/templates/pretixpresale/event/index.html:165
#: pretix/presale/templates/pretixpresale/event/index.html:182
#, python-format
msgid "End: %(time)s"
msgstr "Fin: %(time)s"
#: pretix/presale/templates/pretixpresale/event/index.html:173
#: pretix/presale/templates/pretixpresale/event/index.html:190
#, python-format
msgid "Admission: %(time)s"
msgstr "Admission: %(time)s"
#: pretix/presale/templates/pretixpresale/event/index.html:177
#: pretix/presale/templates/pretixpresale/event/index.html:194
#, python-format
msgid "Admission: %(datetime)s"
msgstr "Admission: %(datetime)s"
#: pretix/presale/templates/pretixpresale/event/index.html:188
#: pretix/presale/templates/pretixpresale/event/index.html:205
msgid "Add to Calendar"
msgstr "Ajouter à l'Agenda"
#: pretix/presale/templates/pretixpresale/event/index.html:200
#: pretix/presale/templates/pretixpresale/event/index.html:217
#: pretix/presale/templates/pretixpresale/event/voucher.html:25
msgid "We're now trying to reserve this for you!"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:211
#: pretix/presale/templates/pretixpresale/event/index.html:228
#: pretix/presale/templates/pretixpresale/event/voucher.html:291
msgid "Add to cart"
msgstr "Ajouter au panier"
#: pretix/presale/templates/pretixpresale/event/index.html:223
#: pretix/presale/templates/pretixpresale/event/index.html:240
msgid "Redeem a voucher"
msgstr "Échangez un bon d'achat"
#: pretix/presale/templates/pretixpresale/event/index.html:241
#: pretix/presale/templates/pretixpresale/event/index.html:258
msgid "Redeem voucher"
msgstr "Échangez votre bon"
#: pretix/presale/templates/pretixpresale/event/index.html:252
#: pretix/presale/templates/pretixpresale/event/index.html:269
msgid "If you already ordered a ticket"
msgstr "Si vous avez déjà commandé un billet"
#: pretix/presale/templates/pretixpresale/event/index.html:256
#: pretix/presale/templates/pretixpresale/event/index.html:273
msgid ""
"If you want to see or change the status and details of your order, click on "
"the link in one of the emails we sent you during the order process. If you "
@@ -18098,7 +18112,7 @@ msgstr ""
"cliquez sur le bouton suivant pour demander que le lien de votre commande "
"vous soit à nouveau envoyé."
#: pretix/presale/templates/pretixpresale/event/index.html:265
#: pretix/presale/templates/pretixpresale/event/index.html:282
#: pretix/presale/templates/pretixpresale/event/resend_link.html:4
#: pretix/presale/templates/pretixpresale/event/resend_link.html:7
msgid "Resend order links"

View File

@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: French\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: 2018-10-28 10:23+0000\n"
"Last-Translator: Arnaud Vergnet <keplyx@gmail.com>\n"
"Language-Team: French <https://translate.pretix.eu/projects/pretix/pretix-js/"
@@ -267,7 +267,7 @@ msgid_plural "The items in your cart are reserved for you for {num} minutes."
msgstr[0] "Les articles de votre panier vous sont réservés pour une minute."
msgstr[1] "Les articles de votre panier vous sont réservés pour {num} minutes."
#: pretix/static/pretixpresale/js/ui/main.js:201
#: pretix/static/pretixpresale/js/ui/main.js:202
msgid "Please enter a quantity for one of the ticket types."
msgstr ""

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: 2019-01-02 08:20+0000\n"
"Last-Translator: amefad <fame@libero.it>\n"
"Language-Team: Italian <https://translate.pretix.eu/projects/pretix/pretix/"
@@ -2706,7 +2706,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/vouchers/index.html:98
#: pretix/control/views/vouchers.py:61 pretix/control/views/waitinglist.py:199
#: pretix/plugins/checkinlists/exporters.py:322
#: pretix/presale/templates/pretixpresale/event/index.html:235
#: pretix/presale/templates/pretixpresale/event/index.html:252
msgid "Voucher code"
msgstr ""
@@ -6024,13 +6024,13 @@ msgid "Search voucher"
msgstr ""
#: pretix/control/forms/filter.py:823 pretix/control/forms/vouchers.py:92
#: pretix/control/views/typeahead.py:311
#: pretix/control/views/typeahead.py:317
#, python-brace-format
msgid "{product} Any variation"
msgstr ""
#: pretix/control/forms/filter.py:829 pretix/control/forms/vouchers.py:83
#: pretix/control/views/typeahead.py:319 pretix/control/views/typeahead.py:323
#: pretix/control/views/typeahead.py:325 pretix/control/views/typeahead.py:329
#: pretix/control/views/vouchers.py:73
#, python-brace-format
msgid "Any product in quota \"{quota}\""
@@ -7405,6 +7405,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/subevents/bulk.html:19
#: pretix/control/templates/pretixcontrol/subevents/index.html:5
#: pretix/control/templates/pretixcontrol/subevents/index.html:7
#: pretix/presale/templates/pretixpresale/event/index.html:115
msgctxt "subevent"
msgid "Dates"
msgstr ""
@@ -15202,7 +15203,7 @@ msgid "We're trying to reserve another one for you!"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:104
#: pretix/presale/templates/pretixpresale/event/index.html:201
#: pretix/presale/templates/pretixpresale/event/index.html:218
#: pretix/presale/templates/pretixpresale/event/voucher.html:26
#, python-format
msgid ""
@@ -15354,77 +15355,88 @@ msgstr ""
msgid "Proceed with checkout"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:99
#: pretix/presale/templates/pretixpresale/event/index.html:100
msgid "Add tickets for a different date"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:104
msgid "View other date"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:102
#: pretix/presale/templates/pretixpresale/event/index.html:108
msgid "Choose date to buy a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:129
#: pretix/presale/templates/pretixpresale/event/index.html:113
#, fuzzy
#| msgid "Order date"
msgctxt "subevent"
msgid "Other dates"
msgstr "Data dell'ordine"
#: pretix/presale/templates/pretixpresale/event/index.html:146
#: pretix/presale/views/widget.py:471
msgid "The presale period for this event is over."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:134
#: pretix/presale/templates/pretixpresale/event/index.html:151
#: pretix/presale/views/widget.py:473
#, python-format
msgid "The presale for this event will start on %(date)s at %(time)s."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:138
#: pretix/presale/templates/pretixpresale/event/index.html:155
#: pretix/presale/views/widget.py:478
msgid "The presale for this event has not yet started."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:160
#: pretix/presale/templates/pretixpresale/event/index.html:177
#, python-format
msgid "Begin: %(time)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:165
#: pretix/presale/templates/pretixpresale/event/index.html:182
#, python-format
msgid "End: %(time)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:173
#: pretix/presale/templates/pretixpresale/event/index.html:190
#, python-format
msgid "Admission: %(time)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:177
#: pretix/presale/templates/pretixpresale/event/index.html:194
#, python-format
msgid "Admission: %(datetime)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:188
#: pretix/presale/templates/pretixpresale/event/index.html:205
msgid "Add to Calendar"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:200
#: pretix/presale/templates/pretixpresale/event/index.html:217
#: pretix/presale/templates/pretixpresale/event/voucher.html:25
msgid "We're now trying to reserve this for you!"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:211
#: pretix/presale/templates/pretixpresale/event/index.html:228
#: pretix/presale/templates/pretixpresale/event/voucher.html:291
msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:223
#: pretix/presale/templates/pretixpresale/event/index.html:240
msgid "Redeem a voucher"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:241
#: pretix/presale/templates/pretixpresale/event/index.html:258
msgid "Redeem voucher"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:252
#: pretix/presale/templates/pretixpresale/event/index.html:269
msgid "If you already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:256
#: pretix/presale/templates/pretixpresale/event/index.html:273
msgid ""
"If you want to see or change the status and details of your order, click on "
"the link in one of the emails we sent you during the order process. If you "
@@ -15432,7 +15444,7 @@ msgid ""
"your order to be sent to you again."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:265
#: pretix/presale/templates/pretixpresale/event/index.html:282
#: pretix/presale/templates/pretixpresale/event/resend_link.html:4
#: pretix/presale/templates/pretixpresale/event/resend_link.html:7
msgid "Resend order links"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: 2019-01-02 08:20+0000\n"
"Last-Translator: amefad <fame@libero.it>\n"
"Language-Team: Italian <https://translate.pretix.eu/projects/pretix/pretix-"
@@ -258,7 +258,7 @@ msgid_plural "The items in your cart are reserved for you for {num} minutes."
msgstr[0] ""
msgstr[1] ""
#: pretix/static/pretixpresale/js/ui/main.js:201
#: pretix/static/pretixpresale/js/ui/main.js:202
msgid "Please enter a quantity for one of the ticket types."
msgstr ""

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
@@ -2641,7 +2641,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/vouchers/index.html:98
#: pretix/control/views/vouchers.py:61 pretix/control/views/waitinglist.py:199
#: pretix/plugins/checkinlists/exporters.py:322
#: pretix/presale/templates/pretixpresale/event/index.html:235
#: pretix/presale/templates/pretixpresale/event/index.html:252
msgid "Voucher code"
msgstr ""
@@ -5946,13 +5946,13 @@ msgid "Search voucher"
msgstr ""
#: pretix/control/forms/filter.py:823 pretix/control/forms/vouchers.py:92
#: pretix/control/views/typeahead.py:311
#: pretix/control/views/typeahead.py:317
#, python-brace-format
msgid "{product} Any variation"
msgstr ""
#: pretix/control/forms/filter.py:829 pretix/control/forms/vouchers.py:83
#: pretix/control/views/typeahead.py:319 pretix/control/views/typeahead.py:323
#: pretix/control/views/typeahead.py:325 pretix/control/views/typeahead.py:329
#: pretix/control/views/vouchers.py:73
#, python-brace-format
msgid "Any product in quota \"{quota}\""
@@ -7325,6 +7325,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/subevents/bulk.html:19
#: pretix/control/templates/pretixcontrol/subevents/index.html:5
#: pretix/control/templates/pretixcontrol/subevents/index.html:7
#: pretix/presale/templates/pretixpresale/event/index.html:115
msgctxt "subevent"
msgid "Dates"
msgstr ""
@@ -15103,7 +15104,7 @@ msgid "We're trying to reserve another one for you!"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:104
#: pretix/presale/templates/pretixpresale/event/index.html:201
#: pretix/presale/templates/pretixpresale/event/index.html:218
#: pretix/presale/templates/pretixpresale/event/voucher.html:26
#, python-format
msgid ""
@@ -15255,77 +15256,86 @@ msgstr ""
msgid "Proceed with checkout"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:99
#: pretix/presale/templates/pretixpresale/event/index.html:100
msgid "Add tickets for a different date"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:104
msgid "View other date"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:102
#: pretix/presale/templates/pretixpresale/event/index.html:108
msgid "Choose date to buy a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:129
#: pretix/presale/templates/pretixpresale/event/index.html:113
msgctxt "subevent"
msgid "Other dates"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:146
#: pretix/presale/views/widget.py:471
msgid "The presale period for this event is over."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:134
#: pretix/presale/templates/pretixpresale/event/index.html:151
#: pretix/presale/views/widget.py:473
#, python-format
msgid "The presale for this event will start on %(date)s at %(time)s."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:138
#: pretix/presale/templates/pretixpresale/event/index.html:155
#: pretix/presale/views/widget.py:478
msgid "The presale for this event has not yet started."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:160
#: pretix/presale/templates/pretixpresale/event/index.html:177
#, python-format
msgid "Begin: %(time)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:165
#: pretix/presale/templates/pretixpresale/event/index.html:182
#, python-format
msgid "End: %(time)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:173
#: pretix/presale/templates/pretixpresale/event/index.html:190
#, python-format
msgid "Admission: %(time)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:177
#: pretix/presale/templates/pretixpresale/event/index.html:194
#, python-format
msgid "Admission: %(datetime)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:188
#: pretix/presale/templates/pretixpresale/event/index.html:205
msgid "Add to Calendar"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:200
#: pretix/presale/templates/pretixpresale/event/index.html:217
#: pretix/presale/templates/pretixpresale/event/voucher.html:25
msgid "We're now trying to reserve this for you!"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:211
#: pretix/presale/templates/pretixpresale/event/index.html:228
#: pretix/presale/templates/pretixpresale/event/voucher.html:291
msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:223
#: pretix/presale/templates/pretixpresale/event/index.html:240
msgid "Redeem a voucher"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:241
#: pretix/presale/templates/pretixpresale/event/index.html:258
msgid "Redeem voucher"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:252
#: pretix/presale/templates/pretixpresale/event/index.html:269
msgid "If you already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:256
#: pretix/presale/templates/pretixpresale/event/index.html:273
msgid ""
"If you want to see or change the status and details of your order, click on "
"the link in one of the emails we sent you during the order process. If you "
@@ -15333,7 +15343,7 @@ msgid ""
"your order to be sent to you again."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:265
#: pretix/presale/templates/pretixpresale/event/index.html:282
#: pretix/presale/templates/pretixpresale/event/resend_link.html:4
#: pretix/presale/templates/pretixpresale/event/resend_link.html:7
msgid "Resend order links"

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -242,7 +242,7 @@ msgid_plural "The items in your cart are reserved for you for {num} minutes."
msgstr[0] ""
msgstr[1] ""
#: pretix/static/pretixpresale/js/ui/main.js:201
#: pretix/static/pretixpresale/js/ui/main.js:202
msgid "Please enter a quantity for one of the ticket types."
msgstr ""

View File

@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: 2019-04-27 21:00+0000\n"
"Last-Translator: Maarten van den Berg <maartenberg1@gmail.com>\n"
"Language-Team: Dutch <https://translate.pretix.eu/projects/pretix/pretix/nl/"
@@ -2815,7 +2815,7 @@ msgstr "Verlaag productprijs met (%)"
#: pretix/control/templates/pretixcontrol/vouchers/index.html:98
#: pretix/control/views/vouchers.py:61 pretix/control/views/waitinglist.py:199
#: pretix/plugins/checkinlists/exporters.py:322
#: pretix/presale/templates/pretixpresale/event/index.html:235
#: pretix/presale/templates/pretixpresale/event/index.html:252
msgid "Voucher code"
msgstr "Vouchercode"
@@ -6818,13 +6818,13 @@ msgid "Search voucher"
msgstr "Zoek voucher"
#: pretix/control/forms/filter.py:823 pretix/control/forms/vouchers.py:92
#: pretix/control/views/typeahead.py:311
#: pretix/control/views/typeahead.py:317
#, python-brace-format
msgid "{product} Any variation"
msgstr "{product} Elke variant"
#: pretix/control/forms/filter.py:829 pretix/control/forms/vouchers.py:83
#: pretix/control/views/typeahead.py:319 pretix/control/views/typeahead.py:323
#: pretix/control/views/typeahead.py:325 pretix/control/views/typeahead.py:329
#: pretix/control/views/vouchers.py:73
#, python-brace-format
msgid "Any product in quota \"{quota}\""
@@ -8332,6 +8332,7 @@ msgstr "Instellingen"
#: pretix/control/templates/pretixcontrol/subevents/bulk.html:19
#: pretix/control/templates/pretixcontrol/subevents/index.html:5
#: pretix/control/templates/pretixcontrol/subevents/index.html:7
#: pretix/presale/templates/pretixpresale/event/index.html:115
msgctxt "subevent"
msgid "Dates"
msgstr "Datums"
@@ -16971,7 +16972,7 @@ msgid "We're trying to reserve another one for you!"
msgstr "We proberen er nog een voor u te reserveren!"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:104
#: pretix/presale/templates/pretixpresale/event/index.html:201
#: pretix/presale/templates/pretixpresale/event/index.html:218
#: pretix/presale/templates/pretixpresale/event/voucher.html:26
#, python-format
msgid ""
@@ -17127,78 +17128,91 @@ msgstr "Leeg winkelwagen"
msgid "Proceed with checkout"
msgstr "Afrekenen"
#: pretix/presale/templates/pretixpresale/event/index.html:99
#: pretix/presale/templates/pretixpresale/event/index.html:100
#, fuzzy
#| msgid "This file is from a different event."
msgid "Add tickets for a different date"
msgstr "Dit bestand is van een ander evenement."
#: pretix/presale/templates/pretixpresale/event/index.html:104
msgid "View other date"
msgstr "Bekijk andere datum"
#: pretix/presale/templates/pretixpresale/event/index.html:102
#: pretix/presale/templates/pretixpresale/event/index.html:108
msgid "Choose date to buy a ticket"
msgstr "Kies een datum om een ticket te kopen"
#: pretix/presale/templates/pretixpresale/event/index.html:129
#: pretix/presale/templates/pretixpresale/event/index.html:113
#, fuzzy
#| msgid "Other features"
msgctxt "subevent"
msgid "Other dates"
msgstr "Andere functies"
#: pretix/presale/templates/pretixpresale/event/index.html:146
#: pretix/presale/views/widget.py:471
msgid "The presale period for this event is over."
msgstr "De voorverkoopperiode voor dit evenement is afgelopen."
#: pretix/presale/templates/pretixpresale/event/index.html:134
#: pretix/presale/templates/pretixpresale/event/index.html:151
#: pretix/presale/views/widget.py:473
#, python-format
msgid "The presale for this event will start on %(date)s at %(time)s."
msgstr ""
"De voorverkoopperiode voor dit evenement begint op %(date)s om %(time)s."
#: pretix/presale/templates/pretixpresale/event/index.html:138
#: pretix/presale/templates/pretixpresale/event/index.html:155
#: pretix/presale/views/widget.py:478
msgid "The presale for this event has not yet started."
msgstr "De voorverkoopperiode voor dit evenement is nog niet begonnen."
#: pretix/presale/templates/pretixpresale/event/index.html:160
#: pretix/presale/templates/pretixpresale/event/index.html:177
#, python-format
msgid "Begin: %(time)s"
msgstr "Begin: %(time)s"
#: pretix/presale/templates/pretixpresale/event/index.html:165
#: pretix/presale/templates/pretixpresale/event/index.html:182
#, python-format
msgid "End: %(time)s"
msgstr "Einde: %(time)s"
#: pretix/presale/templates/pretixpresale/event/index.html:173
#: pretix/presale/templates/pretixpresale/event/index.html:190
#, python-format
msgid "Admission: %(time)s"
msgstr "Toegang: %(time)s"
#: pretix/presale/templates/pretixpresale/event/index.html:177
#: pretix/presale/templates/pretixpresale/event/index.html:194
#, python-format
msgid "Admission: %(datetime)s"
msgstr "Toegang: %(datetime)s"
#: pretix/presale/templates/pretixpresale/event/index.html:188
#: pretix/presale/templates/pretixpresale/event/index.html:205
msgid "Add to Calendar"
msgstr "Voeg toe aan kalender"
#: pretix/presale/templates/pretixpresale/event/index.html:200
#: pretix/presale/templates/pretixpresale/event/index.html:217
#: pretix/presale/templates/pretixpresale/event/voucher.html:25
msgid "We're now trying to reserve this for you!"
msgstr "We proberen dit nu voor u te reserveren!"
#: pretix/presale/templates/pretixpresale/event/index.html:211
#: pretix/presale/templates/pretixpresale/event/index.html:228
#: pretix/presale/templates/pretixpresale/event/voucher.html:291
msgid "Add to cart"
msgstr "Voeg toe aan winkelwagen"
#: pretix/presale/templates/pretixpresale/event/index.html:223
#: pretix/presale/templates/pretixpresale/event/index.html:240
msgid "Redeem a voucher"
msgstr "Verzilver een voucher"
#: pretix/presale/templates/pretixpresale/event/index.html:241
#: pretix/presale/templates/pretixpresale/event/index.html:258
msgid "Redeem voucher"
msgstr "Voucher inwisselen"
#: pretix/presale/templates/pretixpresale/event/index.html:252
#: pretix/presale/templates/pretixpresale/event/index.html:269
msgid "If you already ordered a ticket"
msgstr "Als u al een ticket heeft besteld"
#: pretix/presale/templates/pretixpresale/event/index.html:256
#: pretix/presale/templates/pretixpresale/event/index.html:273
msgid ""
"If you want to see or change the status and details of your order, click on "
"the link in one of the emails we sent you during the order process. If you "
@@ -17210,7 +17224,7 @@ msgstr ""
"wijzigen. Als u deze link niet kunt vinden kunt u op de knop hiernaast "
"klikken om de link opnieuw te laten versturen."
#: pretix/presale/templates/pretixpresale/event/index.html:265
#: pretix/presale/templates/pretixpresale/event/index.html:282
#: pretix/presale/templates/pretixpresale/event/resend_link.html:4
#: pretix/presale/templates/pretixpresale/event/resend_link.html:7
msgid "Resend order links"

View File

@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: 2019-04-27 21:00+0000\n"
"Last-Translator: Maarten van den Berg <maartenberg1@gmail.com>\n"
"Language-Team: Dutch <https://translate.pretix.eu/projects/pretix/pretix-js/"
@@ -259,7 +259,7 @@ msgstr[0] "De items in uw winkelwagen zijn nog één voor u gereserveerd."
msgstr[1] ""
"De items in uw winkelwagen zijn nog {num} minuten voor u gereserveerd."
#: pretix/static/pretixpresale/js/ui/main.js:201
#: pretix/static/pretixpresale/js/ui/main.js:202
msgid "Please enter a quantity for one of the ticket types."
msgstr ""

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
@@ -2641,7 +2641,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/vouchers/index.html:98
#: pretix/control/views/vouchers.py:61 pretix/control/views/waitinglist.py:199
#: pretix/plugins/checkinlists/exporters.py:322
#: pretix/presale/templates/pretixpresale/event/index.html:235
#: pretix/presale/templates/pretixpresale/event/index.html:252
msgid "Voucher code"
msgstr ""
@@ -5946,13 +5946,13 @@ msgid "Search voucher"
msgstr ""
#: pretix/control/forms/filter.py:823 pretix/control/forms/vouchers.py:92
#: pretix/control/views/typeahead.py:311
#: pretix/control/views/typeahead.py:317
#, python-brace-format
msgid "{product} Any variation"
msgstr ""
#: pretix/control/forms/filter.py:829 pretix/control/forms/vouchers.py:83
#: pretix/control/views/typeahead.py:319 pretix/control/views/typeahead.py:323
#: pretix/control/views/typeahead.py:325 pretix/control/views/typeahead.py:329
#: pretix/control/views/vouchers.py:73
#, python-brace-format
msgid "Any product in quota \"{quota}\""
@@ -7325,6 +7325,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/subevents/bulk.html:19
#: pretix/control/templates/pretixcontrol/subevents/index.html:5
#: pretix/control/templates/pretixcontrol/subevents/index.html:7
#: pretix/presale/templates/pretixpresale/event/index.html:115
msgctxt "subevent"
msgid "Dates"
msgstr ""
@@ -15103,7 +15104,7 @@ msgid "We're trying to reserve another one for you!"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:104
#: pretix/presale/templates/pretixpresale/event/index.html:201
#: pretix/presale/templates/pretixpresale/event/index.html:218
#: pretix/presale/templates/pretixpresale/event/voucher.html:26
#, python-format
msgid ""
@@ -15255,77 +15256,86 @@ msgstr ""
msgid "Proceed with checkout"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:99
#: pretix/presale/templates/pretixpresale/event/index.html:100
msgid "Add tickets for a different date"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:104
msgid "View other date"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:102
#: pretix/presale/templates/pretixpresale/event/index.html:108
msgid "Choose date to buy a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:129
#: pretix/presale/templates/pretixpresale/event/index.html:113
msgctxt "subevent"
msgid "Other dates"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:146
#: pretix/presale/views/widget.py:471
msgid "The presale period for this event is over."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:134
#: pretix/presale/templates/pretixpresale/event/index.html:151
#: pretix/presale/views/widget.py:473
#, python-format
msgid "The presale for this event will start on %(date)s at %(time)s."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:138
#: pretix/presale/templates/pretixpresale/event/index.html:155
#: pretix/presale/views/widget.py:478
msgid "The presale for this event has not yet started."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:160
#: pretix/presale/templates/pretixpresale/event/index.html:177
#, python-format
msgid "Begin: %(time)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:165
#: pretix/presale/templates/pretixpresale/event/index.html:182
#, python-format
msgid "End: %(time)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:173
#: pretix/presale/templates/pretixpresale/event/index.html:190
#, python-format
msgid "Admission: %(time)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:177
#: pretix/presale/templates/pretixpresale/event/index.html:194
#, python-format
msgid "Admission: %(datetime)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:188
#: pretix/presale/templates/pretixpresale/event/index.html:205
msgid "Add to Calendar"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:200
#: pretix/presale/templates/pretixpresale/event/index.html:217
#: pretix/presale/templates/pretixpresale/event/voucher.html:25
msgid "We're now trying to reserve this for you!"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:211
#: pretix/presale/templates/pretixpresale/event/index.html:228
#: pretix/presale/templates/pretixpresale/event/voucher.html:291
msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:223
#: pretix/presale/templates/pretixpresale/event/index.html:240
msgid "Redeem a voucher"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:241
#: pretix/presale/templates/pretixpresale/event/index.html:258
msgid "Redeem voucher"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:252
#: pretix/presale/templates/pretixpresale/event/index.html:269
msgid "If you already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:256
#: pretix/presale/templates/pretixpresale/event/index.html:273
msgid ""
"If you want to see or change the status and details of your order, click on "
"the link in one of the emails we sent you during the order process. If you "
@@ -15333,7 +15343,7 @@ msgid ""
"your order to be sent to you again."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:265
#: pretix/presale/templates/pretixpresale/event/index.html:282
#: pretix/presale/templates/pretixpresale/event/resend_link.html:4
#: pretix/presale/templates/pretixpresale/event/resend_link.html:7
msgid "Resend order links"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
@@ -241,7 +241,7 @@ msgid_plural "The items in your cart are reserved for you for {num} minutes."
msgstr[0] ""
msgstr[1] ""
#: pretix/static/pretixpresale/js/ui/main.js:201
#: pretix/static/pretixpresale/js/ui/main.js:202
msgid "Please enter a quantity for one of the ticket types."
msgstr ""

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: 2019-04-27 21:00+0000\n"
"Last-Translator: Maarten van den Berg <maartenberg1@gmail.com>\n"
"Language-Team: Dutch (informal) <https://translate.pretix.eu/projects/pretix/"
@@ -2816,7 +2816,7 @@ msgstr "Verlaag productprijs met (%)"
#: pretix/control/templates/pretixcontrol/vouchers/index.html:98
#: pretix/control/views/vouchers.py:61 pretix/control/views/waitinglist.py:199
#: pretix/plugins/checkinlists/exporters.py:322
#: pretix/presale/templates/pretixpresale/event/index.html:235
#: pretix/presale/templates/pretixpresale/event/index.html:252
msgid "Voucher code"
msgstr "Vouchercode"
@@ -6809,13 +6809,13 @@ msgid "Search voucher"
msgstr "Zoek voucher"
#: pretix/control/forms/filter.py:823 pretix/control/forms/vouchers.py:92
#: pretix/control/views/typeahead.py:311
#: pretix/control/views/typeahead.py:317
#, python-brace-format
msgid "{product} Any variation"
msgstr "{product} Elke variant"
#: pretix/control/forms/filter.py:829 pretix/control/forms/vouchers.py:83
#: pretix/control/views/typeahead.py:319 pretix/control/views/typeahead.py:323
#: pretix/control/views/typeahead.py:325 pretix/control/views/typeahead.py:329
#: pretix/control/views/vouchers.py:73
#, python-brace-format
msgid "Any product in quota \"{quota}\""
@@ -8322,6 +8322,7 @@ msgstr "Instellingen"
#: pretix/control/templates/pretixcontrol/subevents/bulk.html:19
#: pretix/control/templates/pretixcontrol/subevents/index.html:5
#: pretix/control/templates/pretixcontrol/subevents/index.html:7
#: pretix/presale/templates/pretixpresale/event/index.html:115
msgctxt "subevent"
msgid "Dates"
msgstr "Datums"
@@ -16969,7 +16970,7 @@ msgid "We're trying to reserve another one for you!"
msgstr "We proberen er nog een voor je te reserveren!"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:104
#: pretix/presale/templates/pretixpresale/event/index.html:201
#: pretix/presale/templates/pretixpresale/event/index.html:218
#: pretix/presale/templates/pretixpresale/event/voucher.html:26
#, python-format
msgid ""
@@ -17125,78 +17126,91 @@ msgstr "Leeg winkelwagen"
msgid "Proceed with checkout"
msgstr "Afrekenen"
#: pretix/presale/templates/pretixpresale/event/index.html:99
#: pretix/presale/templates/pretixpresale/event/index.html:100
#, fuzzy
#| msgid "This file is from a different event."
msgid "Add tickets for a different date"
msgstr "Dit bestand is van een ander evenement."
#: pretix/presale/templates/pretixpresale/event/index.html:104
msgid "View other date"
msgstr "Bekijk andere datum"
#: pretix/presale/templates/pretixpresale/event/index.html:102
#: pretix/presale/templates/pretixpresale/event/index.html:108
msgid "Choose date to buy a ticket"
msgstr "Kies een datum om een kaartje te kopen"
#: pretix/presale/templates/pretixpresale/event/index.html:129
#: pretix/presale/templates/pretixpresale/event/index.html:113
#, fuzzy
#| msgid "Other features"
msgctxt "subevent"
msgid "Other dates"
msgstr "Andere functies"
#: pretix/presale/templates/pretixpresale/event/index.html:146
#: pretix/presale/views/widget.py:471
msgid "The presale period for this event is over."
msgstr "De voorverkoopperiode voor dit evenement is afgelopen."
#: pretix/presale/templates/pretixpresale/event/index.html:134
#: pretix/presale/templates/pretixpresale/event/index.html:151
#: pretix/presale/views/widget.py:473
#, python-format
msgid "The presale for this event will start on %(date)s at %(time)s."
msgstr ""
"De voorverkoopperiode voor dit evenement begint op %(date)s om %(time)s."
#: pretix/presale/templates/pretixpresale/event/index.html:138
#: pretix/presale/templates/pretixpresale/event/index.html:155
#: pretix/presale/views/widget.py:478
msgid "The presale for this event has not yet started."
msgstr "De voorverkoopperiode voor dit evenement is nog niet begonnen."
#: pretix/presale/templates/pretixpresale/event/index.html:160
#: pretix/presale/templates/pretixpresale/event/index.html:177
#, python-format
msgid "Begin: %(time)s"
msgstr "Begin: %(time)s"
#: pretix/presale/templates/pretixpresale/event/index.html:165
#: pretix/presale/templates/pretixpresale/event/index.html:182
#, python-format
msgid "End: %(time)s"
msgstr "Einde: %(time)s"
#: pretix/presale/templates/pretixpresale/event/index.html:173
#: pretix/presale/templates/pretixpresale/event/index.html:190
#, python-format
msgid "Admission: %(time)s"
msgstr "Deuren open: %(time)s"
#: pretix/presale/templates/pretixpresale/event/index.html:177
#: pretix/presale/templates/pretixpresale/event/index.html:194
#, python-format
msgid "Admission: %(datetime)s"
msgstr "Deuren open: %(datetime)s"
#: pretix/presale/templates/pretixpresale/event/index.html:188
#: pretix/presale/templates/pretixpresale/event/index.html:205
msgid "Add to Calendar"
msgstr "Voeg toe aan kalender"
#: pretix/presale/templates/pretixpresale/event/index.html:200
#: pretix/presale/templates/pretixpresale/event/index.html:217
#: pretix/presale/templates/pretixpresale/event/voucher.html:25
msgid "We're now trying to reserve this for you!"
msgstr "We proberen dit nu voor je te reserveren!"
#: pretix/presale/templates/pretixpresale/event/index.html:211
#: pretix/presale/templates/pretixpresale/event/index.html:228
#: pretix/presale/templates/pretixpresale/event/voucher.html:291
msgid "Add to cart"
msgstr "Voeg toe aan winkelwagen"
#: pretix/presale/templates/pretixpresale/event/index.html:223
#: pretix/presale/templates/pretixpresale/event/index.html:240
msgid "Redeem a voucher"
msgstr "Verzilver een voucher"
#: pretix/presale/templates/pretixpresale/event/index.html:241
#: pretix/presale/templates/pretixpresale/event/index.html:258
msgid "Redeem voucher"
msgstr "Voucher inwisselen"
#: pretix/presale/templates/pretixpresale/event/index.html:252
#: pretix/presale/templates/pretixpresale/event/index.html:269
msgid "If you already ordered a ticket"
msgstr "Als je al een kaartje hebt besteld"
#: pretix/presale/templates/pretixpresale/event/index.html:256
#: pretix/presale/templates/pretixpresale/event/index.html:273
msgid ""
"If you want to see or change the status and details of your order, click on "
"the link in one of the emails we sent you during the order process. If you "
@@ -17208,7 +17222,7 @@ msgstr ""
"hebben gestuurd. Als je deze link niet kan vinden kan je de knop hierboven "
"gebruiken om de link nog een keer op te laten sturen."
#: pretix/presale/templates/pretixpresale/event/index.html:265
#: pretix/presale/templates/pretixpresale/event/index.html:282
#: pretix/presale/templates/pretixpresale/event/resend_link.html:4
#: pretix/presale/templates/pretixpresale/event/resend_link.html:7
msgid "Resend order links"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: 2019-04-27 21:00+0000\n"
"Last-Translator: Maarten van den Berg <maartenberg1@gmail.com>\n"
"Language-Team: Dutch (informal) <https://translate.pretix.eu/projects/pretix/"
@@ -262,7 +262,7 @@ msgstr[0] ""
msgstr[1] ""
"De items in je winkelwagen zijn nog {num} minuten voor je gereserveerd."
#: pretix/static/pretixpresale/js/ui/main.js:201
#: pretix/static/pretixpresale/js/ui/main.js:202
msgid "Please enter a quantity for one of the ticket types."
msgstr ""

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: 2019-03-15 11:19+0000\n"
"Last-Translator: Serge Bazanski <q3k@hackerspace.pl>\n"
"Language-Team: Polish <https://translate.pretix.eu/projects/pretix/pretix/pl/"
@@ -2799,7 +2799,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/vouchers/index.html:98
#: pretix/control/views/vouchers.py:61 pretix/control/views/waitinglist.py:199
#: pretix/plugins/checkinlists/exporters.py:322
#: pretix/presale/templates/pretixpresale/event/index.html:235
#: pretix/presale/templates/pretixpresale/event/index.html:252
msgid "Voucher code"
msgstr ""
@@ -6136,13 +6136,13 @@ msgid "Search voucher"
msgstr ""
#: pretix/control/forms/filter.py:823 pretix/control/forms/vouchers.py:92
#: pretix/control/views/typeahead.py:311
#: pretix/control/views/typeahead.py:317
#, python-brace-format
msgid "{product} Any variation"
msgstr ""
#: pretix/control/forms/filter.py:829 pretix/control/forms/vouchers.py:83
#: pretix/control/views/typeahead.py:319 pretix/control/views/typeahead.py:323
#: pretix/control/views/typeahead.py:325 pretix/control/views/typeahead.py:329
#: pretix/control/views/vouchers.py:73
#, python-brace-format
msgid "Any product in quota \"{quota}\""
@@ -7519,6 +7519,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/subevents/bulk.html:19
#: pretix/control/templates/pretixcontrol/subevents/index.html:5
#: pretix/control/templates/pretixcontrol/subevents/index.html:7
#: pretix/presale/templates/pretixpresale/event/index.html:115
msgctxt "subevent"
msgid "Dates"
msgstr ""
@@ -15316,7 +15317,7 @@ msgid "We're trying to reserve another one for you!"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:104
#: pretix/presale/templates/pretixpresale/event/index.html:201
#: pretix/presale/templates/pretixpresale/event/index.html:218
#: pretix/presale/templates/pretixpresale/event/voucher.html:26
#, python-format
msgid ""
@@ -15474,77 +15475,88 @@ msgstr ""
msgid "Proceed with checkout"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:99
#: pretix/presale/templates/pretixpresale/event/index.html:100
msgid "Add tickets for a different date"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:104
msgid "View other date"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:102
#: pretix/presale/templates/pretixpresale/event/index.html:108
msgid "Choose date to buy a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:129
#: pretix/presale/templates/pretixpresale/event/index.html:113
#, fuzzy
#| msgid "Order date"
msgctxt "subevent"
msgid "Other dates"
msgstr "Data zamówienia"
#: pretix/presale/templates/pretixpresale/event/index.html:146
#: pretix/presale/views/widget.py:471
msgid "The presale period for this event is over."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:134
#: pretix/presale/templates/pretixpresale/event/index.html:151
#: pretix/presale/views/widget.py:473
#, python-format
msgid "The presale for this event will start on %(date)s at %(time)s."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:138
#: pretix/presale/templates/pretixpresale/event/index.html:155
#: pretix/presale/views/widget.py:478
msgid "The presale for this event has not yet started."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:160
#: pretix/presale/templates/pretixpresale/event/index.html:177
#, python-format
msgid "Begin: %(time)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:165
#: pretix/presale/templates/pretixpresale/event/index.html:182
#, python-format
msgid "End: %(time)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:173
#: pretix/presale/templates/pretixpresale/event/index.html:190
#, python-format
msgid "Admission: %(time)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:177
#: pretix/presale/templates/pretixpresale/event/index.html:194
#, python-format
msgid "Admission: %(datetime)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:188
#: pretix/presale/templates/pretixpresale/event/index.html:205
msgid "Add to Calendar"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:200
#: pretix/presale/templates/pretixpresale/event/index.html:217
#: pretix/presale/templates/pretixpresale/event/voucher.html:25
msgid "We're now trying to reserve this for you!"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:211
#: pretix/presale/templates/pretixpresale/event/index.html:228
#: pretix/presale/templates/pretixpresale/event/voucher.html:291
msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:223
#: pretix/presale/templates/pretixpresale/event/index.html:240
msgid "Redeem a voucher"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:241
#: pretix/presale/templates/pretixpresale/event/index.html:258
msgid "Redeem voucher"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:252
#: pretix/presale/templates/pretixpresale/event/index.html:269
msgid "If you already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:256
#: pretix/presale/templates/pretixpresale/event/index.html:273
msgid ""
"If you want to see or change the status and details of your order, click on "
"the link in one of the emails we sent you during the order process. If you "
@@ -15552,7 +15564,7 @@ msgid ""
"your order to be sent to you again."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:265
#: pretix/presale/templates/pretixpresale/event/index.html:282
#: pretix/presale/templates/pretixpresale/event/resend_link.html:4
#: pretix/presale/templates/pretixpresale/event/resend_link.html:7
msgid "Resend order links"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: 2019-03-15 11:19+0000\n"
"Last-Translator: Serge Bazanski <q3k@hackerspace.pl>\n"
"Language-Team: Polish <https://translate.pretix.eu/projects/pretix/pretix-js/"
@@ -265,7 +265,7 @@ msgstr[0] "Przedmioty w koszyku są zarezerwowane na jedną minutę."
msgstr[1] "Przedmioty w koszyku są zarezerwowane na {num} minuty."
msgstr[2] "Przedmioty w koszyku są zarezerwowane na {num} minut."
#: pretix/static/pretixpresale/js/ui/main.js:201
#: pretix/static/pretixpresale/js/ui/main.js:202
msgid "Please enter a quantity for one of the ticket types."
msgstr ""

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
@@ -2642,7 +2642,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/vouchers/index.html:98
#: pretix/control/views/vouchers.py:61 pretix/control/views/waitinglist.py:199
#: pretix/plugins/checkinlists/exporters.py:322
#: pretix/presale/templates/pretixpresale/event/index.html:235
#: pretix/presale/templates/pretixpresale/event/index.html:252
msgid "Voucher code"
msgstr ""
@@ -5947,13 +5947,13 @@ msgid "Search voucher"
msgstr ""
#: pretix/control/forms/filter.py:823 pretix/control/forms/vouchers.py:92
#: pretix/control/views/typeahead.py:311
#: pretix/control/views/typeahead.py:317
#, python-brace-format
msgid "{product} Any variation"
msgstr ""
#: pretix/control/forms/filter.py:829 pretix/control/forms/vouchers.py:83
#: pretix/control/views/typeahead.py:319 pretix/control/views/typeahead.py:323
#: pretix/control/views/typeahead.py:325 pretix/control/views/typeahead.py:329
#: pretix/control/views/vouchers.py:73
#, python-brace-format
msgid "Any product in quota \"{quota}\""
@@ -7326,6 +7326,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/subevents/bulk.html:19
#: pretix/control/templates/pretixcontrol/subevents/index.html:5
#: pretix/control/templates/pretixcontrol/subevents/index.html:7
#: pretix/presale/templates/pretixpresale/event/index.html:115
msgctxt "subevent"
msgid "Dates"
msgstr ""
@@ -15107,7 +15108,7 @@ msgid "We're trying to reserve another one for you!"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:104
#: pretix/presale/templates/pretixpresale/event/index.html:201
#: pretix/presale/templates/pretixpresale/event/index.html:218
#: pretix/presale/templates/pretixpresale/event/voucher.html:26
#, python-format
msgid ""
@@ -15259,77 +15260,86 @@ msgstr ""
msgid "Proceed with checkout"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:99
#: pretix/presale/templates/pretixpresale/event/index.html:100
msgid "Add tickets for a different date"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:104
msgid "View other date"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:102
#: pretix/presale/templates/pretixpresale/event/index.html:108
msgid "Choose date to buy a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:129
#: pretix/presale/templates/pretixpresale/event/index.html:113
msgctxt "subevent"
msgid "Other dates"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:146
#: pretix/presale/views/widget.py:471
msgid "The presale period for this event is over."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:134
#: pretix/presale/templates/pretixpresale/event/index.html:151
#: pretix/presale/views/widget.py:473
#, python-format
msgid "The presale for this event will start on %(date)s at %(time)s."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:138
#: pretix/presale/templates/pretixpresale/event/index.html:155
#: pretix/presale/views/widget.py:478
msgid "The presale for this event has not yet started."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:160
#: pretix/presale/templates/pretixpresale/event/index.html:177
#, python-format
msgid "Begin: %(time)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:165
#: pretix/presale/templates/pretixpresale/event/index.html:182
#, python-format
msgid "End: %(time)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:173
#: pretix/presale/templates/pretixpresale/event/index.html:190
#, python-format
msgid "Admission: %(time)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:177
#: pretix/presale/templates/pretixpresale/event/index.html:194
#, python-format
msgid "Admission: %(datetime)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:188
#: pretix/presale/templates/pretixpresale/event/index.html:205
msgid "Add to Calendar"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:200
#: pretix/presale/templates/pretixpresale/event/index.html:217
#: pretix/presale/templates/pretixpresale/event/voucher.html:25
msgid "We're now trying to reserve this for you!"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:211
#: pretix/presale/templates/pretixpresale/event/index.html:228
#: pretix/presale/templates/pretixpresale/event/voucher.html:291
msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:223
#: pretix/presale/templates/pretixpresale/event/index.html:240
msgid "Redeem a voucher"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:241
#: pretix/presale/templates/pretixpresale/event/index.html:258
msgid "Redeem voucher"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:252
#: pretix/presale/templates/pretixpresale/event/index.html:269
msgid "If you already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:256
#: pretix/presale/templates/pretixpresale/event/index.html:273
msgid ""
"If you want to see or change the status and details of your order, click on "
"the link in one of the emails we sent you during the order process. If you "
@@ -15337,7 +15347,7 @@ msgid ""
"your order to be sent to you again."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:265
#: pretix/presale/templates/pretixpresale/event/index.html:282
#: pretix/presale/templates/pretixpresale/event/resend_link.html:4
#: pretix/presale/templates/pretixpresale/event/resend_link.html:7
msgid "Resend order links"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
@@ -244,7 +244,7 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#: pretix/static/pretixpresale/js/ui/main.js:201
#: pretix/static/pretixpresale/js/ui/main.js:202
msgid "Please enter a quantity for one of the ticket types."
msgstr ""

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: 2019-03-19 09:00+0000\n"
"Last-Translator: Lorhan Sohaky <lorhansohaky@gmail.com>\n"
"Language-Team: Portuguese (Brazil) <https://translate.pretix.eu/projects/"
@@ -2877,7 +2877,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/vouchers/index.html:98
#: pretix/control/views/vouchers.py:61 pretix/control/views/waitinglist.py:199
#: pretix/plugins/checkinlists/exporters.py:322
#: pretix/presale/templates/pretixpresale/event/index.html:235
#: pretix/presale/templates/pretixpresale/event/index.html:252
msgid "Voucher code"
msgstr "Código do voucher"
@@ -6311,13 +6311,13 @@ msgid "Search voucher"
msgstr ""
#: pretix/control/forms/filter.py:823 pretix/control/forms/vouchers.py:92
#: pretix/control/views/typeahead.py:311
#: pretix/control/views/typeahead.py:317
#, python-brace-format
msgid "{product} Any variation"
msgstr ""
#: pretix/control/forms/filter.py:829 pretix/control/forms/vouchers.py:83
#: pretix/control/views/typeahead.py:319 pretix/control/views/typeahead.py:323
#: pretix/control/views/typeahead.py:325 pretix/control/views/typeahead.py:329
#: pretix/control/views/vouchers.py:73
#, python-brace-format
msgid "Any product in quota \"{quota}\""
@@ -7751,6 +7751,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/subevents/bulk.html:19
#: pretix/control/templates/pretixcontrol/subevents/index.html:5
#: pretix/control/templates/pretixcontrol/subevents/index.html:7
#: pretix/presale/templates/pretixpresale/event/index.html:115
msgctxt "subevent"
msgid "Dates"
msgstr ""
@@ -15823,7 +15824,7 @@ msgid "We're trying to reserve another one for you!"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:104
#: pretix/presale/templates/pretixpresale/event/index.html:201
#: pretix/presale/templates/pretixpresale/event/index.html:218
#: pretix/presale/templates/pretixpresale/event/voucher.html:26
#, python-format
msgid ""
@@ -15981,77 +15982,88 @@ msgstr ""
msgid "Proceed with checkout"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:99
#: pretix/presale/templates/pretixpresale/event/index.html:100
msgid "Add tickets for a different date"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:104
msgid "View other date"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:102
#: pretix/presale/templates/pretixpresale/event/index.html:108
msgid "Choose date to buy a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:129
#: pretix/presale/templates/pretixpresale/event/index.html:113
#, fuzzy
#| msgid "Order date"
msgctxt "subevent"
msgid "Other dates"
msgstr "Data do pedido"
#: pretix/presale/templates/pretixpresale/event/index.html:146
#: pretix/presale/views/widget.py:471
msgid "The presale period for this event is over."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:134
#: pretix/presale/templates/pretixpresale/event/index.html:151
#: pretix/presale/views/widget.py:473
#, python-format
msgid "The presale for this event will start on %(date)s at %(time)s."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:138
#: pretix/presale/templates/pretixpresale/event/index.html:155
#: pretix/presale/views/widget.py:478
msgid "The presale for this event has not yet started."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:160
#: pretix/presale/templates/pretixpresale/event/index.html:177
#, python-format
msgid "Begin: %(time)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:165
#: pretix/presale/templates/pretixpresale/event/index.html:182
#, python-format
msgid "End: %(time)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:173
#: pretix/presale/templates/pretixpresale/event/index.html:190
#, python-format
msgid "Admission: %(time)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:177
#: pretix/presale/templates/pretixpresale/event/index.html:194
#, python-format
msgid "Admission: %(datetime)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:188
#: pretix/presale/templates/pretixpresale/event/index.html:205
msgid "Add to Calendar"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:200
#: pretix/presale/templates/pretixpresale/event/index.html:217
#: pretix/presale/templates/pretixpresale/event/voucher.html:25
msgid "We're now trying to reserve this for you!"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:211
#: pretix/presale/templates/pretixpresale/event/index.html:228
#: pretix/presale/templates/pretixpresale/event/voucher.html:291
msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:223
#: pretix/presale/templates/pretixpresale/event/index.html:240
msgid "Redeem a voucher"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:241
#: pretix/presale/templates/pretixpresale/event/index.html:258
msgid "Redeem voucher"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:252
#: pretix/presale/templates/pretixpresale/event/index.html:269
msgid "If you already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:256
#: pretix/presale/templates/pretixpresale/event/index.html:273
msgid ""
"If you want to see or change the status and details of your order, click on "
"the link in one of the emails we sent you during the order process. If you "
@@ -16059,7 +16071,7 @@ msgid ""
"your order to be sent to you again."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:265
#: pretix/presale/templates/pretixpresale/event/index.html:282
#: pretix/presale/templates/pretixpresale/event/resend_link.html:4
#: pretix/presale/templates/pretixpresale/event/resend_link.html:7
msgid "Resend order links"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: 2019-03-19 09:00+0000\n"
"Last-Translator: Vitor Reis <vitor.reis7@gmail.com>\n"
"Language-Team: Portuguese (Brazil) <https://translate.pretix.eu/projects/"
@@ -269,7 +269,7 @@ msgstr[0] "Os items em seu carrinho estão reservados para você por 1 minuto."
msgstr[1] ""
"Os items em seu carrinho estão reservados para você por {num} minutos."
#: pretix/static/pretixpresale/js/ui/main.js:201
#: pretix/static/pretixpresale/js/ui/main.js:202
msgid "Please enter a quantity for one of the ticket types."
msgstr ""

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: 2019-01-02 08:20+0000\n"
"Last-Translator: Alexey Zh <write2aracon@gmail.com>\n"
"Language-Team: Russian <https://translate.pretix.eu/projects/pretix/pretix/"
@@ -2644,7 +2644,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/vouchers/index.html:98
#: pretix/control/views/vouchers.py:61 pretix/control/views/waitinglist.py:199
#: pretix/plugins/checkinlists/exporters.py:322
#: pretix/presale/templates/pretixpresale/event/index.html:235
#: pretix/presale/templates/pretixpresale/event/index.html:252
msgid "Voucher code"
msgstr ""
@@ -5954,13 +5954,13 @@ msgid "Search voucher"
msgstr ""
#: pretix/control/forms/filter.py:823 pretix/control/forms/vouchers.py:92
#: pretix/control/views/typeahead.py:311
#: pretix/control/views/typeahead.py:317
#, python-brace-format
msgid "{product} Any variation"
msgstr ""
#: pretix/control/forms/filter.py:829 pretix/control/forms/vouchers.py:83
#: pretix/control/views/typeahead.py:319 pretix/control/views/typeahead.py:323
#: pretix/control/views/typeahead.py:325 pretix/control/views/typeahead.py:329
#: pretix/control/views/vouchers.py:73
#, python-brace-format
msgid "Any product in quota \"{quota}\""
@@ -7333,6 +7333,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/subevents/bulk.html:19
#: pretix/control/templates/pretixcontrol/subevents/index.html:5
#: pretix/control/templates/pretixcontrol/subevents/index.html:7
#: pretix/presale/templates/pretixpresale/event/index.html:115
msgctxt "subevent"
msgid "Dates"
msgstr ""
@@ -15123,7 +15124,7 @@ msgid "We're trying to reserve another one for you!"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:104
#: pretix/presale/templates/pretixpresale/event/index.html:201
#: pretix/presale/templates/pretixpresale/event/index.html:218
#: pretix/presale/templates/pretixpresale/event/voucher.html:26
#, python-format
msgid ""
@@ -15275,77 +15276,86 @@ msgstr ""
msgid "Proceed with checkout"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:99
#: pretix/presale/templates/pretixpresale/event/index.html:100
msgid "Add tickets for a different date"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:104
msgid "View other date"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:102
#: pretix/presale/templates/pretixpresale/event/index.html:108
msgid "Choose date to buy a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:129
#: pretix/presale/templates/pretixpresale/event/index.html:113
msgctxt "subevent"
msgid "Other dates"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:146
#: pretix/presale/views/widget.py:471
msgid "The presale period for this event is over."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:134
#: pretix/presale/templates/pretixpresale/event/index.html:151
#: pretix/presale/views/widget.py:473
#, python-format
msgid "The presale for this event will start on %(date)s at %(time)s."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:138
#: pretix/presale/templates/pretixpresale/event/index.html:155
#: pretix/presale/views/widget.py:478
msgid "The presale for this event has not yet started."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:160
#: pretix/presale/templates/pretixpresale/event/index.html:177
#, python-format
msgid "Begin: %(time)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:165
#: pretix/presale/templates/pretixpresale/event/index.html:182
#, python-format
msgid "End: %(time)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:173
#: pretix/presale/templates/pretixpresale/event/index.html:190
#, python-format
msgid "Admission: %(time)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:177
#: pretix/presale/templates/pretixpresale/event/index.html:194
#, python-format
msgid "Admission: %(datetime)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:188
#: pretix/presale/templates/pretixpresale/event/index.html:205
msgid "Add to Calendar"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:200
#: pretix/presale/templates/pretixpresale/event/index.html:217
#: pretix/presale/templates/pretixpresale/event/voucher.html:25
msgid "We're now trying to reserve this for you!"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:211
#: pretix/presale/templates/pretixpresale/event/index.html:228
#: pretix/presale/templates/pretixpresale/event/voucher.html:291
msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:223
#: pretix/presale/templates/pretixpresale/event/index.html:240
msgid "Redeem a voucher"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:241
#: pretix/presale/templates/pretixpresale/event/index.html:258
msgid "Redeem voucher"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:252
#: pretix/presale/templates/pretixpresale/event/index.html:269
msgid "If you already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:256
#: pretix/presale/templates/pretixpresale/event/index.html:273
msgid ""
"If you want to see or change the status and details of your order, click on "
"the link in one of the emails we sent you during the order process. If you "
@@ -15353,7 +15363,7 @@ msgid ""
"your order to be sent to you again."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:265
#: pretix/presale/templates/pretixpresale/event/index.html:282
#: pretix/presale/templates/pretixpresale/event/resend_link.html:4
#: pretix/presale/templates/pretixpresale/event/resend_link.html:7
msgid "Resend order links"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: 2019-01-02 08:21+0000\n"
"Last-Translator: Alexey Zh <write2aracon@gmail.com>\n"
"Language-Team: Russian <https://translate.pretix.eu/projects/pretix/pretix-"
@@ -246,7 +246,7 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#: pretix/static/pretixpresale/js/ui/main.js:201
#: pretix/static/pretixpresale/js/ui/main.js:202
msgid "Please enter a quantity for one of the ticket types."
msgstr ""

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: 2019-05-10 20:00+0000\n"
"Last-Translator: Bostjan Marusic <bostjan@brokenbones.si>\n"
"Language-Team: Slovenian <https://translate.pretix.eu/projects/pretix/pretix/"
@@ -2675,7 +2675,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/vouchers/index.html:98
#: pretix/control/views/vouchers.py:61 pretix/control/views/waitinglist.py:199
#: pretix/plugins/checkinlists/exporters.py:322
#: pretix/presale/templates/pretixpresale/event/index.html:235
#: pretix/presale/templates/pretixpresale/event/index.html:252
msgid "Voucher code"
msgstr ""
@@ -5983,13 +5983,13 @@ msgid "Search voucher"
msgstr ""
#: pretix/control/forms/filter.py:823 pretix/control/forms/vouchers.py:92
#: pretix/control/views/typeahead.py:311
#: pretix/control/views/typeahead.py:317
#, python-brace-format
msgid "{product} Any variation"
msgstr ""
#: pretix/control/forms/filter.py:829 pretix/control/forms/vouchers.py:83
#: pretix/control/views/typeahead.py:319 pretix/control/views/typeahead.py:323
#: pretix/control/views/typeahead.py:325 pretix/control/views/typeahead.py:329
#: pretix/control/views/vouchers.py:73
#, python-brace-format
msgid "Any product in quota \"{quota}\""
@@ -7364,6 +7364,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/subevents/bulk.html:19
#: pretix/control/templates/pretixcontrol/subevents/index.html:5
#: pretix/control/templates/pretixcontrol/subevents/index.html:7
#: pretix/presale/templates/pretixpresale/event/index.html:115
msgctxt "subevent"
msgid "Dates"
msgstr ""
@@ -15148,7 +15149,7 @@ msgid "We're trying to reserve another one for you!"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:104
#: pretix/presale/templates/pretixpresale/event/index.html:201
#: pretix/presale/templates/pretixpresale/event/index.html:218
#: pretix/presale/templates/pretixpresale/event/voucher.html:26
#, python-format
msgid ""
@@ -15300,77 +15301,86 @@ msgstr ""
msgid "Proceed with checkout"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:99
#: pretix/presale/templates/pretixpresale/event/index.html:100
msgid "Add tickets for a different date"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:104
msgid "View other date"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:102
#: pretix/presale/templates/pretixpresale/event/index.html:108
msgid "Choose date to buy a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:129
#: pretix/presale/templates/pretixpresale/event/index.html:113
msgctxt "subevent"
msgid "Other dates"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:146
#: pretix/presale/views/widget.py:471
msgid "The presale period for this event is over."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:134
#: pretix/presale/templates/pretixpresale/event/index.html:151
#: pretix/presale/views/widget.py:473
#, python-format
msgid "The presale for this event will start on %(date)s at %(time)s."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:138
#: pretix/presale/templates/pretixpresale/event/index.html:155
#: pretix/presale/views/widget.py:478
msgid "The presale for this event has not yet started."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:160
#: pretix/presale/templates/pretixpresale/event/index.html:177
#, python-format
msgid "Begin: %(time)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:165
#: pretix/presale/templates/pretixpresale/event/index.html:182
#, python-format
msgid "End: %(time)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:173
#: pretix/presale/templates/pretixpresale/event/index.html:190
#, python-format
msgid "Admission: %(time)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:177
#: pretix/presale/templates/pretixpresale/event/index.html:194
#, python-format
msgid "Admission: %(datetime)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:188
#: pretix/presale/templates/pretixpresale/event/index.html:205
msgid "Add to Calendar"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:200
#: pretix/presale/templates/pretixpresale/event/index.html:217
#: pretix/presale/templates/pretixpresale/event/voucher.html:25
msgid "We're now trying to reserve this for you!"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:211
#: pretix/presale/templates/pretixpresale/event/index.html:228
#: pretix/presale/templates/pretixpresale/event/voucher.html:291
msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:223
#: pretix/presale/templates/pretixpresale/event/index.html:240
msgid "Redeem a voucher"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:241
#: pretix/presale/templates/pretixpresale/event/index.html:258
msgid "Redeem voucher"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:252
#: pretix/presale/templates/pretixpresale/event/index.html:269
msgid "If you already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:256
#: pretix/presale/templates/pretixpresale/event/index.html:273
msgid ""
"If you want to see or change the status and details of your order, click on "
"the link in one of the emails we sent you during the order process. If you "
@@ -15378,7 +15388,7 @@ msgid ""
"your order to be sent to you again."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:265
#: pretix/presale/templates/pretixpresale/event/index.html:282
#: pretix/presale/templates/pretixpresale/event/resend_link.html:4
#: pretix/presale/templates/pretixpresale/event/resend_link.html:7
msgid "Resend order links"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
@@ -246,7 +246,7 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
#: pretix/static/pretixpresale/js/ui/main.js:201
#: pretix/static/pretixpresale/js/ui/main.js:202
msgid "Please enter a quantity for one of the ticket types."
msgstr ""

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: 2019-04-27 21:00+0000\n"
"Last-Translator: Tobias Sundgren <syrgas@gmail.com>\n"
"Language-Team: Swedish <https://translate.pretix.eu/projects/pretix/pretix/"
@@ -2643,7 +2643,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/vouchers/index.html:98
#: pretix/control/views/vouchers.py:61 pretix/control/views/waitinglist.py:199
#: pretix/plugins/checkinlists/exporters.py:322
#: pretix/presale/templates/pretixpresale/event/index.html:235
#: pretix/presale/templates/pretixpresale/event/index.html:252
msgid "Voucher code"
msgstr ""
@@ -5951,13 +5951,13 @@ msgid "Search voucher"
msgstr ""
#: pretix/control/forms/filter.py:823 pretix/control/forms/vouchers.py:92
#: pretix/control/views/typeahead.py:311
#: pretix/control/views/typeahead.py:317
#, python-brace-format
msgid "{product} Any variation"
msgstr ""
#: pretix/control/forms/filter.py:829 pretix/control/forms/vouchers.py:83
#: pretix/control/views/typeahead.py:319 pretix/control/views/typeahead.py:323
#: pretix/control/views/typeahead.py:325 pretix/control/views/typeahead.py:329
#: pretix/control/views/vouchers.py:73
#, python-brace-format
msgid "Any product in quota \"{quota}\""
@@ -7330,6 +7330,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/subevents/bulk.html:19
#: pretix/control/templates/pretixcontrol/subevents/index.html:5
#: pretix/control/templates/pretixcontrol/subevents/index.html:7
#: pretix/presale/templates/pretixpresale/event/index.html:115
msgctxt "subevent"
msgid "Dates"
msgstr ""
@@ -15110,7 +15111,7 @@ msgid "We're trying to reserve another one for you!"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:104
#: pretix/presale/templates/pretixpresale/event/index.html:201
#: pretix/presale/templates/pretixpresale/event/index.html:218
#: pretix/presale/templates/pretixpresale/event/voucher.html:26
#, python-format
msgid ""
@@ -15262,77 +15263,86 @@ msgstr ""
msgid "Proceed with checkout"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:99
#: pretix/presale/templates/pretixpresale/event/index.html:100
msgid "Add tickets for a different date"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:104
msgid "View other date"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:102
#: pretix/presale/templates/pretixpresale/event/index.html:108
msgid "Choose date to buy a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:129
#: pretix/presale/templates/pretixpresale/event/index.html:113
msgctxt "subevent"
msgid "Other dates"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:146
#: pretix/presale/views/widget.py:471
msgid "The presale period for this event is over."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:134
#: pretix/presale/templates/pretixpresale/event/index.html:151
#: pretix/presale/views/widget.py:473
#, python-format
msgid "The presale for this event will start on %(date)s at %(time)s."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:138
#: pretix/presale/templates/pretixpresale/event/index.html:155
#: pretix/presale/views/widget.py:478
msgid "The presale for this event has not yet started."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:160
#: pretix/presale/templates/pretixpresale/event/index.html:177
#, python-format
msgid "Begin: %(time)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:165
#: pretix/presale/templates/pretixpresale/event/index.html:182
#, python-format
msgid "End: %(time)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:173
#: pretix/presale/templates/pretixpresale/event/index.html:190
#, python-format
msgid "Admission: %(time)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:177
#: pretix/presale/templates/pretixpresale/event/index.html:194
#, python-format
msgid "Admission: %(datetime)s"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:188
#: pretix/presale/templates/pretixpresale/event/index.html:205
msgid "Add to Calendar"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:200
#: pretix/presale/templates/pretixpresale/event/index.html:217
#: pretix/presale/templates/pretixpresale/event/voucher.html:25
msgid "We're now trying to reserve this for you!"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:211
#: pretix/presale/templates/pretixpresale/event/index.html:228
#: pretix/presale/templates/pretixpresale/event/voucher.html:291
msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:223
#: pretix/presale/templates/pretixpresale/event/index.html:240
msgid "Redeem a voucher"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:241
#: pretix/presale/templates/pretixpresale/event/index.html:258
msgid "Redeem voucher"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:252
#: pretix/presale/templates/pretixpresale/event/index.html:269
msgid "If you already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:256
#: pretix/presale/templates/pretixpresale/event/index.html:273
msgid ""
"If you want to see or change the status and details of your order, click on "
"the link in one of the emails we sent you during the order process. If you "
@@ -15340,7 +15350,7 @@ msgid ""
"your order to be sent to you again."
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:265
#: pretix/presale/templates/pretixpresale/event/index.html:282
#: pretix/presale/templates/pretixpresale/event/resend_link.html:4
#: pretix/presale/templates/pretixpresale/event/resend_link.html:7
msgid "Resend order links"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: 2019-04-27 21:00+0000\n"
"Last-Translator: Tobias Sundgren <syrgas@gmail.com>\n"
"Language-Team: Swedish <https://translate.pretix.eu/projects/pretix/pretix-"
@@ -257,7 +257,7 @@ msgid_plural "The items in your cart are reserved for you for {num} minutes."
msgstr[0] "Artiklarna i din varukorg är reserverade i en minut."
msgstr[1] "Artiklarna i din varukorg är reserverade i {num} minuter."
#: pretix/static/pretixpresale/js/ui/main.js:201
#: pretix/static/pretixpresale/js/ui/main.js:202
msgid "Please enter a quantity for one of the ticket types."
msgstr ""

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: 2018-09-12 07:17+0000\n"
"Last-Translator: Yunus Fırat Pişkin <firat.piskin@idvlabs.com>\n"
"Language-Team: Turkish <https://translate.pretix.eu/projects/pretix/pretix/"
@@ -2913,7 +2913,7 @@ msgstr "Ürün fiyatını azalt(%)"
#: pretix/control/templates/pretixcontrol/vouchers/index.html:98
#: pretix/control/views/vouchers.py:61 pretix/control/views/waitinglist.py:199
#: pretix/plugins/checkinlists/exporters.py:322
#: pretix/presale/templates/pretixpresale/event/index.html:235
#: pretix/presale/templates/pretixpresale/event/index.html:252
msgid "Voucher code"
msgstr "Kupon kodu"
@@ -6956,13 +6956,13 @@ msgid "Search voucher"
msgstr "Arama kuponu"
#: pretix/control/forms/filter.py:823 pretix/control/forms/vouchers.py:92
#: pretix/control/views/typeahead.py:311
#: pretix/control/views/typeahead.py:317
#, python-brace-format
msgid "{product} Any variation"
msgstr "{product} - Herhangi bir varyasyon"
#: pretix/control/forms/filter.py:829 pretix/control/forms/vouchers.py:83
#: pretix/control/views/typeahead.py:319 pretix/control/views/typeahead.py:323
#: pretix/control/views/typeahead.py:325 pretix/control/views/typeahead.py:329
#: pretix/control/views/vouchers.py:73
#, python-brace-format
msgid "Any product in quota \"{quota}\""
@@ -8483,6 +8483,7 @@ msgstr "Ayarlar"
#: pretix/control/templates/pretixcontrol/subevents/bulk.html:19
#: pretix/control/templates/pretixcontrol/subevents/index.html:5
#: pretix/control/templates/pretixcontrol/subevents/index.html:7
#: pretix/presale/templates/pretixpresale/event/index.html:115
msgctxt "subevent"
msgid "Dates"
msgstr "Tarihler"
@@ -17233,7 +17234,7 @@ msgid "We're trying to reserve another one for you!"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:104
#: pretix/presale/templates/pretixpresale/event/index.html:201
#: pretix/presale/templates/pretixpresale/event/index.html:218
#: pretix/presale/templates/pretixpresale/event/voucher.html:26
#, python-format
msgid ""
@@ -17392,77 +17393,90 @@ msgstr "Boş sepet"
msgid "Proceed with checkout"
msgstr "Ödeme ile devam et"
#: pretix/presale/templates/pretixpresale/event/index.html:99
#: pretix/presale/templates/pretixpresale/event/index.html:100
#, fuzzy
#| msgid "This file is from a different event."
msgid "Add tickets for a different date"
msgstr "Bu dosya farklı bir etkinlikten."
#: pretix/presale/templates/pretixpresale/event/index.html:104
msgid "View other date"
msgstr "Diğer tarihi görüntüle"
#: pretix/presale/templates/pretixpresale/event/index.html:102
#: pretix/presale/templates/pretixpresale/event/index.html:108
msgid "Choose date to buy a ticket"
msgstr "Bir bilet almak için tarih seçin"
#: pretix/presale/templates/pretixpresale/event/index.html:129
#: pretix/presale/templates/pretixpresale/event/index.html:113
#, fuzzy
#| msgid "Other features"
msgctxt "subevent"
msgid "Other dates"
msgstr "Diğer özellikler"
#: pretix/presale/templates/pretixpresale/event/index.html:146
#: pretix/presale/views/widget.py:471
msgid "The presale period for this event is over."
msgstr "Bu etkinlik için presale süresi bitti."
#: pretix/presale/templates/pretixpresale/event/index.html:134
#: pretix/presale/templates/pretixpresale/event/index.html:151
#: pretix/presale/views/widget.py:473
#, python-format
msgid "The presale for this event will start on %(date)s at %(time)s."
msgstr "Bu etkinlik için satış öncesi %(date)s %(time)s ile başlayacaktır."
#: pretix/presale/templates/pretixpresale/event/index.html:138
#: pretix/presale/templates/pretixpresale/event/index.html:155
#: pretix/presale/views/widget.py:478
msgid "The presale for this event has not yet started."
msgstr "Bu etkinlik için önceden teklif henüz başlamamıştır."
#: pretix/presale/templates/pretixpresale/event/index.html:160
#: pretix/presale/templates/pretixpresale/event/index.html:177
#, python-format
msgid "Begin: %(time)s"
msgstr "Başlangıç: %(time)s"
#: pretix/presale/templates/pretixpresale/event/index.html:165
#: pretix/presale/templates/pretixpresale/event/index.html:182
#, python-format
msgid "End: %(time)s"
msgstr "Bitiş:%(time)s"
#: pretix/presale/templates/pretixpresale/event/index.html:173
#: pretix/presale/templates/pretixpresale/event/index.html:190
#, python-format
msgid "Admission: %(time)s"
msgstr "Giriş: %(time)s"
#: pretix/presale/templates/pretixpresale/event/index.html:177
#: pretix/presale/templates/pretixpresale/event/index.html:194
#, python-format
msgid "Admission: %(datetime)s"
msgstr "Giriş: %(datetime)s"
#: pretix/presale/templates/pretixpresale/event/index.html:188
#: pretix/presale/templates/pretixpresale/event/index.html:205
msgid "Add to Calendar"
msgstr "Takvime ekle"
#: pretix/presale/templates/pretixpresale/event/index.html:200
#: pretix/presale/templates/pretixpresale/event/index.html:217
#: pretix/presale/templates/pretixpresale/event/voucher.html:25
msgid "We're now trying to reserve this for you!"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:211
#: pretix/presale/templates/pretixpresale/event/index.html:228
#: pretix/presale/templates/pretixpresale/event/voucher.html:291
msgid "Add to cart"
msgstr "Sepete ekle"
#: pretix/presale/templates/pretixpresale/event/index.html:223
#: pretix/presale/templates/pretixpresale/event/index.html:240
msgid "Redeem a voucher"
msgstr "Bir kuponu kullan"
#: pretix/presale/templates/pretixpresale/event/index.html:241
#: pretix/presale/templates/pretixpresale/event/index.html:258
msgid "Redeem voucher"
msgstr "Kuponu kullan"
#: pretix/presale/templates/pretixpresale/event/index.html:252
#: pretix/presale/templates/pretixpresale/event/index.html:269
msgid "If you already ordered a ticket"
msgstr "Zaten bir bilet sipariş ettiyseniz"
#: pretix/presale/templates/pretixpresale/event/index.html:256
#: pretix/presale/templates/pretixpresale/event/index.html:273
msgid ""
"If you want to see or change the status and details of your order, click on "
"the link in one of the emails we sent you during the order process. If you "
@@ -17475,7 +17489,7 @@ msgstr ""
"gönderilmesini istediğiniz bağlantıyı istemek için aşağıdaki düğmeyi "
"tıklayın."
#: pretix/presale/templates/pretixpresale/event/index.html:265
#: pretix/presale/templates/pretixpresale/event/index.html:282
#: pretix/presale/templates/pretixpresale/event/resend_link.html:4
#: pretix/presale/templates/pretixpresale/event/resend_link.html:7
msgid "Resend order links"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: 2018-09-03 06:36+0000\n"
"Last-Translator: Yunus Fırat Pişkin <firat.piskin@idvlabs.com>\n"
"Language-Team: Turkish <https://translate.pretix.eu/projects/pretix/pretix-"
@@ -272,7 +272,7 @@ msgstr[1] ""
"Diğer\n"
"Sepetinizdeki ürünler {num} dakikalığına ayrılmıştır."
#: pretix/static/pretixpresale/js/ui/main.js:201
#: pretix/static/pretixpresale/js/ui/main.js:202
msgid "Please enter a quantity for one of the ticket types."
msgstr ""

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: 2019-03-28 14:00+0000\n"
"Last-Translator: yichengsd <sunzl@jxepub.com>\n"
"Language-Team: Chinese (Simplified) <https://translate.pretix.eu/projects/"
@@ -2719,7 +2719,7 @@ msgstr "降低产品价格(%)"
#: pretix/control/templates/pretixcontrol/vouchers/index.html:98
#: pretix/control/views/vouchers.py:61 pretix/control/views/waitinglist.py:199
#: pretix/plugins/checkinlists/exporters.py:322
#: pretix/presale/templates/pretixpresale/event/index.html:235
#: pretix/presale/templates/pretixpresale/event/index.html:252
msgid "Voucher code"
msgstr "优惠券号"
@@ -6437,13 +6437,13 @@ msgid "Search voucher"
msgstr "搜索票证"
#: pretix/control/forms/filter.py:823 pretix/control/forms/vouchers.py:92
#: pretix/control/views/typeahead.py:311
#: pretix/control/views/typeahead.py:317
#, python-brace-format
msgid "{product} Any variation"
msgstr "{product} - 任何变量"
#: pretix/control/forms/filter.py:829 pretix/control/forms/vouchers.py:83
#: pretix/control/views/typeahead.py:319 pretix/control/views/typeahead.py:323
#: pretix/control/views/typeahead.py:325 pretix/control/views/typeahead.py:329
#: pretix/control/views/vouchers.py:73
#, python-brace-format
msgid "Any product in quota \"{quota}\""
@@ -7866,6 +7866,7 @@ msgstr "设置"
#: pretix/control/templates/pretixcontrol/subevents/bulk.html:19
#: pretix/control/templates/pretixcontrol/subevents/index.html:5
#: pretix/control/templates/pretixcontrol/subevents/index.html:7
#: pretix/presale/templates/pretixpresale/event/index.html:115
msgctxt "subevent"
msgid "Dates"
msgstr "日期"
@@ -16010,7 +16011,7 @@ msgid "We're trying to reserve another one for you!"
msgstr "我们正试图为你预留另一个!"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:104
#: pretix/presale/templates/pretixpresale/event/index.html:201
#: pretix/presale/templates/pretixpresale/event/index.html:218
#: pretix/presale/templates/pretixpresale/event/voucher.html:26
#, python-format
msgid ""
@@ -16162,77 +16163,90 @@ msgstr "清空购物车"
msgid "Proceed with checkout"
msgstr "进行结账"
#: pretix/presale/templates/pretixpresale/event/index.html:99
#: pretix/presale/templates/pretixpresale/event/index.html:100
#, fuzzy
#| msgid "This file is from a different event."
msgid "Add tickets for a different date"
msgstr "此文件来自其他活动。"
#: pretix/presale/templates/pretixpresale/event/index.html:104
msgid "View other date"
msgstr "查看其他日期"
#: pretix/presale/templates/pretixpresale/event/index.html:102
#: pretix/presale/templates/pretixpresale/event/index.html:108
msgid "Choose date to buy a ticket"
msgstr "选择购票日期"
#: pretix/presale/templates/pretixpresale/event/index.html:129
#: pretix/presale/templates/pretixpresale/event/index.html:113
#, fuzzy
#| msgid "Other features"
msgctxt "subevent"
msgid "Other dates"
msgstr "其他特征"
#: pretix/presale/templates/pretixpresale/event/index.html:146
#: pretix/presale/views/widget.py:471
msgid "The presale period for this event is over."
msgstr "此活动的预售期已结束。"
#: pretix/presale/templates/pretixpresale/event/index.html:134
#: pretix/presale/templates/pretixpresale/event/index.html:151
#: pretix/presale/views/widget.py:473
#, python-format
msgid "The presale for this event will start on %(date)s at %(time)s."
msgstr "此活动的预售将从%(date)s的%(time)s开始。"
#: pretix/presale/templates/pretixpresale/event/index.html:138
#: pretix/presale/templates/pretixpresale/event/index.html:155
#: pretix/presale/views/widget.py:478
msgid "The presale for this event has not yet started."
msgstr "此活动的预售尚未开始。"
#: pretix/presale/templates/pretixpresale/event/index.html:160
#: pretix/presale/templates/pretixpresale/event/index.html:177
#, python-format
msgid "Begin: %(time)s"
msgstr "开始:%(time)s"
#: pretix/presale/templates/pretixpresale/event/index.html:165
#: pretix/presale/templates/pretixpresale/event/index.html:182
#, python-format
msgid "End: %(time)s"
msgstr "结束:%(time)s"
#: pretix/presale/templates/pretixpresale/event/index.html:173
#: pretix/presale/templates/pretixpresale/event/index.html:190
#, python-format
msgid "Admission: %(time)s"
msgstr "入场:%(time)s"
#: pretix/presale/templates/pretixpresale/event/index.html:177
#: pretix/presale/templates/pretixpresale/event/index.html:194
#, python-format
msgid "Admission: %(datetime)s"
msgstr "入场:%(datetime)s"
#: pretix/presale/templates/pretixpresale/event/index.html:188
#: pretix/presale/templates/pretixpresale/event/index.html:205
msgid "Add to Calendar"
msgstr "添加到日历"
#: pretix/presale/templates/pretixpresale/event/index.html:200
#: pretix/presale/templates/pretixpresale/event/index.html:217
#: pretix/presale/templates/pretixpresale/event/voucher.html:25
msgid "We're now trying to reserve this for you!"
msgstr "我们现在正试图为您保留这个!"
#: pretix/presale/templates/pretixpresale/event/index.html:211
#: pretix/presale/templates/pretixpresale/event/index.html:228
#: pretix/presale/templates/pretixpresale/event/voucher.html:291
msgid "Add to cart"
msgstr "添加到购物车"
#: pretix/presale/templates/pretixpresale/event/index.html:223
#: pretix/presale/templates/pretixpresale/event/index.html:240
msgid "Redeem a voucher"
msgstr "兑换优惠券"
#: pretix/presale/templates/pretixpresale/event/index.html:241
#: pretix/presale/templates/pretixpresale/event/index.html:258
msgid "Redeem voucher"
msgstr "兑换优惠券"
#: pretix/presale/templates/pretixpresale/event/index.html:252
#: pretix/presale/templates/pretixpresale/event/index.html:269
msgid "If you already ordered a ticket"
msgstr "如果您已经订了票"
#: pretix/presale/templates/pretixpresale/event/index.html:256
#: pretix/presale/templates/pretixpresale/event/index.html:273
msgid ""
"If you want to see or change the status and details of your order, click on "
"the link in one of the emails we sent you during the order process. If you "
@@ -16243,7 +16257,7 @@ msgstr ""
"一封电子邮件中的链接。 如果您找不到该链接,请单击以下按钮以请求再次发送给您的"
"订单链接。"
#: pretix/presale/templates/pretixpresale/event/index.html:265
#: pretix/presale/templates/pretixpresale/event/index.html:282
#: pretix/presale/templates/pretixpresale/event/resend_link.html:4
#: pretix/presale/templates/pretixpresale/event/resend_link.html:7
msgid "Resend order links"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-06-05 10:21+0000\n"
"POT-Creation-Date: 2019-06-06 09:11+0000\n"
"PO-Revision-Date: 2019-03-28 14:00+0000\n"
"Last-Translator: yichengsd <sunzl@jxepub.com>\n"
"Language-Team: Chinese (Simplified) <https://translate.pretix.eu/projects/"
@@ -249,7 +249,7 @@ 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."
msgstr[0] "购物车中的物品将为您保留{num}分钟。"
#: pretix/static/pretixpresale/js/ui/main.js:201
#: pretix/static/pretixpresale/js/ui/main.js:202
msgid "Please enter a quantity for one of the ticket types."
msgstr ""

View File

@@ -7,6 +7,7 @@ from pretix.base.models import (
CachedFile, Event, OrderPosition, cachedfile_name,
)
from pretix.base.services.orders import OrderError
from pretix.base.services.tasks import EventTask
from pretix.celery_app import app
from .exporters import render_pdf
@@ -14,8 +15,8 @@ from .exporters import render_pdf
logger = logging.getLogger(__name__)
@app.task(throws=(OrderError,))
def badges_create_pdf(fileid: int, event: int, positions: List[int]) -> int:
@app.task(base=EventTask, throws=(OrderError,))
def badges_create_pdf(event: int, fileid: int, positions: List[int]) -> int:
file = CachedFile.objects.get(id=fileid)
event = Event.objects.get(id=event)

View File

@@ -223,7 +223,7 @@ class OrderPrintDo(EventPermissionRequiredMixin, AsyncAction, View):
else:
positions = [p.pk for p in order.positions.all()]
return self.do(
str(cf.id),
self.request.event.pk,
str(cf.id),
positions,
)

View File

@@ -9,6 +9,7 @@ from django.db import transaction
from django.db.models import Q
from django.utils.formats import date_format
from django.utils.translation import ugettext, ugettext_noop
from django_scopes import scope, scopes_disabled
from pretix.base.i18n import language
from pretix.base.models import (
@@ -194,51 +195,53 @@ def _get_unknown_transactions(job: BankImportJob, data: list, event: Event=None,
@app.task(base=TransactionAwareTask, bind=True, max_retries=5, default_retry_delay=1)
def process_banktransfers(self, job: int, data: list) -> None:
with language("en"): # We'll translate error messages at display time
job = BankImportJob.objects.get(pk=job)
job.state = BankImportJob.STATE_RUNNING
job.save()
prefixes = []
with scopes_disabled():
job = BankImportJob.objects.get(pk=job)
with scope(organizer=job.organizer or job.event.organizer):
job.state = BankImportJob.STATE_RUNNING
job.save()
prefixes = []
try:
# Delete left-over transactions from a failed run before so they can reimported
BankTransaction.objects.filter(state=BankTransaction.STATE_UNCHECKED, **job.owner_kwargs).delete()
transactions = _get_unknown_transactions(job, data, **job.owner_kwargs)
code_len = settings.ENTROPY['order_code']
if job.event:
pattern = re.compile(job.event.slug.upper() + r"[ \-_]*([A-Z0-9]{%s})" % code_len)
else:
if not prefixes:
prefixes = [e.slug.upper().replace(".", r"\.").replace("-", r"[\- ]*")
for e in job.organizer.events.all()]
pattern = re.compile("(%s)[ \\-_]*([A-Z0-9]{%s})" % ("|".join(prefixes), code_len))
for trans in transactions:
match = pattern.search(trans.reference.replace(" ", "").replace("\n", "").upper())
if match:
if job.event:
code = match.group(1)
_handle_transaction(trans, code, event=job.event)
else:
slug = match.group(1)
code = match.group(2)
_handle_transaction(trans, code, organizer=job.organizer, slug=slug)
else:
trans.state = BankTransaction.STATE_NOMATCH
trans.save()
except LockTimeoutException:
try:
self.retry()
except MaxRetriesExceededError:
logger.exception('Maximum number of retries exceeded for task.')
# Delete left-over transactions from a failed run before so they can reimported
BankTransaction.objects.filter(state=BankTransaction.STATE_UNCHECKED, **job.owner_kwargs).delete()
transactions = _get_unknown_transactions(job, data, **job.owner_kwargs)
code_len = settings.ENTROPY['order_code']
if job.event:
pattern = re.compile(job.event.slug.upper() + r"[ \-_]*([A-Z0-9]{%s})" % code_len)
else:
if not prefixes:
prefixes = [e.slug.upper().replace(".", r"\.").replace("-", r"[\- ]*")
for e in job.organizer.events.all()]
pattern = re.compile("(%s)[ \\-_]*([A-Z0-9]{%s})" % ("|".join(prefixes), code_len))
for trans in transactions:
match = pattern.search(trans.reference.replace(" ", "").replace("\n", "").upper())
if match:
if job.event:
code = match.group(1)
_handle_transaction(trans, code, event=job.event)
else:
slug = match.group(1)
code = match.group(2)
_handle_transaction(trans, code, organizer=job.organizer, slug=slug)
else:
trans.state = BankTransaction.STATE_NOMATCH
trans.save()
except LockTimeoutException:
try:
self.retry()
except MaxRetriesExceededError:
logger.exception('Maximum number of retries exceeded for task.')
job.state = BankImportJob.STATE_ERROR
job.save()
except Exception as e:
job.state = BankImportJob.STATE_ERROR
job.save()
except Exception as e:
job.state = BankImportJob.STATE_ERROR
job.save()
raise e
else:
job.state = BankImportJob.STATE_COMPLETED
job.save()
raise e
else:
job.state = BankImportJob.STATE_COMPLETED
job.save()

View File

@@ -13,6 +13,7 @@ from django.utils.translation import ugettext_lazy as _
from django.views.decorators.clickjacking import xframe_options_exempt
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.http import require_POST
from django_scopes import scopes_disabled
from paypalrestsdk.openid_connect import Tokeninfo
from pretix.base.models import Event, Order, OrderPayment, OrderRefund, Quota
@@ -133,6 +134,7 @@ def abort(request, *args, **kwargs):
@csrf_exempt
@require_POST
@scopes_disabled()
def webhook(request, *args, **kwargs):
event_body = request.body.decode('utf-8').strip()
event_json = json.loads(event_body)

View File

@@ -1,6 +1,9 @@
from django import forms
from django.urls import reverse
from django.utils.translation import ugettext_lazy as _
from django_scopes.forms import (
SafeModelChoiceField, SafeModelMultipleChoiceField,
)
from pretix.control.forms.widgets import Select2
from pretix.plugins.pretixdroid.models import AppConfiguration
@@ -16,6 +19,10 @@ class AppConfigurationForm(forms.ModelForm):
}),
'app': forms.RadioSelect
}
field_classes = {
'items': SafeModelMultipleChoiceField,
'list': SafeModelChoiceField,
}
def __init__(self, **kwargs):
self.event = kwargs.pop('event')

View File

@@ -17,6 +17,7 @@ from django.utils.timezone import now
from django.utils.translation import ugettext_lazy as _
from django.views.decorators.csrf import csrf_exempt
from django.views.generic import TemplateView, View
from django_scopes import scope, scopes_disabled
from pretix.base.models import Checkin, Event, Order, OrderPosition
from pretix.base.models.event import SubEvent
@@ -124,34 +125,35 @@ class ConfigView(EventPermissionRequiredMixin, TemplateView):
class ApiView(View):
@method_decorator(csrf_exempt)
def dispatch(self, request, **kwargs):
try:
self.event = Event.objects.get(
slug=self.kwargs['event'],
organizer__slug=self.kwargs['organizer']
)
except Event.DoesNotExist:
return HttpResponseNotFound('Unknown event')
with scopes_disabled():
try:
self.event = Event.objects.get(
slug=self.kwargs['event'],
organizer__slug=self.kwargs['organizer']
)
except Event.DoesNotExist:
return HttpResponseNotFound('Unknown event')
with scope(organizer=self.event.organizer):
try:
self.config = self.event.appconfiguration_set.get(key=request.GET.get("key", "-unset-"))
except AppConfiguration.DoesNotExist:
return HttpResponseForbidden('Invalid key')
try:
self.config = self.event.appconfiguration_set.get(key=request.GET.get("key", "-unset-"))
except AppConfiguration.DoesNotExist:
return HttpResponseForbidden('Invalid key')
self.subevent = None
if self.event.has_subevents:
if self.config.list.subevent:
self.subevent = self.config.list.subevent
if 'subevent' in kwargs and kwargs['subevent'] != str(self.subevent.pk):
return HttpResponseForbidden('Invalid subevent selected.')
elif 'subevent' in kwargs:
self.subevent = get_object_or_404(SubEvent, event=self.event, pk=kwargs['subevent'])
self.subevent = None
if self.event.has_subevents:
if self.config.list.subevent:
self.subevent = self.config.list.subevent
if 'subevent' in kwargs and kwargs['subevent'] != str(self.subevent.pk):
return HttpResponseForbidden('Invalid subevent selected.')
elif 'subevent' in kwargs:
self.subevent = get_object_or_404(SubEvent, event=self.event, pk=kwargs['subevent'])
else:
return HttpResponseForbidden('No subevent selected.')
else:
return HttpResponseForbidden('No subevent selected.')
else:
if 'subevent' in kwargs:
return HttpResponseForbidden('Subevents not enabled.')
if 'subevent' in kwargs:
return HttpResponseForbidden('Subevents not enabled.')
return super().dispatch(request, **kwargs)
return super().dispatch(request, **kwargs)
class ApiRedeemView(ApiView):

Some files were not shown because too many files have changed in this diff Show More