diff options
Diffstat (limited to 'chimere/scripts/upgrade.py')
-rwxr-xr-x | chimere/scripts/upgrade.py | 315 |
1 files changed, 315 insertions, 0 deletions
diff --git a/chimere/scripts/upgrade.py b/chimere/scripts/upgrade.py new file mode 100755 index 0000000..accb751 --- /dev/null +++ b/chimere/scripts/upgrade.py @@ -0,0 +1,315 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +import sys +sys.path.append('.') + +from django.core.management import setup_environ +import settings + +setup_environ(settings) + +from django.db import connection, transaction + +cursor = connection.cursor() + +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 + +import htmlentitydefs, re + +def slugfy(text, separator): + ret = u"" + text = text.strip() + for c in text.lower(): + try: + ret += htmlentitydefs.codepoint2name[ord(c)][0] + except: + ret += c + ret = re.sub("\W", " ", ret) + ret = re.sub(" +", separator, ret) + return ret.strip() + +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() + +row = cursor.fetchone() +if not row: + query_update = "ALTER TABLE main_area ADD COLUMN urn VARCHAR(50) \ +UNIQUE" + cursor.execute(query_update) + transaction.commit_unless_managed() + areas = Area.objects.all() + print " * urn field created in table main_area" + for area in areas: + urn = slugfy(area.name, "-") + area.urn = urn + area.save() + print " * area %s urn is now: %s" % (area.name, area.urn) + + query = "ALTER TABLE main_area ALTER COLUMN urn SET not null;" + cursor.execute(query) + transaction.commit_unless_managed() + print " * urn field has now the constraint NOT NULL" + +from django.contrib.auth.models import Permission, ContentType + +# check if permission have been correctly set for each areas +areas = Area.objects.all() +for area in areas: + content_type = ContentType.objects.get(app_label="main", + model="area") + mnemo = 'change_area_' + area.urn + perm = Permission.objects.filter(codename=mnemo) + if not perm: + lbl = "Can change " + area.name + perm = Permission(name=lbl, content_type_id=content_type.id, + codename=mnemo) + perm.save() + print ' * permission "' + lbl + '" has been created' + print " WARNING: don't forget to update administrator's rights with \ +this new permission" + +# early versions before 0.1: subcategory_areas table doesn't exist +# version 1.0 subcategory_areas renamed to main_subcategory_areas + +query = QUERY_CHECK_TABLE % 'main_subcategory_areas' +cursor.execute(query) +transaction.commit_unless_managed() + +row = cursor.fetchone() +if not row: + query = QUERY_CHECK_TABLE % 'subcategory_areas' + cursor.execute(query) + transaction.commit_unless_managed() + + row = cursor.fetchone() + if row: + query_rename = "ALTER TABLE subcategory_areas RENAME TO \ +main_subcategory_areas;" + cursor.execute(query_rename) + transaction.commit_unless_managed() + print " * subcategory_areas renamed to main_subcategory_areas" + else: + query_create = """ +CREATE TABLE "main_subcategory_areas" ( + "id" serial NOT NULL PRIMARY KEY, + "subcategory_id" integer NOT NULL REFERENCES "main_subcategory" ("id") + DEFERRABLE INITIALLY DEFERRED, + "area_id" integer NOT NULL REFERENCES "main_area" ("id") + DEFERRABLE INITIALLY DEFERRED, + UNIQUE ("subcategory_id", "area_id")); +""" + cursor.execute(query_create) + transaction.commit_unless_managed() + print " * main_subcategory_areas created" + +# early versions before 0.1: main_tinyurl table doesn't exist + +query = QUERY_CHECK_TABLE % 'main_tinyurl' +cursor.execute(query) +transaction.commit_unless_managed() + +row = cursor.fetchone() +if not row: + query_create = """ +CREATE TABLE "main_tinyurl" ( + "id" serial NOT NULL PRIMARY KEY, + "parameters" varchar(500) NOT NULL); +""" + cursor.execute(query_create) + transaction.commit_unless_managed() + print " * main_tinyurl created" + + +# early versions before 0.1: save area with wrong SRID +# only errors with default SRID is managed adapt the script for your SRID + +from osgeo import osr + +srs = osr.SpatialReference() +srs.ImportFromEPSG(4326) # WGS84 +ll = srs.CloneGeogCS() +srs.ImportFromEPSG(settings.EPSG_PROJECTION) +proj = osr.CoordinateTransformation(srs, ll) + +changed = False +areas = Area.objects.all() +for area in areas: + # only one test: assume each point as been save with the same SRID... + if area.upper_left_corner.srid == 4326 and area.upper_left_corner.x > 90 \ + or area.upper_left_corner.x < -90: + changed = True + pt = proj.TransformPoint(area.upper_left_corner.y, + area.upper_left_corner.x) + area.upper_left_corner.x = pt[0] + area.upper_left_corner.y = pt[1] + pt = proj.TransformPoint(area.lower_right_corner.y, + area.lower_right_corner.x) + area.lower_right_corner.x = pt[0] + area.lower_right_corner.y = pt[1] + area.save() +if changed: + print " * projections of areas corrected" + +# changement from version 1.0 to 1.1: add dated fields to markers and routes +if settings.DAYS_BEFORE_EVENT: + for cls in (Marker, Route): + table = cls._meta.db_table + query = QUERY_CHECK_FIELD % (table, 'start_date') + cursor.execute(query) + transaction.commit_unless_managed() + + row = cursor.fetchone() + if not row: + query_update = "ALTER TABLE "+table+" ADD COLUMN start_date date" + cursor.execute(query_update) + transaction.commit_unless_managed() + query_update = "ALTER TABLE "+table+" ADD COLUMN end_date date" + cursor.execute(query_update) + transaction.commit_unless_managed() + print " * start_date and end_date added to table " + table + "." + +# changement from version 1.0 to 1.1: add available_date field to marker +if 'chimere.rss' in settings.INSTALLED_APPS: + for cls in (Marker,): + table = cls._meta.db_table + query = QUERY_CHECK_FIELD % (table, 'available_date') + cursor.execute(query) + transaction.commit_unless_managed() + + row = cursor.fetchone() + if not row: + query_update = "ALTER TABLE " + table + " ADD COLUMN \ +available_date timestamp with time zone" + cursor.execute(query_update) + transaction.commit_unless_managed() + print " * available_date added to table " + table + "." + +# changement from version 1.0 to 1.1: version of django 1.2 +# create specific height and width for image fields + +for cls, attr in ((Icon, "image"), (Marker, "picture"), + (Route, "picture")): + table = cls._meta.db_table + query = QUERY_CHECK_FIELD % (table, 'width') + cursor.execute(query) + transaction.commit_unless_managed() + + row = cursor.fetchone() + if not row: + query_update = "ALTER TABLE "+table+" ADD COLUMN width integer" + cursor.execute(query_update) + transaction.commit_unless_managed() + query_update = "ALTER TABLE "+table+" ADD COLUMN height integer" + cursor.execute(query_update) + transaction.commit_unless_managed() + for obj in cls.objects.all(): + image = getattr(obj, attr) + if not image: + continue + obj.width = image.width + obj.height = image.height + obj.save() + 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 + +# -> version 1.2: associate point to route (for the future) +query = QUERY_CHECK_FIELD % ('main_marker', 'route_id') +cursor.execute(query) +transaction.commit_unless_managed() + +row = cursor.fetchone() +if not row: + query_update = 'ALTER TABLE "main_marker" ADD COLUMN \ +"route_id" integer REFERENCES "main_route" ("id") DEFERRABLE INITIALLY DEFERRED' + cursor.execute(query_update) + transaction.commit_unless_managed() + print " * route_id added to table main_marker." + +# -> version 1.3: file associated to routes +query = QUERY_CHECK_TABLE % 'main_routefile' +cursor.execute(query) +transaction.commit_unless_managed() + +row = cursor.fetchone() +if not row: + query_create = """ + CREATE TABLE "main_routefile" ( + "id" serial NOT NULL PRIMARY KEY, + "name" varchar(150) NOT NULL, + "raw_file" varchar(100) NOT NULL, + "simplified_file" varchar(100), + "file_type" varchar(1) NOT NULL + ) + ; + ALTER TABLE "main_route" ADD COLUMN + "associated_file_id" integer REFERENCES "main_routefile" ("id") + DEFERRABLE INITIALLY DEFERRED; + """ + cursor.execute(query_create) + transaction.commit_unless_managed() + print " * main_routefile created" + +# early versions before 0.1: save route with wrong SRID +# only errors with default SRID is managed adapt the script for your SRID + +changed = False +routes = Route.objects.all() +for route in routes: + # only one test: assume each point as been save with the same SRID... + if route.route and route.route.srid == 4326 and \ + route.route[0][0] > 90 or route.route[0][0] < -90: + changed = True + new_route = [] + for pt in route.route: + pt = proj.TransformPoint(pt[0], pt[1]) + new_route.append((pt[0], pt[1])) + route.route = LineString(new_route) + route.save() +if changed: + print " * projections of routes corrected" |