Added tags atom feed and linked it in the appropriate places

This commit is contained in:
Christopher Allan Webber 2011-07-31 21:24:33 -05:00
parent a5303e4791
commit 1a89706872
3 changed files with 67 additions and 13 deletions

View File

@ -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"),
]

View File

@ -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()

View File

@ -17,6 +17,13 @@
#}
{% extends "mediagoblin/base.html" %}
{% block mediagoblin_head %}
<link rel="alternate" type="application/atom+xml"
href="{{ request.urlgen(
'mediagoblin.listings.tag_atom_feed',
tag=tag_slug) }}">
{% endblock mediagoblin_head %}
{% block mediagoblin_content -%}
<h1>
Media tagged with: {{ tag_name }}
@ -25,4 +32,10 @@
<div class="container_16 media_gallery">
{% include "mediagoblin/utils/object_gallery.html" %}
</div>
<div class="grid_16">
<a href="{{ request.urlgen(
'mediagoblin.listings.tag_atom_feed',
tag=tag_slug) }}">atom feed</a>
</div>
{% endblock %}