models.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import base64
  2. from django.db import models
  3. from misago.conf import hydrators
  4. try:
  5. import cPickle as pickle
  6. except ImportError:
  7. import pickle
  8. class SettingsGroup(models.Model):
  9. key = models.CharField(max_length=255, unique=True)
  10. name = models.CharField(max_length=255)
  11. description = models.TextField(null=True, blank=True)
  12. class Setting(models.Model):
  13. group = models.ForeignKey(SettingsGroup)
  14. setting = models.CharField(max_length=255, unique=True)
  15. name = models.CharField(max_length=255)
  16. description = models.TextField(null=True, blank=True)
  17. legend = models.CharField(max_length=255, null=True, blank=True)
  18. order = models.IntegerField(default=0, db_index=True)
  19. dry_value = models.TextField(null=True, blank=True)
  20. default_value = models.TextField(null=True, blank=True)
  21. python_type = models.CharField(max_length=255, default='string')
  22. is_lazy = models.BooleanField(default=False)
  23. form_field = models.CharField(max_length=255, default='text')
  24. pickled_field_extra = models.TextField(null=True, blank=True)
  25. @property
  26. def value(self):
  27. if not self.dry_value and self.default_value:
  28. return hydrators.hydrate_value(self.python_type,
  29. self.default_value)
  30. else:
  31. return hydrators.hydrate_value(self.python_type,
  32. self.dry_value)
  33. @value.setter
  34. def value(self, new_value):
  35. if new_value is not None:
  36. self.dry_value = hydrators.dehydrate_value(self.python_type,
  37. new_value)
  38. else:
  39. self.dry_value = None
  40. return self.value
  41. @property
  42. def has_custom_value(self):
  43. return self.dry_value and self.dry_value != self.default_value
  44. @property
  45. def field_extra(self):
  46. if self.pickled_field_extra:
  47. return pickle.loads(base64.decodestring(self.pickled_field_extra))
  48. else:
  49. return {}
  50. @field_extra.setter
  51. def field_extra(self, new_extra):
  52. if new_extra:
  53. pickled_extra = pickle.dumps(new_extra, pickle.HIGHEST_PROTOCOL)
  54. self.pickled_field_extra = base64.encodestring(pickled_extra)