Skip to content

Commit 78bdcd8

Browse files
committed
Add view that renders the schedule as JSON
1 parent 47dd3d6 commit 78bdcd8

File tree

2 files changed

+69
-1
lines changed

2 files changed

+69
-1
lines changed

program/urls.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
session_detail,
99
schedule_redirect,
1010
schedule_day,
11+
schedule_json,
1112
debug_og_image_for_talk,
1213
debug_og_image_for_workshop,
1314
)
@@ -23,6 +24,7 @@
2324
# Schedule
2425
path("schedule/", schedule_redirect, name="schedule_redirect"),
2526
path("schedule/<str:conference_day>/", schedule_day, name="schedule_day"),
27+
path("schedule.json", schedule_json, name="schedule_json"),
2628
]
2729

2830
# Routes for previewing OG images template.

program/views.py

Lines changed: 67 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import re
33

44
from django.db.models import Prefetch
5-
from django.http import HttpRequest, Http404
5+
from django.http import HttpRequest, Http404, JsonResponse
66
from django.template.loader import render_to_string
77
from django.template.response import TemplateResponse, HttpResponse
88
from django.shortcuts import get_object_or_404, redirect
@@ -187,6 +187,72 @@ def schedule_day(request: HttpRequest, conference_day: str) -> HttpResponse:
187187
)
188188

189189

190+
def schedule_json(request):
191+
all_slots = Slot.objects.select_related(
192+
"room"
193+
).prefetch_related(
194+
"talk",
195+
Prefetch(
196+
"talk__talk_speakers",
197+
queryset=Speaker.objects.filter(is_public=True),
198+
to_attr="public_speakers",
199+
),
200+
"workshop",
201+
Prefetch(
202+
"workshop__workshop_speakers",
203+
queryset=Speaker.objects.filter(is_public=True),
204+
to_attr="public_speakers",
205+
),
206+
"utility",
207+
).order_by(
208+
"start",
209+
"room__order",
210+
)
211+
212+
schedule_grid = ScheduleGrid.create_from_slots(all_slots)
213+
result = []
214+
for row in schedule_grid.rows:
215+
for item in row.items:
216+
session = item.slot.event
217+
session_json = {
218+
'title': session.title,
219+
}
220+
if isinstance(session, (Talk, Workshop)):
221+
session_json.update({
222+
'type': session.type,
223+
'abstract': session.abstract,
224+
'track': session.track,
225+
'language': session.language,
226+
'minimum_python_knowledge': session.minimum_python_knowledge,
227+
'minimum_topic_knowledge': session.minimum_topic_knowledge,
228+
'speakers': [
229+
{
230+
'name': speaker.full_name,
231+
'twitter': speaker.twitter if speaker.twitter else None,
232+
'github': speaker.github if speaker.github else None,
233+
'linkedin': speaker.linkedin if speaker.linkedin else None,
234+
'personal_website': speaker.personal_website if speaker.personal_website else None,
235+
}
236+
for speaker in session.speakers
237+
],
238+
})
239+
else:
240+
session_json['type'] = 'other'
241+
242+
slot_json = {
243+
'start': item.slot.start.isoformat(),
244+
'end': item.slot.end.isoformat(),
245+
'room': item.slot.room.label,
246+
'is_streamed': item.is_streamed,
247+
'session': session_json,
248+
}
249+
result.append(slot_json)
250+
251+
return JsonResponse({
252+
'schedule': result,
253+
})
254+
255+
190256
def debug_og_image_for_talk(request, session_id: int) -> HttpResponse:
191257
"""
192258
DEBUG view: preview OG image template for a talk.

0 commit comments

Comments
 (0)