import datetime as dt import json import pytz import random from django.contrib import messages from django.db.models import Case, OuterRef, Subquery, When from django.http import Http404, JsonResponse from django.shortcuts import redirect from django.urls import reverse from django.utils.functional import cached_property from django.utils.timezone import now from django.utils.translation import gettext_lazy as _ from django.views.generic import FormView from django.views.generic.base import TemplateView from django_context_decorator import context from pretalx.agenda.views.schedule import ScheduleMixin from pretalx.common.mixins.views import EventPermissionRequired, PermissionRequired from pretalx.common.signals import register_data_exporters from pretalx.schedule.exporters import ScheduleData from .forms import LowerThirdsSettingsForm class LowerThirdsView(TemplateView): template_name = "pretalx_lower_thirds/lower_thirds.html" class LowerThirdsOrgaView(PermissionRequired, FormView): form_class = LowerThirdsSettingsForm permission_required = 'orga.change_settings' template_name = "pretalx_lower_thirds/orga.html" def get_success_url(self): return self.request.path def form_valid(self, form): form.save() return super().form_valid(form) def get_object(self): return self.request.event def get_form_kwargs(self): kwargs = super().get_form_kwargs() return {'obj': self.request.event, 'attribute_name': 'settings', **kwargs} class ScheduleView(EventPermissionRequired, ScheduleMixin, TemplateView): permission_required = "agenda.view_schedule" def get(self, request, *args, **kwargs): schedule = ScheduleData( event=self.request.event, schedule=self.schedule, ) tz = pytz.timezone(schedule.event.timezone) return JsonResponse( { "conference": { "slug": schedule.event.slug, "name": str(schedule.event.name), "no_talk": str(schedule.event.settings.lower_thirds_no_talk_info), }, "rooms": sorted({ str(room["name"]) for day in schedule.data for room in day["rooms"] }), "talks": [ { "id": talk.submission.id, "start": talk.start.astimezone(tz).isoformat(), "end": (talk.start + dt.timedelta(minutes=talk.duration)).astimezone(tz).isoformat(), "slug": talk.frab_slug, "title": talk.submission.title, "persons": sorted({ person.get_display_name() for person in talk.submission.speakers.all() }), "track": { "color": talk.submission.track.color, "name": str(talk.submission.track.name), } if talk.submission.track else None, "room": str(room["name"]), "infoline": str(schedule.event.settings.lower_thirds_info_string).format( EVENT_SLUG=str(schedule.event.slug), TALK_SLUG=talk.frab_slug, CODE=talk.submission.code, ), } for day in schedule.data for room in day["rooms"] for talk in room["talks"] ], }, json_dumps_params={ "indent": 4, }, )