Added an organizer overview page

This commit is contained in:
Raphael Michel
2015-10-22 17:45:19 +02:00
parent 0b4cae07c4
commit 232c42b265
23 changed files with 400 additions and 92 deletions

View File

@@ -5,7 +5,7 @@ from django.http import Http404
from django.shortcuts import redirect
from django.utils.translation import ugettext_lazy as _
from pretix.base.models import Event
from pretix.base.models import Event, Organizer
from pretix.multidomain.urlreverse import get_domain
@@ -13,11 +13,10 @@ class EventMiddleware:
def process_request(self, request):
url = resolve(request.path_info)
url_namespace = url.namespace
url_name = url.url_name
if url_namespace != 'presale':
return
if 'event.' in url_name and 'event' in url.kwargs:
if 'organizer' in url.kwargs or 'event' in url.kwargs:
try:
if hasattr(request, 'organizer'):
# We are on an organizer's custom domain
@@ -31,18 +30,24 @@ class EventMiddleware:
slug=url.kwargs['event'],
organizer=request.organizer,
).select_related('organizer')[0]
request.organizer = request.event.organizer
else:
# We are on our main domain
if 'organizer' not in url.kwargs:
raise Http404(_('The selected event was not found.'))
request.event = Event.objects.current.filter(
slug=url.kwargs['event'],
organizer__slug=url.kwargs['organizer']
).select_related('organizer')[0]
if 'event' in url.kwargs and 'organizer' in url.kwargs:
request.event = Event.objects.current.filter(
slug=url.kwargs['event'],
organizer__slug=url.kwargs['organizer']
).select_related('organizer')[0]
request.organizer = request.event.organizer
elif 'organizer' in url.kwargs:
request.organizer = Organizer.objects.current.filter(
slug=url.kwargs['organizer']
)[0]
else:
raise Http404()
# If this organizer has a custom domain, send the user there
domain = get_domain(request.event)
domain = get_domain(request.organizer)
if domain:
if request.port and request.port not in (80, 443):
domain = '%s:%d' % (domain, request.port)
@@ -50,7 +55,7 @@ class EventMiddleware:
return redirect(urljoin('%s://%s' % (request.scheme, domain), path))
except IndexError:
raise Http404(_('The selected event was not found.'))
raise Http404(_('The selected event or organizer was not found.'))
if '_' not in request.session:
# We need to create session even if we do not yet store something there, because we need the session

View File

@@ -0,0 +1,49 @@
{% load compress %}
{% load staticfiles %}
{% load i18n %}
<!DOCTYPE html>
<html>
<head>
<title>{% block thetitle %}{% endblock %}</title>
{% compress css %}
<link rel="stylesheet" type="text/less" href="{% static "pretixpresale/less/main.less" %}" />
{% endcompress %}
{% compress js %}
<script type="text/javascript" src="{% static "jquery/js/jquery-2.1.1.min.js" %}"></script>
<script type="text/javascript" src="{% static "js/jquery.formset.js" %}"></script>
<script type="text/javascript" src="{% static "bootstrap/dist/js/bootstrap.js" %}"></script>
<script type="text/javascript" src="{% static "pretixpresale/js/ui/main.js" %}"></script>
<script type="text/javascript" src="{% static "pretixpresale/js/ui/asynctask.js" %}"></script>
{% endcompress %}
{{ html_head|safe }}
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<div class="container">
{% block page %}
{% endblock %}
</div>
<footer>
{% block footer %}
{% endblock %}
{% with "href='http://pretix.eu'" as a_attr %}
{% blocktrans trimmed %}
powered by <a {{ a_attr }}>pretix</a>
{% endblocktrans %}
{% endwith %}
</footer>
<script type="text/javascript">
var default_loading_message = '{% trans "We are processing your request…" %}';
</script>
<div id="loadingmodal">
<i class="fa fa-cog big-rotating-icon"></i>
<h1>{% trans "We are processing your request…" %}</h1>
<p>
{% trans "If this takes longer than a few minutes, please contact us." %}
</p>
</div>
{% compress js %}
<script type="text/javascript" src="{% static "lightbox/js/lightbox.min.js" %}"></script>
{% endcompress %}
</body>
</html>

View File

