Allow to access not-yet-live shop on different domain

This commit is contained in:
Raphael Michel
2017-01-05 11:50:10 +01:00
parent f6d8b825d5
commit d3f21353ca
5 changed files with 82 additions and 9 deletions

View File

@@ -3,12 +3,21 @@
{% load eventurl %} {% load eventurl %}
{% block title %}{{ request.event.name }}{% endblock %} {% block title %}{{ request.event.name }}{% endblock %}
{% block content %} {% block content %}
<h1> <form action="{% eventurl request.event "presale:event.auth" %}" method="post" target="_blank">
{{ request.event.name }} <h1>
<a href="{% eventurl request.event "presale:event.index" %}" class="btn btn-default btn-sm" target="_blank"> {{ request.event.name }}
{% trans "Go to shop" %} {% if has_domain and not request.event.live %}
</a> <input type="hidden" value="{{ new_session }}" name="session">
</h1> <button type="submit" class="btn btn-default btn-sm">
{% trans "Go to shop" %}
</button>
{% else %}
<a href="{% eventurl request.event "presale:event.index" %}" class="btn btn-default btn-sm" target="_blank">
{% trans "Go to shop" %}
</a>
{% endif %}
</h1>
</form>
{% if actions|length > 0 %} {% if actions|length > 0 %}
<div class="panel panel-danger"> <div class="panel panel-danger">

View File

@@ -1,5 +1,7 @@
from decimal import Decimal from decimal import Decimal
from importlib import import_module
from django.conf import settings
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.db.models import Sum from django.db.models import Sum
@@ -17,6 +19,7 @@ from pretix.control.signals import (
from ..logdisplay import OVERVIEW_BLACKLIST from ..logdisplay import OVERVIEW_BLACKLIST
SessionStore = import_module(settings.SESSION_ENGINE).SessionStore
NUM_WIDGET = '<div class="numwidget"><span class="num">{num}</span><span class="text">{text}</span></div>' NUM_WIDGET = '<div class="numwidget"><span class="num">{num}</span><span class="text">{text}</span></div>'
@@ -167,11 +170,21 @@ def event_index(request, organizer, event):
a_qs = request.event.requiredaction_set.filter(done=False) a_qs = request.event.requiredaction_set.filter(done=False)
has_domain = request.event.organizer.domains.exists()
ctx = { ctx = {
'widgets': rearrange(widgets), 'widgets': rearrange(widgets),
'logs': qs[:5], 'logs': qs[:5],
'actions': a_qs[:5] if request.eventperm.can_change_orders else [] 'actions': a_qs[:5] if request.eventperm.can_change_orders else [],
'has_domain': has_domain
} }
if not request.event.live and has_domain:
s = SessionStore()
s['pretix_event_access_{}'.format(request.event.pk)] = request.session.session_key
s.create()
ctx['new_session'] = s.session_key
for a in ctx['actions']: for a in ctx['actions']:
a.display = a.display(request) a.display = a.display(request)

View File

@@ -51,6 +51,7 @@ event_patterns = [
url(r'^order/(?P<order>[^/]+)/(?P<secret>[A-Za-z0-9]+)/invoice/(?P<invoice>[0-9]+)$', url(r'^order/(?P<order>[^/]+)/(?P<secret>[A-Za-z0-9]+)/invoice/(?P<invoice>[0-9]+)$',
pretix.presale.views.order.InvoiceDownload.as_view(), pretix.presale.views.order.InvoiceDownload.as_view(),
name='event.invoice.download'), name='event.invoice.download'),
url(r'^auth/$', pretix.presale.views.event.EventAuth.as_view(), name='event.auth'),
url(r'^$', pretix.presale.views.event.EventIndex.as_view(), name='event.index'), url(r'^$', pretix.presale.views.event.EventIndex.as_view(), name='event.index'),
] ]

View File

@@ -1,5 +1,7 @@
from importlib import import_module
from urllib.parse import urljoin from urllib.parse import urljoin
from django.conf import settings
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
from django.core.urlresolvers import resolve from django.core.urlresolvers import resolve
from django.http import Http404 from django.http import Http404
@@ -11,6 +13,8 @@ from pretix.base.models import Event, EventPermission, Organizer
from pretix.multidomain.urlreverse import get_domain from pretix.multidomain.urlreverse import get_domain
from pretix.presale.signals import process_request, process_response from pretix.presale.signals import process_request, process_response
SessionStore = import_module(settings.SESSION_ENGINE).SessionStore
def _detect_event(request, require_live=True): def _detect_event(request, require_live=True):
url = resolve(request.path_info) url = resolve(request.path_info)
@@ -59,8 +63,19 @@ def _detect_event(request, require_live=True):
LocaleMiddleware().process_request(request) LocaleMiddleware().process_request(request)
if require_live and not request.event.live: if require_live and not request.event.live:
if not request.user.is_authenticated or not EventPermission.objects.filter( can_access = (
event=request.event, user=request.user).exists(): url.url_name == 'event.auth'
or (
request.user.is_authenticated
and EventPermission.objects.filter(event=request.event, user=request.user).exists()
)
)
if not can_access and 'pretix_event_access_{}'.format(request.event.pk) in request.session:
sparent = SessionStore(request.session.get('pretix_event_access_{}'.format(request.event.pk)))
can_access = sparent.exists(request.session.get('pretix_event_access_{}'.format(request.event.pk)))
if not can_access:
raise PermissionDenied(_('The selected ticket shop is currently not available.')) raise PermissionDenied(_('The selected ticket shop is currently not available.'))
for receiver, response in process_request.send(request.event, request=request): for receiver, response in process_request.send(request.event, request=request):

View File

@@ -1,13 +1,24 @@
import sys import sys
from importlib import import_module
from django.conf import settings
from django.core.exceptions import PermissionDenied
from django.db.models import Count, Prefetch, Q from django.db.models import Count, Prefetch, Q
from django.shortcuts import redirect
from django.utils.decorators import method_decorator
from django.utils.timezone import now from django.utils.timezone import now
from django.utils.translation import ugettext_lazy as _
from django.views import View
from django.views.decorators.csrf import csrf_exempt
from django.views.generic import TemplateView from django.views.generic import TemplateView
from pretix.base.models import ItemVariation from pretix.base.models import ItemVariation
from pretix.multidomain.urlreverse import eventreverse
from . import CartMixin, EventViewMixin from . import CartMixin, EventViewMixin
SessionStore = import_module(settings.SESSION_ENGINE).SessionStore
def item_group_by_category(items): def item_group_by_category(items):
return sorted( return sorted(
@@ -90,3 +101,27 @@ class EventIndex(EventViewMixin, CartMixin, TemplateView):
context['cart'] = self.get_cart() context['cart'] = self.get_cart()
context['frontpage_text'] = str(self.request.event.settings.frontpage_text) context['frontpage_text'] = str(self.request.event.settings.frontpage_text)
return context return context
class EventAuth(View):
@method_decorator(csrf_exempt)
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
s = SessionStore(request.POST.get('session'))
try:
data = s.load()
except:
raise PermissionDenied(_('Please go back and try again.'))
parent = data.get('pretix_event_access_{}'.format(request.event.pk))
sparent = SessionStore(parent)
if not sparent.exists(parent):
raise PermissionDenied(_('Please go back and try again.'))
request.session['pretix_event_access_{}'.format(request.event.pk)] = parent
return redirect(eventreverse(request.event, 'presale:event.index'))