[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[snapshot/master] Make list of binary packages browseable as well



---
 web/app/snapshot/controllers/package.py            |   50 +++++++++++++-------
 web/app/snapshot/controllers/root.py               |    1 +
 web/app/snapshot/model/snapshotmodel.py            |   18 ++++---
 web/app/snapshot/public/robots.txt                 |    1 +
 .../templates/package-binary-list-packages.mako    |   13 +++++
 web/app/snapshot/templates/root.mako               |   10 ++++-
 6 files changed, 66 insertions(+), 27 deletions(-)
 create mode 100644 web/app/snapshot/templates/package-binary-list-packages.mako

diff --git a/web/app/snapshot/controllers/package.py b/web/app/snapshot/controllers/package.py
index b9e86c7..f124514 100644
--- a/web/app/snapshot/controllers/package.py
+++ b/web/app/snapshot/controllers/package.py
@@ -27,30 +27,32 @@ class PackageController(BaseController):
         if not self.db is None:
             self.db.close()
 
-    def _make_crumbs_base(self):
+    def _build_crumbs(self, pkg=None, version=None, start=None, is_binary=False):
         crumbs = []
 
         url = urllib.quote(request.environ.get('SCRIPT_NAME')) + "/"
         crumbs.append( { 'url': url, 'name': 'snapshot.debian.org', 'sep': '|' });
 
-        return (url, crumbs)
-
-    def _build_crumbs(self, srcpkg=None, version=None, start=None):
-        (url, crumbs) = self._make_crumbs_base()
-        crumbs.append( { 'url': None, 'name': 'source package:', 'sep': '' });
+        if is_binary:
+            crumbs.append( { 'url': None, 'name': 'binary package:', 'sep': '' });
+        else:
+            crumbs.append( { 'url': None, 'name': 'source package:', 'sep': '' });
 
         if not start:
-            if srcpkg.startswith('lib') and len(srcpkg) >= 4:
-                start = srcpkg[0:4]
+            if pkg.startswith('lib') and len(pkg) >= 4:
+                start = pkg[0:4]
             else:
-                start = srcpkg[0:1]
+                start = pkg[0:1]
 
-        url += 'package/'
+        if is_binary:
+            url += 'binary/'
+        else:
+            url += 'package/'
         crumbs.append( { 'url': url + '?cat=%s'%urllib.quote(start), 'name': start+'*' } )
 
-        if not srcpkg is None:
-            url += urllib.quote(srcpkg) + '/'
-            crumbs.append( { 'url': url, 'name': srcpkg });
+        if not pkg is None:
+            url += urllib.quote(pkg) + '/'
+            crumbs.append( { 'url': url, 'name': pkg });
 
             if version:
                 url += urllib.quote(version) + '/'
@@ -160,6 +162,22 @@ class PackageController(BaseController):
         if 'bin' in request.params:
             url = url_quote(request.params['bin'] + "/")
             return redirect_to(url)
+        elif 'cat' in request.params:
+            try:
+                #etag_cache( g.shm.packages_get_etag(self._db()) )
+                set_expires(int(config['app_conf']['expires.package.root_cat']))
+
+                start = request.params['cat']
+                pkgs = g.shm.packages_get_name_starts_with(self._db(), start, get_binary=True)
+                if pkgs is None:
+                    abort(404, 'No binary packages in this category.')
+                c.start = start
+                c.packages = link_quote_array(pkgs)
+                c.breadcrumbs = self._build_crumbs(start=start, is_binary=True)
+                c.title = '%s*'%(start)
+                return render('/package-binary-list-packages.mako')
+            finally:
+                self._db_close()
         else:
             return redirect_to("../")
 
@@ -190,13 +208,9 @@ class PackageController(BaseController):
                 b['escaped_name'] = self._attribute_escape(b['name'])
                 b['escaped_version'] = self._attribute_escape(b['version'])
 
-            url, crumbs = self._make_crumbs_base()
-            crumbs.append( { 'url': None, 'name': 'binary package:', 'sep': '' });
-            crumbs.append( { 'url': None, 'name': binary });
-
             c.binary = binary
             c.binaryversions = binaryversions
-            c.breadcrumbs = crumbs
+            c.breadcrumbs = self._build_crumbs(binary, is_binary=True)
             c.title = binary
             return render('/package-binary.mako')
         finally:
diff --git a/web/app/snapshot/controllers/root.py b/web/app/snapshot/controllers/root.py
index 1737ebe..9d90007 100644
--- a/web/app/snapshot/controllers/root.py
+++ b/web/app/snapshot/controllers/root.py
@@ -17,6 +17,7 @@ class RootController(BaseController):
             db = DBInstance(g.pool)
             c.names = link_quote_array(g.shm.archives_get_list(db))
             c.srcstarts = link_quote_array(g.shm.packages_get_name_starts(db))
+            c.binstarts = link_quote_array(g.shm.packages_get_name_starts(db, get_binary=True))
             set_expires(int(config['app_conf']['expires.root']))
             return render('/root.mako')
         finally:
diff --git a/web/app/snapshot/model/snapshotmodel.py b/web/app/snapshot/model/snapshotmodel.py
index 20823b4..07205e2 100644
--- a/web/app/snapshot/model/snapshotmodel.py
+++ b/web/app/snapshot/model/snapshotmodel.py
@@ -322,22 +322,24 @@ class SnapshotModel:
                         { 'hash': hash } )
         return rows
 