@@ -1,26 +1,11 @@
{% load compress %}
{% load staticfiles %}
{% extends "pretixpresale/base.html" %}
{% load i18n %}
{% load static %}
{% load eventurl %}
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}{% endblock %}{% if url_name != "event.index" %} :: {% endif %}{{ event.name }}</title>
{% compress css %}
<link rel="stylesheet" type="text/less" href="{% static "pretixpresale/less/main.less" %}" />
{% endcompress %}
{% compress js %}
<script type="text/javascript" src="{% static "jquery/js/jquery-2.1.1.min.js" %}"></script>
<script type="text/javascript" src="{% static "js/jquery.formset.js" %}"></script>
<script type="text/javascript" src="{% static "bootstrap/dist/js/bootstrap.js" %}"></script>
<script type="text/javascript" src="{% static "pretixpresale/js/ui/main.js" %}"></script>
<script type="text/javascript" src="{% static "pretixpresale/js/ui/asynctask.js" %}"></script>
{% endcompress %}
{{ html_head|safe }}
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<div class="container event">
{% block thetitle %}
{% block title %}{% endblock %}{% if url_name != "event.index" %} :: {% endif %}{{ event.name }}
{% endblock %}
{% block page %}
<div class="page-header">
<h1 class="pull-left">
<a href="{% eventurl event "presale:event.index" %}">{{ event.name }}</a>
@@ -50,8 +35,8 @@
{% endif %}
{% block content %}
{% endblock %}
</div>
<footer>
{% endblock %}
{% block footer %}
{% if request.event.settings.contact_mail %}
<a href="mailto:{{ request.event.settings.contact_mail }}">{% trans "Contact event organizer" %}</a> &middot;
{% endif %}
@@ -59,24 +44,4 @@
<a href="{{ request.event.settings.imprint_url }}" target="_blank">{% trans "Imprint" %}</a>
&middot;
{% endif %}
{% with "href='http://pretix.eu'" as a_attr %}
{% blocktrans trimmed %}
powered by <a {{ a_attr }}>pretix</a>
{% endblocktrans %}
{% endwith %}
</footer>
<script type="text/javascript">
var default_loading_message = '{% trans "We are processing your request…" %}';
</script>
<div id="loadingmodal">
<i class="fa fa-cog big-rotating-icon"></i>
<h1>{% trans "We are processing your request…" %}</h1>
<p>
{% trans "If this takes longer than a few minutes, please contact us." %}
</p>
</div>
{% compress js %}
<script type="text/javascript" src="{% static "lightbox/js/lightbox.min.js" %}"></script>
{% endcompress %}
</body>
</html>
{% endblock %}

View File

@@ -0,0 +1,26 @@
{% extends "pretixpresale/base.html" %}
{% load i18n %}
{% load static %}
{% load eventurl %}
{% block thetitle %}
{% block title %}{% endblock %}{% if url_name != "organizer.index" %} :: {% endif %}{{ organizer.name }}
{% endblock %}
{% block page %}
<div class="page-header">
<h1 class="pull-left">
<a href="{% eventurl organizer "presale:organizer.index" %}">{{ organizer.name }}</a>
</h1>
<div class="clearfix"></div>
</div>
{% if messages %}
{% for message in messages %}
<div class="alert {{ message.tags }}">
{{ message }}
</div>
{% endfor %}
{% endif %}
{% block content %}
{% endblock %}
{% endblock %}
{% block footer %}
{% endblock %}

View File

@@ -0,0 +1,61 @@
{% extends "pretixpresale/organizers/base.html" %}
{% load i18n %}
{% load eventurl %}
{% block title %}Event list{% endblock %}
{% block content %}
{% if "old" in request.GET %}
<h3>Past events</h3>
<p>
<small><a href="?">{% trans "Show upcoming" %}</a></small>
</p>
{% else %}
<h3>Upcoming events </h3>
<p>
<small><a href="?old=1">{% trans "Show past events" %}</a></small>
</p>
{% endif %}
<div class="table-responsive">
<table class="table">
<thead>
<tr>
<th>{% trans "Name" %}</th>
<th>{% trans "Date" %}</th>
<th></th>
</tr>
</thead>
<tbody>
{% for e in events %}{% eventurl e "presale:event.index" as url %}
<tr>
<td><a href="{{ url }}">{{ e.name }}</a></td>
<td>
{{ e.date_from|date:"DATE_FORMAT" }}
{% if e.settings.show_date_to %} {{ e.date_to|date:"DATE_FORMAT" }}{% endif %}
</td>
<td class="text-right">
<a class="btn btn-primary" href="{{ url }}">
{% if e.presale_is_running %}{% trans "Buy tickets" %}
{% else %}{% trans "More info" %}
{% endif %}
</a>
</td>
</tr>
{% empty %}
{% if "old" in request.GET %}
<tr>
<td colspan="3">
<em>{% trans "No archived events found." %}</em>
</td>
</tr>
{% else %}
<tr>
<td colspan="3">
<em>{% trans "No public upcoming events found." %}</em>
</td>
</tr>
{% endif %}
{% endfor %}
</tbody>
</table>
</div>
{% include "pretixpresale/pagination.html" %}
{% endblock %}

