Adds an ical feed and track name to room

This commit is contained in:
Scott Bragg 2016-12-26 12:14:16 +11:00 committed by GitHub
commit 72c3d623b4
7 changed files with 128 additions and 1 deletions

View file

@ -10,3 +10,4 @@ easy-thumbnails==2.3
html5lib==0.9999999 html5lib==0.9999999
markdown==2.6.5 markdown==2.6.5
pytz==2015.7 pytz==2015.7
django-ical==1.4

View file

@ -1,7 +1,7 @@
from __future__ import unicode_literals from __future__ import unicode_literals
from django.contrib import admin from django.contrib import admin
from symposion.schedule.models import Schedule, Day, Room, SlotKind, Slot, SlotRoom, Presentation, Session, SessionRole from symposion.schedule.models import Schedule, Day, Room, SlotKind, Slot, SlotRoom, Presentation, Session, SessionRole, Track
class DayInline(admin.StackedInline): class DayInline(admin.StackedInline):
@ -55,3 +55,4 @@ admin.site.register(Slot, SlotAdmin)
admin.site.register(Session) admin.site.register(Session)
admin.site.register(SessionRole) admin.site.register(SessionRole)
admin.site.register(Presentation, PresentationAdmin) admin.site.register(Presentation, PresentationAdmin)
admin.site.register(Track)

View file

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-12-24 00:10
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('symposion_schedule', '0005_auto_20161210_1736'),
]
operations = [
migrations.AddField(
model_name='room',
name='track',
field=models.CharField(blank=True, default=None, max_length=80, null=True, verbose_name='Track'),
),
]

View file

@ -0,0 +1,41 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-12-24 06:09
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('symposion_schedule', '0006_room_track'),
]
operations = [
migrations.CreateModel(
name='Track',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=80, verbose_name='Track')),
('day', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='symposion_schedule.Day')),
],
options={
'verbose_name': 'Track',
'verbose_name_plural': 'Tracks',
},
),
migrations.RemoveField(
model_name='room',
name='track',
),
migrations.AddField(
model_name='track',
name='room',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='symposion_schedule.Room'),
),
migrations.AlterUniqueTogether(
name='track',
unique_together=set([('room', 'day')]),
),
]

View file

@ -61,6 +61,21 @@ class Room(models.Model):
verbose_name_plural = _("Rooms") verbose_name_plural = _("Rooms")
@python_2_unicode_compatible
class Track(models.Model):
name = models.CharField(max_length=80, verbose_name=_("Track"))
room = models.ForeignKey(Room)
day = models.ForeignKey(Day)
def __str__(self):
return self.name
class Meta:
unique_together = [('room', 'day')]
verbose_name = _("Track")
verbose_name_plural = _("Tracks")
@python_2_unicode_compatible @python_2_unicode_compatible
class SlotKind(models.Model): class SlotKind(models.Model):
""" """

View file

@ -13,6 +13,7 @@ from .views import (
session_staff_email, session_staff_email,
session_list, session_list,
session_detail, session_detail,
EventFeed
) )
urlpatterns = [ urlpatterns = [
@ -27,6 +28,7 @@ urlpatterns = [
url(r"^([\w\-]+)/presentations.csv$", schedule_list_csv, name="schedule_list_csv"), url(r"^([\w\-]+)/presentations.csv$", schedule_list_csv, name="schedule_list_csv"),
url(r"^([\w\-]+)/edit/slot/(\d+)/", schedule_slot_edit, name="schedule_slot_edit"), url(r"^([\w\-]+)/edit/slot/(\d+)/", schedule_slot_edit, name="schedule_slot_edit"),
url(r"^conference.json", schedule_json, name="schedule_json"), url(r"^conference.json", schedule_json, name="schedule_json"),
url(r"^conference.ics", EventFeed(), name="ical_feed"),
url(r"^sessions/staff.txt$", session_staff_email, name="schedule_session_staff_email"), url(r"^sessions/staff.txt$", session_staff_email, name="schedule_session_staff_email"),
url(r"^sessions/$", session_list, name="schedule_session_list"), url(r"^sessions/$", session_list, name="schedule_session_list"),
url(r"^session/(\d+)/$", session_detail, name="schedule_session_detail"), url(r"^session/(\d+)/$", session_detail, name="schedule_session_detail"),

View file

@ -1,15 +1,19 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import json import json
import pytz
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.http import Http404, HttpResponse from django.http import Http404, HttpResponse
from django.shortcuts import render, get_object_or_404, redirect from django.shortcuts import render, get_object_or_404, redirect
from django.template import loader, Context from django.template import loader, Context
from django.conf import settings
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.contrib import messages from django.contrib import messages
from django.contrib.sites.models import Site from django.contrib.sites.models import Site
from django_ical.views import ICalFeed
from account.decorators import login_required from account.decorators import login_required
from symposion.schedule.forms import SlotEditForm, ScheduleSectionForm from symposion.schedule.forms import SlotEditForm, ScheduleSectionForm
@ -48,8 +52,10 @@ def schedule_conference(request):
"days": days, "days": days,
}) })
day_switch = request.GET.get('day', None)
ctx = { ctx = {
"sections": sections, "sections": sections,
"day_switch": day_switch
} }
return render(request, "symposion/schedule/schedule_conference.html", ctx) return render(request, "symposion/schedule/schedule_conference.html", ctx)
@ -256,6 +262,47 @@ def schedule_json(request):
content_type="application/json" content_type="application/json"
) )
class EventFeed(ICalFeed):
product_id = '-//linux.conf.au/schedule//EN'
timezone = settings.TIME_ZONE
filename = 'conference.ics'
def items(self):
return Slot.objects.filter(
day__schedule__published=True,
day__schedule__hidden=False
).order_by("start")
def item_title(self, item):
if hasattr(item.content, 'proposal'):
return item.content.title
else:
item.content_override if item.content_override else "Slot"
def item_description(self, item):
if hasattr(item.content, 'proposal'):
return item.content.abstract
else:
return None
def item_start_datetime(self, item):
return pytz.timezone(settings.TIME_ZONE).localize(item.start_datetime)
def item_end_datetime(self, item):
return pytz.timezone(settings.TIME_ZONE).localize(item.end_datetime)
def item_location(self, item):
return ", ".join(room["name"] for room in item.rooms.values())
def item_link(self, item):
if hasattr(item.content, 'proposal'):
return 'http://%s%s' % (
Site.objects.get_current().domain,
reverse('schedule_presentation_detail', args=[item.content.pk])
)
else:
return 'http://%s' % Site.objects.get_current().domain
def session_list(request): def session_list(request):
sessions = Session.objects.all().order_by('pk') sessions = Session.objects.all().order_by('pk')