mirror of
https://github.com/pretix/pretix.git
synced 2026-05-08 15:44:02 +00:00
Allow to access not-yet-live shop on different domain
This commit is contained in:
@@ -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">
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|||||||
@@ -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'),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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'))
|
||||||
|
|||||||
Reference in New Issue
Block a user