summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjelle van der Waa <jelle@vdwaa.nl>2018-06-08 21:15:21 +0200
committerGitHub <noreply@github.com>2018-06-08 21:15:21 +0200
commit89f3940a08427895d64df060f37701edb5dffd2e (patch)
treefd5877c99ee7b26d9baae12c2cf7148604902faa
parent50a51bef297c0122b4a67416c785d4ffeb880cba (diff)
parent8406d4145288730d2b0c3450c483b8c070cf7bca (diff)
Merge pull request #58 from jelly/added_removed_rssrelease_2018-06-10
Added removed rss
-rw-r--r--README.md7
-rw-r--r--feeds.py102
-rw-r--r--packages/models.py4
-rw-r--r--templates/public/feeds.html62
-rw-r--r--urls.py6
5 files changed, 177 insertions, 4 deletions
diff --git a/README.md b/README.md
index 219b1abb..3cafaea2 100644
--- a/README.md
+++ b/README.md
@@ -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
diff --git a/feeds.py b/feeds.py
index 0f7fa5d7..fb993624 100644
--- a/feeds.py
+++ b/feeds.py
@@ -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>
diff --git a/urls.py b/urls.py
index ba63eea8..fd26b1cc 100644
--- a/urls.py
+++ b/urls.py
@@ -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())),