models.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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 __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. source_file = models.FileField(
  36. upload_to=upload_source_css_to, max_length=255, null=True, blank=True
  37. )
  38. source_hash = models.CharField(max_length=8, null=True, blank=True)
  39. source_needs_building = models.BooleanField(default=False)
  40. build_file = models.FileField(
  41. upload_to=upload_build_css_to, max_length=255, null=True, blank=True
  42. )
  43. build_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. if self.source_file:
  51. self.source_file.delete(save=False)
  52. if self.build_file:
  53. self.build_file.delete(save=False)
  54. super().delete(*args, **kwargs)
  55. def __str__(self):
  56. return self.name
  57. class Media(models.Model):
  58. theme = models.ForeignKey(Theme, on_delete=models.PROTECT, related_name="media")
  59. name = models.CharField(max_length=255)
  60. file = models.ImageField(upload_to=upload_media_to, max_length=255)
  61. hash = models.CharField(max_length=8)
  62. type = models.CharField(max_length=255)
  63. width = models.PositiveIntegerField(default=0)
  64. height = models.PositiveIntegerField(default=0)
  65. size = models.PositiveIntegerField()
  66. thumbnail = models.ImageField(
  67. upload_to=upload_media_thumbnail_to, max_length=255, null=True, blank=True
  68. )
  69. modified_on = models.DateTimeField(auto_now=True)
  70. class Meta:
  71. ordering = ["name"]
  72. def delete(self, *args, **kwargs):
  73. self.file.delete(save=False)
  74. if self.thumbnail:
  75. self.thumbnail.delete(save=False)
  76. super().delete(*args, **kwargs)
  77. def __str__(self):
  78. return self.name