diff --git a/src/pretix/control/__init__.py b/src/pretix/control/__init__.py index c8139479c1..44e4f080d6 100644 --- a/src/pretix/control/__init__.py +++ b/src/pretix/control/__init__.py @@ -6,6 +6,6 @@ class PretixControlConfig(AppConfig): label = 'pretixcontrol' def ready(self): - from .views import event_dashboard # noqa + from .views import dashboards # noqa default_app_config = 'pretix.control.PretixControlConfig' diff --git a/src/pretix/control/signals.py b/src/pretix/control/signals.py index c0aefd88ba..d6697fae8c 100644 --- a/src/pretix/control/signals.py +++ b/src/pretix/control/signals.py @@ -1,3 +1,5 @@ +from django.dispatch import Signal + from pretix.base.signals import EventPluginSignal """ @@ -34,3 +36,16 @@ should return a list of dictionaries, where each dictionary can have the keys: event_dashboard_widgets = EventPluginSignal( providing_args=[] ) + +""" +This signal is sent out to include widgets to the personal user dashboard. Receivers +should return a list of dictionaries, where each dictionary can have the keys: +* content (str, containing HTML) +* minimal width (int, widget width in 1/12ths of the page, default ist 3, can be + ignored on small displays) +* priority (int, used for ordering, higher comes first, default is 1) +* link (str, optional, if the full widget should be a link) +""" +user_dashboard_widgets = Signal( + providing_args=['user'] +) diff --git a/src/pretix/control/templates/pretixcontrol/dashboard.html b/src/pretix/control/templates/pretixcontrol/dashboard.html index 879b72ca85..8a15a3cc6f 100644 --- a/src/pretix/control/templates/pretixcontrol/dashboard.html +++ b/src/pretix/control/templates/pretixcontrol/dashboard.html @@ -3,11 +3,19 @@ {% block title %}{% trans "Dashboard" %}{% endblock %} {% block content %}

{% trans "Dashboard" %}

-

- There is nothing yet to see on this dashboard. If you have any ideas what to put here, just tell us! -

-

- Probably, you are looking for your events. -

