migration to fix broken foreign keys refering to spaces

This commit is contained in:
Laura Klünder 2017-05-11 19:01:33 +02:00
parent 69634da8d1
commit ac29041a3c
2 changed files with 84 additions and 1 deletions

View file

@ -11,7 +11,7 @@ import django.db.models.deletion
class Migration(migrations.Migration):
replaces = [('mapdata', '0001_initial'), ('mapdata', '0002_door_obstacle'), ('mapdata', '0003_auto_20161016_1133'), ('mapdata', '0004_auto_20161128_1536'), ('mapdata', '0005_auto_20161128_1735'), ('mapdata', '0006_auto_20161128_1809'), ('mapdata', '0007_auto_20161128_1903'), ('mapdata', '0008_hole'), ('mapdata', '0009_levelconnector'), ('mapdata', '0010_auto_20161203_2139'), ('mapdata', '0011_auto_20161204_1041'), ('mapdata', '0012_auto_20161204_1544'), ('mapdata', '0013_auto_20161208_0937'), ('mapdata', '0014_lineobstacle'), ('mapdata', '0015_auto_20161208_2020'), ('mapdata', '0016_auto_20161208_2023'), ('mapdata', '0017_auto_20161208_2039'), ('mapdata', '0018_auto_20161212_1205'), ('mapdata', '0019_auto_20161216_0923'), ('mapdata', '0020_auto_20161216_0934'), ('mapdata', '0021_auto_20161217_2333'), ('mapdata', '0022_escalator'), ('mapdata', '0023_escalatorslope'), ('mapdata', '0024_oneway'), ('mapdata', '0025_auto_20161219_1440'), ('mapdata', '0026_auto_20161219_1501'), ('mapdata', '0027_auto_20161219_1748'), ('mapdata', '0028_auto_20161219_1757'), ('mapdata', '0029_auto_20161221_1120'), ('mapdata', '0030_remove_locationgroup_routing_inclusion'), ('mapdata', '0031_locationgroup_compiled_room'), ('mapdata', '0032_auto_20161223_2225'), ('mapdata', '0033_auto_20161224_1803'), ('mapdata', '0034_auto_20161224_2104'), ('mapdata', '0035_auto_20161226_1154'), ('mapdata', '0036_arealocation_bssids'), ('mapdata', '0037_auto_20170428_0902'), ('mapdata', '0038_source_image'), ('mapdata', '0039_auto_20170501_1523'), ('mapdata', '0040_auto_20170504_0953'), ('mapdata', '0041_room_outside_area'), ('mapdata', '0042_auto_20170504_1007'), ('mapdata', '0043_auto_20170504_1010'), ('mapdata', '0044_auto_20170504_1023'), ('mapdata', '0045_merge_areas'), ('mapdata', '0046_assign_area'), ('mapdata', '0047_auto_20170505_1002'), ('mapdata', '0048_elevator_area'), ('mapdata', '0049_auto_20170505_1125'), ('mapdata', '0050_categorize_intermediate_areas'), ('mapdata', '0051_move_intermediate_areas'), ('mapdata', '0052_remove_level_intermediate'), ('mapdata', '0053_auto_20170505_1212'), ('mapdata', '0054_remove_obstacle_crop_to_level'), ('mapdata', '0055_auto_20170505_1334'), ('mapdata', '0056_auto_20170506_1531'), ('mapdata', '0057_auto_20170506_1534'), ('mapdata', '0058_auto_20170506_1549'), ('mapdata', '0059_auto_20170507_0937'), ('mapdata', '0060_auto_20170507_0952'), ('mapdata', '0061_auto_20170507_0953'), ('mapdata', '0062_auto_20170508_1400'), ('mapdata', '0063_auto_20170508_1404'), ('mapdata', '0064_auto_20170509_1140'), ('mapdata', '0065_auto_20170509_1140'), ('mapdata', '0066_auto_20170509_1148'), ('mapdata', '0067_auto_20170510_1311'), ('mapdata', '0068_area_stuffed'), ('mapdata', '0069_auto_20170510_1329'), ('mapdata', '0070_point'), ('mapdata', '0071_auto_20170510_1413'), ('mapdata', '0072_auto_20170510_1540'), ('mapdata', '0073_remove_locationgroup_slug'), ('mapdata', '0074_auto_20170510_1556'), ('mapdata', '0075_auto_20170510_1557'), ('mapdata', '0076_auto_20170510_1629'), ('mapdata', '0077_auto_20170510_1637'), ('mapdata', '0078_auto_20170510_1639'), ('mapdata', '0079_auto_20170510_1641'), ('mapdata', '0080_auto_20170510_1642'), ('mapdata', '0081_arealocation_groups'), ('mapdata', '0082_auto_20170510_1644'), ('mapdata', '0083_auto_20170510_1645'), ('mapdata', '0084_auto_20170510_1701'), ('mapdata', '0085_assign_location_level_room'), ('mapdata', '0086_auto_20170510_1820'), ('mapdata', '0087_assign_location_roomsegment_poi'), ('mapdata', '0088_locationgroup_compiled_area'), ('mapdata', '0089_assign_location_area'), ('mapdata', '0090_auto_20170510_1931')]
replaces = [('mapdata', '0001_initial'), ('mapdata', '0002_door_obstacle'), ('mapdata', '0003_auto_20161016_1133'), ('mapdata', '0004_auto_20161128_1536'), ('mapdata', '0005_auto_20161128_1735'), ('mapdata', '0006_auto_20161128_1809'), ('mapdata', '0007_auto_20161128_1903'), ('mapdata', '0008_hole'), ('mapdata', '0009_levelconnector'), ('mapdata', '0010_auto_20161203_2139'), ('mapdata', '0011_auto_20161204_1041'), ('mapdata', '0012_auto_20161204_1544'), ('mapdata', '0013_auto_20161208_0937'), ('mapdata', '0014_lineobstacle'), ('mapdata', '0015_auto_20161208_2020'), ('mapdata', '0016_auto_20161208_2023'), ('mapdata', '0017_auto_20161208_2039'), ('mapdata', '0018_auto_20161212_1205'), ('mapdata', '0019_auto_20161216_0923'), ('mapdata', '0020_auto_20161216_0934'), ('mapdata', '0021_auto_20161217_2333'), ('mapdata', '0022_escalator'), ('mapdata', '0023_escalatorslope'), ('mapdata', '0024_oneway'), ('mapdata', '0025_auto_20161219_1440'), ('mapdata', '0026_auto_20161219_1501'), ('mapdata', '0027_auto_20161219_1748'), ('mapdata', '0028_auto_20161219_1757'), ('mapdata', '0029_auto_20161221_1120'), ('mapdata', '0030_remove_locationgroup_routing_inclusion'), ('mapdata', '0031_locationgroup_compiled_room'), ('mapdata', '0032_auto_20161223_2225'), ('mapdata', '0033_auto_20161224_1803'), ('mapdata', '0034_auto_20161224_2104'), ('mapdata', '0035_auto_20161226_1154'), ('mapdata', '0036_arealocation_bssids'), ('mapdata', '0037_auto_20170428_0902'), ('mapdata', '0038_source_image'), ('mapdata', '0039_auto_20170501_1523'), ('mapdata', '0040_auto_20170504_0953'), ('mapdata', '0041_room_outside_area'), ('mapdata', '0042_auto_20170504_1007'), ('mapdata', '0043_auto_20170504_1010'), ('mapdata', '0044_auto_20170504_1023'), ('mapdata', '0045_merge_areas'), ('mapdata', '0046_assign_area'), ('mapdata', '0047_auto_20170505_1002'), ('mapdata', '0048_elevator_area'), ('mapdata', '0049_auto_20170505_1125'), ('mapdata', '0050_categorize_intermediate_areas'), ('mapdata', '0051_move_intermediate_areas'), ('mapdata', '0052_remove_level_intermediate'), ('mapdata', '0053_auto_20170505_1212'), ('mapdata', '0054_remove_obstacle_crop_to_level'), ('mapdata', '0055_auto_20170505_1334'), ('mapdata', '0056_auto_20170506_1531'), ('mapdata', '0057_auto_20170506_1534'), ('mapdata', '0058_auto_20170506_1549'), ('mapdata', '0059_auto_20170507_0937'), ('mapdata', '0060_auto_20170507_0952'), ('mapdata', '0061_auto_20170507_0953'), ('mapdata', '0062_auto_20170508_1400'), ('mapdata', '0063_auto_20170508_1404'), ('mapdata', '0064_auto_20170509_1140'), ('mapdata', '0065_auto_20170509_1140'), ('mapdata', '0066_auto_20170509_1148'), ('mapdata', '0067_auto_20170510_1311'), ('mapdata', '0068_area_stuffed'), ('mapdata', '0069_auto_20170510_1329'), ('mapdata', '0070_point'), ('mapdata', '0071_auto_20170510_1413'), ('mapdata', '0072_auto_20170510_1540'), ('mapdata', '0073_remove_locationgroup_slug'), ('mapdata', '0074_auto_20170510_1556'), ('mapdata', '0075_auto_20170510_1557'), ('mapdata', '0076_auto_20170510_1629'), ('mapdata', '0077_auto_20170510_1637'), ('mapdata', '0078_auto_20170510_1639'), ('mapdata', '0079_auto_20170510_1641'), ('mapdata', '0080_auto_20170510_1642'), ('mapdata', '0081_arealocation_groups'), ('mapdata', '0082_auto_20170510_1644'), ('mapdata', '0083_auto_20170510_1645'), ('mapdata', '0084_auto_20170510_1701'), ('mapdata', '0085_assign_location_level_room'), ('mapdata', '0086_auto_20170510_1820'), ('mapdata', '0087_assign_location_roomsegment_poi'), ('mapdata', '0088_locationgroup_compiled_area'), ('mapdata', '0089_assign_location_area'), ('mapdata', '0090_auto_20170510_1931'), ('mapdata', '0002_fix_space_foreign_keys')]
initial = True

