diff --git a/coopeV3/acl.py b/coopeV3/acl.py
new file mode 100644
index 0000000..c1b38f1
--- /dev/null
+++ b/coopeV3/acl.py
@@ -0,0 +1,66 @@
+from django.contrib.auth.decorators import user_passes_test
+from django.contrib.auth.models import User
+from django.shortcuts import redirect, get_object_or_404
+from django.urls import reverse
+
+from preferences.models import GeneralPreferences
+
+def admin_required(view):
+ """
+ Test if the user is staff
+ """
+ return user_passes_test(view, lambda u:u.is_staff)
+
+def superuser_required(view):
+ """
+ Test if the user is superuser
+ """
+ return user_passes_test(view, lambda u:u.is_superuser)
+
+def self_or_has_perm(pkName, perm):
+ """
+ Test if the user is the request user (pk) or has perm permission
+ """
+ def decorator(view):
+ def wrapper(request, *args, **kwargs):
+ user = get_object_or_404(User, pk=kwargs[pkName])
+ if(user == request.user or request.user.has_perm(perm)):
+ return view(request, *args, **kwargs)
+ else:
+ return redirect(reverse('users:login'))
+ return wrapper
+ return decorator
+
+def active_required(view):
+ def wrapper(request, *args, **kwargs):
+ gp,_ = GeneralPreferences.objects.get_or_create(pk=1)
+ if(not gp.is_active):
+ return redirect(reverse('preferences:inactif'))
+ return view(request, *args, **kwargs)
+ return wrapper
+
+def acl_or(*perms):
+ def decorator(view):
+ def wrapper(request,*args, **kwargs):
+ can_pass = request.user.has_perm(perms[0])
+ for perm in perms:
+ can_pass = can_pass or request.user.has_perm(perm)
+ if can_pass:
+ return view(request, *args, **kwargs)
+ else:
+ return redirect(reverse('users:login'))
+ return wrapper
+ return decorator
+
+def acl_and(*perms):
+ def decorator(view):
+ def wrapper(request,*args, **kwargs):
+ can_pass = request.user.has_perm(perms[0])
+ for perm in perms:
+ can_pass = can_pass and request.user.has_perm(perm)
+ if can_pass:
+ return view(request, *args, **kwargs)
+ else:
+ return redirect(reverse('users:login'))
+ return wrapper
+ return decorator
\ No newline at end of file
diff --git a/gestion/templates/gestion/annual_ranking.html b/gestion/templates/gestion/annual_ranking.html
new file mode 100644
index 0000000..e3ea586
--- /dev/null
+++ b/gestion/templates/gestion/annual_ranking.html
@@ -0,0 +1,24 @@
+{% extends "base.html" %}
+{%load static %}
+{%block entete%}
Classement
{%endblock%}
+{% block nav %}
+
+{% endblock %}
+{% block content %}
+
+
+
+
+
+
+ Dû à des problèmes techniques, cet onglet n'est actuellement pas disponible.
+
+
+
+
+
+{%endblock%}
\ No newline at end of file
diff --git a/gestion/templates/gestion/product_profile.html b/gestion/templates/gestion/product_profile.html
new file mode 100644
index 0000000..acc131b
--- /dev/null
+++ b/gestion/templates/gestion/product_profile.html
@@ -0,0 +1,24 @@
+{% extends "base.html" %}
+{% block entete %}Gestion des utilisateurs
{% endblock %}
+{% block navbar %}
+
+{% endblock %}
+{% block content %}
+
+
+ (Dés)Activer Modifier Supprimer
+ Nom : {{ product.name }}
+ Prix de vente : {{ product.amount }}€
+ Stock en soute : {{ product.stockHold }}
+ Stock au bar : {{ product.stockBar }}
+ Code Barre : {{ product.barcode }}
+ Catégorie : {{ product.category }}
+ Actif : {{ product.active }}
+ Dégré : {{ product.deg }}
+ Volume : {{ product.volume }}cl
+
+{% endblock %}
diff --git a/gestion/templates/gestion/ranking.html b/gestion/templates/gestion/ranking.html
new file mode 100644
index 0000000..e7de54b
--- /dev/null
+++ b/gestion/templates/gestion/ranking.html
@@ -0,0 +1,73 @@
+{% extends "base.html" %}
+{%load static %}
+{%block entete%}Classement
{%endblock%}
+{% block nav %}
+
+{% endblock %}
+{% block content %}
+
+
+
+
+ Meilleurs consommateurs (débit)
+
+
+
+
+
+
+ Place |
+ Pseudo |
+ Debit |
+
+
+
+ {%for customer in bestBuyers%}
+
+ {{ forloop.counter }} |
+ {{ customer.username }} |
+ {{ customer.profile.debit }}€ |
+
+ {%endfor%}
+
+
+
+
+
+
+
+
+
+
+
+ Meilleurs consommateurs (alcool)
+
+
+
+
+
+
+ Place |
+ Pseudo |
+ Nombre de kilos ingérés |
+
+
+
+ {% for customer in bestDrinkers %}
+
+ {{ forloop.counter }} |
+ {{ customer.0.username }} |
+ {{ customer.1 }} |
+
+ {%endfor%}
+
+
+
+
+
+
+
+{%endblock%}
\ No newline at end of file
diff --git a/preferences/migrations/0002_auto_20181009_1119.py b/preferences/migrations/0002_auto_20181009_1119.py
new file mode 100644
index 0000000..8bcfa51
--- /dev/null
+++ b/preferences/migrations/0002_auto_20181009_1119.py
@@ -0,0 +1,33 @@
+# Generated by Django 2.1 on 2018-10-09 09:19
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('preferences', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='paymentmethod',
+ name='is_usable_in_reload',
+ field=models.BooleanField(default=True, verbose_name='Rechargements ?'),
+ ),
+ migrations.AlterField(
+ model_name='paymentmethod',
+ name='affect_balance',
+ field=models.BooleanField(default=False, verbose_name='Affecte le solde'),
+ ),
+ migrations.AlterField(
+ model_name='paymentmethod',
+ name='is_active',
+ field=models.BooleanField(default=True, verbose_name='Actif'),
+ ),
+ migrations.AlterField(
+ model_name='paymentmethod',
+ name='is_usable_in_cotisation',
+ field=models.BooleanField(default=True, verbose_name='Cotisations ?'),
+ ),
+ ]
diff --git a/users/migrations/0002_auto_20181009_1119.py b/users/migrations/0002_auto_20181009_1119.py
new file mode 100644
index 0000000..768d95e
--- /dev/null
+++ b/users/migrations/0002_auto_20181009_1119.py
@@ -0,0 +1,18 @@
+# Generated by Django 2.1 on 2018-10-09 09:19
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('users', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='school',
+ name='name',
+ field=models.CharField(max_length=255, verbose_name='Nom'),
+ ),
+ ]
diff --git a/users/templates/users/allReloads.html b/users/templates/users/allReloads.html
new file mode 100644
index 0000000..2b0895e
--- /dev/null
+++ b/users/templates/users/allReloads.html
@@ -0,0 +1,55 @@
+{% extends "base.html" %}
+{% load static %}
+{% block entete %}Rechargements
{%endblock%}
+
+{% block navbar %}
+
+{% endblock %}
+{% block content %}
+
+
+ Rechargements ({{user}})
+
+
+
+
+
+
+ Montant |
+ Type de Rechargement |
+ Date |
+
+
+
+ {% for reload in reloads %}
+
+ {{reload.amount}}€ |
+ {{reload.PaymentMethod}} |
+ {{reload.date}} |
+
+ {% endfor %}
+
+
+
+
+
+
+{%endblock%}