From 07d1cd225b9e65181a9b1255587242c57898fe15 Mon Sep 17 00:00:00 2001
From: Pierre-antoine Comby <comby@crans.org>
Date: Mon, 23 Sep 2019 12:50:14 +0200
Subject: [PATCH] [member] add user list and filter

---
 apps/member/filters.py          | 31 +++++++++++++++++++++++++++++++
 apps/member/tables.py           | 16 +++++++++++++++-
 apps/member/urls.py             |  1 +
 apps/member/views.py            | 29 ++++++++++++++++++++++++++++-
 requirements.txt                |  1 +
 templates/member/user_list.html | 29 +++++++++++++++++++++++++++++
 6 files changed, 105 insertions(+), 2 deletions(-)
 create mode 100644 apps/member/filters.py
 create mode 100644 templates/member/user_list.html

diff --git a/apps/member/filters.py b/apps/member/filters.py
new file mode 100644
index 00000000..fb1a2128
--- /dev/null
+++ b/apps/member/filters.py
@@ -0,0 +1,31 @@
+# -*- mode: python; coding: utf-8 -*-
+# Copyright (C) 2018-2019 by BDE ENS Paris-Saclay
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+from django_filters import FilterSet, CharFilter,NumberFilter
+from django.contrib.auth.models import User
+from django.db.models import CharField
+from crispy_forms.helper import FormHelper
+from crispy_forms.layout import Layout, Submit
+
+from .models import  Club
+
+class UserFilter(FilterSet):
+    class Meta:
+        model = User
+        fields = ['last_name','first_name','username','profile__section']
+        filter_overrides={
+            CharField:{
+                'filter_class':CharFilter,
+                'extra': lambda f:{
+                    'lookup_expr':'icontains'
+                }
+            }
+        }
+
+class UserFilterFormHelper(FormHelper):
+    form_method = 'GET'
+    layout = Layout(
+        'last_name','first_name','username','profile__section',
+        Submit('Submit','Apply Filter'),
+    )
diff --git a/apps/member/tables.py b/apps/member/tables.py
index 5213a3d4..4218948c 100644
--- a/apps/member/tables.py
+++ b/apps/member/tables.py
@@ -2,12 +2,26 @@
 
 import django_tables2 as tables
 from .models import Club
+from django.conf import settings
+from django.contrib.auth.models import User
 
 class ClubTable(tables.Table):
     class Meta:
         attrs = {'class':'table table-bordered table-condensed table-striped table-hover'}
         model = Club
         template_name = 'django_tables2/bootstrap.html'
-        fields= ('id','name','email')
+        fields = ('id','name','email')
         row_attrs = {'class':'table-row',
                      'data-href': lambda record: record.pk }
+
+
+
+class UserTable(tables.Table):
+    section = tables.Column(accessor='profile.section')
+    solde = tables.Column(accessor='note.balance')
+
+    class Meta:
+        attrs = {'class':'table table-bordered table-condensed table-striped table-hover'}
+        template_name = 'django_tables2/bootstrap.html'
+        fields = ('last_name','first_name','username','email')
+        model = User
diff --git a/apps/member/urls.py b/apps/member/urls.py
index 39d3d896..8d3aa40a 100644
--- a/apps/member/urls.py
+++ b/apps/member/urls.py
@@ -15,5 +15,6 @@ urlpatterns = [
     path('club/<int:pk>/',views.ClubDetailView.as_view(),name="club_detail"),
     path('club/<int:pk>/add_member/',views.ClubAddMemberView.as_view(),name="club_add_member"),
     path('club/create/',views.ClubCreateView.as_view(),name="club_create"),
+    path('user/',views.UserListView.as_view(),name="user_list"),
     path('user/<int:pk>',views.UserDetailView.as_view(),name="user_detail")
 ]
diff --git a/apps/member/views.py b/apps/member/views.py
index fed0c30b..c5c3d788 100644
--- a/apps/member/views.py
+++ b/apps/member/views.py
@@ -8,6 +8,7 @@ from django.utils.translation import gettext_lazy as _
 from django.views.generic import CreateView, ListView, DetailView
 from django.http import HttpResponseRedirect
 from django.contrib.auth.forms import UserCreationForm
+from django.contrib.auth.models import User
 from django.urls import reverse_lazy
 from django.db.models import Q
 
@@ -16,9 +17,13 @@ from django_tables2.views import SingleTableView
 
 from .models import Profile, Club, Membership
 from .forms import ProfileForm, ClubForm,MembershipForm, MemberFormSet,FormSetHelper
-from .tables import ClubTable
+from .tables import ClubTable,UserTable
+from .filters import UserFilter, UserFilterFormHelper
+
+
 from note.models.transactions import Transaction
 from note.tables import HistoryTable
+
 class UserCreateView(CreateView):
     """
     Une vue pour inscrire un utilisateur et lui créer un profile
@@ -60,6 +65,28 @@ class UserDetailView(LoginRequiredMixin,DetailView):
         context['club_list'] = ClubTable(club_list)
         return context
 
+class UserListView(LoginRequiredMixin,SingleTableView):
+    model = User
+    table_class = UserTable
+    template_name = 'member/user_list.html'
+    filter_class = UserFilter
+    formhelper_class = UserFilterFormHelper
+   
+    def get_queryset(self,**kwargs):
+        qs = super().get_queryset()
+        self.filter = self.filter_class(self.request.GET,queryset=qs)
+        self.filter.form.helper = self.formhelper_class()
+        return self.filter.qs
+
+    def get_context_data(self,**kwargs):
+        context = super().get_context_data(**kwargs)
+        context["filter"] = self.filter
+        return context
+
+
+###################################
+############## CLUB ###############
+###################################
 
 class ClubCreateView(LoginRequiredMixin,CreateView):
     """
diff --git a/requirements.txt b/requirements.txt
index 39c20738..51b9ae4a 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -5,6 +5,7 @@ Django==2.2.3
 django-allauth==0.39.1
 django-crispy-forms==1.7.2
 django-extensions==2.1.9
+django-filter==2.2.0
 django-polymorphic==2.0.3
 django-reversion==3.0.3
 django-tables2==2.1.0
diff --git a/templates/member/user_list.html b/templates/member/user_list.html
new file mode 100644
index 00000000..821ea619
--- /dev/null
+++ b/templates/member/user_list.html
@@ -0,0 +1,29 @@
+{% extends "base.html" %}
+{% load render_table from django_tables2 %}
+{% load crispy_forms_tags%}
+{% block content %}
+
+<a class="btn btn-primary" href="{% url 'member:signup' %}">New User</a>
+
+<div class="row">
+{% crispy filter.form filter.form.helper %}
+</div>
+<div class="row">
+    <div id="replaceable-content" class="col-6">
+        {% render_table  table %}
+    </div>
+</div>
+
+{% endblock %}
+
+{% block extrajavascript %}
+<script type="text/javascript">
+
+$(document).ready(function($) {
+    $(".table-row").click(function() {
+        window.document.location = $(this).data("href");
+    });
+});
+
+</script>
+{% endblock %}
-- 
GitLab