Skip to content

Commit

Permalink
🐛 Add migration generation distance to source
Browse files Browse the repository at this point in the history
  • Loading branch information
LePetitTim committed Jul 17, 2023
1 parent c2def4e commit 89ccc43
Showing 1 changed file with 62 additions and 0 deletions.
62 changes: 62 additions & 0 deletions georiviere/main/migrations/0012_generate_distancetosource.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
# Generated by Django 3.1.14 on 2023-07-17 08:57

from django.conf import settings
from django.contrib.contenttypes.models import ContentType
from django.db import migrations

from mapentity.models import MapEntityMixin


def generate_distancetosource(apps, schema_editor):
Stream = apps.get_model('river', 'Stream')
DistanceToSource = apps.get_model('main', 'DistanceToSource')
from georiviere.main.signals import annotate_distance_to_source
for model in apps.get_models():
field_names = [field.name for field in model._meta.get_fields()]
if any(i in field_names for i in ['topology', 'geom']) and model._meta.model_name != "stream":
for instance in model.objects.all():
if instance._meta.model_name in ['morphology', 'status']:
stream = annotate_distance_to_source(Stream.objects.all(), instance).get(
pk=instance.topology.stream.pk)
DistanceToSource.objects.update_or_create(
object_id=instance.pk,
content_type_id=ContentType.objects.get(model=instance._meta.model_name).pk,
stream=stream,
defaults={"distance": stream.locate.m}
)
else:
qs = Stream.objects.none()
if not instance.geom:
return qs
geom = instance.geom
area = geom.buffer(settings.BASE_INTERSECTION_MARGIN)
qs = Stream.objects.all()
if "geom" in [field.name for field in Stream._meta.get_fields()]:
qs = qs.filter(geom__intersects=area)
elif "_geom" in [field.name for field in Stream._meta.get_fields()]:
qs = qs.filter(_geom__intersects=area)
streams = annotate_distance_to_source(qs, instance)

for stream in streams:
DistanceToSource.objects.update_or_create(
object_id=instance.pk,
content_type_id=ContentType.objects.get_for_model(
instance._meta.model).pk,
stream=stream,
defaults={"distance": stream.locate.m}
)
DistanceToSource.objects.filter(object_id=instance.pk,
content_type_id=ContentType.objects.get_for_model(
instance._meta.model).pk,
).exclude(stream__in=streams).delete()


class Migration(migrations.Migration):

dependencies = [
('main', '0011_auto_20230602_0901'),
]

operations = [
migrations.RunPython(generate_distancetosource, reverse_code=migrations.RunPython.noop)
]

0 comments on commit 89ccc43

Please sign in to comment.