From 66cd3ce12c2586af4d4caf345135f89fb6937c1b Mon Sep 17 00:00:00 2001
From: Tom Teichler <tom.teichler@teckids.org>
Date: Sat, 17 Aug 2019 16:09:19 +0200
Subject: [PATCH] Add list of groups and view for group.

---
 biscuit/core/menus.py                       |  4 ++
 biscuit/core/tables.py                      |  7 ++++
 biscuit/core/templates/core/group_full.html | 35 ++++++++++++++++
 biscuit/core/templates/core/groups.html     | 14 +++++++
 biscuit/core/urls.py                        |  3 ++
 biscuit/core/views.py                       | 44 ++++++++++++++++++++-
 6 files changed, 105 insertions(+), 2 deletions(-)
 create mode 100644 biscuit/core/templates/core/group_full.html
 create mode 100644 biscuit/core/templates/core/groups.html

diff --git a/biscuit/core/menus.py b/biscuit/core/menus.py
index 53dbb37a5..c85af6bfb 100644
--- a/biscuit/core/menus.py
+++ b/biscuit/core/menus.py
@@ -14,3 +14,7 @@ Menu.add_item('main', MenuItem('Logout',
 Menu.add_item('main', MenuItem(_('Persons'),
                                reverse('persons'),
                                check=lambda request: request.user.is_authenticated))
+
+Menu.add_item('main', MenuItem(_('Groups'),
+                               reverse('groups'),
+                               check=lambda request: request.user.is_authenticated))
diff --git a/biscuit/core/tables.py b/biscuit/core/tables.py
index f4a8e508a..f7fbeb93a 100644
--- a/biscuit/core/tables.py
+++ b/biscuit/core/tables.py
@@ -9,3 +9,10 @@ class PersonsTable(tables.Table):
 
     first_name = tables.LinkColumn('person_by_id', args=[A('id')])
     last_name = tables.LinkColumn('person_by_id', args=[A('id')])
+
+class GroupsTable(tables.Table):
+    class Meta:
+        attrs = {'class': 'table table-striped table-bordered table-hover table-responsive-xl'}
+
+    name = tables.LinkColumn('group_by_id', args=[A('id')])
+    short_name = tables.LinkColumn('group_by_id', args=[A('id')])
diff --git a/biscuit/core/templates/core/group_full.html b/biscuit/core/templates/core/group_full.html
new file mode 100644
index 000000000..d4c0854be
--- /dev/null
+++ b/biscuit/core/templates/core/group_full.html
@@ -0,0 +1,35 @@
+{% extends "core/base.html" %}
+{% load bootstrap4 font_awesome i18n staticfiles %}
+
+{% block content %}
+<div class="col-sm-12 col-md-12">
+ {% if group %}
+  <h2>{{ group.name }} <small>{{ group.short_name }}</small></h2>
+  <p>
+   <a href="{{ '#' }}">
+    {% blocktrans %}Edit group{% endblocktrans %}
+   </a>
+  </p>
+  <h3>{% blocktrans %}Details{% endblocktrans %}</h3>
+  <table class="table table-responsive-xl table-border table-striped">
+   <tr>
+    <td>{% fa 'users' %}</td>
+    <td>{{ group.name }}</td>
+    <td>{{ group.short_name }}</td>
+   </tr>
+  </table>
+
+  <h3>Members</h3>
+  {% render_table persons_table %}
+
+ {% else %}
+  <h2>{% blocktrans %}Person not found{% endblocktrans %}</h2>
+
+  <p>
+   {% blocktrans %}
+    There is no group with this id.
+   {% endblocktrans %}
+  </p>
+ {% endif %}
+</div>
+{% endblock %}
diff --git a/biscuit/core/templates/core/groups.html b/biscuit/core/templates/core/groups.html
new file mode 100644
index 000000000..fbcadfbb5
--- /dev/null
+++ b/biscuit/core/templates/core/groups.html
@@ -0,0 +1,14 @@
+{% extends "core/base.html" %}
+{% load bootstrap4 i18n %}
+{% load render_table from django_tables2 %}
+
+{% block page_title %}{% blocktrans %}Groups{% endblocktrans %}{% endblock %}
+
+{% block content %}
+ <h2>
+  {% blocktrans %}List of all groups{% endblocktrans %}
+ </h2>
+
+ {% render_table groups_table %}
+
+{% endblock %}
diff --git a/biscuit/core/urls.py b/biscuit/core/urls.py
index f3688a368..47e3dcba8 100644
--- a/biscuit/core/urls.py
+++ b/biscuit/core/urls.py
@@ -15,6 +15,9 @@ urlpatterns = [
          {'template': 'full'}, name='person_by_id'),
     path('person/<int:id_>/card', views.person,
          {'template': 'card'}, name='person_by_id_card'),
+    path('groups', views.groups, name='groups'),
+    path('group/<int:id_>', views.group,
+         {'template': 'full'}, name='group_by_id'),
     path('', views.index, name='index'),
 ]
 
diff --git a/biscuit/core/views.py b/biscuit/core/views.py
index 9ece571c0..0a83c1776 100644
--- a/biscuit/core/views.py
+++ b/biscuit/core/views.py
@@ -2,8 +2,8 @@ from django.contrib.auth.decorators import login_required
 from django.http import Http404
 from django.shortcuts import render
 from django_tables2 import RequestConfig
-from .models import Person
-from .tables import PersonsTable
+from .models import Person, Group
+from .tables import PersonsTable, GroupsTable
 
 
 def index(request):
@@ -40,3 +40,43 @@ def person(request, id_, template):
     context['person'] = person
 
     return render(request, 'core/person_%s.html' % template, context)
+
+@login_required
+def group(request, id_, template):
+    context = {}
+
+    # Get group and check if it exist
+    try:
+        group = Group.objects.get(pk=id_)
+    except Group.DoesNotExist as e:
+        # Turn not-found object into a 404 error
+        raise Http404 from e
+
+    context['group'] = group
+
+    # Get group
+    group = Group.objects.get(pk=id_)
+
+    # Get members
+    persons = group.members
+
+    # Build table
+    persons_table = PersonsTable(persons)
+    RequestConfig(request).configure(persons_table)
+    context['persons_table'] = persons_table
+
+    return render(request, 'core/group_%s.html' % template, context)
+
+@login_required
+def groups(request):
+    context = {}
+
+    # Get all groups
+    groups = Group.objects.all()
+
+    # Build table
+    groups_table = GroupsTable(groups)
+    RequestConfig(request).configure(groups_table)
+    context['groups_table'] = groups_table
+
+    return render(request, 'core/groups.html', context)
-- 
GitLab