models.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. from django.contrib.postgres.fields import JSONField
  2. from django.db import models
  3. from . import hydrators
  4. class SettingsGroupsManager(models.Manager):
  5. def ordered_alphabetically(self):
  6. from django.utils.translation import ugettext as _
  7. groups_dict = {}
  8. for group in self.all():
  9. groups_dict[_(group.name)] = group
  10. ordered_groups = []
  11. for key in groups_dict.keys():
  12. ordered_groups.append(groups_dict[key])
  13. return ordered_groups
  14. class SettingsGroup(models.Model):
  15. key = models.CharField(max_length=255, unique=True)
  16. name = models.CharField(max_length=255)
  17. description = models.TextField(null=True, blank=True)
  18. objects = SettingsGroupsManager()
  19. class SettingsManager(models.Manager):
  20. def change_setting(self, setting, dry_value=None, wet_value=None):
  21. if dry_value:
  22. return self.filter(setting=setting).update(dry_value=dry_value)
  23. elif wet_value:
  24. try:
  25. setting = self.get(setting=setting)
  26. setting.value = wet_value
  27. setting.save(update_fields=['dry_value'])
  28. except Setting.DoesNotExist:
  29. return 0
  30. class Setting(models.Model):
  31. group = models.ForeignKey(SettingsGroup)
  32. setting = models.CharField(max_length=255, unique=True)
  33. name = models.CharField(max_length=255)
  34. description = models.TextField(null=True, blank=True)
  35. legend = models.CharField(max_length=255, null=True, blank=True)
  36. order = models.IntegerField(default=0, db_index=True)
  37. dry_value = models.TextField(null=True, blank=True)
  38. default_value = models.TextField(null=True, blank=True)
  39. python_type = models.CharField(max_length=255, default='string')
  40. is_public = models.BooleanField(default=False)
  41. is_lazy = models.BooleanField(default=False)
  42. form_field = models.CharField(max_length=255, default='text')
  43. field_extra = JSONField()
  44. objects = SettingsManager()
  45. @property
  46. def value(self):
  47. if not self.dry_value and self.default_value:
  48. return hydrators.hydrate_value(
  49. self.python_type, self.default_value)
  50. else:
  51. return hydrators.hydrate_value(
  52. self.python_type, self.dry_value)
  53. @value.setter
  54. def value(self, new_value):
  55. if new_value is not None:
  56. self.dry_value = hydrators.dehydrate_value(
  57. self.python_type, new_value)
  58. else:
  59. self.dry_value = None
  60. return self.value
  61. @property
  62. def has_custom_value(self):
  63. return self.dry_value and self.dry_value != self.default_value