create initial graph models
This commit is contained in:
parent
98ee2d0310
commit
6cf085398a
3 changed files with 137 additions and 0 deletions
75
src/c3nav/mapdata/migrations/0029_auto_20170714_1519.py
Normal file
75
src/c3nav/mapdata/migrations/0029_auto_20170714_1519.py
Normal file
|
@ -0,0 +1,75 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.11.2 on 2017-07-14 13:19
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import c3nav.mapdata.fields
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('mapdata', '0028_door_access_restriction'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='GraphEdge',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('access_restriction', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='graphedges', to='mapdata.AccessRestriction', verbose_name='Access Restriction')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Graph Edge',
|
||||
'verbose_name_plural': 'Graph Edges',
|
||||
'default_related_name': 'graphedges',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='GraphNode',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('geometry', c3nav.mapdata.fields.GeometryField(default=None, geomtype='point')),
|
||||
('space_transfer', models.BooleanField(db_index=True, default=False, verbose_name='space transfer node')),
|
||||
('space', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='graphnodes', to='mapdata.Space', verbose_name='space')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Graph Node',
|
||||
'verbose_name_plural': 'Graph Nodes',
|
||||
'default_related_name': 'graphnodes',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='WayType',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('titles', c3nav.mapdata.fields.JSONField(default={})),
|
||||
('color', models.CharField(max_length=32, verbose_name='edge color')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Way Type',
|
||||
'verbose_name_plural': 'Way Types',
|
||||
'default_related_name': 'waytypes',
|
||||
},
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='graphedge',
|
||||
name='from_node',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='edges_from_here', to='mapdata.GraphNode', verbose_name='from node'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='graphedge',
|
||||
name='to_node',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='edges_to_here', to='mapdata.GraphNode', verbose_name='to node'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='graphedge',
|
||||
name='waytype',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='graphedges', to='mapdata.WayType', verbose_name='Way Type'),
|
||||
),
|
||||
migrations.AlterUniqueTogether(
|
||||
name='graphedge',
|
||||
unique_together=set([('from_node', 'to_node')]),
|
||||
),
|
||||
]
|
|
@ -5,3 +5,4 @@ from c3nav.mapdata.models.level import Level # noqa
|
|||
from c3nav.mapdata.models.locations import Location, LocationSlug, LocationGroup, LocationGroupCategory # noqa
|
||||
from c3nav.mapdata.models.source import Source # noqa
|
||||
from c3nav.mapdata.models.update import MapUpdate # noqa
|
||||
from c3nav.mapdata.models.graph import GraphNode, WayType, GraphEdge # noqa
|
||||
|
|
61
src/c3nav/mapdata/models/graph.py
Normal file
61
src/c3nav/mapdata/models/graph.py
Normal file
|
@ -0,0 +1,61 @@
|
|||
from django.db import models
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
from shapely.geometry import mapping
|
||||
|
||||
from c3nav.mapdata.fields import GeometryField
|
||||
from c3nav.mapdata.models.access import AccessRestrictionMixin
|
||||
from c3nav.mapdata.models.base import TitledMixin
|
||||
from c3nav.mapdata.models.geometry.space import SpaceGeometryMixin
|
||||
from c3nav.mapdata.utils.json import format_geojson
|
||||
|
||||
|
||||
class GraphNode(SpaceGeometryMixin, models.Model):
|
||||
"""
|
||||
A graph node
|
||||
"""
|
||||
geometry = GeometryField('point')
|
||||
space_transfer = models.BooleanField(_('space transfer node'), default=False, db_index=True)
|
||||
|
||||
class Meta:
|
||||
verbose_name = _('Graph Node')
|
||||
verbose_name_plural = _('Graph Nodes')
|
||||
default_related_name = 'graphnodes'
|
||||
|
||||
@property
|
||||
def buffered_geometry(self):
|
||||
return self.geometry.buffer(0.3)
|
||||
|
||||
def to_geojson(self, *args, **kwargs):
|
||||
result = super().to_geojson(*args, **kwargs)
|
||||
result['original_geometry'] = result['geometry']
|
||||
result['geometry'] = format_geojson(mapping(self.buffered_geometry))
|
||||
return result
|
||||
|
||||
|
||||
class WayType(TitledMixin, models.Model):
|
||||
"""
|
||||
A special way type
|
||||
"""
|
||||
color = models.CharField(max_length=32, verbose_name=_('edge color'))
|
||||
|
||||
class Meta:
|
||||
verbose_name = _('Way Type')
|
||||
verbose_name_plural = _('Way Types')
|
||||
default_related_name = 'waytypes'
|
||||
|
||||
|
||||
class GraphEdge(AccessRestrictionMixin, models.Model):
|
||||
"""
|
||||
A directed edge connecting two graph nodes
|
||||
"""
|
||||
from_node = models.ForeignKey(GraphNode, on_delete=models.PROTECT, related_name='edges_from_here',
|
||||
verbose_name=_('from node'))
|
||||
to_node = models.ForeignKey(GraphNode, on_delete=models.PROTECT, related_name='edges_to_here',
|
||||
verbose_name=_('to node'))
|
||||
waytype = models.ForeignKey(WayType, null=True, blank=True, on_delete=models.PROTECT, verbose_name=_('Way Type'))
|
||||
|
||||
class Meta:
|
||||
verbose_name = _('Graph Edge')
|
||||
verbose_name_plural = _('Graph Edges')
|
||||
default_related_name = 'graphedges'
|
||||
unique_together = (('from_node', 'to_node'), )
|
Loading…
Add table
Add a link
Reference in a new issue