From 5ff47a28069e21debc2c828248bc653d38ca3a0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20G=C3=B6tz?= Date: Fri, 29 Mar 2019 19:05:48 +0100 Subject: [PATCH] Implement realm group update and deletion, Close #14, Close #8 --- account_manager/urls.py | 6 +- account_manager/views/group_views.py | 47 ++++- templates/group/group_detail.jinja2 | 30 ++- templates/macros/forms_macro.jinja2 | 226 ++++++++++++++++++++ templates/macros/item_form_macros.jinja2 | 73 +++++++ templates/macros/utils_macros.jinja2 | 257 +++++++++++++++++++++++ templates/realm/realm_groups.jinja2 | 10 +- 7 files changed, 624 insertions(+), 25 deletions(-) create mode 100644 templates/macros/forms_macro.jinja2 create mode 100644 templates/macros/item_form_macros.jinja2 create mode 100644 templates/macros/utils_macros.jinja2 diff --git a/account_manager/urls.py b/account_manager/urls.py index 13142d7..a2e2cb8 100644 --- a/account_manager/urls.py +++ b/account_manager/urls.py @@ -21,9 +21,9 @@ urlpatterns = [ # Realm Group path('realm//groups/', account_manager.views.group_views.realm_groups, name='realm-group-list'), path('realm//groups/add/', account_manager.views.group_views.group_add, name='realm-group-add'), - path('realm//group//', account_manager.views.user_views.user_add, name='realm-group-detail'), - path('realm//group//update/', account_manager.views.user_views.user_add, name='realm-group-update'), - path('realm//group//delete/', account_manager.views.user_views.user_add, name='realm-group-delete'), + path('realm//group//', account_manager.views.group_views.group_detail, name='realm-group-detail'), + path('realm//group//update/', account_manager.views.group_views.group_update, name='realm-group-update'), + path('realm//group//delete/', account_manager.views.group_views.group_delete, name='realm-group-delete'), # Permission Info path('permission-denied', main_views.permission_denied, name='permission-denied') diff --git a/account_manager/views/group_views.py b/account_manager/views/group_views.py index f0f9ad5..5a841b4 100644 --- a/account_manager/views/group_views.py +++ b/account_manager/views/group_views.py @@ -17,13 +17,16 @@ def realm_groups(request, realm_id): @login_required -def group_detail(request, dn): - group = LdapGroup.objects.get(dn=dn) - context = {'group': group, } - return render(request, 'user/group_detail.jinja2', context) +@is_realm_admin +def group_detail(request, realm_id, group_dn): + realm = Realm.objects.get(id=realm_id) + LdapGroup.base_dn = f'ou=groups,{realm.ldap_base_dn}' + group = LdapGroup.objects.get(dn=group_dn) + return render(request, 'group/group_detail.jinja2', {'group': group, 'realm': realm}) @login_required +@is_realm_admin def group_add(request, realm_id): realm_obj = Realm.objects.get(id=realm_id) # if this is a POST request we need to process the form data @@ -44,3 +47,39 @@ def group_add(request, realm_id): form = AddLDAPGroupForm() return render(request, 'group/group_add.jinja2', {'form': form, 'realm': realm_obj}) + + +@login_required +@is_realm_admin +def group_update(request, realm_id, group_dn): + realm = Realm.objects.get(id=realm_id) + LdapGroup.base_dn = f'ou=groups,{realm.ldap_base_dn}' + group = LdapGroup.objects.get(dn=group_dn) + + if request.method == 'POST': + # create a form instance and populate it with data from the request: + form = AddLDAPGroupForm(request.POST) + # check whether it's valid: + if form.is_valid(): + group.name = form.cleaned_data['name'] + members = form.cleaned_data['members'] + group.members = [member.dn for member in members] + group.save() + return redirect('realm-group-detail', realm_id, group.dn) + + # if a GET (or any other method) we'll create a blank form + else: + # TODO: Automatic checkbox selection + data = {'name': group.name, 'members': group.members} + form = AddLDAPGroupForm(initial=data) + + return render(request, 'group/group_detail.jinja2', {'form': form, 'realm': realm}) + + +def group_delete(request, realm_id, group_dn): + realm = Realm.objects.get(id=realm_id) + LdapGroup.base_dn = f'ou=groups,{realm.ldap_base_dn}' + group = LdapGroup.objects.get(dn=group_dn) + group.delete() + + return redirect('realm-group-list', realm_id) diff --git a/templates/group/group_detail.jinja2 b/templates/group/group_detail.jinja2 index fd66cec..053ed11 100644 --- a/templates/group/group_detail.jinja2 +++ b/templates/group/group_detail.jinja2 @@ -1,11 +1,21 @@ -{% extends 'base.jinja' %} -{% block content %} -

{{ group.name }}

- Nutzerübersicht -

DN: {{ group.dn }}

-

Nutzername: {{ group.name }}

