models.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. from django.db import models
  2. from django.dispatch import receiver
  3. from misago.core import serializer
  4. from misago.core.signals import secret_key_changed
  5. from misago.conf import hydrators
  6. class SettingsGroupsManager(models.Manager):
  7. def ordered_alphabetically(self):
  8. from django.utils.translation import ugettext as _
  9. groups_dict = {}
  10. for group in self.all():
  11. groups_dict[_(group.name)] = group
  12. ordered_groups = []
  13. for key in groups_dict.keys():
  14. ordered_groups.append(groups_dict[key])
  15. return ordered_groups
  16. class SettingsGroup(models.Model):
  17. key = models.CharField(max_length=255, unique=True)
  18. name = models.CharField(max_length=255)
  19. description = models.TextField(null=True, blank=True)
  20. objects = SettingsGroupsManager()
  21. class SettingsManager(models.Manager):
  22. def change_setting(self, setting, dry_value=None, wet_value=None):
  23. if dry_value:
  24. return self.filter(setting=setting).update(dry_value=dry_value)
  25. elif wet_value:
  26. try:
  27. setting = self.get(setting=setting)
  28. setting.value = wet_value
  29. setting.save(update_fields=['dry_value'])
  30. except Setting.DoesNotExist:
  31. return 0
  32. class Setting(models.Model):
  33. group = models.ForeignKey(SettingsGroup)
  34. setting = models.CharField(max_length=255, unique=True)
  35. name = models.CharField(max_length=255)
  36. description = models.TextField(null=True, blank=True)
  37. legend = models.CharField(max_length=255, null=True, blank=True)
  38. order = models.IntegerField(default=0, db_index=True)
  39. dry_value = models.TextField(null=True, blank=True)
  40. default_value = models.TextField(null=True, blank=True)
  41. python_type = models.CharField(max_length=255, default='string')
  42. is_public = models.BooleanField(default=False)
  43. is_lazy = models.BooleanField(default=False)
  44. form_field = models.CharField(max_length=255, default='text')
  45. pickled_field_extra = models.TextField(null=True, blank=True)
  46. objects = SettingsManager()
  47. @property
  48. def value(self):
  49. if not self.dry_value and self.default_value:
  50. return hydrators.hydrate_value(self.python_type,
  51. self.default_value)
  52. else:
  53. return hydrators.hydrate_value(self.python_type,
  54. self.dry_value)
  55. @value.setter
  56. def value(self, new_value):
  57. if new_value is not None:
  58. self.dry_value = hydrators.dehydrate_value(self.python_type,
  59. new_value)
  60. else:
  61. self.dry_value = None
  62. return self.value
  63. @property
  64. def has_custom_value(self):
  65. return self.dry_value and self.dry_value != self.default_value
  66. @property
  67. def field_extra(self):
  68. if self.pickled_field_extra:
  69. return serializer.loads(self.pickled_field_extra)
  70. else:
  71. return {}
  72. @field_extra.setter
  73. def field_extra(self, new_extra):
  74. if new_extra:
  75. self.pickled_field_extra = serializer.dumps(new_extra)
  76. """
  77. Signal handlers
  78. """
  79. @receiver(secret_key_changed)
  80. def update_settings_pickles(sender, **kwargs):
  81. for setting in Setting.objects.iterator():
  82. if setting.pickled_field_extra:
  83. setting.pickled_field_extra = serializer.regenerate_checksum(
  84. setting.pickled_field_extra)
  85. setting.save(update_fields=['pickled_field_extra'])