introduce load group as a concept
This commit is contained in:
parent
e5c6fde55e
commit
218cae8d5f
5 changed files with 104 additions and 2 deletions
72
src/c3nav/mapdata/migrations/0126_loadgroup.py
Normal file
72
src/c3nav/mapdata/migrations/0126_loadgroup.py
Normal 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'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -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')
|
||||||
|
|
|
@ -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')
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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):
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue