diff options
| -rw-r--r-- | pgweb/featurematrix/__init__.py | 0 | ||||
| -rw-r--r-- | pgweb/featurematrix/admin.py | 16 | ||||
| -rw-r--r-- | pgweb/featurematrix/models.py | 51 | ||||
| -rw-r--r-- | pgweb/featurematrix/views.py | 35 | ||||
| -rw-r--r-- | pgweb/settings.py | 1 | ||||
| -rw-r--r-- | pgweb/urls.py | 2 | ||||
| -rw-r--r-- | templates/featurematrix/featuredetail.html | 10 | ||||
| -rw-r--r-- | templates/featurematrix/featurematrix.html | 55 |
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> </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%} + |
