6fe8aec0ab
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>
78 lines
2.3 KiB
Python
78 lines
2.3 KiB
Python
import datetime
|
|
|
|
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):
|
|
def get_object(self, bits):
|
|
# just cut the BS early
|
|
if len(bits) > 2:
|
|
raise FeedDoesNotExist
|
|
|
|
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
|
|
|
|
def item_categories(self, item):
|
|
return (item.repo.name,item.arch.name)
|
|
|
|
|
|
class NewsFeed(Feed):
|
|
title = 'Arch Linux: Recent news updates'
|
|
link = '/news/'
|
|
description = 'The latest and greatest news from the Arch Linux distribution.'
|
|
|
|
def items(self):
|
|
return News.objects.select_related('author').order_by('-postdate', '-id')[:10]
|
|
|
|
def item_pubdate(self, item):
|
|
d = item.postdate
|
|
return datetime.datetime(d.year, d.month, d.day)
|
|
|
|
def item_author_name(self, item):
|
|
return item.author.get_full_name()
|
|
|
|
# vim: set ts=4 sw=4 et:
|
|
|