From 3bb6c880d2d0476245cfe7bf8afa579e4ee5ba11 Mon Sep 17 00:00:00 2001 From: Leif Johansson Date: Fri, 13 May 2011 11:15:32 +0200 Subject: replace hand-drawn feeds with the django syndication framework --- src/meetingtools/apps/room/feeds.py | 76 +++++++++++++++++++++++++++++++++++++ src/meetingtools/apps/room/views.py | 16 ++------ src/meetingtools/urls.py | 5 ++- 3 files changed, 84 insertions(+), 13 deletions(-) create mode 100644 src/meetingtools/apps/room/feeds.py (limited to 'src/meetingtools') diff --git a/src/meetingtools/apps/room/feeds.py b/src/meetingtools/apps/room/feeds.py new file mode 100644 index 0000000..0254339 --- /dev/null +++ b/src/meetingtools/apps/room/feeds.py @@ -0,0 +1,76 @@ +''' +Created on May 13, 2011 + +@author: leifj +''' + +from django.contrib.syndication.views import Feed +from meetingtools.apps.room.models import Room +from tagging.models import TaggedItem +from meetingtools.settings import BASE_URL +from django.utils.feedgenerator import Atom1Feed, Rss201rev2Feed + +class TagsWrapper(object): + + def __init__(self,tn): + self.tags = tn.split('+') + self.rooms = TaggedItem.objects.get_by_model(Room, tn.split('+')) + + def title(self): + return "Rooms tagged with %s" % " and ".join(self.tags) + + def description(self): + return self.title() + + def link(self,ext): + return "%s/room/+%s.%s" % (BASE_URL,"+".join(self.tags),ext) + +class RoomTagFeed(Feed): + + item_author_name = 'SUNET e-meeting tools' + + def ext(self): + if self.feed_type == Atom1Feed: + return "atom" + + if self.feed_type == Rss201rev2Feed: + return "rss" + + return "rss" + + def get_object(self,request,tn): + return TagsWrapper(tn) + + def title(self,t): + return t.title() + + def link(self,t): + return t.link(self.ext()) + + def description(self,t): + return t.description() + + def items(self,t): + return t.rooms + + def item_title(self,room): + return room.name + + def item_description(self,room): + return room.description + + def item_link(self,room): + return room.go_url() + + def item_guid(self,room): + return room.permalink() + + def item_pubdate(self,room): + return room.lastupdated + + +class RoomAtomTagFeed(RoomTagFeed): + feed_type = Atom1Feed + +class RoomRSSTagField(RoomTagFeed): + feed_type = Rss201rev2Feed \ No newline at end of file diff --git a/src/meetingtools/apps/room/views.py b/src/meetingtools/apps/room/views.py index d0c5f37..3bbc74a 100644 --- a/src/meetingtools/apps/room/views.py +++ b/src/meetingtools/apps/room/views.py @@ -395,26 +395,18 @@ def widget(request,tn): title = 'Rooms tagged with %s' % " and ".join(tags) now = timeAsrfc822( datetime.now() ) return respond_to(request, - {'text/html':'apps/room/widget-test.html', - 'application/json': json_response([_room2dict(room) for room in rooms]), - 'application/rss+xml': 'apps/room/rss2.xml', - 'text/rss': 'apps/room/rss2.xml'}, - {'title':title,'description':title ,'edit':False,'date': now,'tags': tn,'rooms': [_room2dict(room) for room in rooms.all()]}) + {'text/html':'apps/room/widget-test.html'}, + {'title':title,'description':title ,'edit':False,'date': now,'tags': tn,'rooms':rooms.all()}) # should not require login def list_by_tag(request,tn): tags = tn.split('+') rooms = TaggedItem.objects.get_by_model(Room, tags) title = 'Rooms tagged with %s' % " and ".join(tags) - now = rfc3339_date(datetime.now()) - now822 = timeAsrfc822( datetime.now() ) return respond_to(request, {'text/html':'apps/room/list.html', - 'application/json': json_response([_room2dict(room) for room in rooms]), - 'application/atom+xml': 'apps/room/atom.xml', - 'application/rss+xml': 'apps/room/rss2.xml', - 'text/rss': 'apps/room/rss2.xml'}, - {'title':title,'description':title ,'edit':False,'baseurl': BASE_URL,'rfc3339_date': now,'rfc822_date': now822,'tags': tn,'rooms':[_room2dict(room) for room in rooms.all()]}) + 'application/json': json_response([_room2dict(room) for room in rooms])}, + {'title':title,'description':title ,'edit':False,'baseurl': BASE_URL,'tags': tn,'rooms':rooms.all()}) def _can_tag(request,tag): if tag in ('selfcleaning','public','private'): diff --git a/src/meetingtools/urls.py b/src/meetingtools/urls.py index c6913d7..d927409 100644 --- a/src/meetingtools/urls.py +++ b/src/meetingtools/urls.py @@ -4,6 +4,7 @@ from django.conf.urls.defaults import patterns,include from django.contrib import admin from meetingtools.settings import ADMIN_MEDIA_ROOT, MEDIA_ROOT from meetingtools.multiresponse import redirect_to +from meetingtools.apps.room.feeds import RoomAtomTagFeed,RoomRSSTagField admin.autodiscover() def welcome(request): @@ -29,7 +30,9 @@ urlpatterns = patterns('', (r'^room/(\d+)/tag$','meetingtools.apps.room.views.tag'), (r'^room/(\d+)/untag/(.+)$','meetingtools.apps.room.views.untag'), (r'^widget/\+(.+)$','meetingtools.apps.room.views.widget'), - (r'^room/\+(.+)\.(?:json|xml|html|htm|atom|rss)$','meetingtools.apps.room.views.list_by_tag'), + (r'^room/\+(.+)\.(?:json|html|htm)$','meetingtools.apps.room.views.list_by_tag'), + (r'^room/\+(.+)\.(?:atom)$',RoomAtomTagFeed()), + (r'^room/\+(.+)\.(?:rss)$',RoomRSSTagField()), (r'^room/\+(.+)$','meetingtools.apps.room.views.list_by_tag'), # Uncomment the admin/doc line below to enable admin documentation: # (r'^admin/doc/', include('django.contrib.admindocs.urls')), -- cgit v1.1