forms.py 2.6 KB

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