from django.db import models from etherpadlite.models import Pad from datetime import date, timedelta, datetime, time from adminsortable.fields import SortableForeignKey from adminsortable.models import SortableMixin from collections import namedtuple from django.utils.translation import get_language as _get_language from filer.fields.image import FilerImageField GridCoordinates = namedtuple('GridCoordinates', ['start', 'span']) def get_language(): code = _get_language() return code if code else 'en' # Create your models here. class Venue(models.Model): published = models.BooleanField(default=False) slug = models.SlugField(unique=True) name_nl = models.CharField(max_length=255) name_en = models.CharField(max_length=255, verbose_name="Name (English)") notes_nl = models.TextField(null=True, blank=True) notes_en = models.TextField(verbose_name="Notes (english)", null=True, blank=True) address = models.TextField(null=True, blank=True) latitude = models.CharField(max_length=255, null=True, blank=True) longitude = models.CharField(max_length=255, null=True, blank=True) class Meta: ordering = ('name_nl',) def __str__ (self): return '{}'.format(self.name) def __getattr__ (self, attrname): if attrname in ['name', 'notes']: return getattr(self, attrname + '_' + get_language()) return super().__getattr__(attrname) class Image(models.Model): published = models.BooleanField(default=False) oldImage = models.ImageField(upload_to="images", null=True, blank=True) image = FilerImageField(null=True, blank=True, on_delete=models.CASCADE) title_nl = models.CharField(max_length=255) tagline_nl = models.CharField(max_length=255, null=True, blank=True) title_en = models.CharField(max_length=255, verbose_name="Title (English)", null=True, blank=True) tagline_en = models.CharField(max_length=255, verbose_name="Tagline (English)", null=True, blank=True) credit_nl = models.CharField(max_length=255, null=True, blank=True) credit_en = models.CharField(max_length=255, verbose_name="Credits (English)", null=True, blank=True) def __str__ (self): return '{}'.format(self.title) def __getattr__ (self, attrname): if attrname in ['title', 'tagline', 'credit']: return getattr(self, attrname + '_' + get_language()) return super(Image, self).__getattr__(attrname) # class ImageCredit(models.Model): # title = models.CharField(max_length=255, verbose_name="Credit Title") # value = models.CharField(max_length=255, verbose_name="Credit Value") # title_en = models.CharField(max_length=255, verbose_name="Credit Title (English)", null=True, blank=True) # value_en = models.CharField(max_length=255, verbose_name="Credit Value (English)", null=True, blank=True) # image = models.ForeignKey(Image, on_delete=models.CASCADE) # def __str__ (self): # return self.title class Participant(models.Model): slug = models.SlugField(unique=True, max_length=255) published = models.BooleanField(default=False) projects = models.ManyToManyField('Project', through='ProjectParticipant') name_nl = models.CharField(max_length=255) sort_name_nl = models.CharField(max_length=255, null=True, blank=True) bio_nl = models.TextField(verbose_name="Biography") name_en = models.CharField(max_length=255, verbose_name="Name (English)", null=True, blank=True) sort_name_en = models.CharField(max_length=255, verbose_name="Sortname (English)", null=True, blank=True) bio_en = models.TextField(verbose_name="Biography (English)", null=True, blank=True) class Meta: ordering = ('sort_name_nl',) def __str__ (self): return '{}'.format(self.name) def __getattr__ (self, attrname): if attrname in ['name', 'sort_name', 'bio']: return getattr(self, attrname + '_' + get_language()) return super().__getattr__(attrname) class Project(models.Model): slug = models.SlugField(unique=True, max_length=255) published = models.BooleanField(default=False) participants = models.ManyToManyField(Participant, through='ProjectParticipant') pads = models.ManyToManyField(Pad, through='ProjectPad') images = models.ManyToManyField(Image, through='ProjectImage') title_nl = models.CharField(max_length=255, verbose_name="Title (Dutch)") summary_nl = models.TextField(null=True, blank=True, verbose_name="Summary (Dutch)") description_nl = models.TextField(verbose_name="Description (Dutch)") title_en = models.CharField(max_length=255, verbose_name="Title (English)", null=True, blank=True) summary_en = models.TextField(verbose_name="Summary (English)", null=True, blank=True) description_en = models.TextField(verbose_name="Description (English)", null=True, blank=True) def __str__ (self): return '{}'.format(self.title) def __getattr__ (self, attrname): if attrname in ['title', 'summary', 'description']: return getattr(self, attrname + '_' + get_language()) return super().__getattr__(attrname) class ProjectCredit(models.Model): project = models.ForeignKey(Project, on_delete=models.CASCADE) title_nl = models.CharField(max_length=255, verbose_name="Credit Title") value_nl = models.CharField(max_length=255, verbose_name="Credit Value") title_en = models.CharField(max_length=255, verbose_name="Credit Title (English)", null=True, blank=True) value_en = models.CharField(max_length=255, verbose_name="Credit Value (English)", null=True, blank=True) def __str__ (self): return '{}: {}'.format(self.title, self.value) def __getattr__ (self, attrname): if attrname in ['title', 'value']: return getattr(self, attrname + '_' + get_language()) return super().__getattr__(attrname) class EventType(models.Model): class Meta: ordering: ['label'] label_nl = models.CharField(max_length=255) label_en = models.CharField(max_length=255, verbose_name="Label (english)", null=True, blank=True) def __str__ (self): return '{}'.format(self.label) def __getattr__ (self, attrname): if attrname in ['label']: return getattr(self, attrname + '_' + get_language()) return super().__getattr__(attrname) class Event(models.Model): class Meta: ordering: ['start'] published = models.BooleanField(default=True) continuous = models.BooleanField(default=False) project = models.ForeignKey(Project, on_delete=models.CASCADE) event_type = models.ForeignKey(EventType, on_delete=models.SET_NULL, null=True) venue = models.ForeignKey(Venue, on_delete=models.SET_NULL, null=True) notes_nl = models.TextField(null=True, blank=True) notes_en = models.TextField(verbose_name="Notes (English)", null=True, blank=True) start = models.DateTimeField() end = models.DateTimeField(null=True, blank=True) show_ticket_link = models.BooleanField(default=True, verbose_name="Tickets sale open") ticket_link = models.URLField(null=True, blank=True, verbose_name="Ticket link") sold_out = models.BooleanField(default=False, verbose_name="Event is sold out") @property def grid_coord (self): return self.__grid_coord @property def grid_coordinates(self): if not hasattr(self, '__grid_coordinates'): resolution = 30 * 60 daystart = time(9) gridstart = (self.start - datetime.combine(self.start.date(), daystart, tzinfo=self.start.tzinfo)).total_seconds() / resolution gridspan = max((self.end - self.start).total_seconds() / resolution, 1) if self.end else 1 self.__grid_coordinates = GridCoordinates(start=max(2, int(gridstart)), span=int(gridspan)) return self.__grid_coordinates def set_grid_coord (self, minimum): resolution = 30 * 60 daystart = time(9) self.__grid_coord = int(max(minimum, (self.start - datetime.combine(self.start.date(), daystart, tzinfo=self.start.tzinfo)).total_seconds() / resolution)) return self.__grid_coord def __str__ (self): # @FIXME: more elegant? return str(self.start) def __getattr__ (self, attrname): if attrname in ['notes']: return getattr(self, attrname + '_' + get_language()) return super().__getattr__(attrname) class DocumentationImage(models.Model): class Meta: ordering = ('position',) def __str__ (self): return self.image.__str__() event = models.ForeignKey(Event, on_delete=models.CASCADE, null=True, blank=True, related_name='documentation_image') image = FilerImageField(on_delete=models.CASCADE) position = models.PositiveIntegerField(default=0, db_index=True) class ProjectParticipant(models.Model): class Meta: ordering = ('position',) def __str__ (self): return self.participant.__str__() participant = models.ForeignKey(Participant, on_delete=models.CASCADE) project = SortableForeignKey(Project, on_delete=models.CASCADE) role_nl = models.CharField(max_length=255) role_en = models.CharField(max_length=255, verbose_name="Role (English)") position = models.PositiveIntegerField(default=0, editable=True, db_index=True) def __getattr__ (self, attrname): if attrname in ['role', 'title', 'content']: return getattr(self, attrname + '_' + get_language()) return super().__getattr__(attrname) # class ParticipantImage(SortableMixin): # class Meta: # ordering = ('image_order',) # participant = SortableForeignKey(Participant, on_delete=models.PROTECT) # image = models.ForeignKey(Image, on_delete=models.PROTECT) # image_order = models.PositiveIntegerField(default=0, editable=False, db_index=True) # def __str__ (self): # return self.image.title class ProjectImage(models.Model): class Meta: ordering = ('position',) project = SortableForeignKey(Project, on_delete=models.CASCADE) image = models.ForeignKey(Image, on_delete=models.CASCADE) position = models.PositiveIntegerField(default=0, editable=True, db_index=True) cover_image = models.BooleanField(default=True) def __str__ (self): return self.image.__str__() class ProjectPad(models.Model): project = models.ForeignKey(Project, on_delete=models.CASCADE) pad = models.ForeignKey(Pad, on_delete=models.CASCADE) position = models.PositiveIntegerField(default=0, editable=True, db_index=True) def __getattr__ (self, attrname): if attrname in ['label']: return getattr(self, attrname + '_' + get_language()) return super().__getattr__(attrname) def __str__ (self): return self.pad.__str__() class Page(models.Model): class Meta: ordering = ['position'] position = models.PositiveIntegerField(default=0, editable=True, db_index=True) slug_nl = models.SlugField(unique=True, max_length=255, verbose_name="Slug (Dutch)") slug_en = models.SlugField(unique=True, max_length=255, verbose_name="Slug (English)") published = models.BooleanField(default=False) title_nl = models.CharField(max_length=255, verbose_name="Title (Dutch)") summary_nl = models.TextField(null=True, blank=True, verbose_name="Summary (Dutch) shown on parent page") content_nl = models.TextField(verbose_name="Content (Dutch)") title_en = models.CharField(max_length=255, verbose_name="Title (English)", null=True, blank=True) summary_en = models.TextField(null=True, blank=True, verbose_name="Summary (English) shown on parent page") content_en = models.TextField(verbose_name="Content (English)", null=True, blank=True) parent = models.ForeignKey('Page', on_delete=models.SET_NULL, related_name='subpage', null=True, blank=True) def __str__ (self): return '{}'.format(self.title) def __getattr__ (self, attrname): if attrname in ['slug', 'title', 'summary', 'content']: return getattr(self, attrname + '_' + get_language()) return super().__getattr__(attrname) class PageImage(models.Model): class Meta: ordering = ('position',) def __str__ (self): return self.image.__str__() page = models.ForeignKey(Page, on_delete=models.CASCADE, null=True, blank=True, related_name='image') image = FilerImageField(on_delete=models.CASCADE) position = models.PositiveIntegerField(default=0, db_index=True) class Loop(models.Model): class Meta: ordering = ['start'] name_nl = models.CharField(max_length=255) name_en = models.CharField(max_length=255) timeline_label_nl = models.CharField(max_length=255) timeline_label_en = models.CharField(max_length=255) start = models.DateField() end = models.DateField() published = models.BooleanField(default=False) description_nl = models.TextField(verbose_name="Description (Dutch)", null=True, blank=True) description_en = models.TextField(verbose_name="Description (English)", null=True, blank=True) page = models.ForeignKey(Page, on_delete=models.SET_NULL, related_name='loop', null=True, blank=True) def __str__ (self): return '{}'.format(self.name) def __getattr__ (self, attrname): if attrname in ['name', 'description', 'timeline_label']: return getattr(self, attrname + '_' + get_language()) return super().__getattr__(attrname) class MenuItem(SortableMixin): class Meta: ordering = ['item_order'] def __str__ (self): return '{}'.format(self.label) label_nl = models.CharField(max_length=255, verbose_name="Menu Label") label_en = models.CharField(max_length=255, verbose_name="Menu Label (English)") url_nl = models.CharField(max_length=255, verbose_name="URL") url_en = models.CharField(max_length=255, verbose_name="URL (English)") item_order = models.PositiveIntegerField(default=0, editable=False, db_index=True) def __getattr__ (self, attrname): if attrname in ['label', 'url']: return getattr(self, attrname + '_' + get_language()) return super().__getattr__(attrname)