forms.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. from django.utils.translation import ugettext_lazy as _
  2. from misago.core import forms
  3. __ALL__ = ['ChangeSettingsForm']
  4. def basic_kwargs(setting):
  5. kwargs = {
  6. 'label': _(setting.name),
  7. 'initial': setting.value
  8. }
  9. if setting.description:
  10. kwargs['help_text'] = _(setting.description)
  11. return kwargs
  12. def create_checkbox(setting, kwargs, extra):
  13. kwargs = basic_kwargs(setting)
  14. kwargs['widget'] = forms.CheckboxSelectMultiple()
  15. kwargs['choices'] = extra.get('choices', [])
  16. if setting.python_type == 'int':
  17. return forms.TypedMultipleChoiceField(coerce='int', **kwargs)
  18. else:
  19. return forms.MultipleChoiceField(**kwargs)
  20. def create_choice(setting, kwargs, extra):
  21. kwargs = basic_kwargs(setting)
  22. if setting.form_field == 'choice':
  23. kwargs['widget'] = forms.RadioSelect()
  24. else:
  25. kwargs['widget'] = forms.Select()
  26. kwargs['choices'] = extra.get('choices', [])
  27. if kwargs['choices'] == '#tz#':
  28. pass
  29. if setting.python_type == 'int':
  30. return forms.TypedChoiceField(coerce='int', **kwargs)
  31. else:
  32. return forms.ChoiceField(**kwargs)
  33. def create_text(setting, kwargs, extra):
  34. kwargs.update(extra)
  35. if setting.python_type == 'int':
  36. return forms.IntegerField(**kwargs)
  37. else:
  38. if extra.get('min_length', 0) == 0:
  39. kwargs['required'] = False
  40. return forms.CharField(**kwargs)
  41. def create_textarea(setting, kwargs, extra):
  42. kwargs = basic_kwargs(setting)
  43. widget_kwargs = {}
  44. if extra.get('min_length', 0) == 0:
  45. kwargs['required'] = False
  46. if extra.get('rows', 0):
  47. widget_kwargs['attrs'] = {'rows': extra.pop('rows')}
  48. kwargs['widget'] = forms.Textarea(**widget_kwargs)
  49. return forms.CharField(**kwargs)
  50. def create_yesno(setting, kwargs, extra):
  51. kwargs = basic_kwargs(setting)
  52. kwargs['widget'] = forms.RadioSelect()
  53. kwargs['choices'] = ((0, _('No')), (1, _('Yes')))
  54. return forms.TypedChoiceField(coerce='int', **kwargs)
  55. FIELD_STYPES = {
  56. 'checkbox': create_checkbox,
  57. 'radio': create_choice,
  58. 'select': create_choice,
  59. 'text': create_text,
  60. 'textarea': create_textarea,
  61. 'yesno': create_yesno,
  62. }
  63. def setting_field(FormType, setting):
  64. field_factory = FIELD_STYPES[setting.form_field]
  65. form_field = field_factory(setting,
  66. basic_kwargs(setting),
  67. setting.field_extra)
  68. if setting.legend:
  69. form_field.legend = _(setting.legend)
  70. FormType = type('FormType%s' % setting.pk, (FormType,),
  71. {setting.setting: form_field})
  72. return FormType
  73. def ChangeSettingsForm(data=None, group=None):
  74. """
  75. Factory method that builds valid form for settings group
  76. """
  77. class FormType(forms.Form):
  78. pass
  79. fieldsets = []
  80. fieldset_legend = None
  81. fieldset_form = FormType
  82. fieldset_fields = False
  83. for setting in group.setting_set.order_by('order'):
  84. if setting.legend and setting.legend != fieldset_legend:
  85. if fieldset_fields != False:
  86. fieldsets.append(
  87. {'legend': fieldset_legend, 'form': fieldset_form(data)})
  88. fieldset_legend = setting.legend
  89. fieldset_form = FormType
  90. fieldset_fields = False
  91. fieldset_fields = True
  92. fieldset_form = setting_field(fieldset_form, setting)
  93. if fieldset_fields:
  94. fieldsets.append(
  95. {'legend': fieldset_legend, 'form': fieldset_form(data)})
  96. return fieldsets