Browse Source

onglet « mes associations »

Élie Bouttier 8 years ago
parent
commit
3026be8c54

+ 17 - 0
adhesions/middleware.py

@@ -0,0 +1,17 @@
+from django.core.exceptions import ImproperlyConfigured
+from django.core import serializers
+
+from adhesions.models import Corporation
+
+
+class CorporationMiddleware:
+    def __init__(self, get_response):
+        self.get_response = get_response
+
+    def __call__(self, request):
+        if request.user.is_authenticated():
+            if 'corporations' not in request.session:
+                corporations = Corporation.objects.filter(members=request.user)
+                request.session['corporations'] = serializers.serialize('json', corporations, fields=('pk', 'social_reason',))
+            request.corporations = serializers.deserialize('json', request.session['corporations'])
+        return self.get_response(request)

+ 20 - 0
adhesions/migrations/0006_adherent_created.py

@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.5 on 2017-02-11 01:34
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('adhesions', '0005_auto_20170206_0039'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='adherent',
+            name='created',
+            field=models.DateTimeField(auto_now_add=True, null=True),
+        ),
+    ]

+ 1 - 0
adhesions/models.py

@@ -19,6 +19,7 @@ class Adherent(models.Model):
                                    content_type_field='reason_type',
                                    object_id_field='reason_id',
                                    related_query_name='adherent')
+    created = models.DateTimeField(null=True, blank=True, auto_now_add=True)
 
     class Meta:
         verbose_name = 'adhérent'

+ 2 - 26
adhesions/templates/adhesions/adhesion.html

@@ -4,7 +4,6 @@
 
 {% block content %}
 {% if adhesion %}
-
 <div class="panel panel-default">
     <div class="panel-heading"><h4>À propos de votre adhésion</h4></div>
     <div class="panel-body">
@@ -14,34 +13,11 @@
         {% else %}
         <p>Pas de cotisation.</p>
         {% endif %}
-        {% if contribution.date %}
-        <p>Date d’adhésion : {{ contribution.date }}</p>
+        {% if adhesion.created %}
+        <p>Date de première adhésion : {{ adhesion.created }}</p>
         {% endif %}
     </div>
 </div>
-
-{% if adhesion.contribution.count > 1 %}
-<div class="panel panel-default">
-    <div class="panel-heading"><h4>Vos cotisations</h4></div>
-    <table class="table">
-        <tr>
-            <th>Montant</th>
-            <th>Période</th>
-            <th>Méthode de paiement</th>
-            <th>Premier paiement</th>
-        </tr>
-        {% for c in adhesion.contribution.all %}
-        <tr>
-            <td>{{ c.amount }} €</td>
-            <td>{{ c.period_verbose }}</td>
-            <td>{{ c.get_payment_method_display }}</td>
-            <td>{{ c.date }}</td>
-        </tr>
-        {% endfor %}
-    </table>
-</div>
-{% endif %}
-
 {% else %}
 <p>Vous n’êtes pas adhérent.</p>
 {% endif %}

+ 32 - 0
adhesions/templates/adhesions/corporation.html

@@ -0,0 +1,32 @@
+{% extends 'base.html' %}
+
+{% load djadhere services %}
+
+{% block assotab %} active{% endblock %}
+
+{% block content %}
+<div class="panel panel-default">
+    <div class="panel-heading"><h4>{{ corporation.social_reason }}</h4></div>
+    <div class="panel-body">
+        {% if corporation.adhesion %}
+        <p>Numéro d’adhérent de l’association : ADT{{ corporation.adhesion.id }}</p>
+        {% if corporation.adhesion.contribution %}
+        <p>Montant de la cotisation : {{ corporation.adhesion.contribution }}</p>
+        {% else %}
+        <p>Pas de cotisation.</p>
+        {% endif %}
+        {% if corporation.adhesion.created %}
+        <p>Date de première adhésion : {{ corporation.adhesion.created }}</p>
+        {% endif %}
+        <p>Services actifs : {{ corporation.adhesion.services|active|count }}</p>
+        <p>Services inactifs : {{ corporation.adhesion.services|inactive|count }}</p>
+        {% else %}
+        <p>Cette association n’est pas adhérente <mark>tetaneutral.net</mark>.</p>
+        {% endif %}
+    </div>
+</div>
+
+{% with services=corporation.adhesion.services.all %}
+{% include 'services/_service_list.html' %}
+{% endwith %}
+{% endblock %}

