summaryrefslogtreecommitdiff
path: root/feeds.py
diff options
context:
space:
mode:
Diffstat (limited to 'feeds.py')
-rw-r--r--feeds.py84
1 files changed, 36 insertions, 48 deletions
diff --git a/feeds.py b/feeds.py
index 6a17949c..be0e8dbb 100644
--- a/feeds.py
+++ b/feeds.py
@@ -1,57 +1,37 @@
from datetime import datetime, time
-import hashlib
from pytz import utc
from django.conf import settings
from django.contrib.sites.models import Site
from django.contrib.syndication.views import Feed
+from django.db import connection
from django.db.models import Q
from django.utils.feedgenerator import Rss201rev2Feed
from django.views.decorators.http import condition
-from main.utils import retrieve_latest
from main.models import Arch, Repo, Package
from news.models import News
from releng.models import Release
class BatchWritesWrapper(object):
- def __init__(self, outfile, chunks=20):
+ def __init__(self, outfile):
self.outfile = outfile
- self.chunks = chunks
self.buf = []
+
def write(self, s):
buf = self.buf
buf.append(s)
- if len(buf) >= self.chunks:
+ if len(buf) >= 40:
self.outfile.write(''.join(buf))
self.buf = []
+
def flush(self):
self.outfile.write(''.join(self.buf))
self.outfile.flush()
-class GuidNotPermalinkFeed(Rss201rev2Feed):
- @staticmethod
- def check_for_unique_id(f):
- def wrapper(name, contents=None, attrs=None):
- if attrs is None:
- attrs = {}
- if name == 'guid':
- attrs['isPermaLink'] = 'false'
- return f(name, contents, attrs)
- return wrapper
-
- def write_items(self, handler):
- '''
- Totally disgusting. Monkey-patch the handler so if it sees a
- 'unique-id' field come through, add an isPermalink="false" attribute.
- Workaround for http://code.djangoproject.com/ticket/9800
- '''
- handler.addQuickElement = self.check_for_unique_id(
- handler.addQuickElement)
- super(GuidNotPermalinkFeed, self).write_items(handler)
-
+class FasterRssFeed(Rss201rev2Feed):
def write(self, outfile, encoding):
'''
Batch the underlying 'write' calls on the outfile because Python's
@@ -60,28 +40,23 @@ class GuidNotPermalinkFeed(Rss201rev2Feed):
'>' closing tags and over 1600 write calls in our package feed.
'''
wrapper = BatchWritesWrapper(outfile)
- super(GuidNotPermalinkFeed, self).write(wrapper, encoding)
+ super(FasterRssFeed, self).write(wrapper, encoding)
wrapper.flush()
-def package_etag(request, *args, **kwargs):
- latest = retrieve_latest(Package)
- if latest:
- return hashlib.md5(str(kwargs) + str(latest)).hexdigest()
- return None
-
def package_last_modified(request, *args, **kwargs):
- return retrieve_latest(Package)
+ cursor = connection.cursor()
+ cursor.execute("SELECT MAX(last_update) FROM packages")
+ return cursor.fetchone()[0]
class PackageFeed(Feed):
- feed_type = GuidNotPermalinkFeed
+ feed_type = FasterRssFeed
link = '/packages/'
- title_template = 'feeds/packages_title.html'
def __call__(self, request, *args, **kwargs):
- wrapper = condition(etag_func=package_etag, last_modified_func=package_last_modified)
+ wrapper = condition(last_modified_func=package_last_modified)
return wrapper(super(PackageFeed, self).__call__)(request, *args, **kwargs)
__name__ = 'package_feed'
@@ -131,6 +106,8 @@ class PackageFeed(Feed):
def items(self, obj):
return obj['qs']
+ item_guid_is_permalink = False
+
def item_guid(self, item):
# http://diveintomark.org/archives/2004/05/28/howto-atom-id
date = item.last_update
@@ -141,6 +118,9 @@ class PackageFeed(Feed):
def item_pubdate(self, item):
return item.last_update
+ def item_title(self, item):
+ return '%s %s %s' % (item.pkgname, item.full_version, item.arch.name)
+
def item_description(self, item):
return item.pkgdesc
@@ -148,27 +128,22 @@ class PackageFeed(Feed):
return (item.repo.name, item.arch.name)
-def news_etag(request, *args, **kwargs):
- latest = retrieve_latest(News, 'last_modified')
- if latest:
- return hashlib.md5(str(latest)).hexdigest()
- return None
-
def news_last_modified(request, *args, **kwargs):
- return retrieve_latest(News, 'last_modified')
+ cursor = connection.cursor()
+ cursor.execute("SELECT MAX(last_modified) FROM news")
+ return cursor.fetchone()[0]
class NewsFeed(Feed):
- feed_type = GuidNotPermalinkFeed
+ feed_type = FasterRssFeed
title = settings.BRANDING_DISTRONAME+': Recent news updates'
link = '/news/'
description = 'The latest and greatest news from the '+settings.BRANDING_DISTRONAME+' distribution.'
subtitle = description
- description_template = 'feeds/news_description.html'
def __call__(self, request, *args, **kwargs):
- wrapper = condition(etag_func=news_etag, last_modified_func=news_last_modified)
+ wrapper = condition(last_modified_func=news_last_modified)
return wrapper(super(NewsFeed, self).__call__)(request, *args, **kwargs)
__name__ = 'news_feed'
@@ -177,21 +152,29 @@ class NewsFeed(Feed):
return News.objects.select_related('author').order_by(
'-postdate', '-id')[:10]
+ item_guid_is_permalink = False
+
def item_guid(self, item):
return item.guid
def item_pubdate(self, item):
return item.postdate
+ def item_updateddate(self, item):
+ return item.last_modified
+
def item_author_name(self, item):
return item.author.get_full_name()
def item_title(self, item):
return item.title
+ def item_description(self, item):
+ return item.html()
+
class ReleaseFeed(Feed):
- feed_type = GuidNotPermalinkFeed
+ feed_type = FasterRssFeed
title = settings.BRANDING_DISTRONAME+': Releases'
link = '/download/'
@@ -212,6 +195,11 @@ class ReleaseFeed(Feed):
def item_pubdate(self, item):
return datetime.combine(item.release_date, time()).replace(tzinfo=utc)
+ def item_updateddate(self, item):
+ return item.last_modified
+
+ item_guid_is_permalink = False
+
def item_guid(self, item):
# http://diveintomark.org/archives/2004/05/28/howto-atom-id
date = item.release_date