From ff5826d8c2d8911898e489a8568fac531e4b6564 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Sat, 23 Dec 2017 02:38:18 +0100 Subject: [PATCH] skip stuff if processupdates is no geometries were affected --- .../management/commands/clearmapcache.py | 4 +- .../0069_mapupdate_geometries_changed.py | 21 +++++++ src/c3nav/mapdata/models/update.py | 57 +++++++++++-------- src/c3nav/mapdata/utils/cache/changes.py | 4 ++ 4 files changed, 61 insertions(+), 25 deletions(-) create mode 100644 src/c3nav/mapdata/migrations/0069_mapupdate_geometries_changed.py diff --git a/src/c3nav/mapdata/management/commands/clearmapcache.py b/src/c3nav/mapdata/management/commands/clearmapcache.py index 7973cc7a..91a8586c 100644 --- a/src/c3nav/mapdata/management/commands/clearmapcache.py +++ b/src/c3nav/mapdata/management/commands/clearmapcache.py @@ -15,13 +15,15 @@ class Command(BaseCommand): def add_arguments(self, parser): parser.add_argument('--include-history', action='store_const', const=True, default=False, help=_('incluce all history as well')) + parser.add_argument('--include-geometries', action='store_const', const=True, default=False, + help=_('incluce all geometries as well')) def handle(self, *args, **options): from c3nav.mapdata.models import MapUpdate logger = logging.getLogger('c3nav') - MapUpdate.objects.create(type='management') + MapUpdate.objects.create(type='management', geometries_changed=options['include_geometries']) logger.info('New management update created.') if options['include_history']: diff --git a/src/c3nav/mapdata/migrations/0069_mapupdate_geometries_changed.py b/src/c3nav/mapdata/migrations/0069_mapupdate_geometries_changed.py new file mode 100644 index 00000000..b229567d --- /dev/null +++ b/src/c3nav/mapdata/migrations/0069_mapupdate_geometries_changed.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.7 on 2017-12-23 01:38 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('mapdata', '0068_waytype_level_change_description'), + ] + + operations = [ + migrations.AddField( + model_name='mapupdate', + name='geometries_changed', + field=models.BooleanField(default=True), + preserve_default=False, + ), + ] diff --git a/src/c3nav/mapdata/models/update.py b/src/c3nav/mapdata/models/update.py index fe3cbcfb..ab169cb6 100644 --- a/src/c3nav/mapdata/models/update.py +++ b/src/c3nav/mapdata/models/update.py @@ -21,6 +21,7 @@ class MapUpdate(models.Model): user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, on_delete=models.PROTECT) type = models.CharField(max_length=32) processed = models.BooleanField(default=False) + geometries_changed = models.BooleanField() class Meta: verbose_name = _('Map update') @@ -92,37 +93,40 @@ class MapUpdate(models.Model): if not new_updates: return () - from c3nav.mapdata.utils.cache.changes import changed_geometries - changed_geometries.reset() + if any(update.geometries_changed for update in new_updates): + from c3nav.mapdata.utils.cache.changes import changed_geometries + changed_geometries.reset() - logger.info('Recalculating altitude areas...') + logger.info('Recalculating altitude areas...') - from c3nav.mapdata.models import AltitudeArea - AltitudeArea.recalculate() + from c3nav.mapdata.models import AltitudeArea + AltitudeArea.recalculate() - logger.info('%.3f m² of altitude areas affected.' % changed_geometries.area) + logger.info('%.3f m² of altitude areas affected.' % changed_geometries.area) - last_processed_update = cls.objects.filter(processed=True).latest().to_tuple + last_processed_update = cls.objects.filter(processed=True).latest().to_tuple - for new_update in new_updates: - logger.info('Applying changed geometries from MapUpdate #%(id)s (%(type)s)...' % - {'id': new_update.pk, 'type': new_update.type}) - try: - new_changes = pickle.load(open(new_update._changed_geometries_filename(), 'rb')) - except FileNotFoundError: - logger.warning('changed_geometries pickle file not found.') - else: - logger.info('%.3f m² affected by this update.' % new_changes.area) - changed_geometries.combine(new_changes) + for new_update in new_updates: + logger.info('Applying changed geometries from MapUpdate #%(id)s (%(type)s)...' % + {'id': new_update.pk, 'type': new_update.type}) + try: + new_changes = pickle.load(open(new_update._changed_geometries_filename(), 'rb')) + except FileNotFoundError: + logger.warning('changed_geometries pickle file not found.') + else: + logger.info('%.3f m² affected by this update.' % new_changes.area) + changed_geometries.combine(new_changes) - logger.info('%.3f m² of geometries affected in total.' % changed_geometries.area) + logger.info('%.3f m² of geometries affected in total.' % changed_geometries.area) - changed_geometries.save(last_processed_update, new_updates[-1].to_tuple) + changed_geometries.save(last_processed_update, new_updates[-1].to_tuple) - logger.info('Rebuilding level render data...') + logger.info('Rebuilding level render data...') - from c3nav.mapdata.render.renderdata import LevelRenderData - LevelRenderData.rebuild() + from c3nav.mapdata.render.renderdata import LevelRenderData + LevelRenderData.rebuild() + else: + logger.info('No geometries affected.') logger.info('Rebuilding router...') from c3nav.routing.router import Router @@ -143,13 +147,18 @@ class MapUpdate(models.Model): if not new and (self.was_processed or not self.processed): raise TypeError + from c3nav.mapdata.utils.cache.changes import changed_geometries + + if self.geometries_changed is None: + self.geometries_changed = not changed_geometries.is_empty + super().save(**kwargs) with suppress(FileExistsError): os.mkdir(os.path.dirname(self._changed_geometries_filename())) - from c3nav.mapdata.utils.cache.changes import changed_geometries - pickle.dump(changed_geometries, open(self._changed_geometries_filename(), 'wb')) + if self.geometries_changed: + pickle.dump(changed_geometries, open(self._changed_geometries_filename(), 'wb')) if new: transaction.on_commit( diff --git a/src/c3nav/mapdata/utils/cache/changes.py b/src/c3nav/mapdata/utils/cache/changes.py index b842d889..e5c408e1 100644 --- a/src/c3nav/mapdata/utils/cache/changes.py +++ b/src/c3nav/mapdata/utils/cache/changes.py @@ -33,6 +33,10 @@ class GeometryChangeTracker: self._unary_unions[level_id] = union return union + @property + def is_empty(self): + return not self._geometries_by_level + @property def area(self): return sum((self._get_unary_union(level_id).area