summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chimere/main/models.py10
-rwxr-xr-xchimere/scripts/upgrade.py47
2 files changed, 48 insertions, 9 deletions
diff --git a/chimere/main/models.py b/chimere/main/models.py
index 5744529..6aaad66 100644
--- a/chimere/main/models.py
+++ b/chimere/main/models.py
@@ -136,7 +136,7 @@ class SubCategory(models.Model):
name = models.CharField(_("Name"), max_length=150)
available = models.BooleanField(_("Available"))
areas = models.ManyToManyField('Area', related_name='areas',
- blank=True, null=True, db_table=u'subcategory_areas')
+ db_table=u'subcategory_areas')
icon = models.ForeignKey(Icon, verbose_name=_("Icon"))
color_theme = models.ForeignKey(ColorTheme, verbose_name=_("Color theme"),
blank=True, null=True)
@@ -185,7 +185,7 @@ class Marker(models.Model):
'''Marker for a POI
'''
name = models.CharField(_("Name"), max_length=150)
- subcategory = models.ForeignKey(SubCategory, verbose_name=_("Subcategory"))
+ categories = models.ManyToManyField(SubCategory)
point = PointField(_("Localisation"), srid=settings.EPSG_DISPLAY_PROJECTION)
picture = models.ImageField(_("Image"), upload_to='upload', blank=True,
null=True, height_field='height', width_field='width')
@@ -204,7 +204,7 @@ class Marker(models.Model):
return self.name
class Meta:
- ordering = ('subcategory__category', 'subcategory', 'status', 'name')
+ ordering = ('status', 'name')
verbose_name = _("Point of interest")
def getLatitude(self):
@@ -255,7 +255,7 @@ class Route(models.Model):
'''Route on the map
'''
name = models.CharField(_("Name"), max_length=150)
- subcategory = models.ForeignKey(SubCategory, verbose_name=_("Subcategory"))
+ categories = models.ManyToManyField(SubCategory)
route = RouteField(_("Route"), srid=settings.EPSG_DISPLAY_PROJECTION)
picture = models.ImageField(_("Image"), upload_to='upload', blank=True,
null=True, height_field='height', width_field='width')
@@ -274,7 +274,7 @@ class Route(models.Model):
return self.name
class Meta:
- ordering = ('subcategory__category', 'subcategory', 'status', 'name')
+ ordering = ('status', 'name')
verbose_name = _("Route")
def getProperty(self, propertymodel, safe=None):
diff --git a/chimere/scripts/upgrade.py b/chimere/scripts/upgrade.py
index a17007b..0649a52 100755
--- a/chimere/scripts/upgrade.py
+++ b/chimere/scripts/upgrade.py
@@ -13,7 +13,7 @@ from django.db import connection, transaction
cursor = connection.cursor()
-from main.models import Area, Marker, Route, Icon
+from main.models import Area, Marker, Route, Icon, SubCategory
from django.contrib.gis.geos import LineString
# early versions before 0.1: urn field doesn't exist for area
@@ -35,6 +35,10 @@ def slugfy(text, separator):
QUERY_CHECK_FIELD = """SELECT a.attname AS field FROM pg_class c, pg_attribute a
WHERE c.relname = '%s' AND a.attnum > 0 AND a.attrelid = c.oid
AND a.attname='%s';"""
+QUERY_CHECK_TABLE = """SELECT c.relname FROM pg_class c
+WHERE c.relname = '%s';"""
+
+
query = QUERY_CHECK_FIELD % ('main_area', 'urn')
cursor.execute(query)
transaction.commit_unless_managed()
@@ -82,8 +86,7 @@ CREATE TABLE "subcategory_areas" (
# early versions before 0.1: main_tinyurl table doesn't exist
-query = """SELECT c.relname FROM pg_class c
-WHERE c.relname = 'main_tinyurl';"""
+query = QUERY_CHECK_TABLE % 'main_tinyurl'
cursor.execute(query)
transaction.commit_unless_managed()
@@ -154,7 +157,43 @@ for cls, attr in ((Icon, "image"), (Marker, "picture"),
obj.width = image.width
obj.height = image.height
obj.save()
- print " * height and width of " + table + " corrected"
+ print " * height and width of " + table + " corrected"
+
+# changement from version 1.0 to 1.1: multiple selection of categories
+
+for cls in (Marker, Route):
+ table = cls._meta.db_table[len("main_"):]
+ query = QUERY_CHECK_TABLE % ('main_' + table + '_categories')
+ cursor.execute(query)
+ transaction.commit_unless_managed()
+
+ row = cursor.fetchone()
+ if row:
+ continue
+ query_create = """
+CREATE TABLE "main_%s_categories" (
+ "id" serial NOT NULL PRIMARY KEY,
+ "%s_id" integer NOT NULL REFERENCES "main_%s" ("id") DEFERRABLE INITIALLY DEFERRED,
+ "subcategory_id" integer NOT NULL REFERENCES "main_subcategory" ("id") DEFERRABLE INITIALLY DEFERRED,
+ UNIQUE ("%s_id", "subcategory_id"));
+""" % (table, table, table, table)
+ cursor.execute(query_create)
+ transaction.commit_unless_managed()
+ for obj in cls.objects.all():
+ query = "select subcategory_id from main_%s where id=%d" % (table,
+ obj.id)
+ cursor.execute(query)
+ transaction.commit_unless_managed()
+
+ row = cursor.fetchone()
+ if row:
+ obj.categories.add(SubCategory.objects.get(id=row[0]))
+ obj.save()
+ query = "ALTER TABLE main_%s DROP COLUMN subcategory_id;" % table
+ cursor.execute(query)
+ transaction.commit_unless_managed()
+ print " * main_%s_categories created" % table
+
# early versions before 0.1: save route with wrong SRID
# only errors with default SRID is managed adapt the script for your SRID