settingmodel.py 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. import base64
  2. from django import forms
  3. from django.core import validators
  4. from django.db import models
  5. from django.utils.translation import ugettext_lazy as _
  6. from misago.utils.timezones import tzlist
  7. try:
  8. import cPickle as pickle
  9. except ImportError:
  10. import pickle
  11. class Setting(models.Model):
  12. setting = models.CharField(max_length=255, primary_key=True)
  13. group = models.ForeignKey('SettingsGroup', to_field='key')
  14. _value = models.TextField(db_column='value', null=True, blank=True)
  15. value_default = models.TextField(null=True, blank=True)
  16. normalize_to = models.CharField(max_length=255)
  17. field = models.CharField(max_length=255)
  18. extra = models.TextField(null=True, blank=True)
  19. position = models.IntegerField(default=0)
  20. separator = models.CharField(max_length=255, null=True, blank=True)
  21. name = models.CharField(max_length=255)
  22. description = models.TextField(null=True, blank=True)
  23. class Meta:
  24. app_label = 'misago'
  25. def get_extra(self):
  26. return pickle.loads(base64.decodestring(self.extra))
  27. @property
  28. def value(self):
  29. if self.normalize_to == 'array':
  30. return self._value.split(',')
  31. if self.normalize_to == 'integer':
  32. return int(self._value)
  33. if self.normalize_to == 'float':
  34. return float(self._value)
  35. if self.normalize_to == 'boolean':
  36. return self._value == "1"
  37. return self._value
  38. @value.setter
  39. def value(self, value):
  40. if self.normalize_to == 'array':
  41. self._value = ','.join(value)
  42. elif self.normalize_to == 'integer':
  43. self._value = int(value)
  44. elif self.normalize_to == 'float':
  45. self._value = float(value)
  46. elif self.normalize_to == 'boolean':
  47. self._value = 1 if value else 0
  48. else:
  49. self._value = value
  50. if not self._value and self.value_default:
  51. self._value = self.value_default
  52. return self._value
  53. def get_field(self):
  54. from misago.forms import YesNoSwitch
  55. extra = self.get_extra()
  56. # Set validators
  57. field_validators = []
  58. if 'min' in extra:
  59. if self.normalize_to == 'string' or self.normalize_to == 'array':
  60. field_validators.append(validators.MinLengthValidator(extra['min']))
  61. if self.normalize_to == 'integer' or self.normalize_to == 'float':
  62. field_validators.append(validators.MinValueValidator(extra['min']))
  63. if 'max' in extra:
  64. if self.normalize_to == 'string' or self.normalize_to == 'array':
  65. field_validators.append(validators.MaxLengthValidator(extra['max']))
  66. if self.normalize_to == 'integer' or self.normalize_to == 'float':
  67. field_validators.append(validators.MaxValueValidator(extra['max']))
  68. # Yes-no
  69. if self.field == 'yesno':
  70. return forms.BooleanField(
  71. initial=self.value,
  72. label=_(self.name),
  73. help_text=_(self.description) if self.description else None,
  74. required=False,
  75. widget=YesNoSwitch,
  76. )
  77. # Multi-list
  78. if self.field == 'mlist':
  79. return forms.MultipleChoiceField(
  80. initial=self.value,
  81. label=_(self.name),
  82. help_text=_(self.description) if self.description else None,
  83. widget=forms.CheckboxSelectMultiple,
  84. validators=field_validators,
  85. required=False,
  86. choices=extra['choices']
  87. )
  88. # Select or choice
  89. if self.field == 'select' or self.field == 'choice':
  90. # Timezone list?
  91. if extra['choices'] == '#TZ#':
  92. extra['choices'] = tzlist()
  93. return forms.ChoiceField(
  94. initial=self.value,
  95. label=_(self.name),
  96. help_text=_(self.description) if self.description else None,
  97. widget=forms.RadioSelect if self.field == 'choice' else forms.Select,
  98. validators=field_validators,
  99. required=False,
  100. choices=extra['choices']
  101. )
  102. # Textarea
  103. if self.field == 'textarea':
  104. return forms.CharField(
  105. initial=self.value,
  106. label=_(self.name),
  107. help_text=_(self.description) if self.description else None,
  108. validators=field_validators,
  109. required=False,
  110. widget=forms.Textarea
  111. )
  112. # Default input
  113. default_input = forms.CharField
  114. if self.normalize_to == 'integer':
  115. default_input = forms.IntegerField
  116. if self.normalize_to == 'float':
  117. default_input = forms.FloatField
  118. # Make text-input
  119. return default_input(
  120. initial=self.value,
  121. label=_(self.name),
  122. help_text=_(self.description) if self.description else None,
  123. validators=field_validators,
  124. required=False,
  125. )