Skip to content
Snippets Groups Projects
Select Git revision
  • 668daf92d3b1c32aaf2c64a8f8e162c485bd5efc
  • main default protected
  • 75389691-a67c-422a-91e9-aa58bfb5-main-patch-32205
  • test-pipe
  • extended-scripts
  • structured-badges
  • guix-pipeline
  • cabal-pipeline
8 results

LayerData.hs

Blame
  • general.py 7.80 KiB
    __all__ = (
        'ComponentGalleryView',
        'IndexView',
        'LandingView',
        'MetaNavView',
        'SearchView',
        'TagView',
        'UnderConstructionView',
    )
    
    from datetime import timedelta
    
    from django.contrib.contenttypes.models import ContentType
    from django.shortcuts import get_object_or_404, redirect
    from django.urls import reverse
    from django.utils import timezone
    from django.utils.timezone import now
    from django.views.generic.base import TemplateView
    
    from core.models import (
        Assembly,
        ConferenceTag,
        Event,
        MetaNavItem,
        Project,
        Room,
        RoomLink,
        TagItem,
    )
    from core.search import search
    
    from plainui.forms import (
        ExampleForm,
    )
    from plainui.views.utils import (
        ConferenceRequiredMixin,
        session_get_favorite_assemblies,
        session_get_favorite_events,
        session_get_favorite_projects,
    )
    
    
    class LandingView(ConferenceRequiredMixin, TemplateView):
        template_name = 'plainui/landing.html.j2'
        require_login = False
        require_conference_member = False
    
        def get(self, request, *args, **kwargs):
            if not self.conf.require_login:
                return redirect(reverse('plainui:index'))
            return super().get(request, *args, **kwargs)
    
        def get_context_data(self, **kwargs):
            context = super().get_context_data(**kwargs)
            context['conf'] = self.conf
            context['hide_header'] = True
    
            return context
    
    
    class IndexView(ConferenceRequiredMixin, TemplateView):
        template_name = 'plainui/index.html.j2'
    
        def get_context_data(self, **kwargs):
            context = super().get_context_data(**kwargs)
            context['conf'] = self.conf
            context['is_favorite_events'] = session_get_favorite_events(self.request.session, self.request.user)
            context['public_streams'] = (
                Room.objects.conference_accessible(self.conf)
                .filter(is_public_fahrplan=True, links__link_type=RoomLink.LinkType.MEDIA_CCC_DE)
                .order_by('official_room_order')
                .distinct()
            )
    
            context['upcoming_events_official'] = (
                Event.objects.conference_accessible(self.conf).order_by('schedule_start').filter(kind=Event.Kind.OFFICIAL).filter(schedule_end__gt=now())[:10]
            )
            context['upcoming_events_self_organized'] = (
                Event.objects.conference_accessible(self.conf).order_by('schedule_start').filter(kind=Event.Kind.SELF_ORGANIZED).filter(schedule_end__gt=now())[:10]
            )
    
            context['report_info'] = {'enabled': True}
    
            return context
    
    
    class UnderConstructionView(ConferenceRequiredMixin, TemplateView):
        template_name = 'plainui/under_construction.html.j2'
        only_published = False
    
        def get_context_data(self, **kwargs):
            context = super().get_context_data(**kwargs)
            context['conf'] = self.conf
    
            context['report_info'] = {'enabled': True}
    
            return context
    
    
    class MetaNavView(ConferenceRequiredMixin, TemplateView):
        require_login = False
        require_conference_member = False
        only_published = False
        template_name = 'plainui/metanav.html.j2'
    
        # TODO: implement caching, e.g. using ConferenceExportCache?
    
        def get_context_data(self, **kwargs):
            context = super().get_context_data(**kwargs)
            context['conf'] = self.conf
            context['include_header'] = self.request.GET.get('full') != '0'
            context['theme'] = 'dark'  # TODO: react to theme switching
            context['active_item'] = self.request.GET.get('active')
            context['items'] = MetaNavItem.objects.for_conference(self.conf)
            return context
    
    
    class TagView(ConferenceRequiredMixin, TemplateView):
        template_name = 'plainui/tag.html.j2'
    
        def get_context_data(self, tag_slug, **kwargs):
            context = super().get_context_data(tag_slug=tag_slug, **kwargs)
            context['conf'] = self.conf
    
            tag = get_object_or_404(ConferenceTag, slug=tag_slug)
            context['tag'] = tag
    
            # TODO other types. What should we link here?
            # TODO: consider using views.utils.event_filter() here
            context['events'] = (
                Event.objects.conference_accessible(self.conf)
                .filter(id__in=TagItem.objects.filter(tag=tag, target_type=ContentType.objects.get_for_model(Event)).values_list('target_id'))
                .filter(schedule_start__isnull=False, schedule_end__isnull=False)
                .order_by('schedule_start', 'schedule_end')
            )
            context['my_favorite_events'] = session_get_favorite_events(self.request.session, self.request.user)
    
            context['assemblies'] = Assembly.objects.conference_accessible(self.conf).filter(
                id__in=TagItem.objects.filter(tag=tag, target_type=ContentType.objects.get_for_model(Assembly)).values_list('target_id')
            )
            context['my_favorite_assemblies'] = session_get_favorite_assemblies(self.request.session, self.request.user)
            context['projects'] = Project.objects.conference_accessible(self.conf).filter(tags__tag=tag)
            context['my_favorite_projects'] = session_get_favorite_projects(self.request.session, self.request.user)
    
            return context
    
    
    class SearchView(ConferenceRequiredMixin, TemplateView):
        template_name = 'plainui/search.html.j2'
    
        def get(self, request, *args, **kwargs):
            return redirect(reverse('plainui:index'))
    
        def post(self, request, **kwargs):
            context = self.get_context_data(**kwargs)
            return self.render_to_response(context)
    
        def get_context_data(self, **kwargs):
            context = super().get_context_data(**kwargs)
            context['conf'] = self.conf
            q = self.request.POST.get('q', '')
            context['search_query'] = q
    
            results = []
            for result in search(self.request.user, self.conf, q):
                results.append({'type': result.__class__.__name__, 'item': result})
            context['search_results'] = results
            return context
    
    
    class ComponentGalleryView(TemplateView):
        template_name = 'plainui/component_gallery.html.j2'
    
        def get_context_data(self, **kwargs):
            form_invalid = ExampleForm({'text': '', 'textarea': ''})
            form_invalid.full_clean()
            return super().get_context_data(
                **kwargs,
                form_valid=ExampleForm({'text': 'lorem ipsum', 'password': 'lorem ipsum', 'checkbox': True, 'textarea': 'blork'}),
                form_invalid=form_invalid,
                conf={
                    'slug': 'sample',
                    'name': 'Example',
                    'id': 'confID',
                    'get_navigation_tree': lambda: [
                        {
                            'label': 'Conference',
                            'title': 'Conference',
                            'icon': 'hammer',
                            'url': '/',
                        }
                    ],
                    'map_config': {
                        'frontend': {
                            'start': {'latitude': 53.56172, 'longitude': 9.98593, 'zoom': 16},
                            'style': {
                                'version': 8,
                                'sources': {
                                    'osm-raster': {
                                        'type': 'raster',
                                        'tiles': ['https://tile.openstreetmap.org/{z}/{x}/{y}.png'],
                                        'tileSize': 256,
                                        'attribution': '© OpenStreetMap contributors / test use only!!!',
                                    }
                                },
                                'layers': [{'id': 'simple-tiles', 'type': 'raster', 'source': 'osm-raster', 'minzoom': 0, 'maxzoom': 19}],
                            },
                        }
                    },
                },
                demo_map_startpos={'longitude': 9.98641, 'latitude': 53.56148},
                csrf_input='xss-safe',
                hide_header=True,
                time1=timezone.now(),
                time2=timezone.now() + timedelta(minutes=45),
                duration=timedelta(minutes=45),
            )