models.py 3.0 KB

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