+ 2 - 1
adhesions/urls.py

@@ -4,5 +4,6 @@ from . import views
 
 
 urlpatterns = [
-    url(r'^$', views.adhesion, name='adhesion'),
+    url(r'^adhesion/$', views.adhesion, name='adhesion'),
+    url(r'^asso/(?P<pk>[0-9]+)/$', views.corporation , name='corporation'),
 ]

+ 19 - 1
adhesions/views.py

@@ -1,7 +1,25 @@
-from django.shortcuts import render
+from django.contrib.auth.decorators import login_required
+from django.core.exceptions import PermissionDenied
+from django.shortcuts import render, get_object_or_404
+from django.contrib.auth.models import User
 
+from .models import Corporation
 
+
+@login_required
 def adhesion(request):
     return render(request, 'adhesions/adhesion.html', {
         'adhesion': request.user.profile.adhesion,
     })
+
+
+@login_required
+def corporation(request, pk):
+    corporation = get_object_or_404(Corporation, pk=pk)
+    try:
+        corporation.members.get(pk=request.user.pk)
+    except User.DoesNotExist:
+        raise PermissionDenied
+    return render(request, 'adhesions/corporation.html', {
+        'corporation': corporation,
+    })

+ 2 - 0
djadhere/settings.py

@@ -55,6 +55,8 @@ MIDDLEWARE = [
     'django.contrib.auth.middleware.AuthenticationMiddleware',
     'django.contrib.messages.middleware.MessageMiddleware',
     'django.middleware.clickjacking.XFrameOptionsMiddleware',
+
+    'adhesions.middleware.CorporationMiddleware',
 ]
 
 ROOT_URLCONF = 'djadhere.urls'

+ 12 - 0
djadhere/templates/base.html

@@ -30,6 +30,18 @@
             <li{% block hometab %}{% endblock %}><a href="{% url 'home' %}"><span class="glyphicon glyphicon-home"></span>&nbsp;Accueil</a></li>
             <li{% block adhesiontab %}{% endblock %}><a href="{% url 'adhesion' %}"><span class="glyphicon glyphicon-heart-empty"></span>&nbsp;Mon adhésion</a></li>
             <li{% block servicestab %}{% endblock %}><a href="{% url 'service-list' %}"><span class="glyphicon glyphicon-list"></span>&nbsp;Mes services</a></li>
+            <li class="dropdown{% block assotab %}{% endblock %}">
+                <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
+                    <span class="glyphicon glyphicon-globe"></span>&nbsp;Mes asso <span class="caret"></span>
+                </a>
+                <ul class="dropdown-menu">
+                    {% for corp in request.corporations %}
+                    <li><a href="{% url 'corporation' corp.object.pk %}">{{ corp.object.social_reason }}</a></li>
+                    {% empty %}
+                    <li><em>Aucune associations</em></li>
+                    {% endfor %}
+                </ul>
+            </li>
           </ul>
           <ul class="nav navbar-nav navbar-right">
             {% if request.user.is_staff %}

+ 1 - 1
djadhere/urls.py

@@ -23,7 +23,7 @@ urlpatterns = [
     url(r'^$', views.home, name='home'),
     url(r'^accounts/', include('accounts.urls')),
     url(r'^services/', include('services.urls')),
-    url(r'^adhesion/', include('adhesions.urls')),
+    url(r'^', include('adhesions.urls')),
     url(r'^admin/', admin.site.urls),
 ]
 

+ 1 - 1
services/models.py

@@ -49,7 +49,7 @@ class ServiceType(models.Model):
 
 
 class Service(models.Model):
-    adherent = models.ForeignKey(Adherent, verbose_name='Adhérent', null=True, blank=True)
+    adherent = models.ForeignKey(Adherent, verbose_name='Adhérent', null=True, blank=True, related_name='services')
     service_type = models.ForeignKey(ServiceType, related_name='services',
                                      verbose_name='Type de service')
     label = models.CharField(blank=True, default='', max_length=128)

+ 25 - 0
services/templates/services/_service_list.html

