models.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. from django.db import models
  2. from django.utils.translation import gettext
  3. from mptt.models import MPTTModel, TreeForeignKey
  4. from .utils import (
  5. generate_theme_dirname,
  6. upload_css_to,
  7. upload_font_to,
  8. upload_image_to,
  9. upload_image_thumbnail_to,
  10. )
  11. class Theme(MPTTModel):
  12. parent = TreeForeignKey(
  13. "self", on_delete=models.PROTECT, null=True, blank=True, related_name="children"
  14. )
  15. name = models.CharField(max_length=255)
  16. dirname = models.CharField(max_length=8, default=generate_theme_dirname)
  17. is_default = models.BooleanField(default=False)
  18. is_active = models.BooleanField(default=False)
  19. version = models.CharField(max_length=255, null=True, blank=True)
  20. author = models.CharField(max_length=255, null=True, blank=True)
  21. url = models.URLField(max_length=255, null=True, blank=True)
  22. class MPTTMeta:
  23. order_insertion_by = ["-is_default", "name"]
  24. def __str__(self):
  25. if self.is_default:
  26. return gettext("Default Misago Theme")
  27. return self.name
  28. @property
  29. def level_range(self):
  30. return range(self.level)
  31. class Css(models.Model):
  32. theme = models.ForeignKey(Theme, on_delete=models.PROTECT, related_name="css")
  33. name = models.CharField(max_length=255)
  34. url = models.URLField(max_length=255, null=True, blank=True)
  35. file = models.FileField(
  36. upload_to=upload_css_to, max_length=255, null=True, blank=True
  37. )
  38. hash = models.CharField(max_length=12)
  39. size = models.PositiveIntegerField()
  40. order = models.IntegerField(default=0)
  41. is_enabled = models.BooleanField(default=True)
  42. modified_on = models.DateTimeField(auto_now=True)
  43. class Meta:
  44. ordering = ["order"]
  45. def delete(self, *args, **kwargs):
  46. self.file.delete(save=False)
  47. super().delete(*args, **kwargs)
  48. def __str__(self):
  49. return self.name
  50. class Font(models.Model):
  51. theme = models.ForeignKey(Theme, on_delete=models.PROTECT, related_name="fonts")
  52. name = models.CharField(max_length=255)
  53. file = models.FileField(upload_to=upload_font_to, max_length=255)
  54. hash = models.CharField(max_length=12)
  55. type = models.CharField(max_length=255)
  56. size = models.PositiveIntegerField()
  57. modified_on = models.DateTimeField(auto_now=True)
  58. class Meta:
  59. ordering = ["name"]
  60. def delete(self, *args, **kwargs):
  61. self.file.delete(save=False)
  62. super().delete(*args, **kwargs)
  63. def __str__(self):
  64. return self.name
  65. class Image(models.Model):
  66. theme = models.ForeignKey(Theme, on_delete=models.PROTECT, related_name="images")
  67. name = models.CharField(max_length=255)
  68. file = models.ImageField(upload_to=upload_image_to, max_length=255, width_field="width", height_field="height")
  69. hash = models.CharField(max_length=12)
  70. type = models.CharField(max_length=255)
  71. width = models.PositiveIntegerField()
  72. height = models.PositiveIntegerField()
  73. size = models.PositiveIntegerField()
  74. thumbnail = models.ImageField(upload_to=upload_image_thumbnail_to, max_length=255)
  75. modified_on = models.DateTimeField(auto_now=True)
  76. class Meta:
  77. ordering = ["name"]
  78. def delete(self, *args, **kwargs):
  79. self.file.delete(save=False)
  80. self.thumbnail.delete(save=False)
  81. super().delete(*args, **kwargs)
  82. def __str__(self):
  83. return self.name