From 01e55d8e6ca532ceb1382db529f82941bc7a6bad Mon Sep 17 00:00:00 2001 From: Sean Finney Date: Thu, 13 May 2010 19:28:58 +0200 Subject: Package index listing now implemented in django --- patchtracker/ComplexQueries.py | 25 +++++++++++++++++++++++++ patchtracker/Templates.py | 10 ---------- patchtracker/models.py | 12 ++++++++++++ patchtracker/urls.py | 2 ++ patchtracker/views.py | 8 ++++++++ templates/letter_toc.html | 33 +++++++++++++++++++++++++++++++++ templates/letter_toc.tmpl | 34 ---------------------------------- 7 files changed, 80 insertions(+), 44 deletions(-) create mode 100644 patchtracker/ComplexQueries.py create mode 100644 templates/letter_toc.html delete mode 100644 templates/letter_toc.tmpl 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("%s"%(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 (​) """ - return '​'.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. ) """ + 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 (​) """ + return '​'.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\w+)/(?P[^/]+)$', views.package_vers), + url(r'^package/(?P\w+)$', + views.display_toc), url(r'^patch/(?P(debianonly|misc|nondebian|series))/view/(?P\w+)/(?P[^/]+)/(?P.*)$', views.display_patch), url(r'^patch/(?P(debianonly|misc|nondebian|series))/dl/(?P\w+)/(?P[^/]+)/(?P.*)$', 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 %} +

Debian Project patch tracking system

+

Packaging patches by index - {{ index }}

+ + + +{% for dist in packageIndex.dists %} + +{% endfor %} + +{% for row in packageIndex %} + + + {% for pkg in row.entries %} + + {% endfor %} + +{% endfor %} +
package{{ dist }}
+ + {{ row.package.name }} + + {% if pkg %} + {{ pkg.wrappable_version|safe }} + {% else %} + n/a + {% endif %} +
+{% 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 -

Debian Project patch tracking system

-

Packaging patches by index - $idx

- - - -#for $d in $dists - -#end for - -#for $p in $sorted($pkgs.iterkeys) - - - #for $d in $dists - - #end for - -#end for -
package$d
- - $p - - #if $pkgs[$p].has_key($d) - $wrappable_version($pkgs[$p][$d].version) - #else - n/a - #end if -
-#end def -- cgit v1.2.3