@@ -0,0 +1,25 @@
+{% for service in services %}
+{% if forloop.first %}
+<div class="list-group">
+{% endif %}
+    <a href="{% url 'service-detail' service.pk %}" class="list-group-item {% if service.active %}list-group-item-success{% else %}list-group-item-danger{% endif %}">
+        <h4 class="list-group-item-heading">
+            <b>{{ service.service_type }}</b> {{ service.label }}
+        </h4>
+        {% if service.contribution.count == 1 %}
+        <p class="list-group-item-text">
+            {{ service.contribution.first }}
+        </p>
+        {% elif service.contribution.count > 1 %}
+        <p class="list-group-item-text">
+            multiples paiements
+        </p>
+        {% endif %}
+        <p class="list-group-item-text">
+            {{ service.ip_resources.all|join:", " }}
+        </p>
+    </a>
+{% if forloop.last %}
+</div>
+{% endif %}
+{% endfor %}

+ 8 - 1
services/templates/services/service_detail.html

@@ -2,10 +2,17 @@
 
 {% load bootstrap3 %}
 
-{% block servicestab %} class="active"{% endblock %}
+{% block servicestab %}{% if service.adherent == request.user.profile.adhesion %} class="active"{% endif %}{% endblock %}
+{% block assotab %}{% if service.adherent != request.user.profile.adhesion %} active{% endif %}{% endblock %}
 
 {% block content %}
+{% if service.adherent == request.user.profile.adhesion %}
 <a href="{% url 'service-list' %}" class="btn btn-primary"><span class="glyphicon glyphicon-arrow-left"></span>&nbsp;Retour à la liste de mes services</a>
+{% else %}
+<a href="{% url 'corporation' service.adherent.adherent.pk %}" class="btn btn-primary">
+    <span class="glyphicon glyphicon-arrow-left"></span>&nbsp;Retour à la liste des services de {{ service.adherent.adherent }}
+</a>
+{% endif %}
 
 <br /><br />
 

+ 3 - 25
services/templates/services/service_list.html

@@ -15,29 +15,7 @@
     {% endif %}
 </div>
 
-{% for service in object_list %}
-{% if forloop.first %}
-<div class="list-group">
-{% endif %}
-    <a href="{% url 'service-detail' service.pk %}" class="list-group-item {% if service.active %}list-group-item-success{% else %}list-group-item-danger{% endif %}">
-        <h4 class="list-group-item-heading">
-            <b>{{ service.service_type }}</b> {{ service.label }}
-        </h4>
-        {% if service.contribution.count == 1 %}
-        <p class="list-group-item-text">
-            {{ service.contribution.first }}
-        </p>
-        {% elif service.contribution.count > 1 %}
-        <p class="list-group-item-text">
-            multiples paiements
-        </p>
-        {% endif %}
-        <p class="list-group-item-text">
-            {{ service.ip_resources.all|join:", " }}
-        </p>
-    </a>
-{% if forloop.last %}
-</div>
-{% endif %}
-{% endfor %}
+{% with services=object_list %}
+{% include 'services/_service_list.html' %}
+{% endwith %}
 {% endblock %}

+ 11 - 9
services/views.py

@@ -5,15 +5,17 @@ from django.contrib.auth.mixins import LoginRequiredMixin
 from .models import Service
 
 
-class ServiceMixin:
+# Cette page liste uniquement les services de l’utilisateur
+class ServiceList(LoginRequiredMixin, ListView):
     def get_queryset(self):
-        return Service.objects.filter(adherent__pk__in=self.request.user.profile.adhesions.values_list('pk')) \
-                    .order_by('-created')
-
-
-class ServiceList(LoginRequiredMixin, ServiceMixin, ListView):
-    pass
+        if self.request.user.profile.adhesion:
+            return Service.objects.filter(adherent=self.request.user.profile.adhesion).order_by('-created')
+        else:
+            return Service.objects.none()
 
 
-class ServiceDetail(LoginRequiredMixin, ServiceMixin, DetailView):
-    pass
+# L’utilisateur peut accéder aux détails de ces services et de ceux de ces asso
+class ServiceDetail(LoginRequiredMixin, DetailView):
+    def get_queryset(self):
+        return Service.objects.filter(adherent__pk__in=self.request.user.profile.adhesions.values_list('pk')) \
+                    .order_by('-created')