models.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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_build_css_to,
  7. upload_source_css_to,
  8. upload_media_to,
  9. upload_media_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 delete(self, *args, **kwargs):
  25. for css in self.css.all():
  26. css.delete()
  27. for media in self.media.all():
  28. media.delete()
  29. super().delete(*args, **kwargs)
  30. def __str__(self):
  31. if self.is_default:
  32. return gettext("Default Misago Theme")
  33. return self.name
  34. @property
  35. def level_range(self):
  36. return range(self.level)
  37. class Css(models.Model):
  38. theme = models.ForeignKey(Theme, on_delete=models.PROTECT, related_name="css")
  39. name = models.CharField(max_length=255)
  40. url = models.URLField(max_length=255, null=True, blank=True)
  41. source_file = models.FileField(
  42. upload_to=upload_source_css_to, max_length=255, null=True, blank=True
  43. )
  44. source_hash = models.CharField(max_length=8, null=True, blank=True)
  45. source_needs_building = models.BooleanField(default=False)
  46. build_file = models.FileField(
  47. upload_to=upload_build_css_to, max_length=255, null=True, blank=True
  48. )
  49. build_hash = models.CharField(max_length=8, null=True, blank=True)
  50. size = models.PositiveIntegerField(default=0)
  51. order = models.IntegerField(default=0)
  52. modified_on = models.DateTimeField(auto_now=True)
  53. class Meta:
  54. ordering = ["order"]
  55. def delete(self, *args, **kwargs):
  56. if self.source_file:
  57. self.source_file.delete(save=False)
  58. if self.build_file:
  59. self.build_file.delete(save=False)
  60. super().delete(*args, **kwargs)
  61. def __str__(self):
  62. return self.name
  63. class Media(models.Model):
  64. theme = models.ForeignKey(Theme, on_delete=models.PROTECT, related_name="media")
  65. name = models.CharField(max_length=255)
  66. file = models.ImageField(upload_to=upload_media_to, max_length=255)
  67. hash = models.CharField(max_length=8)
  68. type = models.CharField(max_length=255)
  69. width = models.PositiveIntegerField(default=0)
  70. height = models.PositiveIntegerField(default=0)
  71. size = models.PositiveIntegerField()
  72. thumbnail = models.ImageField(
  73. upload_to=upload_media_thumbnail_to, max_length=255, null=True, blank=True
  74. )
  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. if self.thumbnail:
  81. self.thumbnail.delete(save=False)
  82. super().delete(*args, **kwargs)
  83. def __str__(self):
  84. return self.name