diff --git a/src/c3nav/mapdata/models/geometry/level.py b/src/c3nav/mapdata/models/geometry/level.py index 3b711e76..f894570a 100644 --- a/src/c3nav/mapdata/models/geometry/level.py +++ b/src/c3nav/mapdata/models/geometry/level.py @@ -439,51 +439,49 @@ class AltitudeArea(LevelGeometryMixin, models.Model): level_areas[level] = set(area.tmpid for area in level_areas.get(level, [])) # save to database - from c3nav.mapdata.models import MapUpdate - with MapUpdate.lock(): - areas_to_save = set(range(len(areas))) + areas_to_save = set(range(len(areas))) - all_candidates = AltitudeArea.objects.select_related('level') - for candidate in all_candidates: - candidate.area = candidate.geometry.area - all_candidates = sorted(all_candidates, key=attrgetter('area'), reverse=True) + all_candidates = AltitudeArea.objects.select_related('level') + for candidate in all_candidates: + candidate.area = candidate.geometry.area + all_candidates = sorted(all_candidates, key=attrgetter('area'), reverse=True) - num_modified = 0 - num_deleted = 0 - num_created = 0 + num_modified = 0 + num_deleted = 0 + num_created = 0 - for candidate in all_candidates: - new_area = None - for tmpid in level_areas.get(candidate.level, set()): - area = areas[tmpid] - if area.geometry.almost_equals(candidate.geometry, 1): - new_area = area - break + for candidate in all_candidates: + new_area = None + for tmpid in level_areas.get(candidate.level, set()): + area = areas[tmpid] + if area.geometry.almost_equals(candidate.geometry, 1): + new_area = area + break - if new_area is None: - potential_areas = [(tmpid, areas[tmpid].geometry.intersection(candidate.geometry.buffer(0)).area) - for tmpid in level_areas.get(candidate.level, set())] - potential_areas = [(tmpid, size) for tmpid, size in potential_areas - if candidate.area and size/candidate.area > 0.9] - if potential_areas: - num_modified += 1 - new_area = areas[max(potential_areas, key=itemgetter(1))[0]] + if new_area is None: + potential_areas = [(tmpid, areas[tmpid].geometry.intersection(candidate.geometry.buffer(0)).area) + for tmpid in level_areas.get(candidate.level, set())] + potential_areas = [(tmpid, size) for tmpid, size in potential_areas + if candidate.area and size/candidate.area > 0.9] + if potential_areas: + num_modified += 1 + new_area = areas[max(potential_areas, key=itemgetter(1))[0]] - if new_area is None: - candidate.delete() - num_deleted += 1 - continue + if new_area is None: + candidate.delete() + num_deleted += 1 + continue - candidate.geometry = new_area.geometry - candidate.altitude = new_area.altitude - candidate.save() - areas_to_save.discard(new_area.tmpid) - level_areas[new_area.level].discard(new_area.tmpid) + candidate.geometry = new_area.geometry + candidate.altitude = new_area.altitude + candidate.save() + areas_to_save.discard(new_area.tmpid) + level_areas[new_area.level].discard(new_area.tmpid) - for tmpid in areas_to_save: - num_created += 1 - areas[tmpid].save() + for tmpid in areas_to_save: + num_created += 1 + areas[tmpid].save() - logger = logging.getLogger('c3nav') - logger.info(_('%d altitude areas built.') % len(areas)) - logger.info(_('%d modified, %d deleted, %d created.') % (num_modified, num_deleted, num_created)) + logger = logging.getLogger('c3nav') + logger.info(_('%d altitude areas built.') % len(areas)) + logger.info(_('%d modified, %d deleted, %d created.') % (num_modified, num_deleted, num_created))