From 8000896f3de9b25713421ae926ba1ceaa33ac055 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=AD=C3=B0ir=20Valberg=20Gu=C3=B0mundsson?= Date: Sat, 15 Apr 2017 19:35:18 +0200 Subject: [PATCH] Adding channels with the schedule as first app using them. --- src/bornhack/routing.py | 8 +++ src/bornhack/settings.py | 28 ++++++++- src/program/consumers.py | 28 +++++++++ src/program/models.py | 17 ++++++ src/program/templates/schedule_overview.html | 61 +++++++++++++++++--- src/requirements.txt | 3 +- 6 files changed, 136 insertions(+), 9 deletions(-) create mode 100644 src/bornhack/routing.py create mode 100644 src/program/consumers.py diff --git a/src/bornhack/routing.py b/src/bornhack/routing.py new file mode 100644 index 00000000..7776c0e7 --- /dev/null +++ b/src/bornhack/routing.py @@ -0,0 +1,8 @@ +from program.consumers import ScheduleConsumer + + +channel_routing = [ + ScheduleConsumer.as_route(path=r"^/schedule/"), +] + + diff --git a/src/bornhack/settings.py b/src/bornhack/settings.py index 4006ef4e..aa0d6823 100644 --- a/src/bornhack/settings.py +++ b/src/bornhack/settings.py @@ -28,6 +28,8 @@ INSTALLED_APPS = [ 'django.contrib.staticfiles', 'django.contrib.sites', + 'channels', + 'profiles', 'camps', 'shop', @@ -108,9 +110,27 @@ MIDDLEWARE = [ if DEBUG: EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' - INSTALLED_APPS += ['debug_toolbar', ] + INSTALLED_APPS += [ + 'debug_toolbar', + 'channels_panel' + ] MIDDLEWARE = ['debug_toolbar.middleware.DebugToolbarMiddleware'] + MIDDLEWARE INTERNAL_IPS = "127.0.0.1" + DEBUG_TOOLBAR_PANELS = [ + 'debug_toolbar.panels.versions.VersionsPanel', + 'debug_toolbar.panels.timer.TimerPanel', + 'debug_toolbar.panels.settings.SettingsPanel', + 'debug_toolbar.panels.headers.HeadersPanel', + 'debug_toolbar.panels.request.RequestPanel', + 'debug_toolbar.panels.sql.SQLPanel', + 'debug_toolbar.panels.staticfiles.StaticFilesPanel', + 'debug_toolbar.panels.templates.TemplatesPanel', + 'debug_toolbar.panels.cache.CachePanel', + 'debug_toolbar.panels.signals.SignalsPanel', + 'debug_toolbar.panels.logging.LoggingPanel', + 'debug_toolbar.panels.redirects.RedirectsPanel', + 'channels_panel.panel.ChannelsDebugPanel', + ] LOGGING = { 'version': 1, @@ -142,3 +162,9 @@ LOGGING = { }, } +CHANNEL_LAYERS = { + "default": { + "BACKEND": "asgiref.inmemory.ChannelLayer", + "ROUTING": "bornhack.routing.channel_routing", + }, +} diff --git a/src/program/consumers.py b/src/program/consumers.py new file mode 100644 index 00000000..3b814314 --- /dev/null +++ b/src/program/consumers.py @@ -0,0 +1,28 @@ +from channels.generic.websockets import JsonWebsocketConsumer + +from .models import EventInstance + + +class ScheduleConsumer(JsonWebsocketConsumer): + http_user = True + + def connection_groups(self, **kwargs): + return ['schedule_users'] + + def connect(self, message, **kwargs): + self.send({"accept": True}) + + def receive(self, content, **kwargs): + action = content.get('action') + data = {} + + if action == 'get_event_instance': + event_instance_id = content.get('event_instance_id') + event_instance = EventInstance.objects.get(id=event_instance_id) + data['action'] = 'event_instance' + data['event_instance'] = event_instance.to_json() + + self.send(data) + + def disconnect(self, message, **kwargs): + pass diff --git a/src/program/models.py b/src/program/models.py index e8c1c98a..a71b4278 100644 --- a/src/program/models.py +++ b/src/program/models.py @@ -14,6 +14,7 @@ from django.apps import apps from django.core.files.base import ContentFile import icalendar +import CommonMark from utils.models import CreatedUpdatedModel, CampRelatedModel @@ -448,6 +449,22 @@ class EventInstance(CampRelatedModel): ievent['location'] = icalendar.vText(self.location.name) return ievent + def to_json(self): + parser = CommonMark.Parser() + renderer = CommonMark.HtmlRenderer() + ast = parser.parse(self.event.abstract) + abstract = renderer.render(ast) + return { + 'title': self.event.title, + 'event_slug': self.event.slug, + 'abstract': abstract, + 'from': self.when.lower.isoformat(), + 'to': self.when.lower.isoformat(), + 'url': str(self.event.get_absolute_url()), + 'id': self.id, + } + + def get_speaker_picture_upload_path(instance, filename): """ We want speaker pictures are saved as MEDIA_ROOT/public/speakers/camp-slug/speaker-slug/filename """ diff --git a/src/program/templates/schedule_overview.html b/src/program/templates/schedule_overview.html index 6cc55748..1b752aa8 100644 --- a/src/program/templates/schedule_overview.html +++ b/src/program/templates/schedule_overview.html @@ -1,6 +1,11 @@ {% extends 'schedule_base.html' %} {% load commonmark %} +{% load staticfiles %} + +{% block extra_head %} + +{% endblock %} {% block schedule_content %} {% if eventinstances %} @@ -12,9 +17,8 @@ + data-eventinstance-id="{{ eventinstance.id }}" + > {{ eventinstance.when.lower|date:"H:i" }} - {{ eventinstance.when.upper|date:"H:i" }} &#x{{ eventinstance.location.icon }};
@@ -23,20 +27,19 @@
{% endif %} -