Use a proper database field for beta releases

This replaces the previous ugly hack where beta versions had a negative number
as latestminor, giving a much cleaner model.

Requires SQL:
ALTER TABLE core_version ADD COLUMN beta boolean NOT NULL DEFAULT 'f';
ALTER TABLE core_version ALTER COLUMN beta DROP DEFAULT;

(Yes, we really need to move to something that can do automatic migrations)
This commit is contained in:
Magnus Hagander
2013-08-17 15:35:42 +02:00
parent 8fc39d7359
commit 8be717d99d
5 changed files with 18 additions and 7 deletions

View File

@ -13,7 +13,7 @@ class VersionFeed(Feed):
title_template = 'core/version_rss_title.html' title_template = 'core/version_rss_title.html'
def items(self): def items(self):
return Version.objects.filter(tree__gt=0).filter(latestminor__gte=0) return Version.objects.filter(tree__gt=0).filter(beta=False)
def item_link(self, obj): def item_link(self, obj):
return "http://www.postgresql.org/docs/%s/static/%s" % (obj.tree, obj.relnotes) return "http://www.postgresql.org/docs/%s/static/%s" % (obj.tree, obj.relnotes)

View File

@ -7,11 +7,12 @@ from datetime import datetime
class Version(PgModel, models.Model): class Version(PgModel, models.Model):
tree = models.DecimalField(max_digits=3, decimal_places=1, null=False, blank=False) tree = models.DecimalField(max_digits=3, decimal_places=1, null=False, blank=False)
latestminor = models.IntegerField(null=False, blank=False, default=0) latestminor = models.IntegerField(null=False, blank=False, default=0, help_text="For beta versions, latestminor means latest beta number. For other releases, it's the latest minor release number in the tree.")
reldate = models.DateField(null=False, blank=False) reldate = models.DateField(null=False, blank=False)
relnotes = models.CharField(max_length=32, null=False, blank=False) relnotes = models.CharField(max_length=32, null=False, blank=False)
current = models.BooleanField(null=False, blank=False, default=False) current = models.BooleanField(null=False, blank=False, default=False)
supported = models.BooleanField(null=False, blank=False, default=True) supported = models.BooleanField(null=False, blank=False, default=True)
beta = models.BooleanField(null=False, blank=False, default=False, help_text="For beta versions, latestminor means beta number")
docsloaded = models.DateTimeField(null=True, blank=True, help_text="The timestamp of the latest docs load. Used to control indexing and info on developer docs.") docsloaded = models.DateTimeField(null=True, blank=True, help_text="The timestamp of the latest docs load. Used to control indexing and info on developer docs.")
firstreldate = models.DateField(null=False, blank=False, help_text="The date of the .0 release in this tree") firstreldate = models.DateField(null=False, blank=False, help_text="The date of the .0 release in this tree")
eoldate = models.DateField(null=False, blank=False, help_text="The planned EOL date for this tree") eoldate = models.DateField(null=False, blank=False, help_text="The planned EOL date for this tree")
@ -21,7 +22,10 @@ class Version(PgModel, models.Model):
@property @property
def versionstring(self): def versionstring(self):
if not self.beta:
return "%s.%s" % (self.tree, self.latestminor) return "%s.%s" % (self.tree, self.latestminor)
else:
return "%sbeta%s" % (self.tree, self.latestminor)
def save(self): def save(self):
# Make sure only one version at a time can be the current one. # Make sure only one version at a time can be the current one.

View File

@ -79,7 +79,7 @@ def community(request):
# List of supported versions # List of supported versions
def versions(request): def versions(request):
return render_to_response('support/versioning.html', { return render_to_response('support/versioning.html', {
'versions': Version.objects.filter(tree__gt=0).filter(latestminor__gte=0), 'versions': Version.objects.filter(tree__gt=0).filter(beta=False),
}, NavContext(request, 'support')) }, NavContext(request, 'support'))
re_staticfilenames = re.compile("^[0-9A-Z/_-]+$", re.IGNORECASE) re_staticfilenames = re.compile("^[0-9A-Z/_-]+$", re.IGNORECASE)

View File

@ -9,7 +9,7 @@ def get_struct():
# Can't use a model here, because we don't (for some reason) have a # Can't use a model here, because we don't (for some reason) have a
# hard link to the versions table here # hard link to the versions table here
curs = connection.cursor() curs = connection.cursor()
curs.execute("SELECT d.version, d.file, v.docsloaded FROM docs d INNER JOIN core_version v ON v.tree=d.version WHERE d.version > 0 AND v.latestminor >= 0 ORDER BY d.version DESC") curs.execute("SELECT d.version, d.file, v.docsloaded FROM docs d INNER JOIN core_version v ON v.tree=d.version WHERE d.version > 0 AND NOT beta ORDER BY d.version DESC")
# Start priority is higher than average but lower than what we assign # Start priority is higher than average but lower than what we assign
# to the current version of the docs. # to the current version of the docs.

View File

@ -1,13 +1,20 @@
from django import forms from django import forms
from django.db.models import Q
from pgweb.core.models import Version from pgweb.core.models import Version
class _version_choices(): class _version_choices():
def __iter__(self): def __iter__(self):
yield ('-1', '** Select version') yield ('-1', '** Select version')
for v in Version.objects.filter(supported=True): q = Q(supported=True) | Q(beta=True)
for v in Version.objects.filter(q):
for minor in range(v.latestminor,-1,-1): for minor in range(v.latestminor,-1,-1):
if not v.beta:
s = "%s.%s" % (v.tree, minor) s = "%s.%s" % (v.tree, minor)
else:
# For beta versions, there is no beta0
if minor==0: continue
s = "%s.beta%s" % (v.tree, minor)
yield (s,s) yield (s,s)
yield ('Unsupported/Unknown', 'Unsupported/Unknown') yield ('Unsupported/Unknown', 'Unsupported/Unknown')