models.py 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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 SettingsGroupsManager(models.Manager):
  9. def ordered_alphabetically(self):
  10. from django.utils.translation import ugettext as _
  11. groups_dict = {}
  12. for group in self.all():
  13. groups_dict[_(group.name)] = group
  14. ordered_groups = []
  15. for key in groups_dict.keys():
  16. ordered_groups.append(groups_dict[key])
  17. return ordered_groups
  18. class SettingsGroup(models.Model):
  19. key = models.CharField(max_length=255, unique=True)
  20. name = models.CharField(max_length=255)
  21. description = models.TextField(null=True, blank=True)
  22. objects = SettingsGroupsManager()
  23. class SettingsManager(models.Manager):
  24. def change_setting(self, setting, dry_value=None, wet_value=None):
  25. if dry_value:
  26. return self.filter(setting=setting).update(dry_value=dry_value)
  27. elif wet_value:
  28. try:
  29. setting = self.get(setting=setting)
  30. setting.value = wet_value
  31. setting.save(update_fields=['dry_value'])
  32. except Setting.DoesNotExist:
  33. return 0
  34. class Setting(models.Model):
  35. group = models.ForeignKey(SettingsGroup)
  36. setting = models.CharField(max_length=255, unique=True)
  37. name = models.CharField(max_length=255)
  38. description = models.TextField(null=True, blank=True)
  39. legend = models.CharField(max_length=255, null=True, blank=True)
  40. order = models.IntegerField(default=0, db_index=True)
  41. dry_value = models.TextField(null=True, blank=True)
  42. default_value = models.TextField(null=True, blank=True)
  43. python_type = models.CharField(max_length=255, default='string')
  44. is_lazy = models.BooleanField(default=False)
  45. form_field = models.CharField(max_length=255, default='text')
  46. pickled_field_extra = models.TextField(null=True, blank=True)
  47. objects = SettingsManager()
  48. @property
  49. def value(self):
  50. if not self.dry_value and self.default_value:
  51. return hydrators.hydrate_value(self.python_type,
  52. self.default_value)
  53. else:
  54. return hydrators.hydrate_value(self.python_type,
  55. self.dry_value)
  56. @value.setter
  57. def value(self, new_value):
  58. if new_value is not None:
  59. self.dry_value = hydrators.dehydrate_value(self.python_type,
  60. new_value)
  61. else:
  62. self.dry_value = None
  63. return self.value
  64. @property
  65. def has_custom_value(self):
  66. return self.dry_value and self.dry_value != self.default_value
  67. @property
  68. def field_extra(self):
  69. if self.pickled_field_extra:
  70. return pickle.loads(base64.decodestring(self.pickled_field_extra))
  71. else:
  72. return {}
  73. @field_extra.setter
  74. def field_extra(self, new_extra):
  75. if new_extra:
  76. pickled_extra = pickle.dumps(new_extra, pickle.HIGHEST_PROTOCOL)
  77. self.pickled_field_extra = base64.encodestring(pickled_extra)