Skip to content
This repository has been archived by the owner on Sep 3, 2019. It is now read-only.

Commit

Permalink
Did some work on stuff.
Browse files Browse the repository at this point in the history
  • Loading branch information
myles committed Oct 7, 2010
1 parent e5abc0f commit 3e07bd7
Show file tree
Hide file tree
Showing 8 changed files with 200 additions and 6 deletions.
9 changes: 6 additions & 3 deletions events/feeds.py
Expand Up @@ -46,10 +46,13 @@ class EventsFeed(BaseFeed):
title = u"%s: events calendar." % current_site.name

def link(self):
return reverse('events_index') + "?utm_source=feedreader&utm_medium=feed&utm_campaign=EventsFeed"
return reverse('events_index')

def items(self):
return Event.objects.published()[:10]
return Event.objects.upcoming()[:10]

def item_link(self, item):
return item.get_absolute_url() + "?utm_source=feedreader&utm_medium=feed&utm_campaign=EventsFeed"
return item.get_absolute_url()

def item_enclosure_url(self, item):
return "http://%s%s" % (current_site.domain, item.get_ical_url())
9 changes: 9 additions & 0 deletions events/models.py
Expand Up @@ -76,6 +76,15 @@ def get_absolute_url(self):
'day': self.start_date.day,
})

@permalink
def get_ical_url(self):
return ('events_event_detail_ical', None, {
'slug': self.slug,
'year': self.start_date.year,
'month': self.start_date.strftime('%b').lower(),
'day': self.start_date.day,
})

@property
def start_datetime(self):
if self.start_time:
Expand Down
37 changes: 37 additions & 0 deletions events/templates/events/tag_detail.html
@@ -0,0 +1,37 @@
{% extends "events/base_events.html" %}

{% block title %}{{ block.super }}: Events Tag {{ tag }}{% endblock %}

{% block content_title %}
<h2>Events <a href="{% url events_tag_list %}">Tag</a> {{ tag }}</h2>
{% endblock %}

{% block content %}
<ul class="link_list">
{% for event in events.object_list %}
<li><a href="{{ event.get_absolute_url }}">{{ event }}</a></li>
{% endfor %}
</ul>

{% if has_other_pages %}
<ul id="pagination">
{% if has_previous %}
<li class="previous on"><a href="{% url events_tag_detail_paginated event.previous_page_number %}" title="Page {{ events.previous_page_number }}">Previous</a></li>
{% else %}
<li class="previous off">Previous</li>
{% endif %}
{% for page in posts.page_range %}
{% ifequal page posts.page_number %}
<li class="active">{{ page }}</li>
{% else %}
<li><a href="{% url events_tag_detail_paginated page %}">{{ page }}</a></li>
{% endifequal %}
{% endfor %}
{% if has_next %}
<li class="next on"><a href="{% url events_tag_detail_paginated posts.next_page_number %}" title="Page {{ events.next_page_number }}">Next</a></li>
{% else %}
<li class="next off">Next</li>
{% endif %}
</ul>
{% endif %}
{% endblock %}
15 changes: 15 additions & 0 deletions events/templates/events/tag_list.html
@@ -0,0 +1,15 @@
{% extends "events/base_events.html" %}

{% block title %}{{ block.super }}: Calendar Tags{% endblock %}

{% block content_title %}
<h2>Calendar Tags</h2>
{% endblock %}

{% block content %}
<ul id="events_tags" class="tag_cloud">
{% for tag in tags %}
<li><a href="{% url events_tag_detail tag.slug %}" rel="tag">{{ tag }}</a></li>
{% endfor %}
</ul>
{% endblock %}
24 changes: 24 additions & 0 deletions events/urls.py
Expand Up @@ -10,6 +10,10 @@
)

