models.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  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. file = models.FileField(
  41. upload_to=upload_css_to, max_length=255, null=True, blank=True
  42. )
  43. hash = models.CharField(max_length=8, null=True, blank=True)
  44. size = models.PositiveIntegerField(default=0)
  45. order = models.IntegerField(default=0)
  46. modified_on = models.DateTimeField(auto_now=True)
  47. class Meta:
  48. ordering = ["order"]
  49. def delete(self, *args, **kwargs):
  50. self.file.delete(save=False)
  51. super().delete(*args, **kwargs)
  52. def __str__(self):
  53. return self.name
  54. class Font(models.Model):
  55. theme = models.ForeignKey(Theme, on_delete=models.PROTECT, related_name="fonts")
  56. name = models.CharField(max_length=255)
  57. file = models.FileField(upload_to=upload_font_to, max_length=255)
  58. hash = models.CharField(max_length=12)
  59. type = models.CharField(max_length=255)
  60. size = models.PositiveIntegerField()
  61. modified_on = models.DateTimeField(auto_now=True)
  62. class Meta:
  63. ordering = ["name"]
  64. def delete(self, *args, **kwargs):
  65. self.file.delete(save=False)
  66. super().delete(*args, **kwargs)
  67. def __str__(self):
  68. return self.name
  69. class Image(models.Model):
  70. theme = models.ForeignKey(Theme, on_delete=models.PROTECT, related_name="images")
  71. name = models.CharField(max_length=255)
  72. file = models.ImageField(upload_to=upload_image_to, max_length=255, width_field="width", height_field="height")
  73. hash = models.CharField(max_length=8)
  74. type = models.CharField(max_length=255)
  75. width = models.PositiveIntegerField()
  76. height = models.PositiveIntegerField()
  77. size = models.PositiveIntegerField()
  78. thumbnail = models.ImageField(upload_to=upload_image_thumbnail_to, max_length=255)
  79. modified_on = models.DateTimeField(auto_now=True)
  80. class Meta:
  81. ordering = ["name"]
  82. def delete(self, *args, **kwargs):
  83. self.file.delete(save=False)
  84. self.thumbnail.delete(save=False)
  85. super().delete(*args, **kwargs)
  86. def __str__(self):
  87. return self.name