Browse Source

Display settings group form

Rafał Pitoń 11 years ago
parent
commit
757b115fee
3 changed files with 164 additions and 4 deletions
  1. 103 0
      misago/conf/forms.py
  2. 19 2
      misago/conf/views.py
  3. 42 2
      misago/templates/misago/admin/conf/group.html

+ 103 - 0
misago/conf/forms.py

@@ -0,0 +1,103 @@
+from django.utils.translation import ugettext_lazy as _
+from misago.core import forms
+
+
+__ALL__ = ['ChangeSettingsForm']
+
+
+def basic_kwargs(setting):
+    kwargs = {
+        'label': _(setting.name),
+        'initial': setting.value
+    }
+    if setting.description:
+        kwargs['help_text'] = _(setting.description)
+
+    return kwargs
+
+def create_text(setting, kwargs, extra):
+    kwargs.update(extra)
+    if setting.python_type == 'int':
+        return forms.IntegerField(**kwargs)
+    else:
+        return forms.CharField(**kwargs)
+
+
+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)
+
+
+def create_radio(setting, kwargs, extra):
+    kwargs = basic_kwargs(setting)
+    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)
+
+
+FIELD_STYPES = {
+    'text': create_text,
+    'textarea': create_textarea,
+    'select': create_select,
+    'radio': create_radio,
+    'yesno': create_yesno,
+    'checkbox': create_checkbox,
+}
+
+
+def setting_field(FormType, setting):
+    field_factory = FIELD_STYPES[setting.form_field]
+    form_field = field_factory(setting,
+                               basic_kwargs(setting),
+                               setting.field_extra)
+
+    if setting.legend:
+        form_field.legend = _(setting.legend)
+
+    FormType = type('FormType%s' % setting.pk, (FormType,),
+                    {setting.setting: form_field})
+
+    return FormType
+
+
+def ChangeSettingsForm(data=None, group=None):
+    """
+    Factory method that builds valid form for settings group
+    """
+    class FormType(forms.Form):
+        pass
+
+    fieldsets = []
+
+    fieldset_legend = None
+    fieldset_form = FormType
+    fieldset_fields = False
+    for setting in group.setting_set.order_by('order'):
+        if setting.legend and setting.legend != fieldset_legend:
+            if fieldset_fields != False:
+                fieldsets.append(
+                    {'legend': fieldset_legend, 'form': fieldset_form(data)})
+            fieldset_legend = setting.legend
+            fieldset_form = FormType
+            fieldset_fields = False
+        fieldset_fields = True
+        fieldset_form = setting_field(fieldset_form, setting)
+
+    if fieldset_fields:
+        fieldsets.append(
+            {'legend': fieldset_legend, 'form': fieldset_form(data)})
+
+    return fieldsets

+ 19 - 2
misago/conf/views.py

@@ -2,6 +2,7 @@ from django.contrib import messages
 from django.shortcuts import redirect
 from django.utils.translation import ugettext as _
 from misago.admin.views import render as mi_render
+from misago.conf.forms import ChangeSettingsForm
 from misago.conf.models import SettingsGroup, Setting
 
 
@@ -27,5 +28,21 @@ def group(request, group_key):
         messages.error(request, _("Settings group could not be found."))
         return redirect('misago:admin:settings:index')
 
-    return render(request, 'misago/admin/conf/group.html',
-                  {'active_group': active_group})
+    fieldsets = ChangeSettingsForm(group=active_group)
+    if request.method == 'POST':
+        fieldsets = ChangeSettingsForm(request.POST, group=active_group)
+        valid_fieldsets = len(True for form in fieldsets if form.is_valid())
+        if len(fieldsets) == valid_fieldsets:
+            pass
+
+    use_single_form_template = (len(fieldsets) == 1 and
+                                not fieldsets[0]['legend'])
+
+    return render(
+        request,
+        'misago/admin/conf/group.html',
+        {
+            'active_group': active_group,
+            'fieldsets': fieldsets,
+            'use_single_form_template': use_single_form_template,
+        })

+ 42 - 2
misago/templates/misago/admin/conf/group.html

@@ -1,5 +1,5 @@
 {% extends "misago/admin/conf/index.html" %}
-{% load i18n %}
+{% load floppyforms i18n %}
 
 
 {% block title %}{% trans active_group.name %} | {{ block.super }}{% endblock %}
@@ -18,5 +18,45 @@
 
 
 {% block action %}
-  TODO: GROUP VIEW
+<div class="form-panel">
+  <form role="form" method="post">
+    {% csrf_token %}
+
+    <div class="form-header">
+      <h1>{% trans active_group.name %}</h1>
+      {% if active_group.description %}
+      <p>{% trans active_group.description %}</p>
+      {% endif %}
+    </div>
+
+    {% if use_single_form_template %}
+    <div class="form-body no-fieldsets">
+      {% for field in fieldsets.0.form %}
+      {% formrow field using "misago/forms/row.html" %}
+      {% endfor %}
+    </div>
+    {% else %}
+    <div class="form-body">
+      {% for fieldset in fieldsets %}
+      <fieldset>
+        {% if fieldset.legend %}
+        <legend>{% trans fieldset.legend %}</legend>
+        {% endif %}
+
+        {% for field in fieldset.form %}
+        {% formrow field using "misago/forms/row.html" %}
+        {% endfor %}
+
+      </fieldset>
+      {% endfor %}
+    </div>
+    {% endif %}
+
+    <div class="form-footer">
+      <button class="btn btn-primary">{% trans "Change settings" %}</button>
+      <a href="{% url 'misago:admin:settings:index' %}" class="btn btn-default">{% trans "Cancel" %}</a>
+    </div>
+
+  </form>
+</div>
 {% endblock action %}