introduce load group as a concept

This commit is contained in:
Laura Klünder 2024-12-25 16:49:08 +01:00
parent e5c6fde55e
commit 218cae8d5f
5 changed files with 104 additions and 2 deletions

View file

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

View file

@ -28,7 +28,7 @@ from c3nav.mapdata.grid import grid
from c3nav.mapdata.models import Level from c3nav.mapdata.models import Level
from c3nav.mapdata.models.access import AccessRestrictionMixin from c3nav.mapdata.models.access import AccessRestrictionMixin
from c3nav.mapdata.models.geometry.base import GeometryMixin 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.cache.changes import changed_geometries
from c3nav.mapdata.utils.geometry import (assert_multilinestring, assert_multipolygon, clean_cut_polygon, from c3nav.mapdata.utils.geometry import (assert_multilinestring, assert_multipolygon, clean_cut_polygon,
cut_polygon_with_line, unwrap_geom) cut_polygon_with_line, unwrap_geom)
@ -124,6 +124,9 @@ class Space(LevelGeometryMixin, SpecificLocation, models.Model):
base_mapdata_accessible = models.BooleanField(default=False, base_mapdata_accessible = models.BooleanField(default=False,
verbose_name=_('always accessible (overwrites base mapdata setting)')) 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: class Meta:
verbose_name = _('Space') verbose_name = _('Space')
verbose_name_plural = _('Spaces') verbose_name_plural = _('Spaces')

View file

@ -18,7 +18,7 @@ from c3nav.mapdata.models import Space, Level
from c3nav.mapdata.models.access import AccessRestrictionMixin from c3nav.mapdata.models.access import AccessRestrictionMixin
from c3nav.mapdata.models.base import SerializableMixin, TitledMixin from c3nav.mapdata.models.base import SerializableMixin, TitledMixin
from c3nav.mapdata.models.geometry.base import GeometryMixin 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.cache.changes import changed_geometries
from c3nav.mapdata.utils.geometry import unwrap_geom from c3nav.mapdata.utils.geometry import unwrap_geom
from c3nav.mapdata.utils.json import format_geojson 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, main_point = GeometryField('point', null=True, blank=True,
help_text=_('main routing point (optional)')) 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: class Meta:
verbose_name = _('Area') verbose_name = _('Area')
verbose_name_plural = _('Areas') verbose_name_plural = _('Areas')

View file

@ -170,6 +170,7 @@ class Location(LocationSlug, AccessRestrictionMixin, TitledMixin, models.Model):
return None return None
class SpecificLocation(Location, models.Model): class SpecificLocation(Location, models.Model):
groups = models.ManyToManyField('mapdata.LocationGroup', verbose_name=_('Location Groups'), blank=True) 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, 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_data = models.BooleanField(_('don\'t change metadata on import'), default=False)
import_block_geom = models.BooleanField(_('don\'t change geometry 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: class Meta:
abstract = True 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, external_url_label = I18nField(_('external URL label'), plural_name='external_url_labels', blank=True,
fallback_any=True, fallback_value="") 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() objects = LocationGroupManager()
class Meta: class Meta:
@ -474,6 +481,19 @@ class LabelSettings(SerializableMixin, models.Model):
ordering = ('min_zoom', '-font_size') 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: class CustomLocationProxyMixin:
request = None request = None

View file

@ -236,6 +236,10 @@ class SpecificLocationSchema(LocationSchema):
title="label override (preferred language)", title="label override (preferred language)",
description="text to use for the label. by default (null), the title would be used." 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): class WithGeometrySchema(BaseSchema):