evorepo/todolists/utils.py
2020-11-11 22:23:29 +01:00

59 lines
1.9 KiB
Python

from django.db import connections, router
from .models import Todolist, TodolistPackage
from packages.models import Package
def todo_counts():
sql = """
SELECT todolist_id, count(*), SUM(CASE WHEN status = %s THEN 1 ELSE 0 END)
FROM todolists_todolistpackage
WHERE removed IS NULL
GROUP BY todolist_id
"""
database = router.db_for_write(TodolistPackage)
connection = connections[database]
cursor = connection.cursor()
cursor.execute(sql, [TodolistPackage.COMPLETE])
results = cursor.fetchall()
return {row[0]: (row[1], row[2]) for row in results}
def get_annotated_todolists(incomplete_only=False):
lists = Todolist.objects.all().defer('raw').select_related(
'creator').order_by('-created')
lookup = todo_counts()
# tag each list with package counts
for todolist in lists:
counts = lookup.get(todolist.id, (0, 0))
todolist.pkg_count = counts[0]
todolist.complete_count = counts[1]
todolist.incomplete_count = counts[0] - counts[1]
if incomplete_only:
lists = [lst for lst in lists if lst.incomplete_count > 0]
else:
lists = sorted(lists, key=lambda todolist: todolist.incomplete_count == 0)
return lists
def attach_staging(packages, list_id):
'''Look for any staging version of the packages provided and attach them
to the 'staging' attribute on each package if found.'''
pkgnames = TodolistPackage.objects.filter(
todolist_id=list_id).values('pkgname')
staging_pkgs = Package.objects.normal().filter(repo__staging=True,
pkgname__in=pkgnames)
# now build a lookup dict to attach to the correct package
lookup = {(p.pkgname, p.arch): p for p in staging_pkgs}
annotated = []
for package in packages:
in_staging = lookup.get((package.pkgname, package.arch), None)
package.staging = in_staging
return annotated
# vim: set ts=4 sw=4 et: