From ab37c15bccf195013db45e717d70cb426e9a0f76 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Sat, 7 May 2016 14:29:51 +0200 Subject: [PATCH] Added a dashboard widget to help starting --- .../event/dashboard_widget_welcome.html | 12 +++ src/pretix/control/views/dashboards.py | 35 ++++++++ src/static/pretixcontrol/scss/_dashboard.scss | 79 +++++++++++++++++++ src/static/pretixcontrol/scss/main.scss | 68 +--------------- 4 files changed, 127 insertions(+), 67 deletions(-) create mode 100644 src/pretix/control/templates/pretixcontrol/event/dashboard_widget_welcome.html create mode 100644 src/static/pretixcontrol/scss/_dashboard.scss diff --git a/src/pretix/control/templates/pretixcontrol/event/dashboard_widget_welcome.html b/src/pretix/control/templates/pretixcontrol/event/dashboard_widget_welcome.html new file mode 100644 index 0000000000..33b860b58b --- /dev/null +++ b/src/pretix/control/templates/pretixcontrol/event/dashboard_widget_welcome.html @@ -0,0 +1,12 @@ +
+

{{ title }}

+ {% if subtitle %} +
{{ subtitle }}
+ {% endif %} + {% if text %} +

{{ text }}

+ {% endif %} + {% if button_text %} +

{{ button_text }}

+ {% endif %} +
\ No newline at end of file diff --git a/src/pretix/control/views/dashboards.py b/src/pretix/control/views/dashboards.py index cf6b293405..fc38fcc8be 100644 --- a/src/pretix/control/views/dashboards.py +++ b/src/pretix/control/views/dashboards.py @@ -4,6 +4,7 @@ from django.core.urlresolvers import reverse from django.db.models import Sum from django.dispatch import receiver from django.shortcuts import render +from django.template.loader import get_template from django.utils import formats from django.utils.formats import date_format from django.utils.translation import ugettext_lazy as _ @@ -110,6 +111,40 @@ def shop_state_widget(sender, **kwargs): }] +@receiver(signal=event_dashboard_widgets) +def welcome_wizard_widget(sender, **kwargs): + template = get_template('pretixcontrol/event/dashboard_widget_welcome.html') + ctx = { + 'title': _('Welcome to pretix!') + } + kwargs = {'event': sender.slug, 'organizer': sender.organizer.slug} + + if not sender.items.exists(): + ctx.update({ + 'subtitle': _('Get started by creating a product'), + 'text': _('The first thing you need for selling tickets to your conference is one or more "products" your ' + 'participants can choose from. A product can be a ticket or anything else that you want to sell, ' + 'e.g. additional merchandise in form of t-shirts.'), + 'button_text': _('Create a first product'), + 'button_url': reverse('control:event.items.add', kwargs=kwargs) + }) + elif not sender.quotas.exists(): + ctx.update({ + 'subtitle': _('Create quotas that apply to your products'), + 'text': _('Your tickets will only be available for sale if you create a matching quota, i.e. if you tell ' + 'pretix how many tickets it should sell for your event.'), + 'button_text': _('Create a first quota'), + 'button_url': reverse('control:event.items.quotas.add', kwargs=kwargs) + }) + else: + return [] + return [{ + 'width': 12, + 'priority': 2000, + 'content': template.render(ctx) + }] + + def event_index(request, organizer, event): widgets = [] for r, result in event_dashboard_widgets.send(sender=request.event): diff --git a/src/static/pretixcontrol/scss/_dashboard.scss b/src/static/pretixcontrol/scss/_dashboard.scss new file mode 100644 index 0000000000..a895ccf695 --- /dev/null +++ b/src/static/pretixcontrol/scss/_dashboard.scss @@ -0,0 +1,79 @@ +.dashboard-panels .panel-heading .fa { + opacity: 0.5; +} +.dashboard > div { + padding: 5px; +} +.dashboard .widget { + min-height: 160px; + background: #F8F8F8; + display: block; + position: relative; +} +.dashboard .widget:hover,.dashboard .widget:focus { + background: #EEEEEE; + text-decoration: none; +} +.dashboard .numwidget { + .num { + display: block; + padding: 28px 0 10px; + text-align: center; + font-size: 40px; + } + .text { + display: block; + text-align: center; + font-size: 20px; + } +} +.dashboard .shopstate { + text-align: center; + padding: 36px 0; + + span.live, span.off { + display: block; + font-size: 20px; + padding: 10px 0; + } + span.live { + color: $brand-success; + } + 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; + } +} +.dashboard .welcome-wizard { + padding: 30px; + h3 { + margin: 0 0 10px 0; + } + .attentionline { + font-size: 18px; + margin: 0 0 10px 0; + } + p:last-child { + margin-bottom: 0; + } +} diff --git a/src/static/pretixcontrol/scss/main.scss b/src/static/pretixcontrol/scss/main.scss index 3ffaa40f26..ff384797f9 100644 --- a/src/static/pretixcontrol/scss/main.scss +++ b/src/static/pretixcontrol/scss/main.scss @@ -7,6 +7,7 @@ $fa-font-path: static("fontawesome/fonts"); @import "_forms.scss"; @import "_flags.scss"; @import "_orders.scss"; +@import "_dashboard.scss"; footer { text-align: center; @@ -81,79 +82,12 @@ h1 .btn-sm { -ms-transform: rotateX(180deg); /* IE 9 */ -webkit-transform: rotateX(180deg); /* Safari and Chrome */ } -.dashboard-panels .panel-heading .fa { - opacity: 0.5; -} @media (max-width: $screen-sm-max) { .navbar-nav { margin-left: 0; } } -.dashboard > div { - padding: 5px; -} -.dashboard .widget { - min-height: 160px; - background: #F8F8F8; - display: block; - position: relative; -} -.dashboard .widget:hover,.dashboard .widget:focus { - background: #EEEEEE; - text-decoration: none; -} -.dashboard .numwidget { - .num { - display: block; - padding: 28px 0 10px; - text-align: center; - font-size: 40px; - } - .text { - display: block; - text-align: center; - font-size: 20px; - } -} -.dashboard .shopstate { - text-align: center; - padding: 36px 0; - - span.live, span.off { - display: block; - font-size: 20px; - padding: 10px 0; - } - span.live { - color: $brand-success; - } - 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; - } - -} .helper-display-inline { display: inline !important;