View file

@ -0,0 +1,83 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.7 on 2017-05-11 16:48
from __future__ import unicode_literals
import json
import os
from django.conf import settings
from django.db import migrations
from shapely.geometry import shape
def fix_space_foreign_keys(apps, schema_editor):
models = ('Area', 'Stair', 'LineObstacle', 'Obstacle')
Space = apps.get_model('mapdata', 'Space')
MAP_PATH = os.path.join(settings.DATA_DIR, 'map')
PACKAGE_PATHS = [os.path.join(MAP_PATH, dirname) for dirname in os.listdir(MAP_PATH)]
PACKAGE_PATHS = [path for path in PACKAGE_PATHS if os.path.isdir(path)]
spaces = {}
for space in Space.objects.all():
spaces.setdefault(space.section.name + '_' + space.level, []).append(space)
for model_name in models:
model = apps.get_model('mapdata', model_name)
orig_dir_names = [model._meta.default_related_name.lower()]
if model.__name__ == 'Area':
orig_dir_names = ['arealocations', 'stuffedareas']
orig_objects = []
for package_path in PACKAGE_PATHS:
for orig_dir_name in orig_dir_names:
dir_name = os.path.join(package_path, orig_dir_name)
if not os.path.isdir(dir_name):
continue
for filename in os.listdir(dir_name):
abs_filename = os.path.join(dir_name, filename)
if not filename.endswith('.json') or not os.path.isfile(abs_filename):
continue
obj = json.load(open(abs_filename))
obj['name'] = filename[:-5]
obj['geometry'] = shape(obj['geometry'])
orig_objects.append(obj)
matches = {}
for obj in model.objects.all().order_by('id'):
for i, orig_obj in enumerate(orig_objects):
if obj.geometry.almost_equals(orig_obj['geometry']):
matches.setdefault(i, []).append(obj)
break
for orig_i, objects in matches.items():
orig_obj = orig_objects[orig_i]
if '-' in orig_obj['level']:
splitted = orig_obj['level'].split('-')
possible_spaces = spaces[splitted[0] + '_upper'] + spaces[splitted[1] + '_lower']
else:
possible_spaces = spaces[orig_obj['level'] + '_']
possible_spaces = [space for space in possible_spaces
if space.geometry.intersects(orig_obj['geometry'])]
if len(objects) == len(possible_spaces):
pass # nice
elif len(objects) > len(possible_spaces):
pass # well, whatever
else:
def compare(space):
return space.geometry.intersection(orig_obj['geometry']).area
possible_spaces.sort(key=compare, reverse=True)
for i, obj in enumerate(objects[:len(possible_spaces)]):
obj.space = possible_spaces[i]
obj.save()
class Migration(migrations.Migration):
dependencies = [
('mapdata', '0090_auto_20170510_1931'),
]
operations = [
migrations.RunPython(fix_space_foreign_keys),
]