settingmodel.py 5.8 KB

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