Browse Source

Basic support for settings forms.

Rafał Pitoń 11 years ago
parent
commit
9ea683d3a0
2 changed files with 41 additions and 19 deletions
  1. 1 1
      docs/developers/settings.rst
  2. 40 18
      misago/conf/forms.py

+ 1 - 1
docs/developers/settings.rst

@@ -51,7 +51,7 @@ Each dict in ``settings`` tuple should define following keys:
 * **default_value** - if your setting should always have value, specify there fallabck value used if no user-defined value is available.
 * **is_lazy** - if setting value may too large to be always loaded into memory, you may make setting lazily loaded by defining this key with ``True`` value assigned.
 * **form_field** - What form field should be used to change this setting. Can be either "text", "textarea", "select", "radio", "yesno" or "checkbox". If not defined, "text" is used. "checkbox" should be used exclusively for multiple choices list.
-* **field_extra** - dict that defines extra attributes of form field. For "select", "radio" and "checkbox" fields this dict should contain "choices" key with tuple of tuples that will be used for choices in input. For "string" settings you can define "min_length" and "max_length" extra specifying minmal and maximal lenght of entered text. For integer settings you can specify minimal and maximal range in which value should fall by "min_value" and "max_value".
+* **field_extra** - dict that defines extra attributes of form field. For "select", "radio" and "checkbox" fields this dict should contain "choices" key with tuple of tuples that will be used for choices in input. For "string" settings you can define "min_length" and "max_length" extra specifying minmal and maximal lenght of entered text. For integer settings you can specify minimal and maximal range in which value should fall by "min_value" and "max_value". "textarea" field supports extra "rows" setting that controls generated textarea rows attribute.
 
 
 .. note::

+ 40 - 18
misago/conf/forms.py

@@ -16,6 +16,34 @@ def basic_kwargs(setting):
     return kwargs
 
 
+def create_checkbox(setting, kwargs, extra):
+    kwargs = basic_kwargs(setting)
+    kwargs['widget'] = forms.CheckboxSelectMultiple()
+    kwargs['choices'] = extra.get('choices', [])
+
+    if setting.python_type == 'int':
+        return forms.TypedMultipleChoiceField(coerce='int', **kwargs)
+    else:
+        return forms.MultipleChoiceField(**kwargs)
+
+
+def create_choice(setting, kwargs, extra):
+    kwargs = basic_kwargs(setting)
+    if setting.form_field == 'choice':
+        kwargs['widget'] = forms.RadioSelect()
+    else:
+        kwargs['widget'] = forms.Select()
+    kwargs['choices'] = extra.get('choices', [])
+
+    if kwargs['choices'] == '#tz#':
+        pass
+
+    if setting.python_type == 'int':
+        return forms.TypedChoiceField(coerce='int', **kwargs)
+    else:
+        return forms.ChoiceField(**kwargs)
+
+
 def create_text(setting, kwargs, extra):
     kwargs.update(extra)
     if setting.python_type == 'int':
@@ -28,36 +56,30 @@ def create_text(setting, kwargs, extra):
 
 def create_textarea(setting, kwargs, extra):
     kwargs = basic_kwargs(setting)
-    return forms.CharField(**kwargs)
-
-
-def create_select(setting, kwargs, extra):
-    kwargs = basic_kwargs(setting)
-    return forms.CharField(**kwargs)
-
+    widget_kwargs = {}
+    if extra.get('min_length', 0) == 0:
+        kwargs['required'] = False
+    if extra.get('rows', 0):
+        widget_kwargs['attrs'] = {'rows': extra.pop('rows')}
 
-def create_radio(setting, kwargs, extra):
-    kwargs = basic_kwargs(setting)
+    kwargs['widget'] = forms.Textarea(**widget_kwargs)
     return forms.CharField(**kwargs)
 
 
 def create_yesno(setting, kwargs, extra):
     kwargs = basic_kwargs(setting)
-    return forms.CharField(**kwargs)
-
-
-def create_checkbox(setting, kwargs, extra):
-    kwargs = basic_kwargs(setting)
-    return forms.CharField(**kwargs)
+    kwargs['widget'] = forms.RadioSelect()
+    kwargs['choices'] = ((0, _('No')), (1, _('Yes')))
+    return forms.TypedChoiceField(coerce='int', **kwargs)
 
 
 FIELD_STYPES = {
+    'checkbox': create_checkbox,
+    'radio': create_choice,
+    'select': create_choice,
     'text': create_text,
     'textarea': create_textarea,
-    'select': create_select,
-    'radio': create_radio,
     'yesno': create_yesno,
-    'checkbox': create_checkbox,
 }