models.py 2.3 KB

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