created TitledMixin
This commit is contained in:
parent
ebdb49981f
commit
358f900cdc
2 changed files with 43 additions and 15 deletions
|
@ -2,6 +2,9 @@ from collections import OrderedDict
|
||||||
|
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
from django.utils.translation import get_language
|
||||||
|
|
||||||
|
from c3nav.mapdata.fields import JSONField
|
||||||
|
|
||||||
|
|
||||||
class SerializableMixin(models.Model):
|
class SerializableMixin(models.Model):
|
||||||
|
@ -32,6 +35,39 @@ class SerializableMixin(models.Model):
|
||||||
return self._meta.verbose_name + ' ' + str(self.id)
|
return self._meta.verbose_name + ' ' + str(self.id)
|
||||||
|
|
||||||
|
|
||||||
|
class TitledMixin(SerializableMixin, models.Model):
|
||||||
|
titles = JSONField(default={})
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
abstract = True
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
super().__init__(*args, **kwargs)
|
||||||
|
self.titles = self.titles.copy()
|
||||||
|
|
||||||
|
def serialize(self, detailed=True, **kwargs):
|
||||||
|
result = super().serialize(detailed=detailed, **kwargs)
|
||||||
|
if not detailed:
|
||||||
|
result.pop('title', None)
|
||||||
|
return result
|
||||||
|
|
||||||
|
def _serialize(self, **kwargs):
|
||||||
|
result = super()._serialize(**kwargs)
|
||||||
|
result['titles'] = self.titles
|
||||||
|
result['title'] = self.title
|
||||||
|
return result
|
||||||
|
|
||||||
|
@property
|
||||||
|
def title(self):
|
||||||
|
lang = get_language()
|
||||||
|
if self.titles:
|
||||||
|
if lang in self.titles:
|
||||||
|
return self.titles[lang]
|
||||||
|
return next(iter(self.titles.values()))
|
||||||
|
return self._meta.verbose_name + ' ' + str(self.pk)
|
||||||
|
return super().title
|
||||||
|
|
||||||
|
|
||||||
class BoundsMixin(SerializableMixin, models.Model):
|
class BoundsMixin(SerializableMixin, models.Model):
|
||||||
bottom = models.DecimalField(_('bottom coordinate'), max_digits=6, decimal_places=2)
|
bottom = models.DecimalField(_('bottom coordinate'), max_digits=6, decimal_places=2)
|
||||||
left = models.DecimalField(_('left coordinate'), max_digits=6, decimal_places=2)
|
left = models.DecimalField(_('left coordinate'), max_digits=6, decimal_places=2)
|
||||||
|
|
|
@ -3,10 +3,8 @@ from contextlib import suppress
|
||||||
from django.apps import apps
|
from django.apps import apps
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from django.utils.translation import get_language
|
|
||||||
|
|
||||||
from c3nav.mapdata.fields import JSONField
|
from c3nav.mapdata.models.base import SerializableMixin, TitledMixin
|
||||||
from c3nav.mapdata.models.base import SerializableMixin
|
|
||||||
from c3nav.mapdata.utils.models import get_submodels
|
from c3nav.mapdata.utils.models import get_submodels
|
||||||
|
|
||||||
|
|
||||||
|
@ -52,8 +50,7 @@ class LocationSlug(SerializableMixin, models.Model):
|
||||||
default_related_name = 'locationslugs'
|
default_related_name = 'locationslugs'
|
||||||
|
|
||||||
|
|
||||||
class Location(LocationSlug, SerializableMixin, models.Model):
|
class Location(LocationSlug, TitledMixin, models.Model):
|
||||||
titles = JSONField(default={})
|
|
||||||
can_search = models.BooleanField(default=True, verbose_name=_('can be searched'))
|
can_search = models.BooleanField(default=True, verbose_name=_('can be searched'))
|
||||||
can_describe = models.BooleanField(default=True, verbose_name=_('can be used to describe a position'))
|
can_describe = models.BooleanField(default=True, verbose_name=_('can be used to describe a position'))
|
||||||
color = models.CharField(null=True, blank=True, max_length=16, verbose_name=_('background color'))
|
color = models.CharField(null=True, blank=True, max_length=16, verbose_name=_('background color'))
|
||||||
|
@ -69,14 +66,14 @@ class Location(LocationSlug, SerializableMixin, models.Model):
|
||||||
def serialize(self, detailed=True, **kwargs):
|
def serialize(self, detailed=True, **kwargs):
|
||||||
result = super().serialize(detailed=detailed, **kwargs)
|
result = super().serialize(detailed=detailed, **kwargs)
|
||||||
if not detailed:
|
if not detailed:
|
||||||
for key in set(result.keys()) - {'type', 'id', 'slug', 'title', 'target'}:
|
result.pop('type', None)
|
||||||
result.pop(key)
|
result.pop('id', None)
|
||||||
|
result.pop('slug', None)
|
||||||
|
result.pop('target', None)
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def _serialize(self, **kwargs):
|
def _serialize(self, **kwargs):
|
||||||
result = super()._serialize(**kwargs)
|
result = super()._serialize(**kwargs)
|
||||||
result['titles'] = self.titles
|
|
||||||
result['title'] = self.title
|
|
||||||
result['can_search'] = self.can_search
|
result['can_search'] = self.can_search
|
||||||
result['can_describe'] = self.can_search
|
result['can_describe'] = self.can_search
|
||||||
result['color'] = self.color
|
result['color'] = self.color
|
||||||
|
@ -116,12 +113,7 @@ class Location(LocationSlug, SerializableMixin, models.Model):
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def title(self):
|
def title(self):
|
||||||
lang = get_language()
|
if not self.titles and self.slug:
|
||||||
if self.titles:
|
|
||||||
if lang in self.titles:
|
|
||||||
return self.titles[lang]
|
|
||||||
return next(iter(self.titles.values()))
|
|
||||||
if self.slug:
|
|
||||||
return self._meta.verbose_name + ' ' + self.slug
|
return self._meta.verbose_name + ' ' + self.slug
|
||||||
return super().title
|
return super().title
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue