# 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"),
+ ]
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):
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()
#}
{% 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 }}
<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 %}