Prefilter packages when looking up uncompressed man/info pages

This vastly speeds up the reports if you just want to look at your own
packages and not the complete list, especially if the list of packages
you maintain is relatively short.

Signed-off-by: Dan McGee <dan@archlinux.org>
This commit is contained in:
Dan McGee 2011-12-09 09:30:18 -06:00
parent 73cd4adf9f
commit d198137d71

View File

@ -6,7 +6,7 @@
from django.contrib.sites.models import Site from django.contrib.sites.models import Site
from django.core.mail import send_mail from django.core.mail import send_mail
from django.db import transaction from django.db import transaction
from django.db.models import F, Q from django.db.models import F
from django.http import Http404 from django.http import Http404
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django.template import loader, Context from django.template import loader, Context
@ -150,6 +150,15 @@ def report(request, report, username=None):
packages = Package.objects.normal() packages = Package.objects.normal()
names = attrs = user = None names = attrs = user = None
if username:
user = get_object_or_404(User, username=username, is_active=True)
maintained = PackageRelation.objects.filter(user=user,
type=PackageRelation.MAINTAINER).values('pkgbase')
packages = packages.filter(pkgbase__in=maintained)
maints = User.objects.filter(id__in=PackageRelation.objects.filter(
type=PackageRelation.MAINTAINER).values('user'))
if report == 'old': if report == 'old':
title = 'Packages last built more than two years ago' title = 'Packages last built more than two years ago'
cutoff = datetime.utcnow() - timedelta(days=365 * 2) cutoff = datetime.utcnow() - timedelta(days=365 * 2)
@ -192,20 +201,24 @@ def report(request, report, username=None):
package.compress_type = package.filename.split('.')[-1] package.compress_type = package.filename.split('.')[-1]
elif report == 'uncompressed-man': elif report == 'uncompressed-man':
title = 'Packages with uncompressed manpages' title = 'Packages with uncompressed manpages'
# magic going on here! Checking for all '.1'...'.9' extensions # checking for all '.0'...'.9' + '.n' extensions
invalid_endings = [Q(filename__endswith='.%d' % n) for n in range(1,10)] bad_files = PackageFile.objects.filter(directory__contains='/man/',
invalid_endings.append(Q(filename__endswith='.n')) filename__regex=r'\.[0-9n]').exclude(filename__endswith='.gz')
bad_files = PackageFile.objects.filter(Q(directory__contains='man') & ( if username:
reduce(operator.or_, invalid_endings)) pkg_ids = set(packages.values_list('id', flat=True))
).values_list('pkg_id', flat=True).distinct() bad_files = bad_files.filter(pkg__in=pkg_ids)
bad_files = bad_files.values_list('pkg_id', flat=True).distinct()
packages = packages.filter(id__in=set(bad_files)) packages = packages.filter(id__in=set(bad_files))
elif report == 'uncompressed-info': elif report == 'uncompressed-info':
title = 'Packages with uncompressed infopages' title = 'Packages with uncompressed infopages'
# we don't worry abut looking for '*.info-1', etc., given that an # we don't worry about looking for '*.info-1', etc., given that an
# uncompressed root page probably exists in the package anyway # uncompressed root page probably exists in the package anyway
bad_files = PackageFile.objects.filter(directory__endswith='/info/', bad_files = PackageFile.objects.filter(directory__endswith='/info/',
filename__endswith='.info').values_list( filename__endswith='.info')
'pkg_id', flat=True).distinct() if username:
pkg_ids = set(packages.values_list('id', flat=True))
bad_files = bad_files.filter(pkg__in=pkg_ids)
bad_files = bad_files.values_list('pkg_id', flat=True).distinct()
packages = packages.filter(id__in=set(bad_files)) packages = packages.filter(id__in=set(bad_files))
elif report == 'unneeded-orphans': elif report == 'unneeded-orphans':
title = 'Orphan packages required by no other packages' title = 'Orphan packages required by no other packages'
@ -217,15 +230,6 @@ def report(request, report, username=None):
else: else:
raise Http404 raise Http404
if username:
user = get_object_or_404(User, username=username, is_active=True)
maintained = PackageRelation.objects.filter(user=user,
type=PackageRelation.MAINTAINER).values('pkgbase')
packages = packages.filter(pkgbase__in=maintained)
maints = User.objects.filter(id__in=PackageRelation.objects.filter(
type=PackageRelation.MAINTAINER).values('user'))
context = { context = {
'all_maintainers': maints, 'all_maintainers': maints,
'title': title, 'title': title,