Implement bootstrap checkboxes

This commit is contained in:
Götz 2019-04-10 16:23:26 +02:00
parent 0b13fe4d7a
commit 8365ba777e
7 changed files with 65 additions and 45 deletions

View File

@ -1,6 +1,7 @@
from django import forms from django import forms
from .models import LdapUser, LdapGroup from .models import LdapUser, LdapGroup
from django.forms import modelformset_factory
class AddLDAPUserForm(forms.Form): class AddLDAPUserForm(forms.Form):
@ -24,9 +25,10 @@ class UserDeleteListForm(forms.Form):
class AddLDAPGroupForm(forms.Form): class AddLDAPGroupForm(forms.Form):
name = forms.CharField(label='name', max_length=400) name = forms.CharField(label='Name', max_length=400)
# TODO show only allowed user # TODO show only allowed user
members = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple, queryset=LdapUser.objects.all()) members = forms.ModelMultipleChoiceField(label='Mitglieder', widget=forms.CheckboxSelectMultiple,
queryset=LdapUser.objects.all(), )
class RealmAddForm(forms.Form): class RealmAddForm(forms.Form):
@ -45,3 +47,10 @@ class RealmUpdateForm(forms.Form):
admin_group = forms.ModelChoiceField(label='Admin Gruppe', admin_group = forms.ModelChoiceField(label='Admin Gruppe',
help_text="Die Mitglieder dieser Gruppe darf den Bereich administieren", help_text="Die Mitglieder dieser Gruppe darf den Bereich administieren",
queryset=LdapGroup.objects.all()) queryset=LdapGroup.objects.all())
UserFormset = modelformset_factory(
LdapUser,
fields=('dn',),
extra=1
)

View File

@ -0,0 +1,12 @@
from django.db import connections
from ldapdb.backends.ldap.compiler import SQLCompiler, query_as_ldap
def get_filterstr(qs):
connection = connections['ldap']
compiler = SQLCompiler(
query=qs.query,
connection=connection,
using=None,
)
return query_as_ldap(qs.query, compiler, connection).filterstr

View File

@ -1,10 +1,13 @@
import re
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.db.models import Q
from django.shortcuts import render, redirect from django.shortcuts import render, redirect
from account_helper.models import Realm from account_helper.models import Realm
from account_manager.forms import AddLDAPGroupForm from account_manager.forms import AddLDAPGroupForm
from account_manager.models import LdapGroup, LdapUser
from account_manager.main_views import is_realm_admin from account_manager.main_views import is_realm_admin
from account_manager.models import LdapGroup, LdapUser
@login_required @login_required
@ -58,6 +61,10 @@ def group_update(request, realm_id, group_dn):
group = LdapGroup.objects.get(dn=group_dn) group = LdapGroup.objects.get(dn=group_dn)
LdapUser.base_dn = LdapUser.ROOT_DN LdapUser.base_dn = LdapUser.ROOT_DN
if request.method == 'POST': if request.method == 'POST':
# user_ids = list(map(int, request.POST.getlist('members')))
# user_formset = UserFormset(request.POST)
# if user_formset and user_formset.is_valid():
# print(user_formset)
# create a form instance and populate it with data from the request: # create a form instance and populate it with data from the request:
form = AddLDAPGroupForm(request.POST) form = AddLDAPGroupForm(request.POST)
# check whether it's valid: # check whether it's valid:
@ -71,10 +78,19 @@ def group_update(request, realm_id, group_dn):
# if a GET (or any other method) we'll create a blank form # if a GET (or any other method) we'll create a blank form
else: else:
# TODO: Automatic checkbox selection # TODO: Automatic checkbox selection
data = {'name': group.name, 'members': group.members} members = LdapUser.objects.none()
if group.members:
group_members = [re.compile('uid=([a-zA-Z0-9_]*),(ou=[a-zA-Z_]*),(.*)').match(member).group(1) for member in
group.members]
query = Q(username=group_members.pop())
for member in group_members:
query = query | Q(username=member)
members = LdapUser.objects.filter(query)
data = {'name': group.name, 'members': members}
form = AddLDAPGroupForm(initial=data) form = AddLDAPGroupForm(initial=data)
return render(request, 'group/group_detail.jinja2', {'form': form, 'realm': realm, 'group': group}) return render(request, 'group/group_detail.jinja2',
{'form': form, 'realm': realm, 'group': group})
def group_delete(request, realm_id, group_dn): def group_delete(request, realm_id, group_dn):

View File

