create initial graph models

This commit is contained in:
Laura Klünder 2017-07-14 15:20:22 +02:00
parent 98ee2d0310
commit 6cf085398a
3 changed files with 137 additions and 0 deletions

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

View file

@ -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

View 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'), )