-

Mitglieder

- {% for user in group.members %} -

{{ user }}

- {% endfor %} +{% extends 'realm/realm_detailed.jinja2' %} +{% import 'macros/forms_macro.jinja2' as forms %} +{% block extra_content %} + {% if not form %} +

{{ group.name }}

+

DN: {{ group.dn }}

+

Nutzername: {{ group.name }}

+

Mitglieder

+ {% for user in group.members %} +

{{ user }}

+ {% endfor %} + Update Gruppe + Delete Gruppe + {% else %} +
+ + {{ form.as_p()|safe }} + +
+ {% endif %} {% endblock %} \ No newline at end of file diff --git a/templates/macros/forms_macro.jinja2 b/templates/macros/forms_macro.jinja2 new file mode 100644 index 0000000..d0f10c3 --- /dev/null +++ b/templates/macros/forms_macro.jinja2 @@ -0,0 +1,226 @@ +{% macro text_input(field, list='', css_classes='') -%} +
+ + {% if list %} + + + {% endif %} + + {% if field.errors %} +
    + {% for error in field.errors %} +
  • {{ error }}
  • + {% endfor %} +
+ {% endif %} + {% if field.help_text %} +
+ {% endif %} +
+
+{% endmacro %} + +{% macro textarea_input(field) -%} +
+ + + {% if field.errors %} +
    + {% for error in field.errors %} +
  • {{ error }}
  • + {% endfor %} +
+ {% endif %} + {% if field.help_text %} +
{{ field.help_text() }} + {% endif %} +
+
+{% endmacro %} + +{% macro number_input(field, type='', step_size='0.01') -%} +
+ + + {% if type %} + {{ field.label }} in {{ type }} + {% endif %} + {% if field.errors %} +
    + {% for error in field.errors %} +
  • {{ error }}
  • + {% endfor %} +
+ {% endif %} + {% if field.help_text %} +
{{ field.help_text() }} + {% endif %} +
+
+{% endmacro %} + + +{% macro file_input(field, multiple=False) -%} +
+ + +
+{% endmacro %} + +{% macro image_deletion_input(existing_images) -%} +
+ {% for image in existing_images %} +
+
+ + +
+
+ {% endfor %} +
+{% endmacro %} + +{% macro checkbox_input(field) -%} +
+ + +
+{% endmacro %} + +{% macro select_input(field, multiple=False) -%} +
+ + +
+{% endmacro %} + +{% macro password_input(field, list='', css_classes='') -%} +
+ + {% if list %} + + + {% endif %} + + {% if field.errors %} +
    + {% for error in field.errors %} +
  • {{ error }}
  • + {% endfor %} +
+ {% endif %} + {% if field.help_text %} +
+ {% endif %} +
+
+{% endmacro %} + +{% macro telephone_input(field, type='', step_size='0.01') -%} +
+ + + {% if type %} + {{ field.label }} in {{ type }} + {% endif %} + {% if field.errors %} +
    + {% for error in field.errors %} +
  • {{ error }}
  • + {% endfor %} +
+ {% endif %} + {% if field.help_text %} +
{{ field.help_text() }} + {% endif %} +
+
+{% endmacro %} \ No newline at end of file diff --git a/templates/macros/item_form_macros.jinja2 b/templates/macros/item_form_macros.jinja2 new file mode 100644 index 0000000..5b6c3c9 --- /dev/null +++ b/templates/macros/item_form_macros.jinja2 @@ -0,0 +1,73 @@ +{% import 'macros/utils_macros.jinja2' as utils %} + +{% macro item_base_attributes(item_base_form, forms, item) %} + + {% for error in item_base_form.non_field_errors() %} + + {% endfor %} + {{ forms.text_input(item_base_form.title) }} + {{ forms.textarea_input(item_base_form.description) }} + {{ forms.select_input(item_base_form.categories, multiple=True) }} + {{ forms.file_input(item_base_form.loan_agreement_file) }} + {{ forms.file_input(item_base_form.images, multiple=True) }} + {% if item and item.images.count() > 0 %} + + {{ forms.image_deletion_input(existing_images=item.images.all()) }} + Bilder manuell sortieren + {% endif %} +{% endmacro %} + +{% macro item_location(item_base_form, forms) %} +
+

Ort

+ {{ forms.text_input(item_base_form.location_title) }} + {{ forms.number_input(item_base_form.location_house_number,step_size='1') }} + {{ forms.text_input(item_base_form.location_street) }} + {{ forms.text_input(item_base_form.location_city) }} + {{ forms.number_input(item_base_form.location_latitude) }} + {{ forms.number_input(item_base_form.location_longitude) }} +
+{% endmacro %} + +{% macro item_dimension(item_base_form, forms) %} +
+

Abmessungen

