migration to fix broken foreign keys refering to spaces
This commit is contained in:
parent
69634da8d1
commit
ac29041a3c
2 changed files with 84 additions and 1 deletions
|
@ -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
|
||||
|
||||
|
|
83
src/c3nav/mapdata/migrations/0002_fix_space_foreign_keys.py
Normal file
83
src/c3nav/mapdata/migrations/0002_fix_space_foreign_keys.py
Normal 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),
|
||||
]
|
Loading…
Add table
Add a link
Reference in a new issue