Browse Source

Move new and edit user forms to misago admin forms

rafalp 6 years ago
parent
commit
3f3e830f83

+ 47 - 10
misago/admin/templatetags/misago_admin_form.py

@@ -1,4 +1,5 @@
 from django import forms, template
+from django.utils.html import format_html_join
 
 register = template.Library()
 
@@ -14,12 +15,35 @@ def admin_form_row(field, label_class, field_class):
 
 @register.inclusion_tag("misago/admin/form/input.html")
 def admin_form_input(field):
-    widget_context = field.field.widget.get_context(field.html_name, field.value(), {})
+    attrs = field.field.widget.attrs
+    context = field.field.widget.get_context(field.html_name, field.value(), attrs)
+    context["attrs"] = attrs
+    context["field"] = field
+    return context
 
-    return {
-        "field": field,
-        "attrs": widget_context["widget"],
-    }
+
+@register.simple_tag
+def render_attrs(widget, class_name=None):
+    rendered_attrs = []
+    for attr, value in widget['attrs'].items():
+        rendered_attrs.append((attr, value))
+    if not widget["attrs"].get("class") and class_name:
+        rendered_attrs.append(("class", class_name))
+    return format_html_join(" ", '{}="{}"', rendered_attrs)
+
+
+@register.simple_tag
+def render_bool_attrs(widget):
+    attrs_html = []
+    for attr, value in widget.items():
+        if value is True:
+            attrs_html.append(attr)
+    return " ".join(attrs_html)
+
+
+@register.filter
+def is_radio_select_field(field):
+    return isinstance(field.field.widget, forms.RadioSelect)
 
 
 @register.filter
@@ -28,8 +52,21 @@ def is_select_field(field):
 
 
 @register.filter
-def extract_choices_from_attrs(attrs):
-    """Filter that extracts field choices into easily iterable list"""
-    if attrs.get("optgroups"):
-        return [i[1][0] for i in attrs["optgroups"]]
-    return []
+def is_multiple_choice_field(field):
+    multichoice_widgets = (forms.CheckboxSelectMultiple, forms.SelectMultiple)
+    return isinstance(field.field.widget, multichoice_widgets)
+
+
+@register.filter
+def is_textarea(field):
+    return isinstance(field.field.widget, forms.Textarea)
+
+
+@register.filter
+def get_options(field):
+    """Filter that extracts field choices into an easily iterable list"""
+    widget = field.field.widget
+    attrs = dict(id=field.auto_id, **widget.attrs)
+    context = widget.get_context(field.html_name, field.value(), attrs)
+    widget_context = context["widget"]
+    return widget.options(widget_context["name"], widget_context["value"], attrs)

+ 10 - 11
misago/templates/misago/admin/form/input.html

@@ -1,13 +1,12 @@
-{% load misago_admin_form misago_shorthands %}
-{{ attrs }}
-{% if field|is_select_field %}
-  <select class="form-control" id="{{ field.id_for_label }}" name="{{ field.html_name }}"{{ attrs.required|iftrue:" required" }}>
-    {% for option in attrs|extract_choices_from_attrs %}
-      <option{% if option.value %} value="{{ option.value }}"{% endif %}{{ option.selected|iftrue:" selected" }}>
-        {{ option.label }}
-      </option>
-    {% endfor %}
-  </select>
+{% load misago_admin_form %}
+{% if field|is_radio_select_field %}
+  {% include "misago/admin/form/radio_select.html" %}
+{% elif field|is_select_field %}
+  {% include "misago/admin/form/select.html" %}
+{% elif field|is_multiple_choice_field %}
+  {% include "misago/admin/form/multiple_choice.html" %}
+{% elif field|is_textarea %}
+  <textarea {% render_attrs widget class_name="form-control" %} id="{{ field.id_for_label }}" name="{{ widget.name }}" {% render_bool_attrs widget %}>{% if widget.value is not None %}{{ widget.value }}{% endif %}</textarea>
 {% else %}