urlpatterns += patterns('events.views',
url(r'^(?P<year>\d{4})/(?P<month>[a-z]{3})/(?P<day>\w{1,2})/(?P<slug>[-\w]+)/ical/$',
view = 'detail_ical',
name = 'events_event_detail_ical',
),
url(r'^(?P<year>\d{4})/(?P<month>[a-z]{3})/(?P<day>\w{1,2})/(?P<slug>[-\w]+)/$',
view = 'detail',
name = 'events_event_detail',
Expand All @@ -30,6 +34,26 @@
view = 'events_year',
name = 'events_year',
),
url(r'^tag/(?P<slug>(.*))/page/(?P<page>\d+)/$',
view = 'tag_detail',
name = 'events_tag_detail_paginated',
),
url(r'^tag/(?P<slug>(.*))/ical/$',
view = 'tag_detail_ical',
name = 'events_tag_detail',
),
url(r'^tag/(?P<slug>(.*))/$',
view = 'tag_detail',
name = 'events_tag_detail',
),
url(r'^tag/$',
view = 'tag_list',
name = 'events_tag_list'
),
url(r'^ical/$',
view = 'ical',
name = 'events_ical',
),
url(r'^archive/$',
view = 'events_archives',
name = 'events_archives'
Expand Down
29 changes: 29 additions & 0 deletions events/utils.py
@@ -0,0 +1,29 @@
from icalendar import Calendar, Event, vText, vUri

from django.contrib.sites.models import Site

def export_ical(events):
cal = Calendar()

site = Site.objects.get_current()

cal.add('prodid', '-//%s Events Calendar//%s//' % (site.name, site.domain))
cal.add('version', '2.0')

site_token = site.domain.split('.')
site_token.reverse()
site_token = '.'.join(site_token)

for event in events:
ical_event = Event()
ical_event.add('summary', event.title)
ical_event.add('description', event.body)
ical_event.add('dtstart', event.start_datetime)
ical_event.add('dtend', event.end_datetime)
ical_event.add('dtstamp', event.end_datetime)
ical_event.add('url', vUri('http://' + site.domain + event.get_absolute_url()))
ical_event['location'] = vText(event.location)
ical_event['uid'] = '%d.event.events.%s' % (event.id, site_token)
cal.add_component(ical_event)

return cal
80 changes: 78 additions & 2 deletions events/views.py
@@ -1,12 +1,14 @@
import datetime
import time

from django.http import Http404, HttpResponse
from django.template import RequestContext
from django.http import Http404, HttpResponse
from django.shortcuts import render_to_response
from django.core.paginator import Paginator, InvalidPage, EmptyPage

from events.models import Event
from events.forms import CalendarYearMonthForm
from events.utils import export_ical

def events_month(request, year=None, month=None):
if not year:
Expand Down Expand Up @@ -290,4 +292,78 @@ def detail(request, year, month, day, slug):
except IndexError:
raise Http404

return render_to_response('events/detail.html', { 'event': event, 'date': date }, context_instance=RequestContext(request))
return render_to_response('events/detail.html', { 'event': event, 'date': date }, context_instance=RequestContext(request))

def detail_ical(request, year, month, day, slug):
try:
date = datetime.date(*time.strptime(year+month+day, '%Y%b%d')[:3])
except ValueError:
raise Http404

try:
event = Event.objects.get(start_date=date, slug__iexact=slug)
except IndexError:
raise Http404

icalendar = export_ical([event, ])

response = HttpResponse(icalendar.as_string(), mimetype="text/calendar")
response['Content-Disposition'] = 'attachment: filename=%s-%s.ics' % (event.start_date.isoformat(), event.slug)

return response

def ical(request):
TODAY = datetime.date.today()
THRIDY_DAYS = datetime.timedelta(days=30)

FUTURE = TODAY + THRIDY_DAYS
PAST = TODAY - THRIDY_DAYS

event_list = Event.objects.filter(start_date__lte=FUTURE, start_date__gte=PAST)

icalendar = export_ical(event_list)

response = HttpResponse(icalendar.as_string(), mimetype="text/calendar")
response['Content-Disposition'] = 'attachment: filename=%s-%s.ics' % (FUTURE.isoformat(), PAST.isoformat())

return response

def tag_list(request):
tags = Event.tags.all()

context = {
'tags': tags,
'is_archive': True
}

return render_to_response('events/tag_list.html', context, context_instance=RequestContext(request))

def tag_detail(request, slug, page=1):
tag = Event.tags.get(slug=slug)
event_list = Event.objects.filter(tags__in=[tag])

paginator = Paginator(event_list, 10)

try:
events = paginator.page(page)
except (EmptyPage, InvalidPage):
events = paginator.page(paginator.num_pages)

context = {
'tag': tag,
'events': events,
'is_archive': True
}

return render_to_response('events/tag_detail.html', context, context_instance=RequestContext(request))

def tag_detail_ical(request, slug):
tag = Event.tags.get(slug=slug)
event_list = Event.objects.upcoming(tags__in=[tag])[:10]

icalendar = export_ical(event_list)

response = HttpResponse(icalendar.as_string(), mimetype="text/calendar")
response['Content-Disposition'] = 'attachment: filename=%s.ics' % slug

return response
3 changes: 2 additions & 1 deletion requirements.txt
@@ -1,3 +1,4 @@
python-dateutil
django-taggit
django-markup
django-markup
icalendar

0 comments on commit 3e07bd7

Please sign in to comment.