skip stuff if processupdates is no geometries were affected

This commit is contained in:
Laura Klünder 2017-12-23 02:38:18 +01:00
parent d51bc684bb
commit ff5826d8c2
4 changed files with 61 additions and 25 deletions

View file

@ -15,13 +15,15 @@ class Command(BaseCommand):
def add_arguments(self, parser): def add_arguments(self, parser):
parser.add_argument('--include-history', action='store_const', const=True, default=False, parser.add_argument('--include-history', action='store_const', const=True, default=False,
help=_('incluce all history as well')) 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): def handle(self, *args, **options):
from c3nav.mapdata.models import MapUpdate from c3nav.mapdata.models import MapUpdate
logger = logging.getLogger('c3nav') 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.') logger.info('New management update created.')
if options['include_history']: if options['include_history']:

View file

@ -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,
),
]

View file

@ -21,6 +21,7 @@ class MapUpdate(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, on_delete=models.PROTECT) user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, on_delete=models.PROTECT)
type = models.CharField(max_length=32) type = models.CharField(max_length=32)
processed = models.BooleanField(default=False) processed = models.BooleanField(default=False)
geometries_changed = models.BooleanField()
class Meta: class Meta:
verbose_name = _('Map update') verbose_name = _('Map update')
@ -92,37 +93,40 @@ class MapUpdate(models.Model):
if not new_updates: if not new_updates:
return () return ()
from c3nav.mapdata.utils.cache.changes import changed_geometries if any(update.geometries_changed for update in new_updates):
changed_geometries.reset() 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 from c3nav.mapdata.models import AltitudeArea
AltitudeArea.recalculate() 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: for new_update in new_updates:
logger.info('Applying changed geometries from MapUpdate #%(id)s (%(type)s)...' % logger.info('Applying changed geometries from MapUpdate #%(id)s (%(type)s)...' %
{'id': new_update.pk, 'type': new_update.type}) {'id': new_update.pk, 'type': new_update.type})
try: try:
new_changes = pickle.load(open(new_update._changed_geometries_filename(), 'rb')) new_changes = pickle.load(open(new_update._changed_geometries_filename(), 'rb'))
except FileNotFoundError: except FileNotFoundError:
logger.warning('changed_geometries pickle file not found.') logger.warning('changed_geometries pickle file not found.')
else: else:
logger.info('%.3f m² affected by this update.' % new_changes.area) logger.info('%.3f m² affected by this update.' % new_changes.area)
changed_geometries.combine(new_changes) 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 from c3nav.mapdata.render.renderdata import LevelRenderData
LevelRenderData.rebuild() LevelRenderData.rebuild()
else:
logger.info('No geometries affected.')
logger.info('Rebuilding router...') logger.info('Rebuilding router...')
from c3nav.routing.router import 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): if not new and (self.was_processed or not self.processed):
raise TypeError 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) super().save(**kwargs)
with suppress(FileExistsError): with suppress(FileExistsError):
os.mkdir(os.path.dirname(self._changed_geometries_filename())) os.mkdir(os.path.dirname(self._changed_geometries_filename()))
from c3nav.mapdata.utils.cache.changes import changed_geometries if self.geometries_changed:
pickle.dump(changed_geometries, open(self._changed_geometries_filename(), 'wb')) pickle.dump(changed_geometries, open(self._changed_geometries_filename(), 'wb'))
if new: if new:
transaction.on_commit( transaction.on_commit(

View file

@ -33,6 +33,10 @@ class GeometryChangeTracker:
self._unary_unions[level_id] = union self._unary_unions[level_id] = union
return union return union
@property
def is_empty(self):
return not self._geometries_by_level
@property @property
def area(self): def area(self):
return sum((self._get_unary_union(level_id).area return sum((self._get_unary_union(level_id).area