Adds an ical feed and track name to room
This commit is contained in:
commit
72c3d623b4
7 changed files with 128 additions and 1 deletions
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
20
symposion/schedule/migrations/0006_room_track.py
Normal file
20
symposion/schedule/migrations/0006_room_track.py
Normal 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'),
|
||||||
|
),
|
||||||
|
]
|
41
symposion/schedule/migrations/0007_auto_20161224_1709.py
Normal file
41
symposion/schedule/migrations/0007_auto_20161224_1709.py
Normal 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')]),
|
||||||
|
),
|
||||||
|
]
|
|
@ -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):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -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"),
|
||||||
|
|
|
@ -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')
|
||||||
|
|
Loading…
Reference in a new issue