|
1 |
| -from importlib import import_module |
| 1 | +import logging |
| 2 | +from urllib.parse import urljoin |
2 | 3 |
|
3 | 4 | from django.conf import settings
|
4 | 5 | from django.db.models import Q
|
5 |
| -from django.urls import Resolver404, get_script_prefix, resolve, reverse |
6 |
| -from django.utils.translation import gettext_lazy as _ |
| 6 | +from django.http import HttpRequest |
| 7 | +from django.urls import Resolver404, get_script_prefix, resolve |
| 8 | +from django_scopes import scope |
7 | 9 |
|
8 | 10 | from pretix.base.models.auth import StaffSession
|
9 | 11 | from pretix.base.settings import GlobalSettingsObject
|
10 |
| -from pretix.control.navigation import merge_in |
11 |
| -from pretix.control.signals import nav_global |
| 12 | +from pretix.eventyay_common.navigation import ( |
| 13 | + get_event_navigation, get_global_navigation, |
| 14 | +) |
12 | 15 |
|
13 |
| -SessionStore = import_module(settings.SESSION_ENGINE).SessionStore |
| 16 | +from ..helpers.plugin_enable import is_video_enabled |
| 17 | +from ..multidomain.urlreverse import get_event_domain |
| 18 | +from .views.event import EventCreatedFor |
14 | 19 |
|
| 20 | +logger = logging.getLogger(__name__) |
15 | 21 |
|
16 |
| -def contextprocessor(request): |
17 |
| - """ |
18 |
| - Adds data to all template contexts |
19 |
| - """ |
20 |
| - if not hasattr(request, '_eventyay_common_default_context'): |
| 22 | + |
| 23 | +def contextprocessor(request: HttpRequest): |
| 24 | + if not hasattr(request, "_eventyay_common_default_context"): |
21 | 25 | request._eventyay_common_default_context = _default_context(request)
|
22 | 26 | return request._eventyay_common_default_context
|
23 | 27 |
|
24 | 28 |
|
25 |
| -def _default_context(request): |
| 29 | +def _default_context(request: HttpRequest): |
26 | 30 | try:
|
27 | 31 | url = resolve(request.path_info)
|
28 | 32 | except Resolver404:
|
29 | 33 | return {}
|
30 | 34 |
|
31 |
| - if not request.path.startswith(get_script_prefix() + 'common'): |
| 35 | + if not request.path.startswith(f"{get_script_prefix()}common"): |
32 | 36 | return {}
|
33 | 37 | ctx = {
|
34 |
| - 'url_name': url.url_name, |
35 |
| - 'settings': settings, |
36 |
| - 'django_settings': settings, |
37 |
| - 'DEBUG': settings.DEBUG, |
| 38 | + "url_name": url.url_name, |
| 39 | + "settings": settings, |
| 40 | + "django_settings": settings, |
| 41 | + "DEBUG": settings.DEBUG, |
| 42 | + "talk_hostname": settings.TALK_HOSTNAME, |
38 | 43 | }
|
39 |
| - if getattr(request, 'event', None) and hasattr(request, 'organizer') and request.user.is_authenticated: |
40 |
| - ctx['nav_items'] = get_global_navigation(request) |
41 |
| - |
42 |
| - elif request.user.is_authenticated: |
43 |
| - ctx['nav_items'] = get_global_navigation(request) |
44 | 44 |
|
45 | 45 | gs = GlobalSettingsObject()
|
46 |
| - ctx['global_settings'] = gs.settings |
47 |
| - |
48 |
| - if request.user.is_authenticated: |
49 |
| - ctx['staff_session'] = request.user.has_active_staff_session(request.session.session_key) |
50 |
| - ctx['staff_need_to_explain'] = ( |
51 |
| - StaffSession.objects.filter(user=request.user, date_end__isnull=False).filter( |
52 |
| - Q(comment__isnull=True) | Q(comment="") |
| 46 | + ctx["global_settings"] = gs.settings |
| 47 | + |
| 48 | + if not request.user.is_authenticated: |
| 49 | + return ctx |
| 50 | + |
| 51 | + ctx["nav_items"] = get_global_navigation(request) |
| 52 | + ctx["staff_session"] = request.user.has_active_staff_session( |
| 53 | + request.session.session_key |
| 54 | + ) |
| 55 | + ctx["staff_need_to_explain"] = ( |
| 56 | + StaffSession.objects.filter(user=request.user, date_end__isnull=False).filter( |
| 57 | + Q(comment__isnull=True) | Q(comment="") |
| 58 | + ) |
| 59 | + if request.user.is_staff and settings.PRETIX_ADMIN_AUDIT_COMMENTS |
| 60 | + else StaffSession.objects.none() |
| 61 | + ) |
| 62 | + |
| 63 | + # Verify if the request includes an event |
| 64 | + event = getattr(request, "event", None) |
| 65 | + if not event: |
| 66 | + return ctx |
| 67 | + |
| 68 | + ctx["talk_edit_url"] = urljoin(settings.TALK_HOSTNAME, f"orga/event/{event.slug}") |
| 69 | + ctx["is_video_enabled"] = is_video_enabled(event) |
| 70 | + ctx["is_talk_event_created"] = False |
| 71 | + if ( |
| 72 | + event.settings.create_for == EventCreatedFor.BOTH.value |
| 73 | + or event.settings.talk_schedule_public is not None |
| 74 | + ): |
| 75 | + ctx["is_talk_event_created"] = True |
| 76 | + |
| 77 | + # Verify if the request includes an organizer |
| 78 | + organizer = getattr(request, "organizer", None) |
| 79 | + if not organizer: |
| 80 | + return ctx |
| 81 | + |
| 82 | + ctx["nav_items"] = get_event_navigation(request, event) |
| 83 | + ctx["has_domain"] = get_event_domain(event, fallback=True) is not None |
| 84 | + if not event.testmode: |
| 85 | + with scope(organizer=organizer): |
| 86 | + complain_testmode_orders = event.cache.get("complain_testmode_orders") |
| 87 | + if complain_testmode_orders is None: |
| 88 | + complain_testmode_orders = event.orders.filter(testmode=True).exists() |
| 89 | + event.cache.set( |
| 90 | + "complain_testmode_orders", complain_testmode_orders, 30 |
| 91 | + ) |
| 92 | + ctx["complain_testmode_orders"] = ( |
| 93 | + complain_testmode_orders |
| 94 | + and request.user.has_event_permission( |
| 95 | + organizer, event, "can_view_orders", request=request |
53 | 96 | )
|
54 |
| - if request.user.is_staff and settings.PRETIX_ADMIN_AUDIT_COMMENTS else StaffSession.objects.none() |
55 | 97 | )
|
56 |
| - |
57 |
| - ctx['talk_hostname'] = settings.TALK_HOSTNAME |
| 98 | + else: |
| 99 | + ctx["complain_testmode_orders"] = False |
| 100 | + |
| 101 | + if not event.live and ctx["has_domain"]: |
| 102 | + child_sess_key = f"child_session_{event.pk}" |
| 103 | + child_sess = request.session.get(child_sess_key) |
| 104 | + |
| 105 | + if not child_sess: |
| 106 | + request.session[child_sess_key] = request.session.session_key |
| 107 | + else: |
| 108 | + ctx["new_session"] = child_sess |
| 109 | + request.session["event_access"] = True |
| 110 | + |
| 111 | + if request.GET.get("subevent", ""): |
| 112 | + subevent_id = request.GET.get("subevent", "").strip() |
| 113 | + try: |
| 114 | + pk = int(subevent_id) |
| 115 | + # Do not use .get() for lazy evaluation |
| 116 | + ctx["selected_subevents"] = event.subevents.filter(pk=pk) |
| 117 | + except ValueError as e: |
| 118 | + logger.error("Error parsing subevent ID: %s", e) |
58 | 119 |
|
59 | 120 | return ctx
|
60 |
| - |
61 |
| - |
62 |
| -def get_global_navigation(request): |
63 |
| - url = request.resolver_match |
64 |
| - if not url: |
65 |
| - return [] |
66 |
| - nav = [ |
67 |
| - { |
68 |
| - 'label': _('Dashboard'), |
69 |
| - 'url': reverse('eventyay_common:dashboard'), |
70 |
| - 'active': (url.url_name == 'dashboard'), |
71 |
| - 'icon': 'dashboard', |
72 |
| - }, |
73 |
| - { |
74 |
| - 'label': _('My Events'), |
75 |
| - 'url': reverse('eventyay_common:events'), |
76 |
| - 'active': 'events' in url.url_name, |
77 |
| - 'icon': 'calendar', |
78 |
| - }, |
79 |
| - { |
80 |
| - 'label': _('Organizers'), |
81 |
| - 'url': reverse('eventyay_common:organizers'), |
82 |
| - 'active': 'organizers' in url.url_name, |
83 |
| - 'icon': 'group', |
84 |
| - }, |
85 |
| - { |
86 |
| - 'label': _('Account'), |
87 |
| - 'url': reverse('eventyay_common:account'), |
88 |
| - 'active': 'account' in url.url_name, |
89 |
| - 'icon': 'user', |
90 |
| - } |
91 |
| - |
92 |
| - ] |
93 |
| - |
94 |
| - merge_in(nav, sorted( |
95 |
| - sum((list(a[1]) for a in nav_global.send(request, request=request)), []), |
96 |
| - key=lambda r: (1 if r.get('parent') else 0, r['label']) |
97 |
| - )) |
98 |
| - return nav |
|
0 commit comments