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:
parent
f22f20003b
commit
6fe8aec0ab
60
feeds.py
60
feeds.py
@ -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):
|
||||
|
@ -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:
|
||||
|
||||
|
27
templates/public/feeds.html
Normal file
27
templates/public/feeds.html
Normal 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 %}
|
||||
|
@ -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>
|
||||
|
1
urls.py
1
urls.py
@ -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',
|
||||
|
Loading…
Reference in New Issue
Block a user