+
+ {% for w in widgets %} +
+ {% if w.url %} + + {{ w.content|safe }} + + {% else %} +
+ {{ w.content|safe }} +
+ {% endif %} +
+ {% endfor %} +
{% endblock %} diff --git a/src/pretix/control/urls.py b/src/pretix/control/urls.py index a9eb11ea2b..56c01510a6 100644 --- a/src/pretix/control/urls.py +++ b/src/pretix/control/urls.py @@ -1,8 +1,7 @@ from django.conf.urls import include, url from pretix.control.views import ( - auth, event, event_dashboard, item, main, orders, organizer, user, - vouchers, + auth, dashboards, event, item, main, orders, organizer, user, vouchers, ) urlpatterns = [ @@ -11,7 +10,7 @@ urlpatterns = [ url(r'^register$', auth.register, name='auth.register'), url(r'^forgot$', auth.Forgot.as_view(), name='auth.forgot'), url(r'^forgot/recover$', auth.Recover.as_view(), name='auth.forgot.recover'), - url(r'^$', main.index, name='index'), + url(r'^$', dashboards.user_index, name='index'), url(r'^settings$', user.UserSettings.as_view(), name='user.settings'), url(r'^organizers/$', organizer.OrganizerList.as_view(), name='organizers'), url(r'^organizers/add$', organizer.OrganizerCreate.as_view(), name='organizers.add'), @@ -20,7 +19,7 @@ urlpatterns = [ url(r'^events/add$', main.EventCreateStart.as_view(), name='events.add'), url(r'^event/(?P[^/]+)/add', main.EventCreate.as_view(), name='events.create'), url(r'^event/(?P[^/]+)/(?P[^/]+)/', include([ - url(r'^$', event_dashboard.index, name='event.index'), + url(r'^$', dashboards.event_index, name='event.index'), url(r'^live/$', event.EventLive.as_view(), name='event.live'), url(r'^settings/$', event.EventUpdate.as_view(), name='event.settings'), url(r'^settings/plugins$', event.EventPlugins.as_view(), name='event.settings.plugins'), diff --git a/src/pretix/control/views/event_dashboard.py b/src/pretix/control/views/dashboards.py similarity index 73% rename from src/pretix/control/views/event_dashboard.py rename to src/pretix/control/views/dashboards.py index 0f7749cc61..df7f323af2 100644 --- a/src/pretix/control/views/event_dashboard.py +++ b/src/pretix/control/views/dashboards.py @@ -5,10 +5,13 @@ from django.db.models import Sum from django.dispatch import receiver from django.shortcuts import render from django.utils import formats +from django.utils.formats import date_format from django.utils.translation import ugettext_lazy as _ -from pretix.base.models import Item, Order, OrderPosition -from pretix.control.signals import event_dashboard_widgets +from pretix.base.models import Event, Item, Order, OrderPosition +from pretix.control.signals import ( + event_dashboard_widgets, user_dashboard_widgets, +) NUM_WIDGET = '
{num}{text}
' @@ -106,7 +109,7 @@ def shop_state_widget(sender, **kwargs): }] -def index(request, organizer, event): +def event_index(request, organizer, event): widgets = [] for r, result in event_dashboard_widgets.send(sender=request.event): widgets.extend(result) @@ -116,6 +119,51 @@ def index(request, organizer, event): return render(request, 'pretixcontrol/event/index.html', ctx) +@receiver(signal=user_dashboard_widgets) +def user_event_widgets(**kwargs): + user = kwargs.pop('user') + widgets = [] + events = Event.objects.filter(permitted__id__exact=user.pk).select_related("organizer").order_by('-date_from') + for event in events: + widgets.append({ + 'content': '
{event}{df}{dt}
'.format( + event=event.name, df=date_format(event.date_from, 'SHORT_DATE_FORMAT'), + dt=date_format(event.date_to, 'SHORT_DATE_FORMAT') + ), + 'width': 3, + 'priority': 100, + 'url': reverse('control:event.index', kwargs={ + 'event': event.slug, + 'organizer': event.organizer.slug + }) + }) + return widgets + + +@receiver(signal=user_dashboard_widgets) +def new_event_widgets(**kwargs): + return [ + { + 'content': '
{t}
'.format( + t=_('Create a new event') + ), + 'width': 3, + 'priority': 50, + 'url': reverse('control:events.add') + } + ] + + +def user_index(request): + widgets = [] + for r, result in user_dashboard_widgets.send(request, user=request.user): + widgets.extend(result) + ctx = { + 'widgets': rearrange(widgets), + } + return render(request, 'pretixcontrol/dashboard.html', ctx) + + def rearrange(widgets: list): """ Small and stupid algorithm to arrange widget boxes without too many gaps while respecting diff --git a/src/pretix/control/views/main.py b/src/pretix/control/views/main.py index b2787e38ff..8b1723461a 100644 --- a/src/pretix/control/views/main.py +++ b/src/pretix/control/views/main.py @@ -24,10 +24,6 @@ class EventList(ListView): ) -def index(request): - return render(request, 'pretixcontrol/dashboard.html', {}) - - class EventCreateStart(TemplateView): template_name = 'pretixcontrol/events/start.html' diff --git a/src/static/pretixcontrol/less/main.less b/src/static/pretixcontrol/less/main.less index a88954489a..8e9aff285e 100644 --- a/src/static/pretixcontrol/less/main.less +++ b/src/static/pretixcontrol/less/main.less @@ -131,4 +131,26 @@ h1 .btn-sm { span.off { color: @brand-danger; } +} +.dashboard .event { + text-align: center; + padding: 30px; + font-size: 20px; + + span.from, span.to { + display: block; + font-size: 25px; + } +} +.dashboard .newevent { + text-align: center; + padding: 30px; + font-size: 20px; + + span.fa { + display: block; + font-size: 60px; + padding-bottom: 15px; + } + } \ No newline at end of file