models.py 3.5 KB

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