-  <input class="form-control" id="{{ field.id_for_label }}" name="{{ field.html_name }}" type="{{ attrs.type }}"{% if attrs.value is not None %} value="{{ attrs.value }}"{% endif %}{{ attrs.required|iftrue:" required" }}>
+  <input {% render_attrs widget class_name="form-control" %} id="{{ field.id_for_label }}" name="{{ widget.name }}" type="{{ widget.type }}"{% if widget.value is not None %} value="{{ widget.value }}"{% endif %} {% render_bool_attrs widget %}>
 {% endif %}

+ 7 - 0
misago/templates/misago/admin/form/multiple_choice.html

@@ -0,0 +1,7 @@
+{% load misago_admin_form %}
+{% for option in field|get_options %}
+  <label class="checkbox">
+    <input id="{{ option.attrs.id }}" name="{{ widget.name }}" type="checkbox"{% if option.value is not None %} value="{{ option.value }}"{% endif %}{% if option.selected %} checked{% endif %}>
+    {{ option.label }}
+  </label>
+{% endfor %}

+ 7 - 0
misago/templates/misago/admin/form/radio_select.html

@@ -0,0 +1,7 @@
+{% load misago_admin_form %}
+{% for option in field|get_options %}
+  <label class="radio">
+    <input {% render_attrs widget %} id="{{ option.attrs.id }}" name="{{ widget.name }}" type="radio"{% if option.value is not None %} value="{{ option.value }}"{% endif %}{% if option.selected %} checked{% endif %}>
+    {{ option.label }}
+  </label>
+{% endfor %}

+ 2 - 2
misago/templates/misago/admin/form/row.html

@@ -1,9 +1,9 @@
 {% load misago_admin_form %}
 <div class="form-group{% if field.errors %} has-error{% endif %}">
-  <label for="{{ field.id_for_label }}" class="{% if label_class %}{{ label_class }} {% endif %}control-label">
+  <label for="{{ field.id_for_label }}" class="control-label{% if label_class %} {{ label_class }}{% endif %}">
     {{ field.label }}:
   </label>
-  <div class="{{ field_class }}">
+  <div class="{% if field|is_radio_select_field %}controls control-radioselect {% endif %}{% if field|is_multiple_choice_field %}controls control-checkboxselect {% endif %}{{ field_class }}">
     {% admin_form_input field %}
     {% for error in field.errors %}
       <div class="text-danger">

+ 8 - 0
misago/templates/misago/admin/form/select.html

@@ -0,0 +1,8 @@
+{% load misago_admin_form %}
+<select class="form-control" id="{{ field.id_for_label }}" name="{{ widget.name }}" {% render_bool_attrs widget %}>
+  {% for option in field|get_options %}
+    <option{% if option.value is not None %} value="{{ option.value }}"{% endif %} {% render_bool_attrs option.attrs %}>
+      {{ option.label }}
+    </option>
+  {% endfor %}
+</select>

+ 24 - 24
misago/templates/misago/admin/users/edit.html

@@ -1,5 +1,5 @@
 {% extends "misago/admin/generic/form.html" %}
-{% load i18n misago_admin_forms %}
+{% load i18n misago_admin_form %}
 
 
 {% block title %}
@@ -30,17 +30,17 @@ class="form-horizontal"
   <fieldset>
     <legend>{% trans "Basic account settings" %}</legend>
 
-    {% form_row form.username label_class field_class %}
+    {% admin_form_row form.username label_class field_class %}
 
     {% if 'rank' in form.fields %}
-      {% form_row form.rank label_class field_class %}
+      {% admin_form_row form.rank label_class field_class %}
     {% endif %}
 
-    {% form_row form.title label_class field_class %}
-    {% form_row form.roles label_class field_class %}
+    {% admin_form_row form.title label_class field_class %}
+    {% admin_form_row form.roles label_class field_class %}
 
     {% if 'staff_level' in form.fields %}
-      {% form_row form.staff_level label_class field_class %}
+      {% admin_form_row form.staff_level label_class field_class %}
     {% endif %}
 
   </fieldset>
