From 1a897068725233b607d377b713b733c6d5084477 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sun, 31 Jul 2011 21:24:33 -0500 Subject: [PATCH] Added tags atom feed and linked it in the appropriate places --- mediagoblin/listings/routing.py | 5 +- mediagoblin/listings/views.py | 62 +++++++++++++++---- .../templates/mediagoblin/listings/tag.html | 13 ++++ 3 files changed, 67 insertions(+), 13 deletions(-) diff --git a/mediagoblin/listings/routing.py b/mediagoblin/listings/routing.py index 90580601..61dd5210 100644 --- a/mediagoblin/listings/routing.py +++ b/mediagoblin/listings/routing.py @@ -21,5 +21,8 @@ tag_routes = [ # Route('mediagoblin.listings.tags_home', "/", # controller="mediagoblin.listings.views:tags_home"), Route('mediagoblin.listings.tags_listing', "/{tag}/", - controller="mediagoblin.listings.views:tag_listing")] + controller="mediagoblin.listings.views:tag_listing"), + Route('mediagoblin.listings.tag_atom_feed', "/{tag}/atom/", + controller="mediagoblin.listings.views:tag_atom_feed"), + ] diff --git a/mediagoblin/listings/views.py b/mediagoblin/listings/views.py index cdb3db31..aade7e64 100644 --- a/mediagoblin/listings/views.py +++ b/mediagoblin/listings/views.py @@ -19,6 +19,23 @@ from mediagoblin.db.util import DESCENDING from mediagoblin.util import Pagination, render_to_response from mediagoblin.decorators import uses_pagination +from werkzeug.contrib.atom import AtomFeed + + +def _get_tag_name_from_entries(media_entries, tag_slug): + """ + Get a tag name from the first entry by looking it up via its slug. + """ + # ... this is slightly hacky looking :\ + tag_name = tag_slug + if media_entries.count(): + for tag in media_entries[0]['tags']: + if tag['slug'] == tag_slug: + tag_name == tag['name'] + break + + return tag_name + @uses_pagination def tag_listing(request, page): @@ -33,21 +50,42 @@ def tag_listing(request, page): pagination = Pagination(page, cursor) media_entries = pagination() - # Take the tag "name" from the first MediaEntry's non-normalized - # tag naming. - # ... this is slightly hacky looking :\ - tag_name = tag_slug - if media_entries.count(): - for tag in media_entries[0]['tags']: - if tag['slug'] == tag_slug: - tag_name == tag['name'] - break - else: - tag_name = tag_slug + tag_name = _get_tag_name_from_entries(media_entries, tag_slug) return render_to_response( request, 'mediagoblin/listings/tag.html', - {'tag_name': tag_name, + {'tag_slug': tag_slug, + 'tag_name': tag_name, 'media_entries': media_entries, 'pagination': pagination}) + + +ATOM_DEFAULT_NR_OF_UPDATED_ITEMS = 15 + +def tag_atom_feed(request): + """ + generates the atom feed with the tag images + """ + tag_slug = request.matchdict[u'tag'] + + cursor = request.db.MediaEntry.find( + {u'state': u'processed', + u'tags.slug': tag_slug}) + cursor = cursor.sort('created', DESCENDING) + cursor = cursor.limit(ATOM_DEFAULT_NR_OF_UPDATED_ITEMS) + + feed = AtomFeed( + "MediaGoblin: Feed for tag '%s'" % tag_slug, + feed_url=request.url, + url=request.host_url) + + for entry in cursor: + feed.add(entry.get('title'), + entry.get('description_html'), + content_type='html', + author=entry.uploader()['username'], + updated=entry.get('created'), + url=entry.url_for_self(request.urlgen)) + + return feed.get_response() diff --git a/mediagoblin/templates/mediagoblin/listings/tag.html b/mediagoblin/templates/mediagoblin/listings/tag.html index db3381d2..6f10ec8d 100644 --- a/mediagoblin/templates/mediagoblin/listings/tag.html +++ b/mediagoblin/templates/mediagoblin/listings/tag.html @@ -17,6 +17,13 @@ #} {% extends "mediagoblin/base.html" %} +{% block mediagoblin_head %} + +{% endblock mediagoblin_head %} + {% block mediagoblin_content -%}

Media tagged with: {{ tag_name }} @@ -25,4 +32,10 @@ + +
+ atom feed +
{% endblock %} -- 2.25.1