feeds: add per arch, per repo feed ability

Make the feed framework a lot more flexible and give the possibility to have
a feed for each architecture. You can drill down even more than also get a
feed for a particular repo; some might find this helpful for something like
tracking [testing]. Implements FS#12939.

I also bumped up the number of items available in each of these feeds; since
it is full of a bunch of small items it might be more helpful to have more
available and it should also prevent fewer ones from being missed.

The UI isn't exactly spectacular, but I figured some sort of page is better
than none listing all the various feeds you can pull from.

Signed-off-by: Dan McGee <dan@archlinux.org>
This commit is contained in:
Dan McGee 2010-02-02 22:36:41 -06:00
parent f22f20003b
commit 6fe8aec0ab
5 changed files with 88 additions and 10 deletions

View File

@ -1,14 +1,55 @@
import datetime
from django.contrib.syndication.feeds import Feed
from archweb.main.models import Package, News
from django.contrib.syndication.feeds import Feed, FeedDoesNotExist
from django.db.models import Q
from archweb.main.models import Arch, Repo, Package, News
class PackageFeed(Feed):
title = 'Arch Linux Recent Package Updates'
link = '/packages/'
description = 'Recently updated packages in the Arch Linux package repositories.'
def get_object(self, bits):
# just cut the BS early
if len(bits) > 2:
raise FeedDoesNotExist
def items(self):
return Package.objects.select_related('arch', 'repo').order_by('-last_update')[:24]
obj = dict()
qs = Package.objects.select_related('arch', 'repo').order_by('-last_update')
if len(bits) > 0:
# feed for a single arch, also include 'any' packages everywhere
a = Arch.objects.get(name=bits[0])
qs = qs.filter(Q(arch=a) | Q(arch__name__iexact='any'))
obj['arch'] = a
if len(bits) > 1:
# feed for a single arch AND repo
r = Repo.objects.get(name=bits[1])
qs = qs.filter(repo=r)
obj['repo'] = r
obj['qs'] = qs[:50]
return obj
def title(self, obj):
s = 'Arch Linux: Recent package updates'
if 'repo' in obj:
s += ' (%s [%s])' % (obj['arch'].name, obj['repo'].name.lower())
elif 'arch' in obj:
s += ' (%s)' % (obj['arch'].name)
return s
def link(self, obj):
return '/packages/'
def description(self, obj):
s = 'Recently updated packages in the Arch Linux package repositories'
if 'arch' in obj:
s += ' for the \'%s\' architecture' % obj['arch'].name.lower()
if obj['arch'].name != 'any':
s += ' (including \'any\' packages)'
if 'repo' in obj:
s += ' in the [%s] repository' % obj['repo'].name.lower()
s += '.'
return s
def items(self, obj):
return obj['qs']
def item_pubdate(self, item):
return item.last_update
@ -16,9 +57,10 @@ def item_pubdate(self, item):
def item_categories(self, item):
return (item.repo.name,item.arch.name)
class NewsFeed(Feed):
title = 'Arch Linux Recent News Updates'
link = '/news/'
title = 'Arch Linux: Recent news updates'
link = '/news/'
description = 'The latest and greatest news from the Arch Linux distribution.'
def items(self):

View File

@ -72,5 +72,12 @@ def moreforums(request):
template_name="public/moreforums.html",
template_object_name="forum")
def feeds(request):
context = {
'arches': Arch.objects.all(),
'repos': Repo.objects.all(),
}
return render_to_response('public/feeds.html', context)
# vim: set ts=4 sw=4 et:

View File

@ -0,0 +1,27 @@
{% extends "base.html" %}
{% block title %}Arch Linux - RSS Feeds{% endblock %}
{% block content %}
<div class="box">
<h2 class="title">RSS Feeds</h2>
<br /><br />
<p>Several RSS feeds are available for consumption from the Arch website.
The majority of these are package related and allow feeds to be customized
for the updates you care about.</p>
<table cellspacing="20">
<tr><td>News items feed</td>
<td><a href="/feeds/news/">Feed <img src="/media/rss.png" alt="RSS Feed" /></a></td></tr>
<tr><td>Packages feed for <em>all</em> architectures, <em>all</em> repositories</td>
<td><a href="/feeds/packages/">Feed <img src="/media/rss.png" alt="RSS Feed" /></a></td></tr>
{% for arch in arches %}
<tr><td>Packages feed for architecture {{ arch }}, <em>all</em> repositories</td>
<td><a href="/feeds/packages/{{ arch }}/">Feed <img src="/media/rss.png" alt="RSS Feed" /></a></td></tr>
{% for repo in repos %}
<tr><td>Packages feed for architecture {{ arch }}, repository {{ repo }}</td>
<td><a href="/feeds/packages/{{ arch }}/{{ repo }}/">Feed <img src="/media/rss.png" alt="RSS Feed" /></a></td></tr>
{% endfor %}
{% endfor %}
</table>
</div>
<br /><br />
{% endblock %}

View File

@ -64,7 +64,8 @@ <h4 class="news"><a href="{{ news.get_absolute_url }}">{{ news.title }}</a></h4>
</tr>
{% endfor %}
<tr>
<td colspan="2" style="text-align:right;font-size:x-small"><br /><a href="/packages/?sort=-last_update">More...</a></td>
<td style="font-size:x-small"><br /><a href="/feeds/">More Feeds...</a></td>
<td style="text-align:right;font-size:x-small"><br /><a href="/packages/?sort=-last_update">More Updates...</a></td>
</tr>
</table>
</div>

View File

@ -78,6 +78,7 @@
(r'^devel/newuser/$', 'archweb.devel.views.new_user_form'),
# Feeds and sitemaps
(r'^feeds/$', 'archweb.public.views.feeds'),
(r'^feeds/(?P<url>.*)/$',
'django.contrib.syndication.views.feed', {'feed_dict': feeds}),
(r'^sitemap.xml$', 'django.contrib.sitemaps.views.sitemap',