models.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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_lazy = models.BooleanField(default=False)
  43. form_field = models.CharField(max_length=255, default='text')
  44. pickled_field_extra = models.TextField(null=True, blank=True)
  45. objects = SettingsManager()
  46. @property
  47. def value(self):
  48. if not self.dry_value and self.default_value:
  49. return hydrators.hydrate_value(self.python_type,
  50. self.default_value)
  51. else:
  52. return hydrators.hydrate_value(self.python_type,
  53. self.dry_value)
  54. @value.setter
  55. def value(self, new_value):
  56. if new_value is not None:
  57. self.dry_value = hydrators.dehydrate_value(self.python_type,
  58. new_value)
  59. else:
  60. self.dry_value = None
  61. return self.value
  62. @property
  63. def has_custom_value(self):
  64. return self.dry_value and self.dry_value != self.default_value
  65. @property
  66. def field_extra(self):
  67. if self.pickled_field_extra:
  68. return serializer.loads(self.pickled_field_extra)
  69. else:
  70. return {}
  71. @field_extra.setter
  72. def field_extra(self, new_extra):
  73. if new_extra:
  74. self.pickled_field_extra = serializer.dumps(new_extra)
  75. """
  76. Signal handlers
  77. """
  78. @receiver(secret_key_changed)
  79. def update_settings_pickles(sender, **kwargs):
  80. for setting in Setting.objects.iterator():
  81. if setting.pickled_field_extra:
  82. setting.pickled_field_extra = serializer.regenerate_checksum(
  83. setting.pickled_field_extra)
  84. setting.save(update_fields=['pickled_field_extra'])