Refactored ics code and added filtering.
This commit is contained in:
parent
ec53bae454
commit
5e322472e2
|
@ -135,6 +135,9 @@ urlpatterns = [
|
||||||
ScheduleView.as_view(),
|
ScheduleView.as_view(),
|
||||||
name='schedule_index'
|
name='schedule_index'
|
||||||
),
|
),
|
||||||
|
url(
|
||||||
|
r'^ics/', ICSView.as_view(), name="ics_view"
|
||||||
|
),
|
||||||
url(
|
url(
|
||||||
r'^proposals/', include([
|
r'^proposals/', include([
|
||||||
url(
|
url(
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
import icalendar
|
|
||||||
|
|
||||||
def gen_ics(eventinstances):
|
|
||||||
cal = icalendar.Calendar()
|
|
||||||
for eventinstance in eventinstances:
|
|
||||||
ievent = icalendar.Event()
|
|
||||||
ievent['summary'] = eventinstance.event.title
|
|
||||||
ievent['dtstart'] = icalendar.vDatetime(eventinstance.when.lower).to_ical()
|
|
||||||
ievent['dtend'] = icalendar.vDatetime(eventinstance.when.upper).to_ical()
|
|
||||||
cal.add_component(ievent)
|
|
||||||
return cal.to_ical()
|
|
||||||
|
|
||||||
|
|
|
@ -1,18 +1,22 @@
|
||||||
|
import uuid, os
|
||||||
|
from datetime import timedelta
|
||||||
|
|
||||||
from django.contrib.postgres.fields import DateTimeRangeField
|
from django.contrib.postgres.fields import DateTimeRangeField
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.utils.text import slugify
|
from django.utils.text import slugify
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from utils.models import CreatedUpdatedModel, CampRelatedModel
|
|
||||||
from django.core.exceptions import ValidationError
|
from django.core.exceptions import ValidationError
|
||||||
from datetime import timedelta
|
|
||||||
from django.core.urlresolvers import reverse_lazy
|
from django.core.urlresolvers import reverse_lazy
|
||||||
import uuid, os
|
|
||||||
from django.core.files.storage import FileSystemStorage
|
from django.core.files.storage import FileSystemStorage
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from django.apps import apps
|
from django.apps import apps
|
||||||
from django.core.files.base import ContentFile
|
from django.core.files.base import ContentFile
|
||||||
|
|
||||||
|
import icalendar
|
||||||
|
|
||||||
|
from utils.models import CreatedUpdatedModel, CampRelatedModel
|
||||||
|
|
||||||
|
|
||||||
class CustomUrlStorage(FileSystemStorage):
|
class CustomUrlStorage(FileSystemStorage):
|
||||||
def __init__(self, location=None):
|
def __init__(self, location=None):
|
||||||
|
@ -436,6 +440,14 @@ class EventInstance(CampRelatedModel):
|
||||||
minutes = seconds / 60
|
minutes = seconds / 60
|
||||||
return minutes / settings.SCHEDULE_TIMESLOT_LENGTH_MINUTES
|
return minutes / settings.SCHEDULE_TIMESLOT_LENGTH_MINUTES
|
||||||
|
|
||||||
|
def get_ics_event(self):
|
||||||
|
ievent = icalendar.Event()
|
||||||
|
ievent['summary'] = self.event.title
|
||||||
|
ievent['dtstart'] = icalendar.vDatetime(self.when.lower).to_ical()
|
||||||
|
ievent['dtend'] = icalendar.vDatetime(self.when.upper).to_ical()
|
||||||
|
ievent['location'] = icalendar.vText(self.location.name)
|
||||||
|
return ievent
|
||||||
|
|
||||||
|
|
||||||
def get_speaker_picture_upload_path(instance, filename):
|
def get_speaker_picture_upload_path(instance, filename):
|
||||||
""" We want speaker pictures are saved as MEDIA_ROOT/public/speakers/camp-slug/speaker-slug/filename """
|
""" We want speaker pictures are saved as MEDIA_ROOT/public/speakers/camp-slug/speaker-slug/filename """
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
import datetime, os
|
||||||
|
|
||||||
from django.views.generic import ListView, TemplateView, DetailView, View
|
from django.views.generic import ListView, TemplateView, DetailView, View
|
||||||
from django.views.generic.edit import CreateView, UpdateView
|
from django.views.generic.edit import CreateView, UpdateView
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
@ -8,11 +10,12 @@ from django.contrib.auth.mixins import LoginRequiredMixin
|
||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
from django.shortcuts import redirect
|
from django.shortcuts import redirect
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
|
|
||||||
|
import icalendar
|
||||||
|
|
||||||
from camps.mixins import CampViewMixin
|
from camps.mixins import CampViewMixin
|
||||||
from .mixins import CreateProposalMixin, EnsureUnapprovedProposalMixin, EnsureUserOwnsProposalMixin, EnsureWritableCampMixin, PictureViewMixin, EnsureCFSOpenMixin
|
from .mixins import CreateProposalMixin, EnsureUnapprovedProposalMixin, EnsureUserOwnsProposalMixin, EnsureWritableCampMixin, PictureViewMixin, EnsureCFSOpenMixin
|
||||||
from . import models
|
from . import models
|
||||||
import datetime, os
|
|
||||||
from .ics import gen_ics
|
|
||||||
|
|
||||||
|
|
||||||
############## ical calendar ########################################################
|
############## ical calendar ########################################################
|
||||||
|
@ -20,7 +23,34 @@ from .ics import gen_ics
|
||||||
|
|
||||||
class ICSView(CampViewMixin, View):
|
class ICSView(CampViewMixin, View):
|
||||||
def get(self, request, *args, **kwargs):
|
def get(self, request, *args, **kwargs):
|
||||||
return HttpResponse(gen_ics(models.EventInstance.objects.all()))
|
eventinstances = models.EventInstance.objects.all()
|
||||||
|
type_ = request.GET.get('type', None)
|
||||||
|
location = request.GET.get('location', None)
|
||||||
|
|
||||||
|
if type_:
|
||||||
|
try:
|
||||||
|
eventtype = models.EventType.objects.get(
|
||||||
|
slug=type_
|
||||||
|
)
|
||||||
|
eventinstances = eventinstances.filter(event__event_type=eventtype)
|
||||||
|
except models.EventType.DoesNotExist:
|
||||||
|
raise Http404
|
||||||
|
|
||||||
|
if location:
|
||||||
|
try:
|
||||||
|
eventlocation = models.EventLocation.objects.get(
|
||||||
|
slug=location,
|
||||||
|
camp=self.camp,
|
||||||
|
)
|
||||||
|
eventinstances = eventinstances.filter(location__slug=location)
|
||||||
|
except models.EventLocation.DoesNotExist:
|
||||||
|
raise Http404
|
||||||
|
|
||||||
|
cal = icalendar.Calendar()
|
||||||
|
for event_instance in eventinstances:
|
||||||
|
cal.add_component(event_instance.get_ics_event())
|
||||||
|
|
||||||
|
return HttpResponse(cal.to_ical())
|
||||||
|
|
||||||
|
|
||||||
############## proposals ########################################################
|
############## proposals ########################################################
|
||||||
|
|
Loading…
Reference in a new issue