models.py 3.7 KB

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