From 218cae8d5fd658a44a49879e9c9e9195f6f3df65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Wed, 25 Dec 2024 16:49:08 +0100 Subject: [PATCH] introduce load group as a concept --- .../mapdata/migrations/0126_loadgroup.py | 72 +++++++++++++++++++ src/c3nav/mapdata/models/geometry/level.py | 5 +- src/c3nav/mapdata/models/geometry/space.py | 5 +- src/c3nav/mapdata/models/locations.py | 20 ++++++ src/c3nav/mapdata/schemas/model_base.py | 4 ++ 5 files changed, 104 insertions(+), 2 deletions(-) create mode 100644 src/c3nav/mapdata/migrations/0126_loadgroup.py diff --git a/src/c3nav/mapdata/migrations/0126_loadgroup.py b/src/c3nav/mapdata/migrations/0126_loadgroup.py new file mode 100644 index 00000000..03193067 --- /dev/null +++ b/src/c3nav/mapdata/migrations/0126_loadgroup.py @@ -0,0 +1,72 @@ +# Generated by Django 5.0.8 on 2024-12-25 15:44 + +import c3nav.routing.schemas +import django.core.serializers.json +import django.db.models.deletion +import django_pydantic_field.compat.django +import django_pydantic_field.fields +import types +import typing +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('mapdata', '0125_rangingbeacon_altitude_quest_and_more'), + ] + + operations = [ + migrations.CreateModel( + name='LoadGroup', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=50, unique=True, verbose_name='Name')), + ], + options={ + 'verbose_name': 'Load group', + 'verbose_name_plural': 'Load groups', + 'default_related_name': 'labelgroup', + }, + ), + migrations.AddField( + model_name='area', + name='load_group_contribute', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='mapdata.loadgroup', verbose_name='contribute to load group'), + ), + migrations.AddField( + model_name='area', + name='load_group_display', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='mapdata.loadgroup', verbose_name='display load group'), + ), + migrations.AddField( + model_name='dynamiclocation', + name='load_group_display', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='mapdata.loadgroup', verbose_name='display load group'), + ), + migrations.AddField( + model_name='level', + name='load_group_display', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='mapdata.loadgroup', verbose_name='display load group'), + ), + migrations.AddField( + model_name='locationgroup', + name='load_group_contribute', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='mapdata.loadgroup', verbose_name='contribute to load group'), + ), + migrations.AddField( + model_name='poi', + name='load_group_display', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='mapdata.loadgroup', verbose_name='display load group'), + ), + migrations.AddField( + model_name='space', + name='load_group_contribute', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='mapdata.loadgroup', verbose_name='contribute to load group'), + ), + migrations.AddField( + model_name='space', + name='load_group_display', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='mapdata.loadgroup', verbose_name='display load group'), + ), + ] diff --git a/src/c3nav/mapdata/models/geometry/level.py b/src/c3nav/mapdata/models/geometry/level.py index ee9ea271..ad817002 100644 --- a/src/c3nav/mapdata/models/geometry/level.py +++ b/src/c3nav/mapdata/models/geometry/level.py @@ -28,7 +28,7 @@ from c3nav.mapdata.grid import grid from c3nav.mapdata.models import Level from c3nav.mapdata.models.access import AccessRestrictionMixin from c3nav.mapdata.models.geometry.base import GeometryMixin -from c3nav.mapdata.models.locations import SpecificLocation +from c3nav.mapdata.models.locations import SpecificLocation, LoadGroup from c3nav.mapdata.utils.cache.changes import changed_geometries from c3nav.mapdata.utils.geometry import (assert_multilinestring, assert_multipolygon, clean_cut_polygon, cut_polygon_with_line, unwrap_geom) @@ -124,6 +124,9 @@ class Space(LevelGeometryMixin, SpecificLocation, models.Model): base_mapdata_accessible = models.BooleanField(default=False, verbose_name=_('always accessible (overwrites base mapdata setting)')) + load_group_contribute = models.ForeignKey(LoadGroup, on_delete=models.SET_NULL, null=True, blank=True, + verbose_name=_('contribute to load group')) + class Meta: verbose_name = _('Space') verbose_name_plural = _('Spaces') diff --git a/src/c3nav/mapdata/models/geometry/space.py b/src/c3nav/mapdata/models/geometry/space.py index a59c0b81..70182744 100644 --- a/src/c3nav/mapdata/models/geometry/space.py +++ b/src/c3nav/mapdata/models/geometry/space.py @@ -18,7 +18,7 @@ from c3nav.mapdata.models import Space, Level from c3nav.mapdata.models.access import AccessRestrictionMixin from c3nav.mapdata.models.base import SerializableMixin, TitledMixin from c3nav.mapdata.models.geometry.base import GeometryMixin -from c3nav.mapdata.models.locations import SpecificLocation +from c3nav.mapdata.models.locations import SpecificLocation, LoadGroup from c3nav.mapdata.utils.cache.changes import changed_geometries from c3nav.mapdata.utils.geometry import unwrap_geom from c3nav.mapdata.utils.json import format_geojson @@ -138,6 +138,9 @@ class Area(SpaceGeometryMixin, SpecificLocation, models.Model): main_point = GeometryField('point', null=True, blank=True, help_text=_('main routing point (optional)')) + load_group_contribute = models.ForeignKey(LoadGroup, on_delete=models.SET_NULL, null=True, blank=True, + verbose_name=_('contribute to load group')) + class Meta: verbose_name = _('Area') verbose_name_plural = _('Areas') diff --git a/src/c3nav/mapdata/models/locations.py b/src/c3nav/mapdata/models/locations.py index 25a3795a..465e5f25 100644 --- a/src/c3nav/mapdata/models/locations.py +++ b/src/c3nav/mapdata/models/locations.py @@ -170,6 +170,7 @@ class Location(LocationSlug, AccessRestrictionMixin, TitledMixin, models.Model): return None + class SpecificLocation(Location, models.Model): groups = models.ManyToManyField('mapdata.LocationGroup', verbose_name=_('Location Groups'), blank=True) label_settings = models.ForeignKey('mapdata.LabelSettings', null=True, blank=True, on_delete=models.PROTECT, @@ -178,6 +179,9 @@ class SpecificLocation(Location, models.Model): import_block_data = models.BooleanField(_('don\'t change metadata on import'), default=False) import_block_geom = models.BooleanField(_('don\'t change geometry on import'), default=False) + load_group_display = models.ForeignKey("LoadGroup", on_delete=models.SET_NULL, null=True, blank=True, + related_name='+', verbose_name=_('display load group')) + class Meta: abstract = True @@ -357,6 +361,9 @@ class LocationGroup(Location, models.Model): external_url_label = I18nField(_('external URL label'), plural_name='external_url_labels', blank=True, fallback_any=True, fallback_value="") + load_group_contribute = models.ForeignKey("LoadGroup", on_delete=models.SET_NULL, null=True, blank=True, + verbose_name=_('contribute to load group')) + objects = LocationGroupManager() class Meta: @@ -474,6 +481,19 @@ class LabelSettings(SerializableMixin, models.Model): ordering = ('min_zoom', '-font_size') +class LoadGroup(SerializableMixin, models.Model): + name = models.CharField(_('Name'), unique=True, max_length=50) # a slugfield would forbid periods + + @property + def title(self): + return self.name + + class Meta: + verbose_name = _('Load group') + verbose_name_plural = _('Load groups') + default_related_name = 'labelgroup' + + class CustomLocationProxyMixin: request = None diff --git a/src/c3nav/mapdata/schemas/model_base.py b/src/c3nav/mapdata/schemas/model_base.py index 4039cb44..810e7b19 100644 --- a/src/c3nav/mapdata/schemas/model_base.py +++ b/src/c3nav/mapdata/schemas/model_base.py @@ -236,6 +236,10 @@ class SpecificLocationSchema(LocationSchema): title="label override (preferred language)", description="text to use for the label. by default (null), the title would be used." ) + load_group_display: Optional[PositiveInt] = APIField( + default=None, + title="load group to display", + ) class WithGeometrySchema(BaseSchema):