diff options
author | jelle van der Waa <jelle@vdwaa.nl> | 2018-06-08 21:15:21 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-06-08 21:15:21 +0200 |
commit | 89f3940a08427895d64df060f37701edb5dffd2e (patch) | |
tree | fd5877c99ee7b26d9baae12c2cf7148604902faa | |
parent | 50a51bef297c0122b4a67416c785d4ffeb880cba (diff) | |
parent | 8406d4145288730d2b0c3450c483b8c070cf7bca (diff) |
Merge pull request #58 from jelly/added_removed_rssrelease_2018-06-10
Added removed rss
-rw-r--r-- | README.md | 7 | ||||
-rw-r--r-- | feeds.py | 102 | ||||
-rw-r--r-- | packages/models.py | 4 | ||||
-rw-r--r-- | templates/public/feeds.html | 62 | ||||
-rw-r--r-- | urls.py | 6 |
5 files changed, 177 insertions, 4 deletions
@@ -76,6 +76,13 @@ packages, you will probably want the following: Alter architecture and repo to get x86\_64 and packages from other repos if needed. +8. Database Updates for Added/Removed packages + + sqlite3 archweb.db < packages/sql/update.sqlite3.sql + +For PostgreSQL use packages/sql/update.postgresql_psycopg2.sql + + # Testing SMTP server To be able to create an account on your test environment an SMTP server is @@ -1,6 +1,8 @@ from datetime import datetime, time from pytz import utc +from django.core.exceptions import ObjectDoesNotExist +from django.contrib.admin.models import ADDITION, DELETION from django.contrib.sites.models import Site from django.contrib.syndication.views import Feed from django.db import connection @@ -10,6 +12,7 @@ from django.views.decorators.http import condition from main.models import Arch, Repo, Package from news.models import News +from packages.models import Update from releng.models import Release @@ -44,9 +47,10 @@ class FasterRssFeed(Rss201rev2Feed): def package_last_modified(request, *args, **kwargs): - cursor = connection.cursor() - cursor.execute("SELECT MAX(last_update) FROM packages") - return cursor.fetchone()[0] + try: + return Package.objects.latest('last_update').last_update + except ObjectDoesNotExist: + return class PackageFeed(Feed): @@ -126,6 +130,98 @@ class PackageFeed(Feed): def item_categories(self, item): return (item.repo.name, item.arch.name) +def removal_last_modified(request, *args, **kwargs): + try: + return Update.objects.latest('created').created + except ObjectDoesNotExist: + return + + +class PackageUpdatesFeed(Feed): + feed_type = FasterRssFeed + link = '/packages/' + + def __call__(self, request, *args, **kwargs): + wrapper = condition(last_modified_func=removal_last_modified) + return wrapper(super(PackageUpdatesFeed, self).__call__)(request, *args, **kwargs) + + __name__ = 'packages_updates_feed' + + def get_object(self, request, operation='', arch='', repo=''): + obj = dict() + + if 'added' in request.path: + flag = ADDITION + obj['action'] = 'added' + elif 'removed' in request.path: + flag = DELETION + obj['action'] = 'removed' + + qs = Update.objects.filter(action_flag=flag).order_by('-created') + + if arch != '': + # feed for a single arch, also include 'any' packages everywhere + a = Arch.objects.get(name=arch) + qs = qs.filter(Q(arch=a) | Q(arch__agnostic=True)) + obj['arch'] = a + if repo != '': + # feed for a single arch AND repo + 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 + + def title(self, obj): + s = 'Arch Linux: Recent {} packages'.format(obj['action']) + 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 + + def description(self, obj): + s = 'Recently {} packages in the Arch Linux package repositories'.format(obj['action']) + if 'arch' in obj: + s += ' for the \'%s\' architecture' % obj['arch'].name.lower() + if not obj['arch'].agnostic: + s += ' (including \'any\' packages)' + if 'repo' in obj: + s += ' in the [%s] repository' % obj['repo'].name.lower() + s += '.' + return s + + subtitle = description + + 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.created + return 'tag:%s,%s:%s%s' % (Site.objects.get_current().domain, + date.strftime('%Y-%m-%d'), item.get_absolute_url(), + date.strftime('%Y%m%d%H%M')) + + def item_pubdate(self, item): + return item.created + + def item_title(self, item): + return '%s %s' % (item.pkgname, item.arch.name) + + def item_description(self, item): + return item.pkgname + + def item_categories(self, item): + return (item.repo.name, item.arch.name) + def news_last_modified(request, *args, **kwargs): cursor = connection.cursor() diff --git a/packages/models.py b/packages/models.py index 83cc7cb7..9b4cc645 100644 --- a/packages/models.py +++ b/packages/models.py @@ -338,6 +338,10 @@ class Update(models.Model): pkgs = pkgs.filter(arch__in=arches) return pkgs + def get_absolute_url(self): + return '/packages/%s/%s/%s/' % (self.repo.name.lower(), + self.arch.name, self.pkgname) + def __unicode__(self): return u'%s of %s on %s' % (self.get_action_flag_display(), self.pkgname, self.created) diff --git a/templates/public/feeds.html b/templates/public/feeds.html index fb02dd9d..435930db 100644 --- a/templates/public/feeds.html +++ b/templates/public/feeds.html @@ -59,6 +59,68 @@ <p>A <a href="https://aur.archlinux.org/rss/" class="rss" title="AUR newest packages feed">newest packages feed</a> is also available from the <a href="https://aur.archlinux.org/" title="AUR Homepage">Arch User Repository (AUR)</a>.</p> + <p>Recently added packages.</p> + <table class="pretty2"> + <thead> + <tr> + <th></th> + <th>All Arches</th> + {% for arch in arches %} + <th>{{ arch }}</th> + {% endfor %} + </tr> + </thead> + <tbody> + <tr> + <td><strong>All Repos</strong></td> + <td><a href="/feeds/packages/added/" class="rss">Feed</a></td> + {% for arch in arches %} + <td><a href="/feeds/packages/added/{{ arch }}/" class="rss">Feed</a></td> + {% endfor %} + </tr> + {% for repo in repos %} + <tr> + <td><strong>{{ repo }}</strong></td> + <td><a href="/feeds/packages/added/all/{{ repo|lower }}/" class="rss">Feed</a></td> + {% for arch in arches %} + <td><a href="/feeds/packages/added/{{ arch }}/{{ repo|lower }}/" class="rss">Feed</a></td> + {% endfor %} + </tr> + {% endfor %} + </tbody> + </table> + + <p>Recently removed packages.</p> + <table class="pretty2"> + <thead> + <tr> + <th></th> + <th>All Arches</th> + {% for arch in arches %} + <th>{{ arch }}</th> + {% endfor %} + </tr> + </thead> + <tbody> + <tr> + <td><strong>All Repos</strong></td> + <td><a href="/feeds/packages/removed/" class="rss">Feed</a></td> + {% for arch in arches %} + <td><a href="/feeds/packages/removed/{{ arch }}/" class="rss">Feed</a></td> + {% endfor %} + </tr> + {% for repo in repos %} + <tr> + <td><strong>{{ repo }}</strong></td> + <td><a href="/feeds/packages/removed/all/{{ repo|lower }}/" class="rss">Feed</a></td> + {% for arch in arches %} + <td><a href="/feeds/packages/removed/{{ arch }}/{{ repo|lower }}/" class="rss">Feed</a></td> + {% endfor %} + </tr> + {% endfor %} + </tbody> + </table> + <h3>Release Feed</h3> <p>Grab the <a href="/feeds/releases/" class="rss" title="Arch Linux release feed">ISO release feed</a> @@ -6,7 +6,7 @@ from django.contrib.auth import views as auth_views from django.views.decorators.cache import cache_page from django.views.generic import TemplateView -from feeds import PackageFeed, NewsFeed, ReleaseFeed +from feeds import PackageFeed, NewsFeed, ReleaseFeed, PackageUpdatesFeed import sitemaps import devel.urls @@ -54,6 +54,10 @@ feeds_patterns = [ url(r'^$', public.views.feeds, name='feeds-list'), url(r'^news/$', cache_page(311)(NewsFeed())), url(r'^packages/$', cache_page(313)(PackageFeed())), + url(r'^packages/(added|removed)/$', cache_page(313)(PackageUpdatesFeed())), + url(r'^packages/(added|removed)/(?P<arch>[A-z0-9]+)/$', cache_page(313)(PackageUpdatesFeed())), + url(r'^packages/(added|removed)/all/(?P<repo>[A-z0-9\-]+)/$', cache_page(313)(PackageUpdatesFeed())), + url(r'^packages/(added|removed)/(?P<arch>[A-z0-9]+)/(?P<repo>[A-z0-9\-]+)/$', cache_page(313)(PackageUpdatesFeed())), url(r'^packages/(?P<arch>[A-z0-9]+)/$', cache_page(313)(PackageFeed())), url(r'^packages/all/(?P<repo>[A-z0-9\-]+)/$', cache_page(313)(PackageFeed())), url(r'^packages/(?P<arch>[A-z0-9]+)/(?P<repo>[A-z0-9\-]+)/$', cache_page(313)(PackageFeed())), |