forms.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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_text(setting, kwargs, extra):
  13. kwargs.update(extra)
  14. if setting.python_type == 'int':
  15. return forms.IntegerField(**kwargs)
  16. else:
  17. if extra.get('min_length', 0) == 0:
  18. kwargs['required'] = False
  19. return forms.CharField(**kwargs)
  20. def create_textarea(setting, kwargs, extra):
  21. kwargs = basic_kwargs(setting)
  22. return forms.CharField(**kwargs)
  23. def create_select(setting, kwargs, extra):
  24. kwargs = basic_kwargs(setting)
  25. return forms.CharField(**kwargs)
  26. def create_radio(setting, kwargs, extra):
  27. kwargs = basic_kwargs(setting)
  28. return forms.CharField(**kwargs)
  29. def create_yesno(setting, kwargs, extra):
  30. kwargs = basic_kwargs(setting)
  31. return forms.CharField(**kwargs)
  32. def create_checkbox(setting, kwargs, extra):
  33. kwargs = basic_kwargs(setting)
  34. return forms.CharField(**kwargs)
  35. FIELD_STYPES = {
  36. 'text': create_text,
  37. 'textarea': create_textarea,
  38. 'select': create_select,
  39. 'radio': create_radio,
  40. 'yesno': create_yesno,
  41. 'checkbox': create_checkbox,
  42. }
  43. def setting_field(FormType, setting):
  44. field_factory = FIELD_STYPES[setting.form_field]
  45. form_field = field_factory(setting,
  46. basic_kwargs(setting),
  47. setting.field_extra)
  48. if setting.legend:
  49. form_field.legend = _(setting.legend)
  50. FormType = type('FormType%s' % setting.pk, (FormType,),
  51. {setting.setting: form_field})
  52. return FormType
  53. def ChangeSettingsForm(data=None, group=None):
  54. """
  55. Factory method that builds valid form for settings group
  56. """
  57. class FormType(forms.Form):
  58. pass
  59. fieldsets = []
  60. fieldset_legend = None
  61. fieldset_form = FormType
  62. fieldset_fields = False
  63. for setting in group.setting_set.order_by('order'):
  64. if setting.legend and setting.legend != fieldset_legend:
  65. if fieldset_fields != False:
  66. fieldsets.append(
  67. {'legend': fieldset_legend, 'form': fieldset_form(data)})
  68. fieldset_legend = setting.legend
  69. fieldset_form = FormType
  70. fieldset_fields = False
  71. fieldset_fields = True
  72. fieldset_form = setting_field(fieldset_form, setting)
  73. if fieldset_fields:
  74. fieldsets.append(
  75. {'legend': fieldset_legend, 'form': fieldset_form(data)})
  76. return fieldsets