summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan McGee <dan@archlinux.org>2012-03-07 23:47:10 -0600
committerDan McGee <dan@archlinux.org>2013-09-30 20:53:25 -0500
commit5a8cfb8566f8764f5ee5370a3414a3a4aafb206a (patch)
tree82b9ce2a815225d8becf960cc28f3c9096fa1113
parent1dbfb0fd1b0024093f42268e168e65c9e10b8f1b (diff)
downloadarchweb-5a8cfb8566f8764f5ee5370a3414a3a4aafb206a.tar.gz
archweb-5a8cfb8566f8764f5ee5370a3414a3a4aafb206a.zip
WIP: adoptable orphans report
-rw-r--r--devel/utils.py43
-rw-r--r--devel/views.py7
2 files changed, 49 insertions, 1 deletions
diff --git a/devel/utils.py b/devel/utils.py
index 340841f5..e45a3cb3 100644
--- a/devel/utils.py
+++ b/devel/utils.py
@@ -1,3 +1,4 @@
+from collections import defaultdict
import re
from django.contrib.auth.models import User
@@ -54,6 +55,48 @@ def ignore_does_not_exist(func):
return new_func
+@cache_function(300)
+def get_adoptable_orphans(user=None):
+ sql = """
+SELECT DISTINCT child.id, ppr.user_id, pp.pkgbase
+FROM package_depends ppd
+JOIN packages pp
+ ON ppd.pkg_id = pp.id
+JOIN packages_packagerelation ppr
+ ON pp.pkgbase = ppr.pkgbase
+JOIN (
+ SELECT DISTINCT cp.id, cp.pkgname
+ FROM packages cp
+ LEFT JOIN packages_packagerelation pr
+ ON cp.pkgbase = pr.pkgbase
+ WHERE pr.id IS NULL
+) child
+ ON ppd.depname = child.pkgname
+"""
+ cursor = connection.cursor()
+ cursor.execute(sql)
+ results = cursor.fetchall()
+
+ pkg_ids = set(t[0] for t in results)
+ user_ids = set(t[1] for t in results)
+ adopt_map = defaultdict(list)
+
+ users = User.objects.in_bulk(user_ids)
+ for child_id, user_id, pkgbase in results:
+ adopt_map[child_id].append((users[user_id], pkgbase))
+
+ pkgs = Package.objects.normal().in_bulk(pkg_ids)
+ pkgs = pkgs.values()
+
+ adoptable = []
+ for pkg in pkgs:
+ pkg.possible = adopt_map[pkg.id]
+ if not user or user in [t[0] for t in pkg.possible]:
+ adoptable.append(pkg)
+
+ return adoptable
+
+
class UserFinder(object):
def __init__(self):
self.cache = {}
diff --git a/devel/views.py b/devel/views.py
index 378d6d57..79b6eb72 100644
--- a/devel/views.py
+++ b/devel/views.py
@@ -28,7 +28,7 @@ from packages.models import PackageRelation, Signoff, FlagRequest, Depend
from packages.utils import get_signoff_groups
from todolists.models import TodolistPackage
from todolists.utils import get_annotated_todolists
-from .utils import get_annotated_maintainers
+from .utils import get_annotated_maintainers, get_adoptable_orphans, UserFinder
@login_required
@@ -298,6 +298,11 @@ def report(request, report_name, username=None):
if bad:
filtered.append(package)
packages = filtered
+ elif report_name == 'possible-maintainers':
+ title = 'TODO'
+ packages = get_adoptable_orphans(user)
+ names = ('Possible Maintainers',)
+ attrs = ('possible',)
else:
raise Http404