Hot on the heels of my last entry, the next utility is needed to extend the event object to automatically produce a URL compatible with Google Calendar's "create an event" handler. Now, I could extend the Event application myself and add a get_google_url() method to the model, but let's try to do this The Django Way. All I want is a URL, and I need it in specific templates. That says to me: template tag. Even better, template tag filter.
This example is problematic in that we only needed dates, not times. This does need work to extend it to handle times.
Sticking with my convention of naming extensions to existing apps project_app, the filename becomes:
<dfn><<project_events_tags.py>>=</dfn>
from django import template
from django.contrib.sites.models import Site
from django.utils.http import urlquote_plus
register = template.Library()
@register.filter
def google_calendarize(event):
st = event.start
en = event.end and event.end or event.start
tfmt = '%Y%m%dT000000'
dates = '%s%s%s' % (st.strftime(tfmt), '%2F', en.strftime(tfmt))
name = urlquote_plus(event.name)
s = ('http://www.google.com/calendar/event?action=TEMPLATE&' +
'text=' + name + '&' +
'dates=' + dates + '&' +
'sprop=website:' + urlquote_plus(Site.objects.get_current().domain))
if event.location:
s = s + '&location=' + urlquote_plus(event.location)
return s + '&trp=false'
google_calendarize.safe = True
And this is invoked via:
<dfn><<events.html>>=</dfn>
{% load project_events_tags %}
...
<a href="{{ event|google_calendarize }}">+ Add to Google Calendar</a>
It couldn't be easier.