Make navigation structure more approachable to new users (#1083)

* Move event selector to sidebar

* Unify navigation

* Fix confusing icons
This commit is contained in:
Raphael Michel
2018-11-12 11:30:36 +01:00
committed by GitHub
parent b9534f23f5
commit 09a9d610f8
46 changed files with 831 additions and 557 deletions

View File

@@ -46,7 +46,6 @@ from pretix.control.forms.event import (
TicketSettingsForm, WidgetCodeForm,
)
from pretix.control.permissions import EventPermissionRequiredMixin
from pretix.control.signals import nav_event_settings
from pretix.helpers.database import rolledback_transaction
from pretix.helpers.urls import build_absolute_uri
from pretix.multidomain.urlreverse import get_domain
@@ -60,12 +59,7 @@ from ..logdisplay import OVERVIEW_BLACKLIST
class EventSettingsViewMixin:
def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs)
ctx['nav_event_settings'] = []
ctx['is_event_settings'] = True
for recv, retv in nav_event_settings.send(sender=self.request.event, request=self.request):
ctx['nav_event_settings'] += retv
ctx['nav_event_settings'].sort(key=lambda n: n['label'])
return ctx

View File

@@ -17,6 +17,55 @@ from pretix.helpers.daterange import daterange
from pretix.helpers.i18n import i18ncomp
def serialize_user(u):
return {
'id': u.pk,
'type': 'user',
'name': str(u),
'text': str(u),
'url': reverse('control:index')
}
def serialize_orga(o):
return {
'id': o.pk,
'slug': o.slug,
'type': 'organizer',
'name': str(o.name),
'text': str(o.name),
'url': reverse('control:organizer', kwargs={
'organizer': o.slug
})
}
def serialize_event(e):
dr = e.get_date_range_display()
if e.has_subevents:
if e.min_from is None:
dr = pgettext('subevent', 'No dates')
else:
tz = pytz.timezone(e.settings.timezone)
dr = _('Series:') + ' ' + daterange(
e.min_from.astimezone(tz),
(e.max_fromto or e.max_to or e.max_from).astimezone(tz)
)
return {
'id': e.pk,
'slug': e.slug,
'type': 'event',
'organizer': str(e.organizer.name),
'name': str(e.name),
'text': str(e.name),
'date_range': dr,
'url': reverse('control:event.index', kwargs={
'event': e.slug,
'organizer': e.organizer.slug
})
}
def event_list(request):
query = request.GET.get('query', '')
try:
@@ -35,37 +84,12 @@ def event_list(request):
order_from=Coalesce('min_from', 'date_from'),
).order_by('-order_from')
def serialize(e):
dr = e.get_date_range_display()
if e.has_subevents:
if e.min_from is None:
dr = pgettext('subevent', 'No dates')
else:
tz = pytz.timezone(e.settings.timezone)
dr = _('Series:') + ' ' + daterange(
e.min_from.astimezone(tz),
(e.max_fromto or e.max_to or e.max_from).astimezone(tz)
)
return {
'id': e.pk,
'slug': e.slug,
'organizer': str(e.organizer.name),
'name': str(e.name),
'text': str(e.name),
'date_range': dr,
'url': reverse('control:event.index', kwargs={
'event': e.slug,
'organizer': e.organizer.slug
})
}
total = qs.count()
pagesize = 20
offset = (page - 1) * pagesize
doc = {
'results': [
serialize(e) for e in qs.select_related('organizer')[offset:offset + pagesize]
serialize_event(e) for e in qs.select_related('organizer')[offset:offset + pagesize]
],
'pagination': {
"more": total >= (offset + pagesize)
@@ -74,6 +98,51 @@ def event_list(request):
return JsonResponse(doc)
def nav_context_list(request):
query = request.GET.get('query', '')
try:
page = int(request.GET.get('page', '1'))
except ValueError:
page = 1
qs_events = request.user.get_events_with_any_permission(request).filter(
Q(name__icontains=i18ncomp(query)) | Q(slug__icontains=query)
).annotate(
min_from=Min('subevents__date_from'),
max_from=Max('subevents__date_from'),
max_to=Max('subevents__date_to'),
max_fromto=Greatest(Max('subevents__date_to'), Max('subevents__date_from'))
).annotate(
order_from=Coalesce('min_from', 'date_from'),
).order_by('-order_from')
if request.user.has_active_staff_session(request.session.session_key):
qs_orga = Organizer.objects.all()
else:
qs_orga = Organizer.objects.filter(pk__in=request.user.teams.values_list('organizer', flat=True))
if query:
qs_orga = qs_orga.filter(Q(name__icontains=query) | Q(slug__icontains=query))
show_user = not query or query.lower() in request.user.email.lower() or query.lower() in request.user.fullname.lower()
total = qs_events.count() + qs_orga.count()
pagesize = 20
offset = (page - 1) * pagesize
results = ([
serialize_user(request.user)
] if show_user else []) + [
serialize_orga(e) for e in qs_orga[offset:offset + (pagesize if query else 5)]
] + [
serialize_event(e) for e in qs_events.select_related('organizer')[offset:offset + (pagesize if query else 5)]
]
doc = {
'results': results,
'pagination': {
"more": total >= (offset + pagesize)
}
}
return JsonResponse(doc)
@event_permission_required(None)
def subevent_select2(request, **kwargs):
query = request.GET.get('query', '')