From d685d51e8c80f29d4f14977a0d8088534e6626c4 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Sun, 20 May 2012 13:21:59 -0500 Subject: Ensure we use last_modified date from News in headers We were actually using the postdate attribute rather than last_modified, which means any News objects that get edited would not trigger an update of the feed. Signed-off-by: Dan McGee --- feeds.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'feeds.py') diff --git a/feeds.py b/feeds.py index ee856f62..2e9b349b 100644 --- a/feeds.py +++ b/feeds.py @@ -106,13 +106,13 @@ class PackageFeed(Feed): def news_etag(request, *args, **kwargs): - latest = retrieve_latest(News) + 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) + return retrieve_latest(News, 'last_modified') class NewsFeed(Feed): feed_type = GuidNotPermalinkFeed -- cgit v1.2.3 From 0cc369e985dd6376f0367e4b57e980ce14231796 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Tue, 31 Jul 2012 00:09:28 -0500 Subject: Update several bits and pieces for staging packages This will prevent [staging] packages from cluttering normal user's view on the website, but allow us to still import everything from this repository for developer use. Signed-off-by: Dan McGee --- feeds.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'feeds.py') diff --git a/feeds.py b/feeds.py index 2e9b349b..d6a97533 100644 --- a/feeds.py +++ b/feeds.py @@ -38,6 +38,7 @@ def package_etag(request, *args, **kwargs): def package_last_modified(request, *args, **kwargs): return retrieve_latest(Package) + class PackageFeed(Feed): feed_type = GuidNotPermalinkFeed @@ -51,8 +52,7 @@ class PackageFeed(Feed): def get_object(self, request, arch='', repo=''): obj = dict() - qs = Package.objects.normal().order_by( - '-last_update') + qs = Package.objects.normal().order_by('-last_update') if arch != '': # feed for a single arch, also include 'any' packages everywhere @@ -64,6 +64,8 @@ class PackageFeed(Feed): r = Repo.objects.get(name__iexact=repo) qs = qs.filter(repo=r) obj['repo'] = r + else: + qs = qs.filter(repo__staging=False) obj['qs'] = qs[:50] return obj @@ -114,6 +116,7 @@ def news_etag(request, *args, **kwargs): def news_last_modified(request, *args, **kwargs): return retrieve_latest(News, 'last_modified') + class NewsFeed(Feed): feed_type = GuidNotPermalinkFeed -- cgit v1.2.3 From c03b9c5f10b1695c4a099a578f19e09b33c6df10 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Tue, 31 Jul 2012 00:16:36 -0500 Subject: feeds: add all arches for repo feed If you wanted to see all updates regardless of architecture for [testing] before, there wasn't really a way to do so. Add one. Signed-off-by: Dan McGee --- feeds.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'feeds.py') diff --git a/feeds.py b/feeds.py index d6a97533..55275ead 100644 --- a/feeds.py +++ b/feeds.py @@ -71,8 +71,10 @@ class PackageFeed(Feed): def title(self, obj): s = 'Arch Linux: Recent package updates' - if 'repo' in obj: + if 'repo' in obj and 'arch' in obj: s += ' (%s [%s])' % (obj['arch'].name, obj['repo'].name.lower()) + elif 'repo' in obj: + s += ' [%s]' % (obj['repo'].name.lower()) elif 'arch' in obj: s += ' (%s)' % (obj['arch'].name) return s -- cgit v1.2.3 From 177b93ac21486c32afba543f77b9273f994f5e20 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Tue, 6 Nov 2012 08:18:53 -0600 Subject: Make guid feeds helper a @staticfunction Signed-off-by: Dan McGee --- feeds.py | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) (limited to 'feeds.py') diff --git a/feeds.py b/feeds.py index 55275ead..d00aec87 100644 --- a/feeds.py +++ b/feeds.py @@ -11,21 +11,24 @@ from main.utils import retrieve_latest from main.models import Arch, Repo, Package from news.models import News -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 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 hander 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 = check_for_unique_id(handler.addQuickElement) + handler.addQuickElement = self.check_for_unique_id( + handler.addQuickElement) super(GuidNotPermalinkFeed, self).write_items(handler) -- cgit v1.2.3 From 554df3f8cfdce7a41904ac985dc2e6f3d43c358d Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Tue, 6 Nov 2012 08:22:44 -0600 Subject: Remove explicit timezone handling from feeds Signed-off-by: Dan McGee --- feeds.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'feeds.py') diff --git a/feeds.py b/feeds.py index d00aec87..49e0bc6e 100644 --- a/feeds.py +++ b/feeds.py @@ -1,5 +1,4 @@ import hashlib -import pytz from django.contrib.sites.models import Site from django.contrib.syndication.views import Feed @@ -106,7 +105,7 @@ class PackageFeed(Feed): date.strftime('%Y%m%d%H%M')) def item_pubdate(self, item): - return item.last_update.replace(tzinfo=pytz.utc) + return item.last_update def item_categories(self, item): return (item.repo.name, item.arch.name) @@ -144,7 +143,7 @@ class NewsFeed(Feed): return item.guid def item_pubdate(self, item): - return item.postdate.replace(tzinfo=pytz.utc) + return item.postdate def item_author_name(self, item): return item.author.get_full_name() -- cgit v1.2.3 From 019785186ce5861215ece96818513ec21e15df41 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Sun, 13 Jan 2013 21:43:11 -0600 Subject: Add __name__ attribute to class-based Feeds views This should hopefully allow these views to not be labeled as '_wrapped_view' in performance monitoring output. Signed-off-by: Dan McGee --- feeds.py | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'feeds.py') diff --git a/feeds.py b/feeds.py index 49e0bc6e..c5bdbdee 100644 --- a/feeds.py +++ b/feeds.py @@ -52,6 +52,8 @@ class PackageFeed(Feed): wrapper = condition(etag_func=package_etag, last_modified_func=package_last_modified) return wrapper(super(PackageFeed, self).__call__)(request, *args, **kwargs) + __name__ = 'package_feed' + def get_object(self, request, arch='', repo=''): obj = dict() qs = Package.objects.normal().order_by('-last_update') @@ -135,6 +137,8 @@ class NewsFeed(Feed): wrapper = condition(etag_func=news_etag, last_modified_func=news_last_modified) return wrapper(super(NewsFeed, self).__call__)(request, *args, **kwargs) + __name__ = 'news_feed' + def items(self): return News.objects.select_related('author').order_by( '-postdate', '-id')[:10] -- cgit v1.2.3 From fbc153ed456f2f4aa730580f942d10d973fd1ea9 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Sat, 19 Jan 2013 10:33:03 -0600 Subject: Initial cut of a Releases RSS feed This is our first use of enclosures on the site as well. Signed-off-by: Dan McGee --- feeds.py | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) (limited to 'feeds.py') diff --git a/feeds.py b/feeds.py index c5bdbdee..98e1fb82 100644 --- a/feeds.py +++ b/feeds.py @@ -1,4 +1,6 @@ +from datetime import datetime, time import hashlib +from pytz import utc from django.contrib.sites.models import Site from django.contrib.syndication.views import Feed @@ -9,6 +11,7 @@ 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 GuidNotPermalinkFeed(Rss201rev2Feed): @@ -152,4 +155,44 @@ class NewsFeed(Feed): def item_author_name(self, item): return item.author.get_full_name() + +class ReleaseFeed(Feed): + feed_type = GuidNotPermalinkFeed + + title = 'Arch Linux: Releases' + link = '/download/' + description = 'Release ISOs' + subtitle = description + + __name__ = 'release_feed' + + def items(self): + return Release.objects.filter(available=True)[:10] + + def item_title(self, item): + return item.version + + def item_description(self, item): + return item.info_html() + + # TODO: individual release pages + item_link = '/download/' + + def item_pubdate(self, item): + return datetime.combine(item.release_date, time()).replace(tzinfo=utc) + + def item_guid(self, item): + # http://diveintomark.org/archives/2004/05/28/howto-atom-id + date = item.release_date + return 'tag:%s,%s:%s' % (Site.objects.get_current().domain, + date.strftime('%Y-%m-%d'), item.iso_url()) + + def item_enclosure_url(self, item): + domain = Site.objects.get_current().domain + proto = 'https' + return "%s://%s/%s.torrent" % (proto, domain, item.iso_url()) + + item_enclosure_mime_type = 'application/x-bittorrent' + item_enclosure_length = 0 + # vim: set ts=4 sw=4 et: -- cgit v1.2.3 From 8cfaa39a0464f7ee35af76473d3e73ae587a6cb8 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Sat, 19 Jan 2013 10:55:58 -0600 Subject: Add more metadata to releng Release model Add a file_size field which we will use in the RSS feed, and also add a field for future storage of the torrent data itself. Signed-off-by: Dan McGee --- feeds.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'feeds.py') diff --git a/feeds.py b/feeds.py index 98e1fb82..c68d3b0e 100644 --- a/feeds.py +++ b/feeds.py @@ -192,7 +192,9 @@ class ReleaseFeed(Feed): proto = 'https' return "%s://%s/%s.torrent" % (proto, domain, item.iso_url()) + def item_enclosure_length(self, item): + return item.file_size or "" + item_enclosure_mime_type = 'application/x-bittorrent' - item_enclosure_length = 0 # vim: set ts=4 sw=4 et: -- cgit v1.2.3 From 1a7e5d22f1c4e948c624d26b4d8c1ed30189acfe Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Sat, 19 Jan 2013 12:06:47 -0600 Subject: Add basic release list and details views Signed-off-by: Dan McGee --- feeds.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) (limited to 'feeds.py') diff --git a/feeds.py b/feeds.py index c68d3b0e..9721f41c 100644 --- a/feeds.py +++ b/feeds.py @@ -175,9 +175,6 @@ class ReleaseFeed(Feed): def item_description(self, item): return item.info_html() - # TODO: individual release pages - item_link = '/download/' - def item_pubdate(self, item): return datetime.combine(item.release_date, time()).replace(tzinfo=utc) @@ -185,7 +182,7 @@ class ReleaseFeed(Feed): # http://diveintomark.org/archives/2004/05/28/howto-atom-id date = item.release_date return 'tag:%s,%s:%s' % (Site.objects.get_current().domain, - date.strftime('%Y-%m-%d'), item.iso_url()) + date.strftime('%Y-%m-%d'), item.get_absolute_url()) def item_enclosure_url(self, item): domain = Site.objects.get_current().domain -- cgit v1.2.3