diff options
author | Dan McGee <dan@archlinux.org> | 2012-03-07 23:47:10 -0600 |
---|---|---|
committer | Dan McGee <dan@archlinux.org> | 2013-09-30 20:53:25 -0500 |
commit | 5a8cfb8566f8764f5ee5370a3414a3a4aafb206a (patch) | |
tree | 82b9ce2a815225d8becf960cc28f3c9096fa1113 | |
parent | 1dbfb0fd1b0024093f42268e168e65c9e10b8f1b (diff) | |
download | archweb-5a8cfb8566f8764f5ee5370a3414a3a4aafb206a.tar.gz archweb-5a8cfb8566f8764f5ee5370a3414a3a4aafb206a.zip |
WIP: adoptable orphans report
-rw-r--r-- | devel/utils.py | 43 | ||||
-rw-r--r-- | devel/views.py | 7 |
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 |