2016-09-20 11:52:55 +02:00
|
|
|
from collections import OrderedDict, namedtuple
|
|
|
|
|
2016-08-29 18:49:24 +02:00
|
|
|
from django.db import models
|
|
|
|
from django.utils.translation import ugettext_lazy as _
|
2016-09-23 17:02:17 +02:00
|
|
|
from django.utils.translation import get_language
|
2016-08-29 18:49:24 +02:00
|
|
|
|
2016-09-23 13:05:15 +02:00
|
|
|
from c3nav.mapdata.models.level import Level
|
|
|
|
from c3nav.mapdata.models.package import Package
|
2016-09-23 17:02:17 +02:00
|
|
|
|
2016-09-20 15:57:37 +02:00
|
|
|
from ..fields import GeometryField
|
|
|
|
|
2016-08-29 18:49:24 +02:00
|
|
|
|
2016-09-20 11:52:55 +02:00
|
|
|
class FeatureType(namedtuple('FeatureType', ('name', 'title', 'title_plural', 'geomtype', 'color'))):
|
2016-09-23 13:05:15 +02:00
|
|
|
def __init__(self, *args, **kwargs):
|
2016-09-20 11:52:55 +02:00
|
|
|
FEATURE_TYPES[self.name] = self
|
|
|
|
|
2016-09-23 17:02:17 +02:00
|
|
|
|
2016-09-20 11:52:55 +02:00
|
|
|
FEATURE_TYPES = OrderedDict()
|
|
|
|
FeatureType('building', _('Building'), _('Buildings'), 'polygon', '#333333')
|
|
|
|
FeatureType('room', _('Room'), _('Rooms'), 'polygon', '#CCCCCC')
|
|
|
|
FeatureType('outside', _('Outside Area'), _('Outside Areas'), 'polygon', '#EEEEEE')
|
|
|
|
FeatureType('obstacle', _('Obstacle'), _('Obstacles'), 'polygon', '#999999')
|
2016-09-23 17:02:17 +02:00
|
|
|
|
|
|
|
|
2016-09-20 11:52:55 +02:00
|
|
|
# FeatureType('door', _('Door'), 'polygon', '#FF00FF')
|
|
|
|
# FeatureType('step', _('Step'), 'polyline', '#FF0000')
|
|
|
|
# FeatureType('elevator', _('Elevator'), 'polygon', '#99CC00')
|
|
|
|
|
|
|
|
|
2016-08-30 17:55:20 +02:00
|
|
|
class Feature(models.Model):
|
2016-08-29 18:49:24 +02:00
|
|
|
"""
|
|
|
|
A map feature
|
|
|
|
"""
|
2016-09-20 11:52:55 +02:00
|
|
|
TYPES = tuple((name, t.title) for name, t in FEATURE_TYPES.items())
|
2016-08-29 18:49:24 +02:00
|
|
|
|
2016-09-11 19:17:42 +02:00
|
|
|
name = models.SlugField(_('feature identifier'), primary_key=True, max_length=50, help_text=_('e.g. noc'))
|
2016-09-23 13:05:15 +02:00
|
|
|
package = models.ForeignKey(Package, on_delete=models.CASCADE, related_name='features',
|
2016-08-29 18:49:24 +02:00
|
|
|
verbose_name=_('map package'))
|
2016-09-20 15:57:37 +02:00
|
|
|
feature_type = models.CharField(max_length=50, choices=TYPES)
|
2016-09-23 13:05:15 +02:00
|
|
|
level = models.ForeignKey(Level, on_delete=models.CASCADE, related_name='features',
|
|
|
|
verbose_name=_('level'))
|
2016-09-20 15:57:37 +02:00
|
|
|
geometry = GeometryField()
|
2016-08-29 18:49:24 +02:00
|
|
|
|
2016-09-23 17:02:17 +02:00
|
|
|
@property
|
|
|
|
def titles(self):
|
|
|
|
return {title.language: title.title for title in self.featuretitles.all()}
|
|
|
|
|
|
|
|
@property
|
|
|
|
def title(self):
|
|
|
|
titles = self.titles
|
|
|
|
lang = get_language()
|
|
|
|
if lang in titles:
|
|
|
|
return titles[lang]
|
|
|
|
return next(iter(titles.values())) if titles else self.name
|
|
|
|
|
2016-08-30 17:55:20 +02:00
|
|
|
|
|
|
|
class FeatureTitle(models.Model):
|
2016-09-23 17:02:17 +02:00
|
|
|
feature = models.ForeignKey('Feature', on_delete=models.CASCADE, related_name='featuretitles',
|
2016-08-30 17:55:20 +02:00
|
|
|
verbose_name=_('map package'))
|
|
|
|
language = models.CharField(max_length=50)
|
|
|
|
title = models.CharField(max_length=50)
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
unique_together = ('feature', 'language')
|