-    @beaker_cache(expire=600, cache_response=False, type='memory', key=None)
-    def packages_get_name_starts(self, db):
-        rows = db.query("""SELECT DISTINCT substring( name FROM 1 FOR 1 ) AS start FROM srcpkg
+    @beaker_cache(expire=600, cache_response=False, type='memory', key='get_binary')
+    def packages_get_name_starts(self, db, get_binary=False):
+        table = ('srcpkg', 'binpkg')[get_binary]
+        rows = db.query("""SELECT DISTINCT substring( name FROM 1 FOR 1 ) AS start FROM """+table+"""
                            UNION ALL
-                           SELECT DISTINCT substring( name FROM 1 FOR 4 ) AS start FROM srcpkg WHERE name LIKE 'lib_%%'
+                           SELECT DISTINCT substring( name FROM 1 FOR 4 ) AS start FROM """+table+""" WHERE name LIKE 'lib_%%'
                            ORDER BY start""")
         return map(lambda x: x['start'], rows)
 
-    def packages_get_name_starts_with(self, db, start):
-        if not start in self.packages_get_name_starts(db):
+    def packages_get_name_starts_with(self, db, start, get_binary=False):
+        if not start in self.packages_get_name_starts(db, get_binary):
             return None
+        table = ('srcpkg', 'binpkg')[get_binary]
         if start == "l":
-            rows = db.query("""SELECT DISTINCT name FROM srcpkg WHERE name LIKE %(start)s AND NOT (name LIKE 'lib_%%') ORDER BY name""",
+            rows = db.query("""SELECT DISTINCT name FROM """+table+""" WHERE name LIKE %(start)s AND NOT (name LIKE 'lib_%%') ORDER BY name""",
                             {'start': start+"%" })
         else:
-            rows = db.query("""SELECT DISTINCT name FROM srcpkg WHERE name LIKE %(start)s ORDER BY name""",
+            rows = db.query("""SELECT DISTINCT name FROM """+table+""" WHERE name LIKE %(start)s ORDER BY name""",
                             {'start': start+"%" })
         return map(lambda x: x['name'], rows)
 
diff --git a/web/app/snapshot/public/robots.txt b/web/app/snapshot/public/robots.txt
index d736b20..a837008 100644
--- a/web/app/snapshot/public/robots.txt
+++ b/web/app/snapshot/public/robots.txt
@@ -1,4 +1,5 @@
 User-agent: *
 Disallow: /archive/*
+Disallow: /binary/*
 Disallow: /package/*
 
diff --git a/web/app/snapshot/templates/package-binary-list-packages.mako b/web/app/snapshot/templates/package-binary-list-packages.mako
new file mode 100644
index 0000000..4bd2b55
--- /dev/null
+++ b/web/app/snapshot/templates/package-binary-list-packages.mako
@@ -0,0 +1,13 @@
+<%inherit file="/page.mako" />
+
+<h1>Binary packages ${c.start}*</h1>
+
+<p>
+%for pkg in c.packages:
+<a href="${pkg['quoted']}/">${pkg['raw']}</a><br />
+%endfor
+</p>
+
+## vim:syn=html
+## vim:set ts=4:
+## vim:set shiftwidth=4:
diff --git a/web/app/snapshot/templates/root.mako b/web/app/snapshot/templates/root.mako
index 2dc1f4b..6c02196 100644
--- a/web/app/snapshot/templates/root.mako
+++ b/web/app/snapshot/templates/root.mako
@@ -16,6 +16,8 @@
 
 <h1>Packages</h1>
 
+<h2>source packages:</h2>
+
 Search in the index of source packages:<br />
 <ul class="inlineList">
 %for letter in c.srcstarts:
@@ -27,7 +29,13 @@ Search in the index of source packages:<br />
 <p>Or enter a <strong>source</strong> package name directly: <input name="src" /> <input type="submit" value="Submit" /></p>
 </form>
 
-<h2>Binary packages</h2>
+<h2>binary packages:</h2>
+
+<ul class="inlineList">
+%for letter in c.binstarts:
+	<li><a href="binary/?cat=${letter['quoted']}">${letter['raw']}</a></li>
+%endfor
+</ul>
 
 <form action="binary/">
 <p>Search for a <strong>binary</strong> package name: <input name="bin" /> <input type="submit" value="Submit" /></p>
-- 
1.5.6.5


Reply to: