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…
	
	Add table
		
		Reference in a new issue
	
	 Scott Bragg
						Scott Bragg