models.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. from pathlib import Path
  2. from django.contrib.postgres.fields import JSONField
  3. from django.db import models
  4. from ..core.utils import get_file_hash
  5. from .hydrators import dehydrate_value, hydrate_value
  6. class SettingsManager(models.Manager):
  7. def change_setting(self, setting, dry_value=None, wet_value=None):
  8. if dry_value:
  9. return self.filter(setting=setting).update(dry_value=dry_value)
  10. if wet_value:
  11. try:
  12. setting = self.get(setting=setting)
  13. setting.value = wet_value
  14. setting.save(update_fields=["dry_value"])
  15. except Setting.DoesNotExist:
  16. return 0
  17. class Setting(models.Model):
  18. setting = models.CharField(max_length=255, unique=True)
  19. python_type = models.CharField(max_length=255, default="string")
  20. dry_value = models.TextField(null=True, blank=True)
  21. image = models.ImageField(
  22. upload_to="conf",
  23. height_field="image_height",
  24. width_field="image_width",
  25. null=True,
  26. blank=True,
  27. )
  28. image_size = models.PositiveIntegerField(null=True, blank=True)
  29. image_width = models.PositiveIntegerField(null=True, blank=True)
  30. image_height = models.PositiveIntegerField(null=True, blank=True)
  31. is_public = models.BooleanField(default=False)
  32. is_lazy = models.BooleanField(default=False)
  33. objects = SettingsManager()
  34. @property
  35. def image_dimensions(self):
  36. if self.image_width and self.image_height:
  37. return self.image_width, self.image_height
  38. return None
  39. @property
  40. def value(self):
  41. if self.python_type == "image":
  42. return self.image
  43. return hydrate_value(self.python_type, self.dry_value)
  44. @value.setter
  45. def value(self, new_value):
  46. if new_value is not None:
  47. if self.python_type == "image":
  48. rename_image_file(new_value, self.setting)
  49. self.image = new_value
  50. self.image_size = new_value.size
  51. else:
  52. self.dry_value = dehydrate_value(self.python_type, new_value)
  53. else:
  54. self.dry_value = None
  55. return new_value
  56. def rename_image_file(file_obj, prefix):
  57. name_parts = [
  58. prefix.replace("_", "-"),
  59. get_file_hash(file_obj),
  60. Path(file_obj.name).suffix.strip(".").lower(),
  61. ]
  62. file_obj.name = ".".join(name_parts)