summaryrefslogtreecommitdiff
path: root/public/utils.py
diff options
context:
space:
mode:
Diffstat (limited to 'public/utils.py')
-rw-r--r--public/utils.py42
1 files changed, 15 insertions, 27 deletions
diff --git a/public/utils.py b/public/utils.py
index fd29a845..30c76ac1 100644
--- a/public/utils.py
+++ b/public/utils.py
@@ -1,7 +1,7 @@
from operator import attrgetter
from main.models import Arch, Package
-from main.utils import cache_function
+from main.utils import cache_function, groupby_preserve_order, PackageStandin
class RecentUpdate(object):
def __init__(self, packages):
@@ -35,18 +35,12 @@ class RecentUpdate(object):
for package in self.packages:
yield package
else:
- # time to fake out the template, this is a tad dirty
- arches = set(pkg.arch for pkg in self.others)
- for arch in arches:
- url = '/packages/%s/%s/%s/' % (
- self.repo.name.lower(), arch.name, self.pkgbase)
- package_stub = {
- 'pkgname': self.pkgbase,
- 'arch': arch,
- 'repo': self.repo,
- 'get_absolute_url': url
- }
- yield package_stub
+ # fake out the template- this is slightly hacky but yields one
+ # 'package-like' object per arch which is what the normal loop does
+ arches = set()
+ for package in self.others:
+ if package.arch not in arches and not arches.add(package.arch):
+ yield PackageStandin(package)
@cache_function(300)
def get_recent_updates(number=15):
@@ -57,22 +51,16 @@ def get_recent_updates(number=15):
# grab a few extra so we can hopefully catch everything we need
fetch = number * 6
for arch in Arch.objects.all():
- pkgs += list(Package.objects.select_related(
- 'arch', 'repo').filter(arch=arch).order_by('-last_update')[:fetch])
- pkgs.sort(key=attrgetter('last_update'))
+ pkgs += list(Package.objects.normal().filter(
+ arch=arch).order_by('-last_update')[:fetch])
+ pkgs.sort(key=attrgetter('last_update'), reverse=True)
- updates = []
- while len(pkgs) > 0:
- pkg = pkgs.pop()
-
- in_group = lambda x: pkg.repo == x.repo and pkg.pkgbase == x.pkgbase
- samepkgs = [other for other in pkgs if in_group(other)]
- samepkgs.append(pkg)
+ same_pkgbase_key = lambda x: (x.repo.name, x.pkgbase)
+ grouped = groupby_preserve_order(pkgs, same_pkgbase_key)
- # now remove all the packages we just pulled out
- pkgs = [other for other in pkgs if other not in samepkgs]
-
- update = RecentUpdate(samepkgs)
+ updates = []
+ for group in grouped:
+ update = RecentUpdate(group)
updates.append(update)
return updates[:number]