summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean Finney <seanius@debian.org>2010-05-13 19:28:58 +0200
committerSean Finney <seanius@debian.org>2010-05-13 19:28:58 +0200
commit01e55d8e6ca532ceb1382db529f82941bc7a6bad (patch)
tree8260781e2f038c6a00fa7a64ec789c7ca873450f
parent022a984fd1d24241c3e1801fd210cd34cdf0e5a6 (diff)
downloadpatch-tracker-01e55d8e6ca532ceb1382db529f82941bc7a6bad.tar.gz
Package index listing now implemented in django
-rw-r--r--patchtracker/ComplexQueries.py25
-rwxr-xr-xpatchtracker/Templates.py10
-rw-r--r--patchtracker/models.py12
-rw-r--r--patchtracker/urls.py2
-rw-r--r--patchtracker/views.py8
-rw-r--r--templates/letter_toc.html33
-rw-r--r--templates/letter_toc.tmpl34
7 files changed, 80 insertions, 44 deletions
diff --git a/patchtracker/ComplexQueries.py b/patchtracker/ComplexQueries.py
new file mode 100644
index 0000000..706301e
--- /dev/null
+++ b/patchtracker/ComplexQueries.py
@@ -0,0 +1,25 @@
+import models
+
+class PackageIndex:
+ def __init__( self, index ):
+ self.dists = [d.name for d in models.RepositorySuite.objects.all()]
+ self.index = {}
+ self.packages = []
+
+ packageMappings = models.SourcePackageMapping.objects.order_by('package__name').filter( package__name=index )
+ if not packageMappings:
+ packageMappings = models.SourcePackageMapping.objects.order_by('package__name').filter( package__name__startswith=index )
+
+ for mapping in packageMappings:
+ self._addPackageMapping(mapping.package, mapping.suite)
+
+ def _addPackageMapping( self, package, suite ):
+ if package.name not in self.index:
+ self.index[package.name] = [None] * len(self.dists)
+ self.packages.append(package)
+ self.index[package.name][self.dists.index(suite.name)] = package
+
+ def __iter__( self ):
+ for pkg in self.packages:
+ yield { 'package':pkg, 'entries':self.index[pkg.name] }
+
diff --git a/patchtracker/Templates.py b/patchtracker/Templates.py
index 42e07dc..bb93eae 100755
--- a/patchtracker/Templates.py
+++ b/patchtracker/Templates.py
@@ -12,22 +12,12 @@ class OurTemplate(Template):
if searchList:
for k,v in searchList.iteritems():
ourSearchList[k]=v
- self.escape_name = self._escape_name
- self.wrappable_version = self._wrappable_version
self.link = self._link
Template.__init__(self, file=file, searchList=ourSearchList)
def _link(self, where, name):
return str("<a href=\"%s\">%s</a>"%(where,name))
- def _escape_name(self, name):
- return re.sub("([^a-zA-Z0-9-])", (lambda x: "_%d"%(ord(x.group(1)))), name)
-
- def _wrappable_version(self, version):
- """ output a version that can be broken up by a web browser using
- the unicode zero-whitespace-break character (&#8203;) """
- return '&#8203;'.join([version[i:i+12] for i in range(0,len(version),12)])
-
class FrontPageTemplate(OurTemplate):
def __init__(self, indices):
tpl = os.sep.join([Conf.template_dir, "frontpage.tmpl"])
diff --git a/patchtracker/models.py b/patchtracker/models.py
index 0fb997d..95a59df 100644
--- a/patchtracker/models.py
+++ b/patchtracker/models.py
@@ -1,3 +1,5 @@
+import re
+
from django.db import models
from django.contrib import admin
@@ -22,6 +24,16 @@ class SourcePackage (models.Model):
else:
return "Native"
+ def anchor_name(self):
+ """ output a version of the package name suitable for use as an
+ anchor name (i.e. <a name="foo">) """
+ return re.sub("([^a-zA-Z0-9-])", (lambda x: "_%d"%(ord(x.group(1)))), self.name)
+
+ def wrappable_version(self):
+ """ output a version that can be broken up by a web browser using
+ the unicode zero-whitespace-break character (&#8203;) """
+ return '&#8203;'.join([self.version[i:i+12] for i in range(0,len(self.version),12)])
+
def __unicode__( self ):
return "%s (%s)"%(self.name, self.version)
diff --git a/patchtracker/urls.py b/patchtracker/urls.py
index 6d2d20b..b7a916f 100644
--- a/patchtracker/urls.py
+++ b/patchtracker/urls.py
@@ -4,6 +4,8 @@ import views
urlpatterns = patterns('',
url(r'^package/(?P<package>\w+)/(?P<version>[^/]+)$',
views.package_vers),
+ url(r'^package/(?P<index>\w+)$',
+ views.display_toc),
url(r'^patch/(?P<patchType>(debianonly|misc|nondebian|series))/view/(?P<package>\w+)/(?P<version>[^/]+)/(?P<patchName>.*)$',
views.display_patch),
url(r'^patch/(?P<patchType>(debianonly|misc|nondebian|series))/dl/(?P<package>\w+)/(?P<version>[^/]+)/(?P<patchName>.*)$',
diff --git a/patchtracker/views.py b/patchtracker/views.py
index ec20cdb..4db3666 100644
--- a/patchtracker/views.py
+++ b/patchtracker/views.py
@@ -4,6 +4,7 @@ import django.http
import django.shortcuts
import django.template
+import ComplexQueries
import DebTarHandler
import DiffGzHandler
import Conf
@@ -23,6 +24,13 @@ def package_vers(request, package, version):
extra = { 'pkg':pkg, 'ctx':ctx, 'conf':Conf, 'diffhandler':diffhandler }
return django.shortcuts.render_to_response(tmpl, extra, context_instance=ctx)
+def display_toc(request, index):
+ packageIndex = ComplexQueries.PackageIndex(index)
+ tmpl = 'letter_toc.html'
+ extra = { 'index':index, 'packageIndex':packageIndex, 'conf':Conf }
+ return django.shortcuts.render_to_response(tmpl, extra)
+
+
def display_patch(request, patchType, package, version, patchName):
pkg = models.SourcePackage.objects.get( name=package, version=version )
ctx = django.template.RequestContext(request)
diff --git a/templates/letter_toc.html b/templates/letter_toc.html
new file mode 100644
index 0000000..bff8a34
--- /dev/null
+++ b/templates/letter_toc.html
@@ -0,0 +1,33 @@
+{% extends "base.html" %}
+{% block title %}
+Debian Project patch tracking system
+{% endblock %}
+{% block content %}
+<h1>Debian Project patch tracking system</h1>
+<h2>Packaging patches by index - {{ index }}</h2>
+<table class="packagelisting">
+<tr>
+<th>package</th>
+{% for dist in packageIndex.dists %}
+ <th>{{ dist }}</th>
+{% endfor %}
+</tr>
+{% for row in packageIndex %}
+<tr>
+ <td>
+ <a name="{{ row.package.anchor_name }}" />
+ <a href="http://packages.debian.org/{{ row.package.name }}">{{ row.package.name }}</a>
+ </td>
+ {% for pkg in row.entries %}
+ <td>
+ {% if pkg %}
+ <a href="{{ conf.root_url }}/package/{{ pkg.name }}/{{ pkg.version }}">{{ pkg.wrappable_version|safe }}</a>
+ {% else %}
+ <i>n/a</i>
+ {% endif %}
+ </td>
+ {% endfor %}
+</tr>
+{% endfor %}
+</table>
+{% endblock %}
diff --git a/templates/letter_toc.tmpl b/templates/letter_toc.tmpl
deleted file mode 100644
index a7bf9a1..0000000
--- a/templates/letter_toc.tmpl
+++ /dev/null
@@ -1,34 +0,0 @@
-#import templates
-#extends templates.skeleton
-#def title
-Debian Project patch tracking system
-#end def
-#def body
-<h1>Debian Project patch tracking system</h1>
-<h2>Packaging patches by index - $idx</h2>
-<table class="packagelisting">
-<tr>
-<th>package</th>
-#for $d in $dists
- <th>$d</th>
-#end for
-</tr>
-#for $p in $sorted($pkgs.iterkeys)
-<tr>
- <td>
- <a name="$escape_name($p)" />
- <a href="http://packages.debian.org/$p">$p</a>
- </td>
- #for $d in $dists
- <td>
- #if $pkgs[$p].has_key($d)
- <a href="$conf.root_url/package/$p/$pkgs[$p][$d].version">$wrappable_version($pkgs[$p][$d].version)</a>
- #else
- <i>n/a</i>
- #end if
- </td>
- #end for
-</tr>
-#end for
-</table>
-#end def