skip stuff if processupdates is no geometries were affected
This commit is contained in:
parent
d51bc684bb
commit
ff5826d8c2
4 changed files with 61 additions and 25 deletions
|
@ -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']:
|
||||||
|
|
|
@ -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,
|
||||||
|
),
|
||||||
|
]
|
|
@ -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(
|
||||||
|
|
4
src/c3nav/mapdata/utils/cache/changes.py
vendored
4
src/c3nav/mapdata/utils/cache/changes.py
vendored
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue