team-3/src/c3nav/mapdata/models/base.py

69 lines
2.2 KiB
Python
Raw Normal View History

from collections import OrderedDict
2017-05-07 12:06:13 +02:00
2017-05-09 13:32:32 +02:00
from django.db import models
2017-05-26 21:25:54 +02:00
from django.utils.translation import ugettext_lazy as _
2017-05-09 09:36:08 +02:00
EDITOR_FORM_MODELS = OrderedDict()
2016-11-27 23:51:44 +01:00
class SerializableMixin(models.Model):
class Meta:
abstract = True
2017-05-11 19:36:49 +02:00
def serialize(self, **kwargs):
return self._serialize(**kwargs)
2017-05-11 21:30:29 +02:00
@classmethod
def serialize_type(cls, **kwargs):
return OrderedDict((
('name', cls.__name__.lower()),
('name_plural', cls._meta.default_related_name),
('title', str(cls._meta.verbose_name)),
('title_plural', str(cls._meta.verbose_name_plural)),
))
2017-05-11 19:36:49 +02:00
def _serialize(self, include_type=False, **kwargs):
result = OrderedDict()
if include_type:
result['type'] = self.__class__.__name__.lower()
result['id'] = self.id
return result
class EditorFormMixin(SerializableMixin, models.Model):
EditorForm = None
class Meta:
abstract = True
@property
def title(self):
return self._meta.verbose_name+' '+str(self.id)
2017-05-26 21:25:54 +02:00
class BoundsMixin(SerializableMixin, models.Model):
bottom = models.DecimalField(_('bottom coordinate'), max_digits=6, decimal_places=2)
left = models.DecimalField(_('left coordinate'), max_digits=6, decimal_places=2)
top = models.DecimalField(_('top coordinate'), max_digits=6, decimal_places=2)
right = models.DecimalField(_('right coordinate'), max_digits=6, decimal_places=2)
class Meta:
abstract = True
@classmethod
def max_bounds(cls):
result = cls.objects.all().aggregate(models.Min('bottom'), models.Min('left'),
models.Max('top'), models.Max('right'))
return ((float(result['bottom__min']), float(result['left__min'])),
(float(result['top__max']), float(result['right__max'])))
def _serialize(self, section=True, **kwargs):
result = super()._serialize(**kwargs)
result['bounds'] = self.bounds
return result
@property
def bounds(self):
# noinspection PyTypeChecker
return (float(self.bottom), float(self.left)), (float(self.top), float(self.right))