2009-10-30 14:24:26 -07:00
|
|
|
import datetime
|
2010-02-02 20:36:41 -08:00
|
|
|
|
2010-06-08 08:52:53 -07:00
|
|
|
from django.contrib.syndication.views import Feed
|
2010-02-02 20:36:41 -08:00
|
|
|
from django.db.models import Q
|
2010-09-14 15:42:12 -07:00
|
|
|
from django.utils.hashcompat import md5_constructor
|
|
|
|
from django.views.decorators.http import condition
|
2010-09-07 22:23:55 -07:00
|
|
|
|
|
|
|
from main.models import Arch, Repo, Package
|
|
|
|
from news.models import News
|
2009-10-30 14:24:26 -07:00
|
|
|
|
2010-09-14 15:42:12 -07:00
|
|
|
def package_etag(request, *args, **kwargs):
|
|
|
|
latest = Package.objects.latest('last_update')
|
|
|
|
if latest:
|
|
|
|
return md5_constructor(
|
|
|
|
str(kwargs) + str(latest.last_update)).hexdigest()
|
|
|
|
return None
|
|
|
|
|
|
|
|
def package_last_modified(request, *args, **kwargs):
|
|
|
|
# we could break this down based on the request url, but it would probably
|
|
|
|
# cost us more in query time to do so.
|
|
|
|
latest = Package.objects.latest('last_update')
|
|
|
|
if latest:
|
|
|
|
return latest.last_update
|
|
|
|
return None
|
|
|
|
|
2009-10-30 14:24:26 -07:00
|
|
|
class PackageFeed(Feed):
|
2010-05-04 08:02:54 -07:00
|
|
|
link = '/packages/'
|
2010-06-08 08:52:53 -07:00
|
|
|
title_template = 'feeds/packages_title.html'
|
|
|
|
description_template = 'feeds/packages_description.html'
|
2010-05-04 08:02:54 -07:00
|
|
|
|
2010-09-14 15:42:12 -07:00
|
|
|
def __call__(self, request, *args, **kwargs):
|
|
|
|
wrapper = condition(etag_func=package_etag, last_modified_func=package_last_modified)
|
|
|
|
return wrapper(super(PackageFeed, self).__call__)(request, *args, **kwargs)
|
|
|
|
|
2010-06-08 08:52:53 -07:00
|
|
|
def get_object(self, request, arch='', repo=''):
|
2010-02-02 20:36:41 -08:00
|
|
|
obj = dict()
|
|
|
|
qs = Package.objects.select_related('arch', 'repo').order_by('-last_update')
|
|
|
|
|
2010-06-08 08:52:53 -07:00
|
|
|
if arch != '':
|
2010-02-02 20:36:41 -08:00
|
|
|
# feed for a single arch, also include 'any' packages everywhere
|
2010-06-08 08:52:53 -07:00
|
|
|
a = Arch.objects.get(name=arch)
|
2010-09-08 09:12:43 -07:00
|
|
|
qs = qs.filter(Q(arch=a) | Q(arch__agnostic=True))
|
2010-02-02 20:36:41 -08:00
|
|
|
obj['arch'] = a
|
2010-06-08 08:52:53 -07:00
|
|
|
if repo != '':
|
2010-02-02 20:36:41 -08:00
|
|
|
# feed for a single arch AND repo
|
2010-06-08 08:52:53 -07:00
|
|
|
r = Repo.objects.get(name=repo)
|
2010-02-02 20:36:41 -08:00
|
|
|
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 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()
|
2010-09-08 09:12:43 -07:00
|
|
|
if not obj['arch'].agnostic:
|
2010-02-02 20:36:41 -08:00
|
|
|
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']
|
2009-10-30 14:24:26 -07:00
|
|
|
|
|
|
|
def item_pubdate(self, item):
|
|
|
|
return item.last_update
|
|
|
|
|
|
|
|
def item_categories(self, item):
|
2010-08-28 09:37:39 -07:00
|
|
|
return (item.repo.name, item.arch.name)
|
2009-10-30 14:24:26 -07:00
|
|
|
|
2010-02-02 20:36:41 -08:00
|
|
|
|
2010-10-07 17:16:40 -07:00
|
|
|
def retrieve_news_latest():
|
|
|
|
try:
|
|
|
|
latest = News.objects.values('last_modified').latest('last_modified')
|
|
|
|
return latest['last_modified']
|
|
|
|
except News.DoesNotExist:
|
|
|
|
pass
|
2010-09-14 15:42:12 -07:00
|
|
|
return None
|
|
|
|
|
2010-10-07 17:16:40 -07:00
|
|
|
def news_etag(request, *args, **kwargs):
|
|
|
|
latest = retrieve_news_latest()
|
2010-09-14 15:42:12 -07:00
|
|
|
if latest:
|
2010-10-07 17:16:40 -07:00
|
|
|
return md5_constructor(str(latest)).hexdigest()
|
2010-09-14 15:42:12 -07:00
|
|
|
return None
|
|
|
|
|
2010-10-07 17:16:40 -07:00
|
|
|
def news_last_modified(request, *args, **kwargs):
|
|
|
|
return retrieve_news_latest()
|
|
|
|
|
2009-10-30 14:24:26 -07:00
|
|
|
class NewsFeed(Feed):
|
2010-02-02 20:36:41 -08:00
|
|
|
title = 'Arch Linux: Recent news updates'
|
|
|
|
link = '/news/'
|
2010-01-31 13:36:42 -08:00
|
|
|
description = 'The latest and greatest news from the Arch Linux distribution.'
|
2010-06-08 08:52:53 -07:00
|
|
|
title_template = 'feeds/news_title.html'
|
|
|
|
description_template = 'feeds/news_description.html'
|
2009-10-30 14:24:26 -07:00
|
|
|
|
2010-09-14 15:42:12 -07:00
|
|
|
def __call__(self, request, *args, **kwargs):
|
|
|
|
wrapper = condition(etag_func=news_etag, last_modified_func=news_last_modified)
|
|
|
|
return wrapper(super(NewsFeed, self).__call__)(request, *args, **kwargs)
|
|
|
|
|
2009-10-30 14:24:26 -07:00
|
|
|
def items(self):
|
2010-01-31 13:19:12 -08:00
|
|
|
return News.objects.select_related('author').order_by('-postdate', '-id')[:10]
|
2009-10-30 14:24:26 -07:00
|
|
|
|
|
|
|
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:
|