From 7ad32c2afd699538479dc08342d84266c04f59f0 Mon Sep 17 00:00:00 2001
From: Yohann D'ANELLO <yohann.danello@gmail.com>
Date: Sun, 12 Apr 2020 00:06:20 +0200
Subject: [PATCH] View detail of a WEI

---
 apps/wei/api/urls.py              |  2 +-
 apps/wei/tables.py                |  2 +-
 apps/wei/urls.py                  |  3 +-
 apps/wei/views.py                 | 53 +++++++++++++++++++++++++++
 templates/member/club_info.html   |  7 +++-
 templates/wei/weiclub_detail.html | 20 ++++++++++
 templates/wei/weiclub_info.html   | 61 +++++++++++++++++++++++++++++++
 templates/wei/weiclub_tables.html | 23 ++++++++++++
 8 files changed, 167 insertions(+), 4 deletions(-)
 create mode 100644 templates/wei/weiclub_detail.html
 create mode 100644 templates/wei/weiclub_info.html
 create mode 100644 templates/wei/weiclub_tables.html

diff --git a/apps/wei/api/urls.py b/apps/wei/api/urls.py
index f5836b8c..7d39e8da 100644
--- a/apps/wei/api/urls.py
+++ b/apps/wei/api/urls.py
@@ -8,4 +8,4 @@ def register_wei_urls(router, path):
     """
     Configure router for Member REST API.
     """
-    router.register(path + '/club', WEIClubViewSet)
+    router.register(path + '/club/', WEIClubViewSet)
diff --git a/apps/wei/tables.py b/apps/wei/tables.py
index 3c1bd3af..8cb23ef2 100644
--- a/apps/wei/tables.py
+++ b/apps/wei/tables.py
@@ -21,5 +21,5 @@ class WEITable(tables.Table):
         row_attrs = {
             'class': 'table-row',
             'id': lambda record: "row-" + str(record.pk),
-            'data-href': lambda record: reverse_lazy('member:club_detail', args=(record.pk,))
+            'data-href': lambda record: reverse_lazy('wei:wei_detail', args=(record.pk,))
         }
diff --git a/apps/wei/urls.py b/apps/wei/urls.py
index 9c898139..71af9cb7 100644
--- a/apps/wei/urls.py
+++ b/apps/wei/urls.py
@@ -3,10 +3,11 @@
 
 from django.urls import path
 
-from .views import WEIListView
+from .views import WEIListView, WEIDetailView
 
 
 app_name = 'wei'
 urlpatterns = [
     path('list/', WEIListView.as_view(), name="wei_list"),
+    path('detail/<int:pk>/', WEIDetailView.as_view(), name="wei_detail"),
 ]
diff --git a/apps/wei/views.py b/apps/wei/views.py
index 7d7fc01f..eb66a74f 100644
--- a/apps/wei/views.py
+++ b/apps/wei/views.py
@@ -1,8 +1,19 @@
 # Copyright (C) 2018-2020 by BDE ENS Paris-Saclay
 # SPDX-License-Identifier: GPL-3.0-or-later
 
+from datetime import datetime
+
 from django.contrib.auth.mixins import LoginRequiredMixin
+from django.contrib.auth.models import User
+from django.db.models import Q
+from django.views.generic import DetailView
 from django_tables2 import SingleTableView
+
+from member.models import Membership
+from member.tables import MembershipTable
+from note.models import Transaction
+from note.tables import HistoryTable
+from permission.backends import PermissionBackend
 from permission.views import ProtectQuerysetMixin
 from wei.models import WEIClub
 
