models.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  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 SettingsGroup(models.Model):
  10. key = models.CharField(max_length=255, unique=True)
  11. name = models.CharField(max_length=255)
  12. description = models.TextField(null=True, blank=True)
  13. class Setting(models.Model):
  14. group = models.ForeignKey(SettingsGroup)
  15. setting = models.CharField(max_length=255, unique=True)
  16. name = models.CharField(max_length=255)
  17. description = models.TextField(null=True, blank=True)
  18. legend = models.CharField(max_length=255, null=True, blank=True)
  19. order = models.IntegerField(default=0, db_index=True)
  20. dry_value = models.TextField(null=True, blank=True)
  21. default_value = models.TextField(null=True, blank=True)
  22. python_type = models.CharField(max_length=255, default='string')
  23. is_lazy = models.BooleanField(default=False)
  24. form_field = models.CharField(max_length=255, default='text')
  25. pickled_field_extra = models.TextField(null=True, blank=True)
  26. @property
  27. def value(self):
  28. if not self.dry_value and self.default_value:
  29. return hydrators.hydrate_value(self.python_type,
  30. self.default_value)
  31. else:
  32. return hydrators.hydrate_value(self.python_type,
  33. self.dry_value)
  34. @value.setter
  35. def value(self, new_value):
  36. if new_value is not None:
  37. self.dry_value = hydrators.dehydrate_value(self.python_type,
  38. new_value)
  39. else:
  40. self.dry_value = None
  41. return self.value
  42. @property
  43. def has_custom_value(self):
  44. return self.dry_value and self.dry_value != self.default_value
  45. @property
  46. def field_extra(self):
  47. if self.pickled_field_extra:
  48. return pickle.loads(base64.decodestring(self.pickled_field_extra))
  49. else:
  50. return {}
  51. @field_extra.setter
  52. def field_extra(self, new_extra):
  53. if new_extra:
  54. pickled_extra = pickle.dumps(new_extra, pickle.HIGHEST_PROTOCOL)
  55. self.pickled_field_extra = base64.encodestring(pickled_extra)
  56. from django.utils.translation import ugettext_lazy as _
  57. admin_site.add_node(
  58. parent='misago:admin',
  59. link='misago:admin:index',
  60. icon='fa fa-home',
  61. name=_("Home"),
  62. )
  63. admin_site.add_node(
  64. parent='misago:admin',
  65. link='misago:admin:settings:index',
  66. icon='fa fa-gears',
  67. name=_("Settings"),
  68. )