3
0
Fork 0
mirror of https://github.com/nanoy42/coope synced 2024-11-17 00:43:12 +00:00
coope/users/views.py

1126 lines
34 KiB
Python
Raw Normal View History

from django.shortcuts import render, get_object_or_404, redirect
from django.urls import reverse
from django.contrib.auth.models import User, Group, Permission
from django.contrib.auth import authenticate, login, logout
from django.contrib import messages
2018-10-05 22:03:02 +00:00
from django.db.models import Q
from django.http import HttpResponse, HttpResponseRedirect
2018-11-22 21:52:15 +00:00
from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
from django.contrib.auth.decorators import login_required, permission_required
from django.forms.models import model_to_dict
2019-01-11 07:46:29 +00:00
from django.utils import timezone
2018-08-31 12:46:35 +00:00
2018-11-22 21:52:15 +00:00
import simplejson as json
2018-10-05 22:03:02 +00:00
from datetime import datetime, timedelta
from dal import autocomplete
import csv
2018-10-05 22:03:02 +00:00
2018-11-22 21:52:15 +00:00
from coopeV3.acl import admin_required, superuser_required, self_or_has_perm, active_required
2018-10-05 22:03:02 +00:00
from .models import CotisationHistory, WhiteListHistory, School
from .forms import CreateUserForm, LoginForm, CreateGroupForm, EditGroupForm, SelectUserForm, GroupsEditForm, EditPasswordForm, addCotisationHistoryForm, addCotisationHistoryForm, addWhiteListHistoryForm, SelectNonAdminUserForm, SelectNonSuperUserForm, SchoolForm, ExportForm
2018-11-30 18:54:12 +00:00
from gestion.models import Reload, Consumption, ConsumptionHistory, MenuHistory
2018-11-22 21:52:15 +00:00
@active_required
def loginView(request):
2018-11-22 21:52:15 +00:00
"""
Display the login form for :model:`User`.
**Context**
``form_entete``
Title of the form.
``form``
The login form.
``form_button``
Content of the form button.
**Template**
:template:`form.html`
"""
form = LoginForm(request.POST or None)
if(form.is_valid()):
user = authenticate(username=form.cleaned_data['username'], password=form.cleaned_data['password'])
if user is not None:
login(request, user)
messages.success(request, "Vous êtes à présent connecté sous le compte " + str(user))
if(request.user.has_perm('gestion.can_manage')):
return redirect(reverse('gestion:manage'))
else:
return redirect(reverse('users:profile', kwargs={'pk':request.user.pk}))
else:
messages.error(request, "Nom d'utilisateur et/ou mot de passe invalide")
2019-01-17 22:16:43 +00:00
return render(request, "form.html", {"form_entete": "Connexion", "form": form, "form_title": "Connexion", "form_button": "Se connecter", "form_button_icon": "sign-in-alt"})
2018-11-22 21:52:15 +00:00
@active_required
@login_required
def logoutView(request):
2018-11-22 21:52:15 +00:00
"""
Logout the logged user
"""
logout(request)
messages.success(request, "Vous êtes à présent déconnecté")
return redirect(reverse('home'))
2018-11-22 21:52:15 +00:00
@active_required
@login_required
@permission_required('auth.view_user')
def index(request):
2018-11-22 21:52:15 +00:00
"""
Display the index for user related actions
**Template**
2018-11-22 21:52:15 +00:00
:template:`users/index.html`
"""
export_form = ExportForm(request.POST or None)
return render(request, "users/index.html", {"export_form": export_form})
def export_csv(request):
export_form = ExportForm(request.POST or None)
if export_form.is_valid():
users = User.objects
qt = export_form.cleaned_data['query_type']
if qt == 'all':
2019-01-06 05:02:16 +00:00
filename = "Utilisateurs-coope"
if not export_form.cleaned_data['group']:
users = users.all()
elif qt == 'all_active':
users = users.filter(is_active=True)
2019-01-06 05:02:16 +00:00
filename = "Utilisateurs-actifs-coope"
elif qt == 'adherent':
pks = [x.pk for x in User.objects.all() if x.profile.is_adherent]
users = users.filter(pk__in=pks)
2019-01-06 05:02:16 +00:00
filename = "Adherents-coope"
elif qt == 'adherent_active':
pks = [x.pk for x in User.objects.filter(is_active=True) if x.profile.is_adherent]
users = users.filter(pk__in=pks)
2019-01-06 05:02:16 +00:00
filename = "Adherents-actifs-coope"
if export_form.cleaned_data['group']:
group = export_form.cleaned_data['group']
users = users.filter(groups=group)
filename += "(" + group.name + ")"
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="'+ filename + '.csv"'
writer = csv.writer(response)
fields = export_form.cleaned_data['fields']
top = ["#"]
for field in fields:
top.append(dict(ExportForm.FIELDS_CHOICES)[field])
writer.writerow(top)
for user in users:
row = [user.pk]
for field in fields:
2018-12-18 18:01:09 +00:00
r = getattr(user.profile, field, None)
if r is not None:
row.append(str(r))
writer.writerow(row)
return response
else:
return redirect(reverse('users:index'))
2018-10-05 22:03:02 +00:00
########## users ##########
2018-11-22 21:52:15 +00:00
@active_required
@login_required
@self_or_has_perm('pk', 'auth.view_user')
def profile(request, pk):
2018-11-22 21:52:15 +00:00
"""
Display the profile for the requested user
``pk``
The primary key for user
**Context**
``user``
The instance of User
``self``
Boolean value wich indicates if the current logged user and the request user are the same
``cotisations``
List of the user's cotisations
``whitelists``
List of the user's whitelists
``reloads``
List of the last 5 reloads of the user
**Template**
:template:`users/profile.html`
"""
user = get_object_or_404(User, pk=pk)
self = request.user == user
2018-10-05 22:03:02 +00:00
cotisations = CotisationHistory.objects.filter(user=user)
whitelists = WhiteListHistory.objects.filter(user=user)
reloads = Reload.objects.filter(customer=user).order_by('-date')[:5]
2018-11-25 23:15:09 +00:00
consumptionsChart = Consumption.objects.filter(customer=user)
2019-01-06 03:39:30 +00:00
products_pre = []
quantities_pre = []
2018-11-25 23:15:09 +00:00
for ch in consumptionsChart:
2019-01-06 03:39:30 +00:00
if ch.product in products_pre:
i = products_pre.index(ch.product)
quantities_pre[i] += int(ch.quantity/ch.product.showingMultiplier)
2018-11-25 23:15:09 +00:00
else:
2019-01-06 03:39:30 +00:00
products_pre.append(ch.product)
quantities_pre.append(int(ch.quantity/ch.product.showingMultiplier))
tot = len(products_pre)
totQ = sum(quantities_pre)
products = []
quantities = []
for k in range(tot):
if quantities_pre[k]/totQ >= 0.01:
products.append(products_pre[k])
quantities.append(quantities_pre[k])
print(products)
print(quantities)
2018-11-25 23:15:09 +00:00
lastConsumptions = ConsumptionHistory.objects.filter(customer=user).order_by('-date')[:10]
2018-11-30 18:54:12 +00:00
lastMenus = MenuHistory.objects.filter(customer=user).order_by('-date')[:10]
2018-11-25 23:15:09 +00:00
return render(request, "users/profile.html",
{
"user":user,
"self":self,
"cotisations":cotisations,
"whitelists": whitelists,
"reloads": reloads,
"products": products,
"quantities": quantities,
2018-11-30 18:54:12 +00:00
"lastConsumptions": lastConsumptions,
"lastMenus": lastMenus,
2018-11-25 23:15:09 +00:00
})
2018-11-22 21:52:15 +00:00
@active_required
@login_required
@permission_required('auth.add_user')
def createUser(request):
2018-11-22 21:52:15 +00:00
"""
Display a CreateUserForm instance.
**Context**
``form_entete``
The form title.
``form``
The CreateUserForm instance.
``form_button``
The content of the form button.
**Template**
:template:`form.html`
"""
form = CreateUserForm(request.POST or None)
if(form.is_valid()):
user = form.save(commit=False)
user.set_password(user.username)
user.save()
user.profile.school = form.cleaned_data['school']
user.save()
2018-12-05 00:43:21 +00:00
messages.success(request, "L'utilisateur a bien été créé")
return redirect(reverse('users:profile', kwargs={'pk':user.pk}))
2019-01-17 22:16:43 +00:00
return render(request, "form.html", {"form_entete": "Gestion des utilisateurs", "form":form, "form_title":"Création d'un nouvel utilisateur", "form_button":"Créer l'utilisateur", "form_button_icon": "user-plus"})
2018-11-22 21:52:15 +00:00
@active_required
@login_required
@permission_required('auth.view_user')
2018-10-05 22:03:02 +00:00
def searchUser(request):
2018-11-22 21:52:15 +00:00
"""
Display a simple searchForm for User.
**Context**
``form_entete``
The form title.
``form``
The searchForm instance.
``form_button``
The content of the form button.
**Template**
:template:`form.html`
"""
2018-10-05 22:03:02 +00:00
form = SelectUserForm(request.POST or None)
if(form.is_valid()):
return redirect(reverse('users:profile', kwargs={"pk":form.cleaned_data['user'].pk}))
2019-01-17 22:16:43 +00:00
return render(request, "form.html", {"form_entete": "Gestion des utilisateurs", "form": form, "form_title": "Rechercher un utilisateur", "form_button": "Afficher le profil", "form_button_icon": "search"})
2018-10-05 22:03:02 +00:00
2018-11-22 21:52:15 +00:00
@active_required
@login_required
@permission_required('auth.view_user')
2018-10-05 22:03:02 +00:00
def usersIndex(request):
2018-11-22 21:52:15 +00:00
"""
Display the list of all users.
**Context**
``users``
The list of all users
**Template**
:template:`users/users_index.html`
"""
2018-10-05 22:03:02 +00:00
users = User.objects.all()
return render(request, "users/users_index.html", {"users":users})
2018-11-22 21:52:15 +00:00
@active_required
@login_required
@permission_required('auth.change_user')
2018-10-05 22:03:02 +00:00
def editGroups(request, pk):
2018-11-22 21:52:15 +00:00
"""
Edit the groups of a user.
``pk``
The pk of the user.
**Context**
``form_entete``
The form title.
``form``
The GroupsEditForm instance.
``form_button``
The content of the form button.
**Template**
:template:`form.html`
"""
2018-10-05 22:03:02 +00:00
user = get_object_or_404(User, pk=pk)
form = GroupsEditForm(request.POST or None, instance=user)
if(form.is_valid()):
form.save()
messages.success(request, "Les groupes de l'utilisateur " + user.username + " ont bien été enregistrés.")
return redirect(reverse('users:profile', kwargs={'pk':pk}))
extra_css = "#id_groups{height:200px;}"
2019-01-17 22:16:43 +00:00
return render(request, "form.html", {"form_entete": "Gestion de l'utilisateur " + user.username, "form": form, "form_title": "Modification des groupes", "form_button": "Enregistrer", "form_button_icon": "pencil-alt", "extra_css": extra_css})
2018-10-05 22:03:02 +00:00
2018-11-22 21:52:15 +00:00
@active_required
@login_required
@permission_required('auth.change_user')
2018-10-05 22:03:02 +00:00
def editPassword(request, pk):
2018-11-22 21:52:15 +00:00
"""
Change the password of a user.
``pk``
The pk of the user.
**Context**
``form_entete``
The form title.
``form``
The EditPasswordForm instance.
``form_button``
The content of the form button.
**Template**
:template:`form.html`
"""
2018-10-05 22:03:02 +00:00
user = get_object_or_404(User, pk=pk)
if user != request.user:
messages.error(request, "Vous ne pouvez modifier le mot de passe d'un autre utilisateur")
return redirect(reverse('home'))
else:
form = EditPasswordForm(request.POST or None)
if(form.is_valid()):
if authenticate(username=user.username, password = form.cleaned_data['password']) is not None:
user.set_password(form.cleaned_data['password2'])
user.save()
messages.success(request, "Votre mot de passe a bien été mis à jour")
return redirect(reverse('users:profile', kwargs={'pk':pk}))
else:
messages.error(request, "Le mot de passe actuel est incorrect")
2019-01-17 22:16:43 +00:00
return render(request, "form.html", {"form_entete": "Modification de mon compte", "form": form, "form_title": "Modification de mon mot de passe", "form_button": "Modifier mon mot de passe", "form_button_icon": "pencil-alt"})
2018-10-05 22:03:02 +00:00
2018-11-22 21:52:15 +00:00
@active_required
@login_required
@permission_required('auth.change_user')
2018-10-05 22:03:02 +00:00
def editUser(request, pk):
2018-11-22 21:52:15 +00:00
"""
Edit a user and user profile
``pk``
The pk of the user.
**Context**
``form_entete``
The form title.
``form``
The CreateUserForm instance.
``form_button``
The content of the form button.
**Template**
:template:`form.html`
"""
2018-10-05 22:03:02 +00:00
user = get_object_or_404(User, pk=pk)
form = CreateUserForm(request.POST or None, instance=user, initial = {'school': user.profile.school})
if(form.is_valid()):
user.profile.school = form.cleaned_data['school']
user.save()
messages.success(request, "Les modifications ont bien été enregistrées")
return redirect(reverse('users:profile', kwargs={'pk': pk}))
2019-01-17 22:16:43 +00:00
return render(request, "form.html", {"form_entete":"Modification du compte " + user.username, "form": form, "form_title": "Modification des informations", "form_button": "Modifier", "form_button_icon": "pencil-alt"})
2018-10-05 22:03:02 +00:00
2018-11-22 21:52:15 +00:00
@active_required
@login_required
@permission_required('auth.change_user')
2018-10-05 22:03:02 +00:00
def resetPassword(request, pk):
2018-11-22 21:52:15 +00:00
"""
Reset the password of a user.
``pk``
The pk of the user
"""
2018-10-05 22:03:02 +00:00
user = get_object_or_404(User, pk=pk)
if user.is_superuser:
messages.error(request, "Impossible de réinitialiser le mot de passe de " + user.username + " : il est superuser.")
return redirect(reverse('users:profile', kwargs={'pk': pk}))
else:
user.set_password(user.username)
user.save()
messages.success(request, "Le mot de passe de " + user.username + " a bien été réinitialisé.")
return redirect(reverse('users:profile', kwargs={'pk': pk}))
2018-11-22 21:52:15 +00:00
@active_required
@login_required
@permission_required('auth.view_user')
2018-10-05 22:03:02 +00:00
def getUser(request, pk):
2018-11-22 21:52:15 +00:00
"""
Return username and balance of the requested user (pk)
``pk``
The pk of the user
"""
2018-10-05 22:03:02 +00:00
user = get_object_or_404(User, pk=pk)
2019-01-22 19:27:18 +00:00
data = json.dumps({"username": user.username, "balance": user.profile.balance, "is_adherent": user.profile.is_adherent})
2018-10-05 22:03:02 +00:00
return HttpResponse(data, content_type='application/json')
2018-11-22 21:52:15 +00:00
@active_required
@login_required
@self_or_has_perm('pk', 'auth.view_user')
def allReloads(request, pk, page):
"""
Display all the reloads of the requested user.
``pk``
The pk of the user.
``page``
The page number.
**Context**
``reloads``
The reloads of the page.
``user``
The requested user
**Template**
:template:`users/allReloads.html`
"""
user = get_object_or_404(User, pk=pk)
allReloads = Reload.objects.filter(customer=user).order_by('-date')
2018-11-30 18:54:12 +00:00
paginator = Paginator(allReloads, 10)
2018-11-22 21:52:15 +00:00
reloads = paginator.get_page(page)
return render(request, "users/allReloads.html", {"reloads": reloads, "user":user})
2018-11-30 18:54:12 +00:00
@active_required
@login_required
@self_or_has_perm('pk', 'auth.view_user')
def all_consumptions(request, pk, page):
"""
Display all the consumptions of the requested user.
``pk``
The pk of the user.
``page``
The page number.
**Context**
``reloads``
The reloads of the page.
``user``
The requested user
**Template**
:template:`users/all_consumptions.html`
"""
user = get_object_or_404(User, pk=pk)
all_consumptions = ConsumptionHistory.objects.filter(customer=user).order_by('-date')
paginator = Paginator(all_consumptions, 10)
consumptions = paginator.get_page(page)
return render(request, "users/all_consumptions.html", {"consumptions": consumptions, "user":user})
@active_required
@login_required
@self_or_has_perm('pk', 'auth.view_user')
def all_menus(request, pk, page):
"""
Display all the menus of the requested user.
``pk``
The pk of the user.
``page``
The page number.
**Context**
``reloads``
The reloads of the page.
``user``
The requested user
**Template**
:template:`users/all_menus.html`
"""
user = get_object_or_404(User, pk=pk)
all_menus = MenuHistory.objects.filter(customer=user).order_by('-date')
paginator = Paginator(all_menus, 10)
menus = paginator.get_page(page)
return render(request, "users/all_menus.html", {"menus": menus, "user":user})
2018-12-23 20:38:53 +00:00
@active_required
@login_required
@permission_required('auth.change_user')
def switch_activate_user(request, pk):
user = get_object_or_404(User, pk=pk)
user.is_active = 1 - user.is_active
user.save()
messages.success(request, "Le statut de l'utilisateur a bien été changé")
return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/'))
########## Groups ##########
2018-11-22 21:52:15 +00:00
@active_required
@login_required
@permission_required('auth.view_group')
def groupsIndex(request):
2018-11-22 21:52:15 +00:00
"""
Display all the groups.
**Context**
``groups``
List of all groups.
**Template**
:template:`users/groups_index.html`
"""
groups = Group.objects.all()
return render(request, "users/groups_index.html", {"groups": groups})
2018-11-22 21:52:15 +00:00
@active_required
@login_required
@permission_required('auth.view_group')
def groupProfile(request, pk):
2018-11-22 21:52:15 +00:00
"""
Display the profile of a group.
``pk``
The pk of the group.
**Context**
``group``
The requested group.
**Template**
:template:`users/group_profile.html`
"""
group = get_object_or_404(Group, pk=pk)
return render(request, "users/group_profile.html", {"group": group})
2018-11-22 21:52:15 +00:00
@active_required
@login_required
@permission_required('auth.add_group')
def createGroup(request):
2018-11-22 21:52:15 +00:00
"""
Create a group with a CreateGroupForm instance.
**Context**
``form_entete``
The form title.
``form``
The CreateGroupForm instance.
``form_button``
The content of the form button.
**Template**
:template:`form.html`
"""
form = CreateGroupForm(request.POST or None)
if(form.is_valid()):
group = form.save()
messages.success(request, "Le groupe " + form.cleaned_data['name'] + " a bien été crée.")
return redirect(reverse('users:groupProfile', kwargs={'pk': group.pk}))
2019-01-17 22:16:43 +00:00
return render(request, "form.html", {"form_entete": "Gestion des utilisateurs", "form":form, "form_title": "Création d'un groupe de droit", "form_button": "Créer le groupe de droit", "form_button_icon": "plus-square"})
2018-11-22 21:52:15 +00:00
@active_required
@login_required
@permission_required('auth.change_group')
def editGroup(request, pk):
2018-11-22 21:52:15 +00:00
"""
Edit a group with a EditGroupForm instance.
``pk``
The pk of the group.
**Context**
``form_entete``
The form title.
``form``
The EditGroupForm instance.
``form_button``
The content of the form button.
**Template**
:template:`form.html`
"""
group = get_object_or_404(Group, pk=pk)
form = EditGroupForm(request.POST or None, instance=group)
extra_css = "#id_permissions{height:200px;}"
if(form.is_valid()):
form.save()
messages.success(request, "Le groupe " + group.name + " a bien été modifié.")
return redirect(reverse('users:groupProfile', kwargs={'pk': group.pk}))
2019-01-17 22:16:43 +00:00
return render(request, "form.html", {"form_entete": "Gestion des utilisateurs", "form": form, "form_title": "Modification du groupe de droit " + group.name, "form_button": "Modifier le groupe de droit", "form_button_icon": "pencil-alt", "extra_css":extra_css})
2018-11-22 21:52:15 +00:00
@active_required
@login_required
@permission_required('auth.delete_group')
def deleteGroup(request, pk):
2018-11-22 21:52:15 +00:00
"""
Delete the requested group.
``pk``
The pk of the group
"""
group = get_object_or_404(Group, pk=pk)
if group.user_set.count() == 0:
name = group.name
group.delete()
messages.success(request, "Le groupe " + name + " a bien été supprimé")
return redirect(reverse('users:index') + '#second')
else:
messages.error(request, "Impossible de supprimer le groupe " + group.name + " : il y a encore des utilisateurs")
return redirect(reverse('users:groupProfile', kwargs={'pk': group.pk}))
2018-11-22 21:52:15 +00:00
@active_required
@login_required
@permission_required('auth.change_group')
def removeRight(request, groupPk, permissionPk):
2018-11-22 21:52:15 +00:00
"""
Remove a right from a given group.
``groupPk``
The pk of the group.
``permissionPk``
The pk of the right.
"""
group = get_object_or_404(Group, pk=groupPk)
perm = get_object_or_404(Permission, pk=permissionPk)
if perm in group.permissions.all():
group.permissions.remove(perm)
messages.success(request, "La permission " + perm.codename + " a bien été retirée du groupe " + group.name)
else:
messages.error(request, "Impossible de retirer la permission " + perm.codename + " du groupe " + group.name)
return redirect(reverse('users:groupProfile', kwargs={'pk': groupPk}) + "#second")
2018-11-22 21:52:15 +00:00
@active_required
@login_required
@permission_required('auth.change_user')
def removeUser(request, groupPk, userPk):
2018-11-22 21:52:15 +00:00
"""
Remove a user from a given group.
``groupPk``
The pk of the group.
``userPk``
The pk of the user.
"""
group = get_object_or_404(Group, pk=groupPk)
user = get_object_or_404(User, pk=userPk)
if(group in user.groups.all()):
user.groups.remove(group)
messages.success(request, "L'utilisateur " + user.username + " a bien été retiré du groupe " + group.name)
else:
messages.error(request, "Impossible de retirer l'utilisateur " + user.username + " du groupe " + group.name)
return redirect(reverse('users:groupProfile', kwargs={'pk': groupPk}) + "#second")
########## admins ##########
2018-11-22 21:52:15 +00:00
@active_required
@login_required
@admin_required
def adminsIndex(request):
2018-12-02 15:28:40 +00:00
"""
Lists the staff
**Context**
``admins``
List of staff
**Template**
:template:`users/admins_index.html`
"""
admins = User.objects.filter(is_staff=True)
return render(request, "users/admins_index.html", {"admins": admins})
2018-11-22 21:52:15 +00:00
@active_required
@login_required
@admin_required
def addAdmin(request):
2018-12-02 15:28:40 +00:00
"""
Form to add a member to staff
**Context**
``form``
The SelectNonAdminUserForm form instance
``form_title``
The title of the form
``form_button``
The text of the button
**Template**
:template:`form.html`
"""
2018-10-05 22:03:02 +00:00
form = SelectNonAdminUserForm(request.POST or None)
if(form.is_valid()):
user = form.cleaned_data['user']
user.is_staff = True
user.save()
messages.success(request, "L'utilisateur " + user.username + " a bien été rajouté aux admins")
return redirect(reverse('users:adminsIndex'))
2019-01-17 22:16:43 +00:00
return render(request, "form.html", {"form": form, "form_title": "Ajout d'un admin", "form_button": "Ajouter l'utilisateur aux admins", "form_button_icon": "user-plus"})
2018-11-22 21:52:15 +00:00
@active_required
@login_required
@admin_required
def removeAdmin(request, pk):
2018-12-02 15:28:40 +00:00
"""
Remove an user form staff
``pk``
The primary key of the user
"""
user = get_object_or_404(User, pk=pk)
if user.is_staff:
if user.is_superuser:
messages.error(request, "Impossible de retirer l'utilisateur " + user.username + " des admins : il est superuser")
else:
if User.objects.filter(is_staff=True).count() > 1:
user.is_staff = False
user.save()
messages.success(request, "L'utilisateur " + user.username + " a bien été retiré des admins.")
else:
messages.error(request, "Impossible de retirer l'utilisateur " + user.username + " des admins : il doit en rester au moins un.")
else:
messages.error(request, "Impossible de retirer l'utilisateur " + user.username + " des admins : il n'en fait pas partie.")
return redirect(reverse('users:adminsIndex'))
########## superusers ##########
2018-11-22 21:52:15 +00:00
@active_required
@login_required
@superuser_required
def superusersIndex(request):
2018-12-02 15:28:40 +00:00
"""
Lists the superusers
**Context**
``superusers``
List of superusers
**Template**
:template:`users/superusers_index.html`
"""
superusers = User.objects.filter(is_superuser=True)
return render(request, "users/superusers_index.html", {"superusers": superusers})
2018-11-22 21:52:15 +00:00
@active_required
@login_required
@superuser_required
def addSuperuser(request):
2018-12-02 15:28:40 +00:00
"""
Displays a form to add a superuser
**Context**
``form``
The SelectNonSuperUserForm form instance
``form_title``
The title of the form
``form_button``
The text of the button
**Template**
:template:`form.html`
"""
2018-10-05 22:03:02 +00:00
form = SelectNonSuperUserForm(request.POST or None)
2018-12-02 15:28:40 +00:00
if form.is_valid():
user = form.cleaned_data['user']
user.is_admin = True
user.is_superuser = True
user.save()
messages.success(request, "L'utilisateur " + user.username + " a bien été rajouté aux superusers")
return redirect(reverse('users:superusersIndex'))
2019-01-17 22:16:43 +00:00
return render(request, "form.html", {"form_entete": "Gestion des superusers", "form": form, "form_title": "Ajout d'un superuser", "form_button":"Ajouter l'utilisateur aux superusers", "form_button_icon": "user-plus"})
2018-11-22 21:52:15 +00:00
@active_required
@login_required
@superuser_required
def removeSuperuser(request, pk):
2018-12-02 15:28:40 +00:00
"""
Removes a user from superusers
``pk``
The primary key of the user
"""
user = get_object_or_404(User, pk=pk)
if user.is_superuser:
if User.objects.filter(is_superuser=True).count() > 1:
user.is_superuser = False
user.save()
messages.success(request, "L'utilisateur " + user.username + " a bien été retiré des superusers.")
else:
messages.error(request, "Impossible de retirer l'utilisateur " + user.username + " des superusers : il doit en rester au moins un.")
else:
messages.error(request, "Impossible de retirer l'utilisateur " + user.username + " des superusers : il n'en fait pas partie.")
return redirect(reverse('users:superusersIndex'))
2018-10-05 22:03:02 +00:00
########## Cotisations ##########
2018-11-22 21:52:15 +00:00
@active_required
@login_required
@permission_required('users.add_cotisationhistory')
2018-10-05 22:03:02 +00:00
def addCotisationHistory(request, pk):
2018-12-02 15:28:40 +00:00
"""
Add a cotisation to the requested user
``pk``
The primary key of the user
**Context**
``form``
The addCotisationHistoryForm form instance
``form_title``
The title of the form
``form_button``
The text of the button
**Template**
:template:`form.html`
"""
2018-10-05 22:03:02 +00:00
user = get_object_or_404(User, pk=pk)
form = addCotisationHistoryForm(request.POST or None)
if(form.is_valid()):
cotisation = form.save(commit=False)
2018-11-22 21:52:15 +00:00
if(cotisation.paymentMethod.affect_balance):
2018-11-25 12:52:32 +00:00
if(user.profile.balance >= cotisation.cotisation.amount):
user.profile.debit += cotisation.cotisation.amount
2018-11-22 21:52:15 +00:00
else:
messages.error(request, "Solde insuffisant")
2018-11-27 08:07:12 +00:00
return redirect(reverse('users:profile',kwargs={'pk':user.pk}))
2018-10-05 22:03:02 +00:00
cotisation.user = user
cotisation.coopeman = request.user
cotisation.amount = cotisation.cotisation.amount
cotisation.duration = cotisation.cotisation.duration
2019-01-11 07:46:29 +00:00
if(user.profile.cotisationEnd and user.profile.cotisationEnd > timezone.now()):
2018-10-05 22:03:02 +00:00
cotisation.endDate = user.profile.cotisationEnd + timedelta(days=cotisation.cotisation.duration)
else:
cotisation.endDate = datetime.now() + timedelta(days=cotisation.cotisation.duration)
user.profile.cotisationEnd = cotisation.endDate
user.save()
cotisation.save()
messages.success(request, "La cotisation a bien été ajoutée")
return redirect(reverse('users:profile',kwargs={'pk':user.pk}))
2019-01-17 22:16:43 +00:00
return render(request, "form.html",{"form": form, "form_title": "Ajout d'une cotisation pour l'utilisateur " + str(user), "form_button": "Ajouter", "form_button_icon": "plus-square"})
2018-10-05 22:03:02 +00:00
2018-11-22 21:52:15 +00:00
@active_required
@login_required
2018-12-02 15:28:40 +00:00
@permission_required('users.validate_cotisationhistory')
2018-10-05 22:03:02 +00:00
def validateCotisationHistory(request, pk):
2018-12-02 15:28:40 +00:00
"""
Validate the requested :model:`users.CotisationHistory`
``pk``
The primary key of the :model:`users.CotisationHistory`
"""
2018-10-05 22:03:02 +00:00
cotisationHistory = get_object_or_404(CotisationHistory, pk=pk)
cotisationHistory.valid = CotisationHistory.VALID
cotisationHistory.save()
messages.success(request, "La cotisation a bien été validée")
return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
2018-11-22 21:52:15 +00:00
@active_required
@login_required
2018-12-02 15:28:40 +00:00
@permission_required('users.validate_cotisationhistory')
2018-10-05 22:03:02 +00:00
def invalidateCotisationHistory(request, pk):
2018-12-02 15:28:40 +00:00
"""
Invalidate the requested :model:`users.CotisationHistory`
``pk``
The primary key of the :model:`users.CotisationHistory`
"""
2018-10-05 22:03:02 +00:00
cotisationHistory = get_object_or_404(CotisationHistory, pk=pk)
cotisationHistory.valid = CotisationHistory.INVALID
cotisationHistory.save()
user = cotisationHistory.user
user.profile.cotisationEnd = user.profile.cotisationEnd - timedelta(days=cotisationHistory.duration)
2018-11-22 21:52:15 +00:00
if(cotisationHistory.paymentMethod.affect_balance):
2019-01-23 09:42:54 +00:00
user.profile.debit -= cotisationHistory.cotisation.amount
2018-10-05 22:03:02 +00:00
user.save()
messages.success(request, "La cotisation a bien été invalidée")
return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
########## Whitelist ##########
2018-11-22 21:52:15 +00:00
@active_required
@login_required
@permission_required('users.add_whitelisthistory')
2018-10-05 22:03:02 +00:00
def addWhiteListHistory(request, pk):
2018-12-02 15:28:40 +00:00
"""
Add a :model:`users.WhitelistHistory` to the requested user
``pk``
The primary key of the user
**Context**
``form``
The addWhiteListHistoryForm form instance
``form_title``
The title of the form
``form_button``
The text of the button
**Template**
:template:`form.html`
"""
2018-10-05 22:03:02 +00:00
user = get_object_or_404(User, pk=pk)
form = addWhiteListHistoryForm(request.POST or None)
if(form.is_valid()):
whiteList = form.save(commit=False)
whiteList.user = user
whiteList.coopeman = request.user
if(user.profile.cotisationEnd):
whiteList.endDate = user.profile.cotisationEnd + timedelta(days=whiteList.duration)
else:
2018-11-27 08:07:12 +00:00
whiteList.endDate = datetime.now() + timedelta(days=whiteList.duration)
2018-10-05 22:03:02 +00:00
user.profile.cotisationEnd = whiteList.endDate
user.save()
whiteList.save()
messages.success(request, "L'accès gracieux a bien été ajouté")
return redirect(reverse('users:profile', kwargs={'pk':user.pk}))
2019-01-17 22:16:43 +00:00
return render(request, "form.html", {"form": form, "form_title": "Ajout d'un accès gracieux pour " + user.username, "form_button": "Ajouter", "form_button_icon": "plus-square"})
2018-10-05 22:03:02 +00:00
########## Schools ##########
2018-11-22 21:52:15 +00:00
@active_required
@login_required
@permission_required('users.view_school')
2018-10-05 22:03:02 +00:00
def schoolsIndex(request):
2018-12-02 15:28:40 +00:00
"""
Lists the :model:`users.School`
**Context**
``schools``
List of the :model:`users.School`
**Template**
:template:`users/schools_index.html`
"""
2018-10-05 22:03:02 +00:00
schools = School.objects.all()
return render(request, "users/schools_index.html", {"schools": schools})
2018-11-22 21:52:15 +00:00
@active_required
@login_required
@permission_required('users.add_school')
2018-10-05 22:03:02 +00:00
def createSchool(request):
2018-12-02 15:28:40 +00:00
"""
Displays form to create :model:`users.School`
**Context**
``form``
The SchoolForm form instance
``form_title``
The title of the form
``form_button``
The text of the button
**Template**
:template:`form.html`
"""
2018-10-05 22:03:02 +00:00
form = SchoolForm(request.POST or None)
2018-12-02 15:28:40 +00:00
if form.is_valid():
2018-10-05 22:03:02 +00:00
form.save()
messages.success(request, "L'école a bien été créée")
return redirect(reverse('users:schoolsIndex'))
2019-01-17 22:16:43 +00:00
return render(request, "form.html", {"form": form, "form_title": "Création d'une école", "form_button": "Créer", "form_button_icon": "plus-square"})
2018-10-05 22:03:02 +00:00
2018-11-22 21:52:15 +00:00
@active_required
@login_required
@permission_required('users.change_school')
2018-10-05 22:03:02 +00:00
def editSchool(request, pk):
2018-12-02 15:28:40 +00:00
"""
Displays form to create :model:`users.School`
``pk``
The primary key of :model:`users.School`
**Context**
``form``
The SchoolForm form instance
``form_title``
The title of the form
``form_button``
The text of the button
**Template**
:template:`form.html`
"""
2018-10-05 22:03:02 +00:00
school = get_object_or_404(School, pk=pk)
form = SchoolForm(request.POST or None, instance=school)
if(form.is_valid()):
form.save()
messages.success(request, "L'école a bien été modifiée")
return redirect(reverse('users:schoolsIndex'))
2019-01-17 22:16:43 +00:00
return render(request, "form.html", {"form": form, "form_title": "Modification de l'école " + str(school), "form_button": "Modifier", "form_button": "pencil-alt"})
2018-10-05 22:03:02 +00:00
2018-11-22 21:52:15 +00:00
@active_required
@login_required
@permission_required('users.delete_school')
2018-10-05 22:03:02 +00:00
def deleteSchool(request, pk):
2018-12-02 15:28:40 +00:00
"""
Delete a :model:`users.School`
``pk``
The primary key of the school to delete
"""
2018-10-05 22:03:02 +00:00
school = get_object_or_404(School, pk=pk)
message = "L'école " + str(school) + " a bien été supprimée"
school.delete()
messages.success(request, message)
return redirect(reverse('users:schoolsIndex'))
########## Autocomplete searchs ##########
class AllUsersAutocomplete(autocomplete.Select2QuerySetView):
2018-12-02 15:28:40 +00:00
"""
Autcomplete for all users
"""
2018-10-05 22:03:02 +00:00
def get_queryset(self):
qs = User.objects.all()
if self.q:
2019-01-23 11:31:33 +00:00
qs = qs.filter(Q(username__icontains=self.q) | Q(first_name__icontains=self.q) | Q(last_name__icontains=self.q))
2018-10-05 22:03:02 +00:00
return qs
class ActiveUsersAutocomplete(autocomplete.Select2QuerySetView):
2018-12-02 15:28:40 +00:00
"""
Autocomplete for active users
"""
2018-10-05 22:03:02 +00:00
def get_queryset(self):
qs = User.objects.filter(is_active=True)
if self.q:
2019-01-23 11:31:33 +00:00
qs = qs.filter(Q(username__icontains=self.q) | Q(first_name__icontains=self.q) | Q(last_name__icontains=self.q))
2018-10-05 22:03:02 +00:00
return qs
class AdherentAutocomplete(autocomplete.Select2QuerySetView):
2018-12-02 15:28:40 +00:00
"""
Autocomplete for adherents
"""
2018-10-05 22:03:02 +00:00
def get_queryset(self):
qs = User.objects.all()
2019-01-23 09:49:33 +00:00
pks = [x.pk for x in qs if x.is_adherent]
qs = User.objects.filter(pk__in=pks)
if self.q:
2019-01-23 11:31:33 +00:00
qs = qs.filter(Q(username__icontains=self.q) | Q(first_name__icontains=self.q) | Q(last_name__icontains=self.q))
2018-10-05 22:03:02 +00:00
return qs
2019-01-23 09:49:33 +00:00
2018-10-05 22:03:02 +00:00
class NonSuperUserAutocomplete(autocomplete.Select2QuerySetView):
2018-12-02 15:28:40 +00:00
"""
Autocomplete for non-superuser users
"""
2018-10-05 22:03:02 +00:00
def get_queryset(self):
qs = User.objects.filter(is_superuser=False)
2018-11-22 21:52:15 +00:00
if self.q:
2019-01-23 11:31:33 +00:00
qs = qs.filter(Q(username__icontains=self.q) | Q(first_name__icontains=self.q) | Q(last_name__icontains=self.q))
2018-11-22 21:52:15 +00:00
return qs
class NonAdminUserAutocomplete(autocomplete.Select2QuerySetView):
2018-12-02 15:28:40 +00:00
"""
Autocomplete for non-admin users
"""
2018-11-22 21:52:15 +00:00
def get_queryset(self):
qs = User.objects.filter(is_staff=False)
2018-10-05 22:03:02 +00:00
if self.q:
2019-01-23 11:31:33 +00:00
qs = qs.filter(Q(username__icontains=self.q) | Q(first_name__icontains=self.q) | Q(last_name__icontains=self.q))
2018-10-05 22:03:02 +00:00
return qs