-
Notifications
You must be signed in to change notification settings - Fork 55
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Eventyay Common: Create an event dashboard (#505)
* Add dashboard eventyay common * Add custom css * Change background * Add component link for eventyay_common * Update css style * Fix isort * Add custom style * Add alert pop up, add line break * Resolve conversation: update template url * Refactor code eventyay_common * Refactor context and navigation * Add missing url return * Fix css error * Update tickets text * Resolve conversations * Fix isort warning * Update modal * Fix urljoin
- Loading branch information
Showing
16 changed files
with
801 additions
and
135 deletions.
There are no files selected for viewing
4 changes: 2 additions & 2 deletions
4
src/pretix/control/templates/pretixcontrol/event/component_link.html
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
32 changes: 17 additions & 15 deletions
32
src/pretix/control/templates/pretixcontrol/event/fragment_info_box.html
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,19 +1,21 @@ | ||
{% load i18n %} | ||
<div class="panel-heading"> | ||
<h3 class="panel-title"> | ||
{% trans "Event organizer" %} | ||
</h3> | ||
</div> | ||
<div class="panel-body timeline"> | ||
<div class="info-row"> | ||
{% trans "This event is organized by" %} <strong><a href="{% url 'control:organizer' request.organizer.slug %}">{{ request.organizer }}</a></strong> | ||
<div class="panel panel-default items widget-container widget-small no-padding last-column"> | ||
<div class="panel-heading"> | ||
<h3 class="panel-title"> | ||
{% trans "Event organizer" %} | ||
</h3> | ||
</div> | ||
<div class="info-row"> | ||
{% trans "Teams of the organizer are" %} | ||
<span></span> | ||
{% for id, name in organizer_teams %} | ||
<strong><a href="{% url 'control:organizer.team' request.organizer.slug id %}">{{ name }}</a></strong> | ||
{% if not forloop.last %}, {% endif %} | ||
{% endfor %} | ||
<div class="panel-body timeline overide-panel-body"> | ||
<div class="info-row"> | ||
{% trans "This event is organized by" %} <strong><a href="{% url 'control:organizer' request.organizer.slug %}">{{ request.organizer }}</a></strong> | ||
</div> | ||
<div class="info-row"> | ||
{% trans "Teams of the organizer are" %} | ||
<span></span> | ||
{% for id, name in organizer_teams %} | ||
<strong><a href="{% url 'control:organizer.team' request.organizer.slug id %}">{{ name }}</a></strong> | ||
{% if not forloop.last %}, {% endif %} | ||
{% endfor %} | ||
</div> | ||
</div> | ||
</div> |
62 changes: 32 additions & 30 deletions
62
src/pretix/control/templates/pretixcontrol/event/fragment_timeline.html
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,34 +1,36 @@ | ||
{% load i18n %} | ||
<div class="panel-heading"> | ||
<h3 class="panel-title"> | ||
{% trans "Your timeline" %} | ||
</h3> | ||
</div> | ||
<div class="panel-body timeline"> | ||
{% regroup timeline by date as tl_list %} | ||
{% for day in tl_list %} | ||
<div class="row {% if day.grouper < today %}text-muted{% endif %}"> | ||
<div class="col-date"> | ||
<strong>{{ day.grouper|date:"SHORT_DATE_FORMAT" }}</strong> | ||
</div> | ||
<div class="col-event"> | ||
{% for e in day.list %} | ||
<strong class="">{{ e.time|date:"TIME_FORMAT" }}</strong> | ||
| ||
<span class="{% if e.time < nearly_now %}text-muted{% endif %}"> | ||
{{ e.entry.description }} | ||
</span> | ||
{% if e.entry.edit_url %} | ||
<div class="panel panel-default items widget-container widget-small no-padding column"> | ||
<div class="panel-heading"> | ||
<h3 class="panel-title"> | ||
{% trans "Your timeline" %} | ||
</h3> | ||
</div> | ||
<div class="panel-body timeline overide-panel-body"> | ||
{% regroup timeline by date as tl_list %} | ||
{% for day in tl_list %} | ||
<div class="row {% if day.grouper < today %}text-muted{% endif %}"> | ||
<div class="col-date"> | ||
<strong>{{ day.grouper|date:"SHORT_DATE_FORMAT" }}</strong> | ||
</div> | ||
<div class="col-event"> | ||
{% for e in day.list %} | ||
<strong class="">{{ e.time|date:"TIME_FORMAT" }}</strong> | ||
| ||
<a href="{{ e.entry.edit_url }}" class="text-muted"> | ||
<span class="fa fa-edit"></span> | ||
</a> | ||
{% endif %} | ||
{% if forloop.revcounter > 1 %} | ||
<br/> | ||
{% endif %} | ||
{% endfor %} | ||
<span class="{% if e.time < nearly_now %}text-muted{% endif %}"> | ||
{{ e.entry.description }} | ||
</span> | ||
{% if e.entry.edit_url %} | ||
| ||
<a href="{{ e.entry.edit_url }}" class="text-muted"> | ||
<span class="fa fa-edit"></span> | ||
</a> | ||
{% endif %} | ||
{% if forloop.revcounter > 1 %} | ||
<br/> | ||
{% endif %} | ||
{% endfor %} | ||
</div> | ||
</div> | ||
</div> | ||
{% endfor %} | ||
{% endfor %} | ||
</div> | ||
</div> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,98 +1,120 @@ | ||
from importlib import import_module | ||
import logging | ||
from urllib.parse import urljoin | ||
|
||
from django.conf import settings | ||
from django.db.models import Q | ||
from django.urls import Resolver404, get_script_prefix, resolve, reverse | ||
from django.utils.translation import gettext_lazy as _ | ||
from django.http import HttpRequest | ||
from django.urls import Resolver404, get_script_prefix, resolve | ||
from django_scopes import scope | ||
|
||
from pretix.base.models.auth import StaffSession | ||
from pretix.base.settings import GlobalSettingsObject | ||
from pretix.control.navigation import merge_in | ||
from pretix.control.signals import nav_global | ||
from pretix.eventyay_common.navigation import ( | ||
get_event_navigation, get_global_navigation, | ||
) | ||
|
||
SessionStore = import_module(settings.SESSION_ENGINE).SessionStore | ||
from ..helpers.plugin_enable import is_video_enabled | ||
from ..multidomain.urlreverse import get_event_domain | ||
from .views.event import EventCreatedFor | ||
|
||
logger = logging.getLogger(__name__) | ||
|
||
def contextprocessor(request): | ||
""" | ||
Adds data to all template contexts | ||
""" | ||
if not hasattr(request, '_eventyay_common_default_context'): | ||
|
||
def contextprocessor(request: HttpRequest): | ||
if not hasattr(request, "_eventyay_common_default_context"): | ||
request._eventyay_common_default_context = _default_context(request) | ||
return request._eventyay_common_default_context | ||
|
||
|
||
def _default_context(request): | ||
def _default_context(request: HttpRequest): | ||
try: | ||
url = resolve(request.path_info) | ||
except Resolver404: | ||
return {} | ||
|
||
if not request.path.startswith(get_script_prefix() + 'common'): | ||
if not request.path.startswith(f"{get_script_prefix()}common"): | ||
return {} | ||
ctx = { | ||
'url_name': url.url_name, | ||
'settings': settings, | ||
'django_settings': settings, | ||
'DEBUG': settings.DEBUG, | ||
"url_name": url.url_name, | ||
"settings": settings, | ||
"django_settings": settings, | ||
"DEBUG": settings.DEBUG, | ||
"talk_hostname": settings.TALK_HOSTNAME, | ||
} | ||
if getattr(request, 'event', None) and hasattr(request, 'organizer') and request.user.is_authenticated: | ||
ctx['nav_items'] = get_global_navigation(request) | ||
|
||
elif request.user.is_authenticated: | ||
ctx['nav_items'] = get_global_navigation(request) | ||
|
||
gs = GlobalSettingsObject() | ||
ctx['global_settings'] = gs.settings | ||
|
||
if request.user.is_authenticated: | ||
ctx['staff_session'] = request.user.has_active_staff_session(request.session.session_key) | ||
ctx['staff_need_to_explain'] = ( | ||
StaffSession.objects.filter(user=request.user, date_end__isnull=False).filter( | ||
Q(comment__isnull=True) | Q(comment="") | ||
ctx["global_settings"] = gs.settings | ||
|
||
if not request.user.is_authenticated: | ||
return ctx | ||
|
||
ctx["nav_items"] = get_global_navigation(request) | ||
ctx["staff_session"] = request.user.has_active_staff_session( | ||
request.session.session_key | ||
) | ||
ctx["staff_need_to_explain"] = ( | ||
StaffSession.objects.filter(user=request.user, date_end__isnull=False).filter( | ||
Q(comment__isnull=True) | Q(comment="") | ||
) | ||
if request.user.is_staff and settings.PRETIX_ADMIN_AUDIT_COMMENTS | ||
else StaffSession.objects.none() | ||
) | ||
|
||
# Verify if the request includes an event | ||
event = getattr(request, "event", None) | ||
if not event: | ||
return ctx | ||
|
||
ctx["talk_edit_url"] = urljoin(settings.TALK_HOSTNAME, f"orga/event/{event.slug}") | ||
ctx["is_video_enabled"] = is_video_enabled(event) | ||
ctx["is_talk_event_created"] = False | ||
if ( | ||
event.settings.create_for == EventCreatedFor.BOTH.value | ||
or event.settings.talk_schedule_public is not None | ||
): | ||
ctx["is_talk_event_created"] = True | ||
|
||
# Verify if the request includes an organizer | ||
organizer = getattr(request, "organizer", None) | ||
if not organizer: | ||
return ctx | ||
|
||
ctx["nav_items"] = get_event_navigation(request, event) | ||
ctx["has_domain"] = get_event_domain(event, fallback=True) is not None | ||
if not event.testmode: | ||
with scope(organizer=organizer): | ||
complain_testmode_orders = event.cache.get("complain_testmode_orders") | ||
if complain_testmode_orders is None: | ||
complain_testmode_orders = event.orders.filter(testmode=True).exists() | ||
event.cache.set( | ||
"complain_testmode_orders", complain_testmode_orders, 30 | ||
) | ||
ctx["complain_testmode_orders"] = ( | ||
complain_testmode_orders | ||
and request.user.has_event_permission( | ||
organizer, event, "can_view_orders", request=request | ||
) | ||
if request.user.is_staff and settings.PRETIX_ADMIN_AUDIT_COMMENTS else StaffSession.objects.none() | ||
) | ||
|
||
ctx['talk_hostname'] = settings.TALK_HOSTNAME | ||
else: | ||
ctx["complain_testmode_orders"] = False | ||
|
||
if not event.live and ctx["has_domain"]: | ||
child_sess_key = f"child_session_{event.pk}" | ||
child_sess = request.session.get(child_sess_key) | ||
|
||
if not child_sess: | ||
request.session[child_sess_key] = request.session.session_key | ||
else: | ||
ctx["new_session"] = child_sess | ||
request.session["event_access"] = True | ||
|
||
if request.GET.get("subevent", ""): | ||
subevent_id = request.GET.get("subevent", "").strip() | ||
try: | ||
pk = int(subevent_id) | ||
# Do not use .get() for lazy evaluation | ||
ctx["selected_subevents"] = event.subevents.filter(pk=pk) | ||
except ValueError as e: | ||
logger.error("Error parsing subevent ID: %s", e) | ||
|
||
return ctx | ||
|
||
|
||
def get_global_navigation(request): | ||
url = request.resolver_match | ||
if not url: | ||
return [] | ||
nav = [ | ||
{ | ||
'label': _('Dashboard'), | ||
'url': reverse('eventyay_common:dashboard'), | ||
'active': (url.url_name == 'dashboard'), | ||
'icon': 'dashboard', | ||
}, | ||
{ | ||
'label': _('My Events'), | ||
'url': reverse('eventyay_common:events'), | ||
'active': 'events' in url.url_name, | ||
'icon': 'calendar', | ||
}, | ||
{ | ||
'label': _('Organizers'), | ||
'url': reverse('eventyay_common:organizers'), | ||
'active': 'organizers' in url.url_name, | ||
'icon': 'group', | ||
}, | ||
{ | ||
'label': _('Account'), | ||
'url': reverse('eventyay_common:account'), | ||
'active': 'account' in url.url_name, | ||
'icon': 'user', | ||
} | ||
|
||
] | ||
|
||
merge_in(nav, sorted( | ||
sum((list(a[1]) for a in nav_global.send(request, request=request)), []), | ||
key=lambda r: (1 if r.get('parent') else 0, r['label']) | ||
)) | ||
return nav |
Oops, something went wrong.