diff --git a/pretalx_broadcast_tools/urls.py b/pretalx_broadcast_tools/urls.py index 2b5f52f..daab6b1 100644 --- a/pretalx_broadcast_tools/urls.py +++ b/pretalx_broadcast_tools/urls.py @@ -1,42 +1,46 @@ from django.urls import re_path from pretalx.event.models.event import SLUG_CHARS -from . import views +from .views.event_info import BroadcastToolsEventInfoView +from .views.orga import BroadcastToolsOrgaView +from .views.qr import BroadcastToolsFeedbackQrCodeSvg, BroadcastToolsPublicQrCodeSvg +from .views.schedule import BroadcastToolsScheduleView +from .views.static_html import BroadcastToolsLowerThirdsView, BroadcastToolsRoomInfoView urlpatterns = [ re_path( f"^(?P[{SLUG_CHARS}]+)/p/broadcast-tools/event.json$", - views.BroadcastToolsEventInfoView.as_view(), + BroadcastToolsEventInfoView.as_view(), name="event_info", ), re_path( f"^(?P[{SLUG_CHARS}]+)/p/broadcast-tools/schedule.json$", - views.BroadcastToolsScheduleView.as_view(), + BroadcastToolsScheduleView.as_view(), name="schedule", ), re_path( f"^(?P[{SLUG_CHARS}]+)/p/broadcast-tools/lower-thirds/$", - views.BroadcastToolsLowerThirdsView.as_view(), + BroadcastToolsLowerThirdsView.as_view(), name="lowerthirds", ), re_path( f"^(?P[{SLUG_CHARS}]+)/p/broadcast-tools/feedback-qr/(?P[0-9]+).svg$", - views.BroadcastToolsFeedbackQrCodeSvg.as_view(), + BroadcastToolsFeedbackQrCodeSvg.as_view(), name="feedback_qr_id", ), re_path( f"^(?P[{SLUG_CHARS}]+)/p/broadcast-tools/public-qr/(?P[0-9]+).svg$", - views.BroadcastToolsPublicQrCodeSvg.as_view(), + BroadcastToolsPublicQrCodeSvg.as_view(), name="public_qr_id", ), re_path( f"^(?P[{SLUG_CHARS}]+)/p/broadcast-tools/room-info/$", - views.BroadcastToolsRoomInfoView.as_view(), + BroadcastToolsRoomInfoView.as_view(), name="room_info", ), re_path( f"^orga/event/(?P[{SLUG_CHARS}]+)/settings/p/broadcast-tools/$", - views.BroadcastToolsOrgaView.as_view(), + BroadcastToolsOrgaView.as_view(), name="orga", ), ] diff --git a/pretalx_broadcast_tools/views/event_info.py b/pretalx_broadcast_tools/views/event_info.py new file mode 100644 index 0000000..46f855b --- /dev/null +++ b/pretalx_broadcast_tools/views/event_info.py @@ -0,0 +1,28 @@ +from django.http import JsonResponse +from django.views import View + + +class BroadcastToolsEventInfoView(View): + def get(self, request, *args, **kwargs): + color = self.request.event.primary_color or "#3aa57c" + return JsonResponse( + { + "color": color, + "name": self.request.event.name.localize(self.request.event.locale), + "no_talk": str( + self.request.event.settings.broadcast_tools_lower_thirds_no_talk_info + ), + "room-info": { + "lower_info": self.request.event.settings.broadcast_tools_room_info_lower_content + or "", + "show_next_talk": True + if self.request.event.settings.broadcast_tools_room_info_show_next_talk + else False, + }, + "slug": self.request.event.slug, + "start": self.request.event.date_from.isoformat(), + "end": self.request.event.date_to.isoformat(), + "timezone": str(self.request.event.tz), + "locale": self.request.event.locale, + }, + ) diff --git a/pretalx_broadcast_tools/views/orga.py b/pretalx_broadcast_tools/views/orga.py new file mode 100644 index 0000000..487db1c --- /dev/null +++ b/pretalx_broadcast_tools/views/orga.py @@ -0,0 +1,37 @@ +from django.views.generic import FormView +from pretalx.common.mixins.views import PermissionRequired + +from ..forms import BroadcastToolsSettingsForm + + +class BroadcastToolsOrgaView(PermissionRequired, FormView): + form_class = BroadcastToolsSettingsForm + permission_required = "orga.change_settings" + template_name = "pretalx_broadcast_tools/orga.html" + + def get_success_url(self): + return self.request.path + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context["localized_rooms"] = [ + room.name.localize(self.request.event.locale) + for room in self.request.event.rooms.all() + ] + return context + + 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", + "locales": self.request.event.locales, + **kwargs, + } diff --git a/pretalx_broadcast_tools/views/qr.py b/pretalx_broadcast_tools/views/qr.py new file mode 100644 index 0000000..618b562 --- /dev/null +++ b/pretalx_broadcast_tools/views/qr.py @@ -0,0 +1,30 @@ +from xml.etree import ElementTree as ET + +import qrcode +import qrcode.image.svg +from django.conf import settings +from django.http import HttpResponse +from django.utils.safestring import mark_safe +from django.views import View + + +class BroadcastToolsFeedbackQrCodeSvg(View): + def get(self, request, *args, **kwargs): + talk = self.request.event.submissions.filter(id=kwargs["talk"]).first() + domain = request.event.custom_domain or settings.SITE_URL + image = qrcode.make( + f"{domain}{talk.urls.feedback}", image_factory=qrcode.image.svg.SvgImage + ) + svg_data = mark_safe(ET.tostring(image.get_image()).decode()) + return HttpResponse(svg_data, content_type="image/svg+xml") + + +class BroadcastToolsPublicQrCodeSvg(View): + def get(self, request, *args, **kwargs): + talk = self.request.event.submissions.filter(id=kwargs["talk"]).first() + domain = request.event.custom_domain or settings.SITE_URL + image = qrcode.make( + f"{domain}{talk.urls.public}", image_factory=qrcode.image.svg.SvgImage + ) + svg_data = mark_safe(ET.tostring(image.get_image()).decode()) + return HttpResponse(svg_data, content_type="image/svg+xml") diff --git a/pretalx_broadcast_tools/views.py b/pretalx_broadcast_tools/views/schedule.py similarity index 57% rename from pretalx_broadcast_tools/views.py rename to pretalx_broadcast_tools/views/schedule.py index 62d5c78..182ce5a 100644 --- a/pretalx_broadcast_tools/views.py +++ b/pretalx_broadcast_tools/views/schedule.py @@ -1,110 +1,14 @@ import datetime as dt -from xml.etree import ElementTree as ET -import qrcode -import qrcode.image.svg from django.conf import settings -from django.http import HttpResponse, JsonResponse +from django.http import JsonResponse from django.urls import reverse -from django.utils.safestring import mark_safe from django.views import View -from django.views.generic import FormView -from django.views.generic.base import TemplateView from pretalx.agenda.views.schedule import ScheduleMixin -from pretalx.common.mixins.views import EventPermissionRequired, PermissionRequired +from pretalx.common.mixins.views import EventPermissionRequired from pretalx.schedule.exporters import ScheduleData -from .forms import BroadcastToolsSettingsForm -from .utils.placeholders import placeholders - - -class BroadcastToolsLowerThirdsView(TemplateView): - template_name = "pretalx_broadcast_tools/lower_thirds.html" - - -class BroadcastToolsRoomInfoView(TemplateView): - template_name = "pretalx_broadcast_tools/room_info.html" - - -class BroadcastToolsOrgaView(PermissionRequired, FormView): - form_class = BroadcastToolsSettingsForm - permission_required = "orga.change_settings" - template_name = "pretalx_broadcast_tools/orga.html" - - def get_success_url(self): - return self.request.path - - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - context["localized_rooms"] = [ - room.name.localize(self.request.event.locale) - for room in self.request.event.rooms.all() - ] - return context - - 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", - "locales": self.request.event.locales, - **kwargs, - } - - -class BroadcastToolsEventInfoView(View): - def get(self, request, *args, **kwargs): - color = self.request.event.primary_color or "#3aa57c" - return JsonResponse( - { - "color": color, - "name": self.request.event.name.localize(self.request.event.locale), - "no_talk": str( - self.request.event.settings.broadcast_tools_lower_thirds_no_talk_info - ), - "room-info": { - "lower_info": self.request.event.settings.broadcast_tools_room_info_lower_content - or "", - "show_next_talk": True - if self.request.event.settings.broadcast_tools_room_info_show_next_talk - else False, - }, - "slug": self.request.event.slug, - "start": self.request.event.date_from.isoformat(), - "end": self.request.event.date_to.isoformat(), - "timezone": str(self.request.event.tz), - "locale": self.request.event.locale, - }, - ) - - -class BroadcastToolsFeedbackQrCodeSvg(View): - def get(self, request, *args, **kwargs): - talk = self.request.event.submissions.filter(id=kwargs["talk"]).first() - domain = request.event.custom_domain or settings.SITE_URL - image = qrcode.make( - f"{domain}{talk.urls.feedback}", image_factory=qrcode.image.svg.SvgImage - ) - svg_data = mark_safe(ET.tostring(image.get_image()).decode()) - return HttpResponse(svg_data, content_type="image/svg+xml") - - -class BroadcastToolsPublicQrCodeSvg(View): - def get(self, request, *args, **kwargs): - talk = self.request.event.submissions.filter(id=kwargs["talk"]).first() - domain = request.event.custom_domain or settings.SITE_URL - image = qrcode.make( - f"{domain}{talk.urls.public}", image_factory=qrcode.image.svg.SvgImage - ) - svg_data = mark_safe(ET.tostring(image.get_image()).decode()) - return HttpResponse(svg_data, content_type="image/svg+xml") +from ..utils.placeholders import placeholders class BroadcastToolsScheduleView(EventPermissionRequired, ScheduleMixin, View): diff --git a/pretalx_broadcast_tools/views/static_html.py b/pretalx_broadcast_tools/views/static_html.py new file mode 100644 index 0000000..49d6c0b --- /dev/null +++ b/pretalx_broadcast_tools/views/static_html.py @@ -0,0 +1,9 @@ +from django.views.generic.base import TemplateView + + +class BroadcastToolsLowerThirdsView(TemplateView): + template_name = "pretalx_broadcast_tools/lower_thirds.html" + + +class BroadcastToolsRoomInfoView(TemplateView): + template_name = "pretalx_broadcast_tools/room_info.html"