@ -5,8 +5,8 @@
<form action="{{ url('realm-group-add', args=[realm.id]) }}" method="post"> <form action="{{ url('realm-group-add', args=[realm.id]) }}" method="post">
<input type="hidden" name="csrfmiddlewaretoken" value="{{ csrf_token }}"> <input type="hidden" name="csrfmiddlewaretoken" value="{{ csrf_token }}">
{{ mform.text_input(form.name) }} {{ mform.text_input(form.name) }}
<p>Mitglieder</p> {{ form.members.label }}
{{ form.members }} {{ mform.checkbox_input_for_choice_fields(form.members) }}
<div class="d-flex mt-4"> <div class="d-flex mt-4">
<button type="submit" class="btn btn-primary mr-auto p-2">Speichern</button> <button type="submit" class="btn btn-primary mr-auto p-2">Speichern</button>
<a href="{{ url('realm-group-list', args = [realm.id]) }}" <a href="{{ url('realm-group-list', args = [realm.id]) }}"

View File

@ -24,17 +24,9 @@
{% else %} {% else %}
<form method="post"> <form method="post">
<input type="hidden" name="csrfmiddlewaretoken" value="{{ csrf_token }}"> <input type="hidden" name="csrfmiddlewaretoken" value="{{ csrf_token }}">
{{ form.as_p()|safe }}
{{ mform.text_input(form.name) }} {{ mform.text_input(form.name) }}
{% for choice_value, choice_label in form.members.field.choices %} {{ form.members.label }}
<p>{{ form.members.html_name }} | {{ choice_value }} | {{ choice_label }} | {{ form.members.value.value }}</p> {{ mform.checkbox_input_for_choice_fields(form.members) }}
{# {{ mform.checkbox_input_for_choice_fields(choice_id, choice_label ) }}#}
{% endfor %}
{# {% for value in form.members.value %}#}
{# <p>{{ value }}</p>#}
{# {{ mform.checkbox_input_for_choice_fields(choice_id, choice_label ) }}#}
{# {% endfor %}#}
<div class="d-flex mt-4"> <div class="d-flex mt-4">
<button type="submit" class="btn btn-primary mr-auto p-2">Speichern</button> <button type="submit" class="btn btn-primary mr-auto p-2">Speichern</button>
<a href="{{ url('realm-group-detail', args = [realm.id, group.dn]) }}" <a href="{{ url('realm-group-detail', args = [realm.id, group.dn]) }}"

View File

@ -143,34 +143,25 @@
</div> </div>
{% endmacro %} {% endmacro %}
{% macro checkbox_input_for_choice_fields(label, value, id) -%} {% macro checkbox_input_for_choice_fields(field) -%}
<div class="form-check"> <div class="form-check">
{# <label class="{{ type }}{% if display == "inline" or field.field.widget.attrs.inline %} inline{% endif %}">#} <ul>
{# <input#} {% for choice_value, choice_label in field.field.choices %}
{# type="checkbox"#} <li>
{# name="{{ field.html_name }}"#}
{# value="{{ choice_id }}"#}
{# {% if field.field.widget.allow_multiple_selected %}#}
{# {% if choice_id|safe in field.value|safeseq %}checked{% endif %}#}
{# {% else %}#}
{# {% if field.value|safe == choice_id|safe %}checked{% endif %}#}
{# {% endif %}#}
{# {{ field.field.widget.attrs|html_attrs }}#}
{# />#}
{# {{ choice_label }}#}
{# </label>#}
<input type="checkbox" <input type="checkbox"
class="form-check-input" class="custom-control-input"
placeholder="{{ field.label }}" aria-describedby="{{ choice_label }}_help"
aria-describedby="{{ field.id_for_label }}_help"
name="{{ field.html_name }}" name="{{ field.html_name }}"
id="{{ field.id_for_label }}" id="{{ choice_label }}_{{ loop.index }}"
{% if field.value() != None %}value="{{ field.value() }}"{% endif %} value="{{ choice_value }}"
maxlength="{{ field.field.max_length }}" {% if field.value() and choice_value in field.value() %}checked{% endif %}
{% if field.field.required %}required{% endif %}> >
<label id="{{ field.id_for_label }}" class="form-check-label" for="{{ field.id_for_label }}"> <label class="custom-control-label" for="{{ choice_label }}_{{ loop.index }}">
{{ field.label }} {{ choice_label }}
</label> </label>
</li>
{% endfor %}
</ul>
</div> </div>
{% endmacro %} {% endmacro %}

View File

@ -33,7 +33,7 @@
<a href="{{ url('user-update', args = [user.dn, realm.id]) }}" <a href="{{ url('user-update', args = [user.dn, realm.id]) }}"
class="btn btn-primary mr-auto p-2">Update class="btn btn-primary mr-auto p-2">Update
User</a> User</a>
<a href="{{ url('user-delete', args = [user.dn, realm.id]) }}" <a href="{{ url('user-delete-confirm', args = [user.dn, realm.id]) }}"
class="btn btn-danger p-2">Delete class="btn btn-danger p-2">Delete
User</a> User</a>
</div> </div>