+ {{ forms.number_input(item_base_form.dimension_width) }} + {{ forms.number_input(item_base_form.dimension_height) }} + {{ forms.number_input(item_base_form.dimension_depth) }} +
+{% endmacro %} + +{% macro item_weight_amount(item_base_form, forms) %} +
+ {{ forms.number_input(item_base_form.weight) }} + {{ forms.number_input(item_base_form.amount, step_size='1') }} +
+{% endmacro %} + +{% macro item_loan_agreement(item_base_form, forms) %} +
+

Leihvereinbarung + (Für eine Schenkung bitte leer lassen) +

+ {{ forms.number_input(item_base_form.loan_caution) }} + {{ forms.number_input(item_base_form.loan_single_rent) }} + {{ forms.select_input(item_base_form.loan_rental_fee_interval_unit) }} + {{ forms.number_input(item_base_form.loan_rental_fee_costs) }} +
+{% endmacro %} + +{% macro item_form_buttons(item_base_form, forms) %} +
+
+ Abbrechen +
+
+ +
+
+{% endmacro %} \ No newline at end of file diff --git a/templates/macros/utils_macros.jinja2 b/templates/macros/utils_macros.jinja2 new file mode 100644 index 0000000..79f9be8 --- /dev/null +++ b/templates/macros/utils_macros.jinja2 @@ -0,0 +1,257 @@ +{# author: Marius Hofmann #} + +{% macro format_money(float_value) -%} + {{ '{:10.2f} €'.format(float_value).replace('.', ',') }} +{% endmacro %} + +{% macro format_mass(float_value) -%} + {{ '{:10.2f} kg'.format(float_value).replace('.', ',') }} +{% endmacro %} + +{% macro format_distance(float_value) -%} + {{ '{:10.2f}m'.format(float_value).replace('.', ',') }} +{% endmacro %} + +{% macro get_item_default_image(item) -%} + {% if item.images.all()[0] %} + Item default image + {% else %} + + {% endif %} +{% endmacro %} + +{% macro get_item_shortened_desc(item) -%} + {% if item.description %} + {{ item.description|truncate(20, True, '...') }} + {% endif %} +{% endmacro %} + +{% macro get_item_image_ligthbox(item) -%} + {% if item.images.all()[0] %} + {# Used this https://lokeshdhakar.com/projects/lightbox2/ to realize the lightbox#} + +
+
+ + Item default image + +
+
+
+ {% for image in item.images.all() %} +
+ + Bild + +
+ {% endfor %} +
+ {% else %} + + {% endif %} +{% endmacro %} + + +{% macro print_item_images(item, include_default=False) -%} + {% for image in item.images.all() %} + {% if loop.index0 > 0 or include_default %} +
+
+ Item image +
+
+ {% endif %} + {% endfor %} +{% endmacro %} + +{% macro mini_map(location, zoomlevel=13, width=300, height=300) -%} + +
+
+{% endmacro %} + +{% macro filter_panel(types) %} +
+
+
+ + + +
+
+
+ +
+
+
+
+
+ +
+ + +
+
+
+ +
+
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+
+ +
+ +
+
+
+ +
+ + +
+ + +
+ +
+
+
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+ +
+ + + + +
+
+
+ +
+
+{% endmacro %} + +{% macro mailto(lender, subject, content) -%} + mailto:{{ lender.user.email }}?subject={{ subject|urlencode }}&body={{ content|urlencode }} +{% endmacro %} + +{% macro request_mail_subject(items) -%} + Resourcenpool Bamberg: Anfrage zu {{ items|length }} Artikeln +{% endmacro %} + +{% macro request_mail_content(lender, items, requesting_user=None) -%} + Guten Tag {{ lender.user.first_name }} {{ lender.user.last_name }} + + Ich habe mich über den Resourcenpool Bamberg über Ihre Angebot informiert und würde gerne folgende{{ 'n' if items|count == 1 else '' }} Artikel ausleihen/buchen: + {% for item in items %} + - {{ item.title }} + {% endfor %} + Ich freue mich auf Ihre Antwort. + + Mit freundlichen Grüßen + {% if requesting_user %} + {{ requesting_user.first_name }} {{ requesting_user.last_name }} + {% endif %} +{% endmacro %} \ No newline at end of file diff --git a/templates/realm/realm_groups.jinja2 b/templates/realm/realm_groups.jinja2 index 8ca7b4f..9bd1f44 100644 --- a/templates/realm/realm_groups.jinja2 +++ b/templates/realm/realm_groups.jinja2 @@ -3,13 +3,7 @@ {% block groups_content %}

Gruppen

{% for group in realm_groups %} -

{{ group.name }}

-

DN: {{ group.dn }}

-{#

Nutzername: {{ group.name }}

#} -{#

Mitglieder

#} -{# {% for user in group.members %}#} -{#

{{ user }}

#} -{# {% endfor %}#} -
+

{{ group.name }} - {{ group.dn }} +

{% endfor %} {% endblock %}