models.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import base64
  2. from django.db import models
  3. try:
  4. import cPickle as pickle
  5. except ImportError:
  6. import pickle
  7. class SettingsGroup(models.Model):
  8. key = models.CharField(max_length=255, unique=True)
  9. name = models.CharField(max_length=255)
  10. description = models.TextField(null=True, blank=True)
  11. # Setting hydrate/dehydrate functions
  12. def hydrate_string(dry_value):
  13. return dry_value
  14. def dehydrate_string(wet_value):
  15. return wet_value
  16. def hydrate_bool(dry_value):
  17. return dry_value == 'True'
  18. def dehydrate_bool(wet_value):
  19. return 'True' if dry_value else 'False'
  20. def hydrate_int(dry_value):
  21. return int(dry_value)
  22. def dehydrate_int(wet_value):
  23. return unicode(wet_value)
  24. def hydrate_list(dry_value):
  25. return dry_value.split(',')
  26. def dehydrate_list(wet_value):
  27. return ','.join(wet_value)
  28. VALUE_HYDRATORS = {
  29. 'string': (hydrate_string, dehydrate_string),
  30. 'bool': (hydrate_bool, dehydrate_bool),
  31. 'int': (hydrate_int, dehydrate_int),
  32. 'list': (hydrate_list, dehydrate_list),
  33. }
  34. def hydrate_value(python_type, dry_value):
  35. value_hydrator = VALUE_HYDRATORS[python_type][0]
  36. return value_hydrator(dry_value)
  37. def dehydrate_value(python_type, wet_value):
  38. value_dehydrator = VALUE_HYDRATORS[python_type][1]
  39. return value_dehydrator(wet_value)
  40. class Setting(models.Model):
  41. group = models.ForeignKey('SettingsGroup')
  42. setting = models.CharField(max_length=255, unique=True)
  43. name = models.CharField(max_length=255)
  44. description = models.TextField(null=True, blank=True)
  45. legend = models.CharField(max_length=255, null=True, blank=True)
  46. order = models.IntegerField(default=0, db_index=True)
  47. dry_value = models.TextField(null=True, blank=True)
  48. default_value = models.TextField(null=True, blank=True)
  49. python_type = models.CharField(max_length=255)
  50. is_lazy = models.BooleanField(default=False)
  51. form_field = models.CharField(max_length=255)
  52. pickled_field_extra = models.TextField(null=True, blank=True)
  53. @property
  54. def value(self):
  55. return hydrate_value(self.python_type, self.dry_value)
  56. @value.setter
  57. def value(self, new_value):
  58. return dehydrate_value(self.python_type, self.new_value)
  59. @property
  60. def has_custom_value(self):
  61. return self.default_value and self.dry_value != self.default_value
  62. @property
  63. def field_extra(self):
  64. if self.pickled_field_extra:
  65. return pickle.loads(base64.decodestring(self.pickled_field_extra))
  66. else:
  67. return {}
  68. @field_extra.setter
  69. def field_extra(self, new_extra):
  70. pickled_extra = pickle.dumps(choices_cache, pickle.HIGHEST_PROTOCOL)
  71. self.pickled_field_extra = base64.encodestring(pickled_extra)