@@ -48,8 +48,8 @@ class="form-horizontal"
     <legend>{% trans "Administrator status" %}</legend>
 
     {% if 'is_staff' in form.fields %}
-      {% form_row form.is_staff label_class field_class %}
-      {% form_row form.is_superuser label_class field_class %}
+      {% admin_form_row form.is_staff label_class field_class %}
+      {% admin_form_row form.is_superuser label_class field_class %}
     {% else %}
       <div id="div_id_is_staff" class="form-group">
         <label for="id_is_staff_0" class="control-label {{ label_class }}">
@@ -95,8 +95,8 @@ class="form-horizontal"
   <fieldset>
     <legend>{% trans "Sign-in credentials" %}</legend>
 
-    {% form_row form.email label_class field_class %}
-    {% form_row form.new_password label_class field_class %}
+    {% admin_form_row form.email label_class field_class %}
+    {% admin_form_row form.new_password label_class field_class %}
 
     {% if not target.has_usable_password %}
       <div id="div_id_has_usable_password" class="form-group">
@@ -112,18 +112,18 @@ class="form-horizontal"
   <fieldset>
     <legend>{% trans "Avatar" %}</legend>
 
-    {% form_row form.is_avatar_locked label_class field_class %}
-    {% form_row form.avatar_lock_user_message label_class field_class %}
-    {% form_row form.avatar_lock_staff_message label_class field_class %}
+    {% admin_form_row form.is_avatar_locked label_class field_class %}
+    {% admin_form_row form.avatar_lock_user_message label_class field_class %}
+    {% admin_form_row form.avatar_lock_staff_message label_class field_class %}
 
   </fieldset>
   <fieldset>
     <legend>{% trans "Signature" %}</legend>
 
-    {% form_row form.signature label_class field_class %}
-    {% form_row form.is_signature_locked label_class field_class %}
-    {% form_row form.signature_lock_user_message label_class field_class %}
-    {% form_row form.signature_lock_staff_message label_class field_class %}
+    {% admin_form_row form.signature label_class field_class %}
+    {% admin_form_row form.is_signature_locked label_class field_class %}
+    {% admin_form_row form.signature_lock_user_message label_class field_class %}
+    {% admin_form_row form.signature_lock_staff_message label_class field_class %}
 
   </fieldset>
   {% for group in form.get_profile_fields_groups %}
@@ -131,7 +131,7 @@ class="form-horizontal"
       <legend>{% trans group.name %}</legend>
 
       {% for field in group.fields %}
-        {% form_row field label_class field_class %}
+        {% admin_form_row field label_class field_class %}
       {% endfor %}
 
     </fieldset>
@@ -139,15 +139,15 @@ class="form-horizontal"
   <fieldset>
     <legend>{% trans "Forum options" %}</legend>
 
-    {% form_row form.is_hiding_presence label_class field_class %}
-    {% form_row form.limits_private_thread_invites_to label_class field_class %}
+    {% admin_form_row form.is_hiding_presence label_class field_class %}
+    {% admin_form_row form.limits_private_thread_invites_to label_class field_class %}
 
   </fieldset>
   <fieldset>
     <legend>{% trans "Automatic subscription preferences" %}</legend>
 
-    {% form_row form.subscribe_to_started_threads label_class field_class %}
-    {% form_row form.subscribe_to_replied_threads label_class field_class %}
+    {% admin_form_row form.subscribe_to_started_threads label_class field_class %}
+    {% admin_form_row form.subscribe_to_replied_threads label_class field_class %}
 
   </fieldset>
   <fieldset>
@@ -171,8 +171,8 @@ class="form-horizontal"
       </div>
     {% else %}
       {% if 'is_active' in form.fields %}
-        {% form_row form.is_active label_class field_class %}
-        {% form_row form.is_active_staff_message label_class field_class %}
+        {% admin_form_row form.is_active label_class field_class %}
+        {% admin_form_row form.is_active_staff_message label_class field_class %}
       {% else %}
         <div id="div_id_is_active" class="form-group">
           <label for="id_is_active_0" class="control-label {{ label_class }}">