Skip to content

Commit

Permalink
Merge pull request #200 from fedora-infra/feature/rss-feeds
Browse files Browse the repository at this point in the history
Feature/rss feeds
  • Loading branch information
ralphbean committed Aug 19, 2013
2 parents 5f301a5 + 9a9ef1d commit 3aa790a
Show file tree
Hide file tree
Showing 5 changed files with 100 additions and 3 deletions.
1 change: 1 addition & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
'docutils',
"python-dateutil",
"moksha.wsgi>=1.2.1",
"webhelpers",

# For qrcode to work from PyPI, you also need Pillow.
# This is handled for us in Fedora because python-qrcode pulls in the
Expand Down
2 changes: 2 additions & 0 deletions tahrir/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,7 @@ def get_db(request):
config.add_route('qrcode', '/qrcode')
config.add_route('badge', '/badge/{id}')
config.add_route('badge_json', '/badge/{id}/json')
config.add_route('badge_rss', '/badge/{id}/rss')
config.add_route('builder', '/builder')
config.add_route('about', '/about')
config.add_route('explore', '/explore')
Expand All @@ -143,6 +144,7 @@ def get_db(request):
config.add_route('tags', '/tags/{tags}/{match}')
config.add_route('user', '/user/{id}')
config.add_route('user_json', '/user/{id}/json')
config.add_route('user_rss', '/user/{id}/rss')
config.add_route('login', '/login')
config.add_route('logout', '/logout')

Expand Down
7 changes: 5 additions & 2 deletions tahrir/templates/badge.mak
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,11 @@
% endif
<p>Issued by: ${badge.issuer.name}</p>
<p>Criteria: <a href="${badge.criteria}">${badge.criteria}</a></p>
<p>View badge as: <a href="${request.route_url('badge_json', id=badge.id)}">
JSON</a></p>
<p>
View badge as:
<a href="${request.route_url('badge_json', id=badge.id)}">JSON</a>,
<a href="${request.route_url('badge_rss', id=badge.id)}">RSS</a>
</p>
</div>
</div> <!-- End padded content. -->
</div> <!-- End shadow. -->
Expand Down
4 changes: 3 additions & 1 deletion tahrir/templates/user.mak
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,9 @@
% endif

<p>
View user as: <a href="${request.route_url('user_json', id=user.nickname)}">JSON</a>
View user as:
<a href="${request.route_url('user_json', id=user.nickname or user.id)}">JSON</a>,
<a href="${request.route_url('user_rss', id=user.nickname or user.id)}">RSS</a>
</p>
</div>
% if logged_in == user.email:
Expand Down
89 changes: 89 additions & 0 deletions tahrir/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
from datetime import datetime

from mako.template import Template as t
from webhelpers import feedgenerator
from pyramid.view import (
view_config,
forbidden_view_config,
Expand Down Expand Up @@ -676,6 +677,94 @@ def badge_json(request):
return _badge_json_generator(request, badge_id, badge)


@view_config(route_name='badge_rss')
def badge_rss(request):
""" Render per-badge rss. """

badge_id = request.matchdict.get('id')
badge = request.db.get_badge(badge_id)

if not badge:
raise HTTPNotFound("No such badge %r" % badge_id)

comparator = lambda x, y: cmp(x.issued_on, y.issued_on)
sorted_assertions = sorted(badge.assertions, cmp=comparator, reverse=True)

feed = feedgenerator.Rss201rev2Feed(
title=u"Badges Feed for %s" % badge.name,
link=request.route_url('badge', id=badge.id),
description=u"Latest recipients of the badge %s" % badge.name,
language=u"en",
)

description_template = "<img src='%s' alt='%s' />%s"

for assertion in sorted_assertions:
url = request.route_url(
'user', id=assertion.person.nickname or assertion.person.id)
feed.add_item(
title=assertion.person.nickname,
link=url,
pubdate=assertion.issued_on,
description=description_template % (
assertion.person.avatar_url(128),
assertion.person.nickname,
assertion.person.nickname,
)
)

return Response(
body=feed.writeString('utf-8'),
content_type='application/rss+xml',
charset='utf-8',
)


@view_config(route_name='user_rss')
def user_rss(request):
""" Render per-user rss. """

user_id = request.matchdict.get('id')
user = _get_user(request, user_id)

if not user:
raise HTTPNotFound("No such user %r" % user_id)

if user.opt_out == True and user.email != authenticated_userid(request):
raise HTTPNotFound("User %r has opted out." % user_id)

comparator = lambda x, y: cmp(x.issued_on, y.issued_on)
sorted_assertions = sorted(user.assertions, cmp=comparator, reverse=True)

feed = feedgenerator.Rss201rev2Feed(
title=u"Badges Feed for %s" % user.nickname,
link=request.route_url('user', id=user.nickname or user.id),
description=u"The latest Fedora Badges obtained by %s" % user.nickname,
language=u"en",
)

description_template = "<img src='%s' alt='%s'/>%s -- %s"

for assertion in sorted_assertions:
feed.add_item(
title=assertion.badge.name,
link=request.route_url('badge', id=assertion.badge.id),
pubdate=assertion.issued_on,
description=description_template % (
assertion.badge.image,
assertion.badge.name,
assertion.badge.name,
assertion.badge.description,
)
)

return Response(
body=feed.writeString('utf-8'),
content_type='application/rss+xml',
charset='utf-8',
)


@view_config(route_name='user', renderer='user.mak')
def user(request):
"""Render user info page."""
Expand Down

0 comments on commit 3aa790a

Please sign in to comment.