diff --git a/src/c3nav/mapdata/migrations/0001_squashed_refactor_2017.py b/src/c3nav/mapdata/migrations/0001_squashed_refactor_2017.py index c52b1475..895f8a32 100644 --- a/src/c3nav/mapdata/migrations/0001_squashed_refactor_2017.py +++ b/src/c3nav/mapdata/migrations/0001_squashed_refactor_2017.py @@ -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 diff --git a/src/c3nav/mapdata/migrations/0002_fix_space_foreign_keys.py b/src/c3nav/mapdata/migrations/0002_fix_space_foreign_keys.py new file mode 100644 index 00000000..18d51eb0 --- /dev/null +++ b/src/c3nav/mapdata/migrations/0002_fix_space_foreign_keys.py @@ -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), + ]