models.py 6.1 KB

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