View File

@@ -0,0 +1,27 @@
{% load i18n %}
{% load urlreplace %}
{% if is_paginated %}
<nav class="text-center">
<ul class="pagination">
{% if page_obj.has_previous %}
<li>
<a href="?{% url_replace request 'page' page_obj.previous_page_number %}">
<span>&laquo;</span>
</a>
</li>
{% endif %}
<li class="page-current"><a>
{% blocktrans trimmed with page=page_obj.number of=page_obj.paginator.num_pages %}
Page {{ page }} of {{ of }}
{% endblocktrans %}
</a></li>
{% if page_obj.has_next %}
<li>
<a href="?{% url_replace request 'page' page_obj.next_page_number %}">
<span>&raquo;</span>
</a>
</li>
{% endif %}
</ul>
</nav>
{% endif %}

View File

@@ -5,6 +5,7 @@ import pretix.presale.views.checkout
import pretix.presale.views.event
import pretix.presale.views.locale
import pretix.presale.views.order
import pretix.presale.views.organizer
# This is not a valid Django URL configuration, as the final
# configuration is done by the pretix.multidomain package.
@@ -37,6 +38,10 @@ event_patterns = [
url(r'^$', pretix.presale.views.event.EventIndex.as_view(), name='event.index'),
]
organizer_patterns = [
url(r'^$', pretix.presale.views.organizer.OrganizerIndex.as_view(), name='organizer.index'),
]
locale_patterns = [
url(r'^locale/set$', pretix.presale.views.locale.LocaleSet.as_view(), name='locale.set'),
]

View File

@@ -1,30 +1,11 @@
from datetime import timedelta
from itertools import groupby
from django.contrib.auth.views import redirect_to_login
from django.utils.functional import cached_property
from django.utils.timezone import now
from pretix.base.models import CartPosition
from pretix.base.signals import register_payment_providers
from pretix.multidomain.urlreverse import eventreverse
def login_required(view_func):
def _wrapped_view(request, *args, **kwargs):
if request.user.is_authenticated():
return view_func(request, *args, **kwargs)
path = request.path
return redirect_to_login(path, eventreverse(request.event, 'presale:event.checkout.login'), 'next')
return _wrapped_view
class LoginRequiredMixin:
@classmethod
def as_view(cls, **initkwargs):
view = super().as_view(**initkwargs)
return login_required(view)
class CartMixin:
@@ -116,3 +97,10 @@ class EventViewMixin:
context = super().get_context_data(**kwargs)
context['event'] = self.request.event
return context
class OrganizerViewMixin:
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['organizer'] = self.request.organizer
return context

View File

@@ -0,0 +1,25 @@
from django.db.models import Q
from django.utils.timezone import now
from django.views.generic import ListView
from pretix.base.models import Event
from pretix.presale.views import OrganizerViewMixin
class OrganizerIndex(OrganizerViewMixin, ListView):
model = Event
context_object_name = 'events'
template_name = 'pretixpresale/organizers/index.html'
paginate_by = 1
def get_queryset(self):
query = Q(is_public=True)
if "old" in self.request.GET:
query &= Q(Q(date_from__lte=now()) & Q(date_to__lte=now()))
order = '-date_from'
else:
query &= Q(Q(date_from__gte=now()) | Q(date_to__gte=now()))
order = 'date_from'
return Event.objects.current.filter(
Q(organizer=self.request.organizer) & query
).order_by(order)