summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMagnus Hagander2010-01-11 21:55:00 +0000
committerMagnus Hagander2010-01-11 21:55:00 +0000
commitcad9eddd925c7e7411a49b9234ae596efdf1c810 (patch)
tree3ca5f48934b52de3e3016f0489dc33bf5a7e151f
parent4e9c4ef7fc1f11cda0f401dda36a51a6f7c9d3a0 (diff)
Implement the feature matrix
-rw-r--r--pgweb/featurematrix/__init__.py0
-rw-r--r--pgweb/featurematrix/admin.py16
-rw-r--r--pgweb/featurematrix/models.py51
-rw-r--r--pgweb/featurematrix/views.py35
-rw-r--r--pgweb/settings.py1
-rw-r--r--pgweb/urls.py2
-rw-r--r--templates/featurematrix/featuredetail.html10
-rw-r--r--templates/featurematrix/featurematrix.html55
8 files changed, 170 insertions, 0 deletions
diff --git a/pgweb/featurematrix/__init__.py b/pgweb/featurematrix/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/pgweb/featurematrix/__init__.py
diff --git a/pgweb/featurematrix/admin.py b/pgweb/featurematrix/admin.py
new file mode 100644
index 00000000..7effca7a
--- /dev/null
+++ b/pgweb/featurematrix/admin.py
@@ -0,0 +1,16 @@
+from django.contrib import admin
+from django import forms
+
+from models import *
+
+class FeatureInline(admin.TabularInline):
+ model = Feature
+
+class FeatureGroupAdmin(admin.ModelAdmin):
+ inlines = [FeatureInline, ]
+
+class FeatureAdmin(admin.ModelAdmin):
+ list_display = ('featurename', 'group')
+
+admin.site.register(FeatureGroup, FeatureGroupAdmin)
+admin.site.register(Feature, FeatureAdmin)
diff --git a/pgweb/featurematrix/models.py b/pgweb/featurematrix/models.py
new file mode 100644
index 00000000..345c7d6b
--- /dev/null
+++ b/pgweb/featurematrix/models.py
@@ -0,0 +1,51 @@
+from django.db import models
+
+choices_map = {
+ 0: {'str': 'No', 'class': 'no', 'bgcolor': '#ffdddd'},
+ 1: {'str': 'Yes', 'class': 'yes', 'bgcolor': '#ddffdd'},
+ 2: {'str': 'Obsolete', 'class': 'obs', 'bgcolor': '#ddddff'},
+ 3: {'str': '?', 'class': 'unk', 'bgcolor': '#ffffaa'},
+}
+choices = [(k, v['str']) for k,v in choices_map.items()]
+
+class FeatureGroup(models.Model):
+ groupname = models.CharField(max_length=100, null=False, blank=False)
+ groupsort = models.IntegerField(null=False, blank=False)
+
+ def __unicode__(self):
+ return self.groupname
+
+ @property
+ def columns(self):
+ # Return a list of all the columns for the matrix
+ return [b for a,b in versions]
+
+class Feature(models.Model):
+ group = models.ForeignKey(FeatureGroup, null=False, blank=False)
+ featurename = models.CharField(max_length=100, null=False, blank=False)
+ featuredescription = models.TextField(null=False, blank=True)
+ #WARNING! All fields that start with "v" will be considered versions!
+ v74 = models.IntegerField(null=False, blank=False, default=0, verbose_name="7.4", choices=choices)
+ v80 = models.IntegerField(null=False, blank=False, default=0, verbose_name="8.0", choices=choices)
+ v81 = models.IntegerField(null=False, blank=False, default=0, verbose_name="8.1", choices=choices)
+ v82 = models.IntegerField(null=False, blank=False, default=0, verbose_name="8.2", choices=choices)
+ v83 = models.IntegerField(null=False, blank=False, default=0, verbose_name="8.3", choices=choices)
+ v84 = models.IntegerField(null=False, blank=False, default=0, verbose_name="8.4", choices=choices)
+ v85 = models.IntegerField(null=False, blank=False, default=0, verbose_name="8.5a3", choices=choices)
+
+ def __unicode__(self):
+ # To make it look good in the admin interface, just don't render it
+ return ''
+
+ def columns(self):
+ return [choices_map[getattr(self, a)] for a,b in versions]
+
+ @property
+ def featurelink(self):
+ if self.featuredescription.startswith('http://'):
+ return self.featuredescription
+ else:
+ return 'detail/%s/' % self.id
+
+versions = [(f.name,f.verbose_name) for f in Feature()._meta.fields if f.name.startswith('v')]
+
diff --git a/pgweb/featurematrix/views.py b/pgweb/featurematrix/views.py
new file mode 100644
index 00000000..b4e33275
--- /dev/null
+++ b/pgweb/featurematrix/views.py
@@ -0,0 +1,35 @@
+from django.shortcuts import render_to_response, get_object_or_404
+from django.http import HttpResponseRedirect, HttpResponse, Http404
+
+from pgweb.util.contexts import NavContext
+
+from models import *
+
+def root(request):
+ features = Feature.objects.all().select_related().order_by('group__groupsort', 'group__groupname', 'featurename')
+ groups = []
+ lastgroup = -1
+ currentgroup = None
+ for f in features:
+ if f.group.id != lastgroup:
+ if currentgroup:
+ groups.append(currentgroup)
+ lastgroup = f.group.id
+ currentgroup = {
+ 'group': f.group,
+ 'features': [],
+ }
+ currentgroup['features'].append(f)
+ if currentgroup:
+ groups.append(currentgroup)
+
+ return render_to_response('featurematrix/featurematrix.html', {
+ 'groups': groups,
+ }, NavContext(request, 'about'))
+
+def detail(request, featureid):
+ feature = get_object_or_404(Feature, pk=featureid)
+ return render_to_response('featurematrix/featuredetail.html', {
+ 'feature': feature,
+ }, NavContext(request, 'about'))
+
diff --git a/pgweb/settings.py b/pgweb/settings.py
index 87f19699..0216211e 100644
--- a/pgweb/settings.py
+++ b/pgweb/settings.py
@@ -104,6 +104,7 @@ INSTALLED_APPS = [
'pgweb.sponsors',
'pgweb.survey',
'pgweb.misc',
+ 'pgweb.featurematrix',
]
diff --git a/pgweb/urls.py b/pgweb/urls.py
index fe81a55f..075c9ff9 100644
--- a/pgweb/urls.py
+++ b/pgweb/urls.py
@@ -26,6 +26,8 @@ urlpatterns = patterns('',
(r'^about/news/(\d+)(-.*)?/$', 'news.views.item'),
(r'^about/eventarchive/$', 'events.views.archive'),
(r'^about/event/(\d+)(-.*)?/$', 'events.views.item'),
+ (r'^about/featurematrix/$', 'featurematrix.views.root'),
+ (r'^about/featurematrix/detail/(\d+)/$', 'featurematrix.views.detail'),
(r'^about/quotesarchive/$', 'quotes.views.allquotes'),
(r'^ftp/(.*/)?$', 'downloads.views.ftpbrowser'),
diff --git a/templates/featurematrix/featuredetail.html b/templates/featurematrix/featuredetail.html
new file mode 100644
index 00000000..fd4ec08a
--- /dev/null
+++ b/templates/featurematrix/featuredetail.html
@@ -0,0 +1,10 @@
+{%extends "base/page.html"%}
+{%block title%}Feature Description{%endblock%}
+{%block contents%}
+<h1>Feature Description</h1>
+<h2>{{feature.featurename}}</h2>
+<p>
+{{feature.featuredescription}}
+</p>
+{%endblock%}
+
diff --git a/templates/featurematrix/featurematrix.html b/templates/featurematrix/featurematrix.html
new file mode 100644
index 00000000..c68c4fd1
--- /dev/null
+++ b/templates/featurematrix/featurematrix.html
@@ -0,0 +1,55 @@
+{%extends "base/page.html"%}
+{%block title%}Feature Matrix{%endblock%}
+{%block extrahead%}
+<style>
+td.fm_no { background-color: #ffdddd !important; }
+td.fm_yes { background-color: #ddffdd !important; }
+td.fm_obs { background-color: #ddddff !important; }
+td.fm_unk { background-color: #ffffaa !important; }
+</style>
+{%endblock%}
+{%block contents%}
+<h1>Feature Matrix</h1>
+<p>
+This table outlines which features were added in which version. To get more
+information about a feature, click the link or hover the mouse pointer over
+the text.
+</p>
+<h2>Groups</h2>
+<ul>
+{%for group in groups %}
+ <li><a href="#{{group.group.groupname|slugify}}">{{group.group.groupname}}</a></li>
+{%endfor%}
+</ul>
+
+<p>&nbsp;</p>
+
+<div class="tblBasic">
+<table border="0" cellpadding="0" cellspacing="0" class="tblBasicGrey">
+{%for group in groups %}
+ <tr>
+ <th class="colFirst"><a name="{{group.group.groupname|slugify}}">{{group.group.groupname}}</a></th>
+ {%for col in group.group.columns %}
+ <th class="{%if forloop.last%}colLast{%else%}colMid{%endif%}">{{col}}</th>
+ {%endfor%}
+ </tr>
+ {%for feature in group.features%}
+ <tr valign="top" {%if forloop.last%}class="lastrow"{%endif%}>
+ <td class="colFirst" {%if feature.featuredescription%}title="{{feature.featuredescription|truncatewords:15}}"{%endif%}>
+ {% if feature.featuredescription %}
+ <a href="{{feature.featurelink}}">{{feature.featurename}}</a>
+ {%else%}
+ {{feature.featurename}}
+ {%endif%}
+ </td>
+ {%for col in feature.columns%}
+ <td class="{%if forloop.last%}colLast{%else%}colMid{%endif%} fm_{{col.class}}">{{col.str}}</td>
+ {%endfor%}
+ </tr>
+ {%endfor%}
+{%endfor%}
+</table>
+</div>
+
+{%endblock%}
+