X-Git-Url: http://git.ithinksw.org/philo.git/blobdiff_plain/f212afea06d9af47d895b6b5be592eba347910cf..96926ace045422f0f5f1f474a174ebbdc253a023:/contrib/julian/models.py?ds=inline diff --git a/contrib/julian/models.py b/contrib/julian/models.py index 14a0b17..44b51f6 100644 --- a/contrib/julian/models.py +++ b/contrib/julian/models.py @@ -6,6 +6,7 @@ from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ValidationError, ObjectDoesNotExist from django.core.validators import RegexValidator from django.db import models +from django.db.models.query import QuerySet from django.http import HttpResponse, Http404 from django.utils.encoding import force_unicode from philo.contrib.julian.feedgenerator import ICalendarFeed @@ -73,6 +74,10 @@ class TimedModel(models.Model): abstract = True +class EventManager(models.Manager): + def get_query_set(self): + return self.model.QuerySet(self.model) + class Event(Entity, TimedModel): name = models.CharField(max_length=255) slug = models.SlugField(max_length=255, unique_for_date='start_date') @@ -94,6 +99,22 @@ class Event(Entity, TimedModel): last_modified = models.DateTimeField(auto_now=True) uuid = models.TextField() # Format? + objects = EventManager() + + class QuerySet(QuerySet): + + def upcoming(self): + return self.filter(start_date__gte=datetime.date.today()) + + def current(self): + return self.filter(start_date__lte=datetime.date.today(), end_date__gte=datetime.date.today()) + + def single_day(self): + return self.filter(start_date__exact=models.F('end_date')) + + def multiday(self): + return self.exclude(start_date__exact=models.F('end_date')) + def __unicode__(self): return self.name @@ -149,35 +170,28 @@ class CalendarView(FeedView): return 'entries_by_tag', [], {'tag_slugs': '/'.join(obj)} raise ViewCanNotProvideSubpath - def timespan_patterns(self, timespan_name): - return self.feed_patterns('get_events_by_timespan', 'timespan_page', "events_by_%s" % timespan_name) + def timespan_patterns(self, pattern, timespan_name): + return self.feed_patterns(pattern, 'get_events_by_timespan', 'timespan_page', "events_by_%s" % timespan_name) @property def urlpatterns(self): - urlpatterns = patterns('', - url(r'^', include(self.feed_patterns('get_all_events', 'index_page', 'index'))), - - url(r'^(?P\d{4})', include(self.timespan_patterns('year'))), - url(r'^(?P\d{4})/(?P\d{2})', include(self.timespan_patterns('month'))), - url(r'^(?P\d{4})/(?P\d{2})/(?P\d{2})', include(self.timespan_patterns('day'))), - #url(r'^(?P\d{4})/(?P\d{2})/(?P\d{2})/(?P\d{1,2})', include(self.timespan_patterns('hour'))), - url(r'(?P\d{4})/(?P\d{2})/(?P\d{2})/(?P[\w-]+)', self.event_detail_view, name="event_detail"), - - url(r'^%s/(?P[^/]+)' % self.owner_permalink_base, include(self.feed_patterns('get_events_by_owner', 'owner_page', 'events_by_user'))), + # Perhaps timespans should be done with GET parameters? Or two /-separated + # date slugs? (e.g. 2010-02-1/2010-02-2) or a start and duration? + # (e.g. 2010-02-01/week/ or ?d=2010-02-01&l=week) + urlpatterns = self.feed_patterns(r'^', 'get_all_events', 'index_page', 'index') + \ + self.timespan_patterns(r'^(?P\d{4})', 'year') + \ + self.timespan_patterns(r'^(?P\d{4})/(?P\d{2})', 'month') + \ + self.timespan_patterns(r'^(?P\d{4})/(?P\d{2})/(?P\d{2})', 'day') + \ + self.feed_patterns(r'^%s/(?P[^/]+)' % self.owner_permalink_base, 'get_events_by_owner', 'owner_page', 'events_by_user') + \ + self.feed_patterns(r'^%s/(?P\w+)/(?P\w+)/(?P[^/]+)' % self.location_permalink_base, 'get_events_by_location', 'location_page', 'events_by_location') + \ + self.feed_patterns(r'^%s/(?P[-\w]+[-+/\w]*)' % self.tag_permalink_base, 'get_events_by_tag', 'tag_page', 'events_by_tag') + \ + patterns('', + url(r'(?P\d{4})/(?P\d{2})/(?P\d{2})/(?P[\w-]+)$', self.event_detail_view, name="event_detail"), + ) # Some sort of shortcut for a location would be useful. This could be on a per-calendar # or per-calendar-view basis. #url(r'^%s/(?P[\w-]+)' % self.location_permalink_base, ...) - url(r'^%s/(?P\w+)/(?P\w+)/(?P[^/]+)' % self.location_permalink_base, include(self.feed_patterns('get_events_by_location', 'location_page', 'events_by_location'))), - ) - - if self.feeds_enabled: - urlpatterns += patterns('', - url(r'^%s/(?P[-\w]+[-+/\w]*)/%s$' % (self.tag_permalink_base, self.feed_suffix), self.feed_view('get_events_by_tag', 'events_by_tag_feed'), name='events_by_tag_feed'), - ) - urlpatterns += patterns('', - url(r'^%s/(?P[-\w]+[-+/\w]*)$' % self.tag_permalink_base, self.page_view('get_events_by_tag', 'tag_page'), name='events_by_tag') - ) if self.tag_archive_page: urlpatterns += patterns('',