fa4f5c15c8
We need to do a little dropping into SQL to accomplish this, but it isn't all that bad to actually do and we can do the whole thing in one query. Signed-off-by: Dan McGee <dan@archlinux.org>
38 lines
1.0 KiB
Python
38 lines
1.0 KiB
Python
from django.contrib.auth.models import User
|
|
from django.db import connection
|
|
|
|
from main.utils import cache_function
|
|
from packages.models import PackageRelation
|
|
|
|
@cache_function(300)
|
|
def get_annotated_maintainers():
|
|
maintainers = User.objects.filter(is_active=True).order_by(
|
|
'first_name', 'last_name')
|
|
|
|
# annotate the maintainers with # of maintained and flagged packages
|
|
pkg_count_sql = """
|
|
SELECT pr.user_id, COUNT(*), COUNT(p.flag_date)
|
|
FROM packages_packagerelation pr
|
|
JOIN packages p
|
|
ON pr.pkgbase = p.pkgbase
|
|
WHERE pr.type = %s
|
|
GROUP BY pr.user_id
|
|
"""
|
|
cursor = connection.cursor()
|
|
cursor.execute(pkg_count_sql, [PackageRelation.MAINTAINER])
|
|
results = cursor.fetchall()
|
|
|
|
pkg_count = {}
|
|
flag_count = {}
|
|
for k, total, flagged in results:
|
|
pkg_count[k] = total
|
|
flag_count[k] = flagged
|
|
|
|
for m in maintainers:
|
|
m.package_count = pkg_count.get(m.id, 0)
|
|
m.flagged_count = flag_count.get(m.id, 0)
|
|
|
|
return maintainers
|
|
|
|
# vim: set ts=4 sw=4 et:
|