from django.db import models from django.utils.translation import gettext from mptt.models import MPTTModel, TreeForeignKey from .uploadto import ( generate_theme_dirname, upload_css_source_to, upload_css_to, upload_font_to, upload_image_to, upload_image_thumbnail_to, ) class Theme(MPTTModel): parent = TreeForeignKey( "self", on_delete=models.PROTECT, null=True, blank=True, related_name="children" ) name = models.CharField(max_length=255) dirname = models.CharField(max_length=8, default=generate_theme_dirname) is_default = models.BooleanField(default=False) is_active = models.BooleanField(default=False) version = models.CharField(max_length=255, null=True, blank=True) author = models.CharField(max_length=255, null=True, blank=True) url = models.URLField(max_length=255, null=True, blank=True) class MPTTMeta: order_insertion_by = ["-is_default", "name"] def __str__(self): if self.is_default: return gettext("Default Misago Theme") return self.name @property def level_range(self): return range(self.level) class Css(models.Model): theme = models.ForeignKey(Theme, on_delete=models.PROTECT, related_name="css") name = models.CharField(max_length=255) url = models.URLField(max_length=255, null=True, blank=True) source_file = models.FileField( upload_to=upload_css_source_to, max_length=255, null=True, blank=True ) source_hash = models.CharField(max_length=8, null=True, blank=True) file = models.FileField( upload_to=upload_css_to, max_length=255, null=True, blank=True ) hash = models.CharField(max_length=8, null=True, blank=True) size = models.PositiveIntegerField(default=0) order = models.IntegerField(default=0) modified_on = models.DateTimeField(auto_now=True) class Meta: ordering = ["order"] def delete(self, *args, **kwargs): self.file.delete(save=False) super().delete(*args, **kwargs) def __str__(self): return self.name class Font(models.Model): theme = models.ForeignKey(Theme, on_delete=models.PROTECT, related_name="fonts") name = models.CharField(max_length=255) file = models.FileField(upload_to=upload_font_to, max_length=255) hash = models.CharField(max_length=12) type = models.CharField(max_length=255) size = models.PositiveIntegerField() modified_on = models.DateTimeField(auto_now=True) class Meta: ordering = ["name"] def delete(self, *args, **kwargs): self.file.delete(save=False) super().delete(*args, **kwargs) def __str__(self): return self.name class Image(models.Model): theme = models.ForeignKey(Theme, on_delete=models.PROTECT, related_name="images") name = models.CharField(max_length=255) file = models.ImageField(upload_to=upload_image_to, max_length=255, width_field="width", height_field="height") hash = models.CharField(max_length=8) type = models.CharField(max_length=255) width = models.PositiveIntegerField() height = models.PositiveIntegerField() size = models.PositiveIntegerField() thumbnail = models.ImageField(upload_to=upload_image_thumbnail_to, max_length=255) modified_on = models.DateTimeField(auto_now=True) class Meta: ordering = ["name"] def delete(self, *args, **kwargs): self.file.delete(save=False) self.thumbnail.delete(save=False) super().delete(*args, **kwargs) def __str__(self): return self.name