from django.utils.translation import get_language from django.conf import settings from django.db import models import os class Element(models.Model): parent = models.ForeignKey( 'Element', on_delete=models.CASCADE, null=True, blank=True, limit_choices_to={'parent': None} ) link = models.CharField(max_length=512, blank=True) new_window = models.BooleanField(default=False) add_locale = models.BooleanField(default=False) icon = models.FilePathField( path='navbar/static/navbar/icons', match=".png", null=True, blank=True ) weight = models.PositiveSmallIntegerField() def icon_path(self): return os.path.join('navbar/icons', os.path.basename(self.icon)) def children(self): return sorted( list(Element.objects.filter(parent=self.id).order_by('weight')) + list( ElementSeparator.objects.filter(parent=self.id) .order_by('weight') ), key=lambda c: c.weight ) def description(self): lang = get_language() if lang is None: lang = settings.LANGUAGE_CODE return ElementDescription.objects.filter( element=self.id, language=lang ).first() def localized_link(self): link = self.link desc = self.description() if desc.link_override: link = desc.link_override return link def __str__(self): desc = self.description() return desc.short_name if desc is not None else self.link class ElementDescription(models.Model): element = models.ForeignKey(Element, on_delete=models.CASCADE) language = models.CharField(max_length=10, choices=settings.LANGUAGES) short_name = models.CharField(max_length=32) full_name = models.CharField(max_length=64, blank=True) description = models.CharField(max_length=512, blank=True) link_override = models.CharField(max_length=512, blank=True) def is_separator(self): return False class ElementSeparator(models.Model): parent = models.ForeignKey( Element, on_delete=models.CASCADE, limit_choices_to={'parent': None} ) weight = models.PositiveSmallIntegerField() def is_separator(self): return True def __str__(self): return '{} ({})'.format(self.parent, self.weight)