From 651678be2b6208cbfb45e11f5f390d66cf3eb8a6 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Fri, 24 Oct 2014 13:50:38 -0500 Subject: Reorganize sidebar links involving people Signed-off-by: Dan McGee --- templates/public/index.html | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/templates/public/index.html b/templates/public/index.html index d815363b..3b17803c 100644 --- a/templates/public/index.html +++ b/templates/public/index.html @@ -108,7 +108,6 @@ {% cache 115 main-page-right secure %}
-- cgit v1.2.3 From 15bb0e7101aa9bfa3f63e8ef44f4a8e1e310e3c1 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Sun, 26 Oct 2014 21:44:11 -0500 Subject: Remove Etag header from feeds We have Last-Modified here, and from what I can tell with some more reading and playing with caching, it isn't necessarily wise to set both of them in the same response. Set the one that we actually trust. Signed-off-by: Dan McGee --- feeds.py | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/feeds.py b/feeds.py index 0bbac270..cb01fbb1 100644 --- a/feeds.py +++ b/feeds.py @@ -1,5 +1,4 @@ from datetime import datetime, time -import hashlib from pytz import utc from django.contrib.sites.models import Site @@ -63,12 +62,6 @@ class GuidNotPermalinkFeed(Rss201rev2Feed): wrapper.flush() -def package_etag(request, *args, **kwargs): - latest = package_last_modified(request) - if latest: - return hashlib.md5(str(kwargs) + str(latest)).hexdigest() - return None - def package_last_modified(request, *args, **kwargs): cursor = connection.cursor() cursor.execute("SELECT MAX(last_update) FROM packages") @@ -81,7 +74,7 @@ class PackageFeed(Feed): link = '/packages/' 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' @@ -151,12 +144,6 @@ class PackageFeed(Feed): return (item.repo.name, item.arch.name) -def news_etag(request, *args, **kwargs): - latest = news_last_modified(request) - if latest: - return hashlib.md5(str(latest)).hexdigest() - return None - def news_last_modified(request, *args, **kwargs): cursor = connection.cursor() cursor.execute("SELECT MAX(last_modified) FROM news") @@ -172,7 +159,7 @@ class NewsFeed(Feed): subtitle = description 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' -- cgit v1.2.3 From 8e990ca945f4fc5b27c0a81a484a107c83aa69d3 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Sun, 26 Oct 2014 21:56:24 -0500 Subject: Kill now unneeded workaround for Django issue #9800 Signed-off-by: Dan McGee --- feeds.py | 38 +++++++++++++------------------------- 1 file changed, 13 insertions(+), 25 deletions(-) diff --git a/feeds.py b/feeds.py index cb01fbb1..24611e7e 100644 --- a/feeds.py +++ b/feeds.py @@ -18,38 +18,20 @@ class BatchWritesWrapper(object): self.outfile = outfile self.chunks = chunks self.buf = [] + def write(self, s): buf = self.buf buf.append(s) if len(buf) >= self.chunks: 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 @@ -58,7 +40,7 @@ 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() @@ -69,7 +51,7 @@ def package_last_modified(request, *args, **kwargs): class PackageFeed(Feed): - feed_type = GuidNotPermalinkFeed + feed_type = FasterRssFeed link = '/packages/' @@ -124,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 @@ -151,7 +135,7 @@ def news_last_modified(request, *args, **kwargs): class NewsFeed(Feed): - feed_type = GuidNotPermalinkFeed + feed_type = FasterRssFeed title = 'Arch Linux: Recent news updates' link = '/news/' @@ -168,6 +152,8 @@ 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 @@ -185,7 +171,7 @@ class NewsFeed(Feed): class ReleaseFeed(Feed): - feed_type = GuidNotPermalinkFeed + feed_type = FasterRssFeed title = 'Arch Linux: Releases' link = '/download/' @@ -206,6 +192,8 @@ class ReleaseFeed(Feed): def item_pubdate(self, item): return datetime.combine(item.release_date, time()).replace(tzinfo=utc) + item_guid_is_permalink = False + def item_guid(self, item): # http://diveintomark.org/archives/2004/05/28/howto-atom-id date = item.release_date -- cgit v1.2.3 From 9c701ebba1f2ef403aab95354a8ae4efdb7df74c Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Sun, 26 Oct 2014 22:06:08 -0500 Subject: Double batch size in BatchWritesWrapper Signed-off-by: Dan McGee --- feeds.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/feeds.py b/feeds.py index 24611e7e..7247e95c 100644 --- a/feeds.py +++ b/feeds.py @@ -14,15 +14,14 @@ 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 = [] -- cgit v1.2.3 From bd2bc6a1c58723502ef6c2e9f49248908a161b13 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Sun, 26 Oct 2014 22:23:56 -0500 Subject: Add last modified date to releases Signed-off-by: Dan McGee --- feeds.py | 6 ++++++ releng/admin.py | 1 + releng/migrations/0002_release_last_modified.py | 22 ++++++++++++++++++++++ .../0003_release_populate_last_modified.py | 21 +++++++++++++++++++++ releng/models.py | 1 + 5 files changed, 51 insertions(+) create mode 100644 releng/migrations/0002_release_last_modified.py create mode 100644 releng/migrations/0003_release_populate_last_modified.py diff --git a/feeds.py b/feeds.py index 7247e95c..0f7fa5d7 100644 --- a/feeds.py +++ b/feeds.py @@ -159,6 +159,9 @@ class NewsFeed(Feed): 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() @@ -191,6 +194,9 @@ 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): diff --git a/releng/admin.py b/releng/admin.py index c7e6396e..9c93c4be 100644 --- a/releng/admin.py +++ b/releng/admin.py @@ -18,6 +18,7 @@ class ReleaseAdmin(admin.ModelAdmin): list_display = ('version', 'release_date', 'kernel_version', 'available', 'created') list_filter = ('available', 'release_date') + readonly_fields = ('created', 'last_modified') SIMPLE_MODELS = (Architecture, BootType, Bootloader, ClockChoice, Filesystem, diff --git a/releng/migrations/0002_release_last_modified.py b/releng/migrations/0002_release_last_modified.py new file mode 100644 index 00000000..58502452 --- /dev/null +++ b/releng/migrations/0002_release_last_modified.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import datetime +from django.utils.timezone import utc + + +class Migration(migrations.Migration): + + dependencies = [ + ('releng', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='release', + name='last_modified', + field=models.DateTimeField(default=datetime.datetime(2001, 1, 1, tzinfo=utc), editable=False), + preserve_default=False, + ), + ] diff --git a/releng/migrations/0003_release_populate_last_modified.py b/releng/migrations/0003_release_populate_last_modified.py new file mode 100644 index 00000000..ec7b6fda --- /dev/null +++ b/releng/migrations/0003_release_populate_last_modified.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + +def forwards(apps, schema_editor): + Release = apps.get_model('releng', 'Release') + Release.objects.update(last_modified=models.F('created')) + +def backwards(apps, schema_editor): + pass + +class Migration(migrations.Migration): + + dependencies = [ + ('releng', '0002_release_last_modified'), + ] + + operations = [ + migrations.RunPython(forwards, backwards) + ] diff --git a/releng/models.py b/releng/models.py index c3ffd322..436308f2 100644 --- a/releng/models.py +++ b/releng/models.py @@ -120,6 +120,7 @@ class Release(models.Model): md5_sum = models.CharField('MD5 digest', max_length=32, blank=True) sha1_sum = models.CharField('SHA1 digest', max_length=40, blank=True) created = models.DateTimeField(editable=False) + last_modified = models.DateTimeField(editable=False) available = models.BooleanField(default=True) info = models.TextField('Public information', blank=True) torrent_data = models.TextField(blank=True, -- cgit v1.2.3 From e7449f7063f3f56af118ed8ad703ec3fce6bc39a Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Tue, 28 Oct 2014 14:14:00 -0500 Subject: Bump to django_countries bugfix release Signed-off-by: Dan McGee --- requirements.txt | 2 +- requirements_prod.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 4b111f06..e1acd2e9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,7 +5,7 @@ Jinja2==2.7.3 Markdown==2.4.1 bencode==1.0 django-jinja==1.0.4 -django_countries==3.0 +django_countries==3.0.1 jsmin==2.0.11 pgpdump==1.5 pytz>=2014.7 diff --git a/requirements_prod.txt b/requirements_prod.txt index 4f52ce3e..ef535eb8 100644 --- a/requirements_prod.txt +++ b/requirements_prod.txt @@ -5,7 +5,7 @@ Jinja2==2.7.3 Markdown==2.4.1 bencode==1.0 django-jinja==1.0.4 -django_countries==3.0 +django_countries==3.0.1 jsmin==2.0.11 pgpdump==1.5 psycopg2==2.5.4 -- cgit v1.2.3