@@ -15,3 +26,45 @@ class WEIListView(ProtectQuerysetMixin, LoginRequiredMixin, SingleTableView):
     """
     model = WEIClub
     table_class = WEITable
+
+
+class WEIDetailView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView):
+    """
+    View WEI information
+    """
+    model = WEIClub
+    context_object_name = "club"
+
+    def get_context_data(self, **kwargs):
+        context = super().get_context_data(**kwargs)
+
+        club = context["club"]
+        if PermissionBackend.check_perm(self.request.user, "member.change_club_membership_start", club):
+            club.update_membership_dates()
+
+        club_transactions = Transaction.objects.all().filter(Q(source=club.note) | Q(destination=club.note)) \
+            .filter(PermissionBackend.filter_queryset(self.request.user, Transaction, "view")).order_by('-id')
+        history_table = HistoryTable(club_transactions, prefix="history-")
+        history_table.paginate(per_page=20, page=self.request.GET.get('history-page', 1))
+        context['history_list'] = history_table
+        club_member = Membership.objects.filter(
+            club=club,
+            date_end__gte=datetime.today(),
+        ).filter(PermissionBackend.filter_queryset(self.request.user, Membership, "view"))
+
+        membership_table = MembershipTable(data=club_member, prefix="membership-")
+        membership_table.paginate(per_page=20, page=self.request.GET.get('membership-page', 1))
+        context['member_list'] = membership_table
+
+        # Check if the user has the right to create a membership, to display the button.
+        empty_membership = Membership(
+            club=club,
+            user=User.objects.first(),
+            date_start=datetime.now().date(),
+            date_end=datetime.now().date(),
+            fee=0,
+        )
+        context["can_add_members"] = PermissionBackend() \
+            .has_perm(self.request.user, "member.add_membership", empty_membership)
+
+        return context
diff --git a/templates/member/club_info.html b/templates/member/club_info.html
index 135862d9..eeebc823 100644
--- a/templates/member/club_info.html
+++ b/templates/member/club_info.html
@@ -15,7 +15,7 @@
 
             {% if club.parent_club %}
                 <dt class="col-xl-6"><a href="{% url 'member:club_detail' club.parent_club.pk %}">{% trans 'Club Parent'|capfirst %}</a></dt>
-                <dd class="col-xl-6"> {{ club.parent_club.name}}</dd>
+                <dd class="col-xl-6"> {{ club.parent_club.name }}</dd>
             {% endif %}
 
             {% if club.require_memberships %}
@@ -39,6 +39,11 @@
                     <dd class="col-xl-6">{{ club.membership_fee_unpaid|pretty_money }}</dd>
                 {% endif %}
             {% endif %}
+
+            {% if "note.view_note"|has_perm:club.note %}
+                <dt class="col-xl-6">{% trans 'balance'|capfirst %}</dt>
+                <dd class="col-xl-6">{{ object.note.balance | pretty_money }}</dd>
+            {% endif %}
             
             <dt class="col-xl-6"><a href="{% url 'member:club_alias' club.pk %}">{% trans 'aliases'|capfirst %}</a></dt>
             <dd class="col-xl-6 text-truncate">{{ object.note.alias_set.all|join:", " }}</dd>
diff --git a/templates/wei/weiclub_detail.html b/templates/wei/weiclub_detail.html
new file mode 100644
index 00000000..7ccd8dea
--- /dev/null
+++ b/templates/wei/weiclub_detail.html
@@ -0,0 +1,20 @@
+{% extends "member/noteowner_detail.html" %}
+
+{% block profile_info %}
+{% include "wei/weiclub_info.html" %}
+{% endblock %}
+
+{% block profile_content %}
+{% include "member/club_tables.html" %}
+{% endblock %}
+
+{% block extrajavascript %}
+    <script>
+        function refreshHistory() {
+            $("#history_list").load("{% url 'member:club_detail' pk=object.pk %} #history_list");
+            $("#profile_infos").load("{% url 'member:club_detail' pk=object.pk %} #profile_infos");
+        }
+
+        window.history.replaceState({}, document.title, location.pathname);
+    </script>
+{% endblock %}
diff --git a/templates/wei/weiclub_info.html b/templates/wei/weiclub_info.html
new file mode 100644
index 00000000..03cb69f2
--- /dev/null
+++ b/templates/wei/weiclub_info.html
@@ -0,0 +1,61 @@
+{% load i18n static pretty_money perms %}
+<div class="card bg-light shadow">
+    <div class="card-header text-center">
+        <h4> Club {{ club.name }} </h4>
+    </div>
+    <div class="card-top text-center">
+        <a  href="{% url 'member:club_update_pic' club.pk  %}">
+            <img src="{{ club.note.display_image.url }}" class="img-thumbnail mt-2" >
+        </a>
+    </div>
+    <div class="card-body" id="profile_infos">
+        <dl class="row">
+            <dt class="col-xl-6">{% trans 'name'|capfirst %}</dt>
+            <dd class="col-xl-6">{{ club.name }}</dd>
+
+            {% if club.require_memberships %}
+                <dt class="col-xl-6">{% trans 'date start'|capfirst %}</dt>
+                <dd class="col-xl-6">{{ club.date_start }}</dd>
+
+                <dt class="col-xl-6">{% trans 'date end'|capfirst %}</dt>
+                <dd class="col-xl-6">{{ club.date_end }}</dd>
+
+                <dt class="col-xl-6">{% trans 'year'|capfirst %}</dt>
+                <dd class="col-xl-6">{{ club.year }}</dd>
+
+                {% if club.membership_fee_paid == club.membership_fee_unpaid %}
+                    <dt class="col-xl-6">{% trans 'membership fee'|capfirst %}</dt>
+                    <dd class="col-xl-6">{{ club.membership_fee_paid|pretty_money }}</dd>
+                {% else %}
+                    <dt class="col-xl-6">{% trans 'fee (paid students)'|capfirst %}</dt>
+                    <dd class="col-xl-6">{{ club.membership_fee_paid|pretty_money }}</dd>
+
+                    <dt class="col-xl-6">{% trans 'fee (unpaid students)'|capfirst %}</dt>
+                    <dd class="col-xl-6">{{ club.membership_fee_unpaid|pretty_money }}</dd>
+                {% endif %}
+            {% endif %}
+
+            {% if "note.view_note"|has_perm:club.note %}
+                <dt class="col-xl-6">{% trans 'balance'|capfirst %}</dt>
+                <dd class="col-xl-6">{{ object.note.balance | pretty_money }}</dd>
+            {% endif %}
+            
+            <dt class="col-xl-6"><a href="{% url 'member:club_alias' club.pk %}">{% trans 'aliases'|capfirst %}</a></dt>
+            <dd class="col-xl-6 text-truncate">{{ object.note.alias_set.all|join:", " }}</dd>
+
+            <dt class="col-xl-4">{% trans 'email'|capfirst %}</dt>
+            <dd class="col-xl-8"><a href="mailto:{{ club.email }}">{{ club.email }}</a></dd>
+        </dl>
+    </div>
+    <div class="card-footer text-center">
+        {% if can_add_members %}
+            <a class="btn btn-primary btn-sm my-1" href="{% url 'member:club_add_member' club_pk=club.pk %}"> {% trans "Add member" %}</a>
+        {% endif %}
+        {% if ".change_"|has_perm:club %}
+            <a class="btn btn-primary btn-sm my-1" href="{% url 'member:club_update' pk=club.pk %}"> {% trans "Edit" %}</a>
+        {% endif %}
+        {% url 'member:club_detail' club.pk as club_detail_url %}
+        {%if request.path_info != club_detail_url %}
+        <a class="btn btn-primary btn-sm my-1" href="{{ club_detail_url }}">{% trans 'View Profile' %}</a>
+        {% endif %}    </div>
+</div>
diff --git a/templates/wei/weiclub_tables.html b/templates/wei/weiclub_tables.html
new file mode 100644
index 00000000..32be9bd4
--- /dev/null
+++ b/templates/wei/weiclub_tables.html
@@ -0,0 +1,23 @@
+{% load render_table from django_tables2 %}
+{% load i18n %}
+<div class="card">
+    <div class="card-header position-relative" id="clubListHeading">
+        <a class="btn btn-link stretched-link font-weight-bold">
+            <i class="fa fa-users"></i> {% trans "Member of the Club" %}
+        </a>
+    </div>
+        {% render_table member_list %}
+</div>
+
+<hr>
+
+<div class="card">
+    <div class="card-header position-relative" id="historyListHeading">
+        <a class="btn btn-link stretched-link font-weight-bold">
+            <i class="fa fa-euro"></i> {% trans "Transaction history" %}
+        </a>
+    </div>
+        <div id="history_list">
+            {% render_table history_list %}
+        </div>
+</div>
-- 
GitLab