forked from CGM_Public/pretix_original
Add option to limit events to specific sales channels (#1867)
This commit is contained in:
@@ -2,6 +2,7 @@ from django.template.response import TemplateResponse
|
||||
from django.urls import resolve
|
||||
from django_scopes import scope
|
||||
|
||||
from pretix.base.channels import WebshopSalesChannel
|
||||
from pretix.presale.signals import process_response
|
||||
|
||||
from .utils import _detect_event
|
||||
@@ -20,6 +21,11 @@ class EventMiddleware:
|
||||
def __call__(self, request):
|
||||
url = resolve(request.path_info)
|
||||
request._namespace = url.namespace
|
||||
|
||||
if not hasattr(request, 'sales_channel'):
|
||||
# The environ lookup is only relevant during unit testing
|
||||
request.sales_channel = request.environ.get('PRETIX_SALES_CHANNEL', WebshopSalesChannel())
|
||||
|
||||
if url.namespace != 'presale':
|
||||
return self.get_response(request)
|
||||
|
||||
|
||||
@@ -11,7 +11,6 @@ from django.urls import resolve
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from django_scopes import scope
|
||||
|
||||
from pretix.base.channels import WebshopSalesChannel
|
||||
from pretix.base.middleware import LocaleMiddleware
|
||||
from pretix.base.models import Event, Organizer
|
||||
from pretix.multidomain.urlreverse import (
|
||||
@@ -32,6 +31,7 @@ def _detect_event(request, require_live=True, require_plugin=None):
|
||||
db = settings.DATABASE_REPLICA
|
||||
|
||||
url = resolve(request.path_info)
|
||||
|
||||
try:
|
||||
if hasattr(request, 'event_domain'):
|
||||
# We are on an event's custom domain
|
||||
@@ -127,9 +127,6 @@ def _detect_event(request, require_live=True, require_plugin=None):
|
||||
if require_plugin not in request.event.get_plugins() and not is_core:
|
||||
raise Http404(_('This feature is not enabled.'))
|
||||
|
||||
if not hasattr(request, 'sales_channel'):
|
||||
# The environ lookup is only relevant during unit testing
|
||||
request.sales_channel = request.environ.get('PRETIX_SALES_CHANNEL', WebshopSalesChannel())
|
||||
for receiver, response in process_request.send(request.event, request=request):
|
||||
if response:
|
||||
return response
|
||||
|
||||
@@ -419,6 +419,9 @@ class CartAdd(EventViewMixin, CartActionMixin, AsyncAction, View):
|
||||
return u
|
||||
|
||||
def post(self, request, *args, **kwargs):
|
||||
if request.sales_channel.identifier not in request.event.sales_channels:
|
||||
raise Http404(_('Tickets for this event cannot be purchased on this sales channel.'))
|
||||
|
||||
cart_id = get_or_create_cart_id(self.request)
|
||||
if "widget_data" in request.POST:
|
||||
try:
|
||||
|
||||
@@ -348,6 +348,9 @@ class EventIndex(EventViewMixin, EventListMixin, CartMixin, TemplateView):
|
||||
r._csp_ignore = True
|
||||
return r
|
||||
|
||||
if request.sales_channel.identifier not in request.event.sales_channels:
|
||||
raise Http404(_('Tickets for this event cannot be purchased on this sales channel.'))
|
||||
|
||||
if request.event.has_subevents:
|
||||
if 'subevent' in kwargs:
|
||||
self.subevent = request.event.subevents.using(settings.DATABASE_REPLICA).filter(pk=kwargs['subevent'], active=True).first()
|
||||
|
||||
@@ -101,6 +101,7 @@ class EventListMixin:
|
||||
def _get_event_queryset(self):
|
||||
query = Q(is_public=True) & Q(live=True)
|
||||
qs = self.request.organizer.events.using(settings.DATABASE_REPLICA).filter(query)
|
||||
qs = qs.filter(sales_channels__contains=self.request.sales_channel.identifier)
|
||||
qs = qs.annotate(
|
||||
min_from=Min('subevents__date_from'),
|
||||
min_to=Min('subevents__date_to'),
|
||||
@@ -487,11 +488,16 @@ class CalendarView(OrganizerViewMixin, EventListMixin, TemplateView):
|
||||
def _events_by_day(self, before, after):
|
||||
ebd = defaultdict(list)
|
||||
timezones = set()
|
||||
add_events_for_days(self.request, Event.annotated(self.request.organizer.events, 'web').using(settings.DATABASE_REPLICA), before, after, ebd, timezones)
|
||||
add_events_for_days(self.request, Event.annotated(self.request.organizer.events, 'web').using(
|
||||
settings.DATABASE_REPLICA
|
||||
).filter(
|
||||
sales_channels__contains=self.request.sales_channel.identifier
|
||||
), before, after, ebd, timezones)
|
||||
add_subevents_for_days(filter_qs_by_attr(SubEvent.annotated(SubEvent.objects.filter(
|
||||
event__organizer=self.request.organizer,
|
||||
event__is_public=True,
|
||||
event__live=True,
|
||||
event__sales_channels__contains=self.request.sales_channel.identifier
|
||||
).prefetch_related(
|
||||
'event___settings_objects', 'event__organizer___settings_objects'
|
||||
)), self.request).using(settings.DATABASE_REPLICA), before, after, ebd, timezones)
|
||||
@@ -539,11 +545,16 @@ class WeekCalendarView(OrganizerViewMixin, EventListMixin, TemplateView):
|
||||
def _events_by_day(self, before, after):
|
||||
ebd = defaultdict(list)
|
||||
timezones = set()
|
||||
add_events_for_days(self.request, Event.annotated(self.request.organizer.events, 'web').using(settings.DATABASE_REPLICA), before, after, ebd, timezones)
|
||||
add_events_for_days(self.request, Event.annotated(self.request.organizer.events, 'web').using(
|
||||
settings.DATABASE_REPLICA
|
||||
).filter(
|
||||
sales_channels__contains=self.request.sales_channel.identifier
|
||||
), before, after, ebd, timezones)
|
||||
add_subevents_for_days(filter_qs_by_attr(SubEvent.annotated(SubEvent.objects.filter(
|
||||
event__organizer=self.request.organizer,
|
||||
event__is_public=True,
|
||||
event__live=True,
|
||||
event__sales_channels__contains=self.request.sales_channel.identifier
|
||||
).prefetch_related(
|
||||
'event___settings_objects', 'event__organizer___settings_objects'
|
||||
)), self.request).using(settings.DATABASE_REPLICA), before, after, ebd, timezones)
|
||||
@@ -556,7 +567,12 @@ class OrganizerIcalDownload(OrganizerViewMixin, View):
|
||||
def get(self, request, *args, **kwargs):
|
||||
events = list(
|
||||
filter_qs_by_attr(
|
||||
self.request.organizer.events.filter(is_public=True, live=True, has_subevents=False),
|
||||
self.request.organizer.events.filter(
|
||||
is_public=True,
|
||||
live=True,
|
||||
has_subevents=False,
|
||||
sales_channels__contains=self.request.sales_channel.identifier
|
||||
),
|
||||
request
|
||||
).order_by(
|
||||
'date_from'
|
||||
@@ -571,7 +587,8 @@ class OrganizerIcalDownload(OrganizerViewMixin, View):
|
||||
event__is_public=True,
|
||||
event__live=True,
|
||||
is_public=True,
|
||||
active=True
|
||||
active=True,
|
||||
event__sales_channels__contains=self.request.sales_channel.identifier
|
||||
),
|
||||
request
|
||||
).prefetch_related(
|
||||
|
||||
@@ -279,6 +279,11 @@ class WidgetAPIProductList(EventListMixin, View):
|
||||
'error': gettext('This ticket shop is currently disabled.')
|
||||
})
|
||||
|
||||
if request.sales_channel.identifier not in request.event.sales_channels:
|
||||
return self.response({
|
||||
'error': gettext('Tickets for this event cannot be purchased on this sales channel.')
|
||||
})
|
||||
|
||||
self.subevent = None
|
||||
if request.event.has_subevents:
|
||||
if 'subevent' in kwargs:
|
||||
@@ -417,7 +422,11 @@ class WidgetAPIProductList(EventListMixin, View):
|
||||
|
||||
if hasattr(self.request, 'event'):
|
||||
add_subevents_for_days(
|
||||
filter_qs_by_attr(self.request.event.subevents_annotated('web'), self.request),
|
||||
filter_qs_by_attr(
|
||||
self.request.event.subevents_annotated('web').filter(
|
||||
event__sales_channels__contains=self.request.sales_channel.identifier
|
||||
), self.request
|
||||
),
|
||||
before, after, ebd, set(), self.request.event,
|
||||
kwargs.get('cart_namespace')
|
||||
)
|
||||
@@ -425,13 +434,18 @@ class WidgetAPIProductList(EventListMixin, View):
|
||||
timezones = set()
|
||||
add_events_for_days(
|
||||
self.request,
|
||||
filter_qs_by_attr(Event.annotated(self.request.organizer.events, 'web'), self.request),
|
||||
filter_qs_by_attr(
|
||||
Event.annotated(self.request.organizer.events, 'web').filter(
|
||||
sales_channels__contains=self.request.sales_channel.identifier
|
||||
), self.request
|
||||
),
|
||||
before, after, ebd, timezones
|
||||
)
|
||||
add_subevents_for_days(filter_qs_by_attr(SubEvent.annotated(SubEvent.objects.filter(
|
||||
event__organizer=self.request.organizer,
|
||||
event__is_public=True,
|
||||
event__live=True,
|
||||
event__sales_channels__contains=self.request.sales_channel.identifier
|
||||
).prefetch_related(
|
||||
'event___settings_objects', 'event__organizer___settings_objects'
|
||||
)), self.request), before, after, ebd, timezones)
|
||||
|
||||
Reference in New Issue
Block a user