5 changed files with 265 additions and 290 deletions
@ -0,0 +1,56 @@ |
|||||
|
from django import forms |
||||
|
from django.contrib.auth.models import User |
||||
|
|
||||
|
from .models import School |
||||
|
|
||||
|
|
||||
|
class CreateSchool(forms.ModelForm): |
||||
|
class Meta: |
||||
|
model = User |
||||
|
fields = '__all__' |
||||
|
|
||||
|
|
||||
|
class CreateUser(forms.ModelForm): |
||||
|
class Meta: |
||||
|
model = User |
||||
|
fields = '__all__' |
||||
|
|
||||
|
|
||||
|
class EditPhone(forms.ModelForm): |
||||
|
class Meta: |
||||
|
model = School |
||||
|
fields = ['phone'] |
||||
|
|
||||
|
|
||||
|
class EditLogo(forms.ModelForm): |
||||
|
class Meta: |
||||
|
model = School |
||||
|
fields = ['logo'] |
||||
|
|
||||
|
|
||||
|
class EditMail(forms.ModelForm): |
||||
|
class Meta: |
||||
|
model = User |
||||
|
fields = ['email'] |
||||
|
|
||||
|
|
||||
|
class EditJury1(forms.ModelForm): |
||||
|
class Meta: |
||||
|
model = School |
||||
|
fields = [ |
||||
|
'first_name_j1', |
||||
|
'last_name_j1', |
||||
|
'phone_j1', |
||||
|
'mail_j1' |
||||
|
] |
||||
|
|
||||
|
|
||||
|
class EditJury2(forms.ModelForm): |
||||
|
class Meta: |
||||
|
model = School |
||||
|
fields = [ |
||||
|
'first_name_j2', |
||||
|
'last_name_j2', |
||||
|
'phone_j2', |
||||
|
'mail_j2' |
||||
|
] |
||||
@ -1,79 +1,45 @@ |
|||||
from django.urls import path |
from django.urls import path, include |
||||
from .views import ( |
from . import views |
||||
CreateUser, |
|
||||
CreateSchool, |
|
||||
EditSchoolName, |
|
||||
EditSchoolPhone, |
|
||||
DeleteSchool, |
|
||||
Login, |
|
||||
Logout, |
|
||||
PasswordChange, |
|
||||
Profile, |
|
||||
School, |
|
||||
promote_user, |
|
||||
degrade_user |
|
||||
) |
|
||||
|
|
||||
app_name = 'users' |
app_name = 'users' |
||||
urlpatterns = [ |
urlpatterns = [ |
||||
path( |
path( |
||||
'user/new', |
'user/new', |
||||
CreateUser.as_view(), |
views.create_user, |
||||
name='new-user' |
name='new-user' |
||||
), |
), |
||||
path( |
path( |
||||
'login', |
'user/', |
||||
Login.as_view(), |
include('django.contrib.auth.urls') |
||||
name='login' |
|
||||
), |
|
||||
path( |
|
||||
'logout', |
|
||||
Logout.as_view(), |
|
||||
name='logout', |
|
||||
), |
|
||||
path( |
|
||||
'change_password', |
|
||||
PasswordChange.as_view(), |
|
||||
name='change-password' |
|
||||
), |
|
||||
path( |
|
||||
'user/<int:pk>', |
|
||||
Profile.as_view(), |
|
||||
name='profile', |
|
||||
), |
), |
||||
path( |
path( |
||||
'school/new', |
'school/new', |
||||
CreateSchool.as_view(), |
views.create_school, |
||||
name='new-school' |
name='new-school' |
||||
), |
), |
||||
path( |
path( |
||||
'school/<int:pk>', |
'school/<int:pk>', |
||||
School.as_view(), |
views.school, |
||||
name='school' |
name='school', |
||||
), |
) |
||||
path( |
path( |
||||
'school/<int:school_pk>/degrade/<int:user_pk>', |
'school/<int:pk>/edit_phone', |
||||
degrade_user, |
views.edit_phone, |
||||
name='degrade-user' |
name='edit-school-phone' |
||||
), |
|
||||
path( |
|
||||
'school/<int:school_pk>/promote/<int:user_pk>', |
|
||||
promote_user, |
|
||||
name='promote-user' |
|
||||
), |
), |
||||
path( |
path( |
||||
'school/<int:pk>/edit_name', |
'school/<int:pk>/edit_mail', |
||||
EditSchoolName.as_view(), |
views.edit_mail, |
||||
name='edit-school-name' |
name='edit-school-mail' |
||||
), |
), |
||||
path( |
path( |
||||
'school/<int:pk>/edit_phone', |
'school/<int:pk>/jury_1', |
||||
EditSchoolPhone.as_view(), |
views.edit_jury_1, |
||||
name='edit-school-phone' |
name='edit-jury-1' |
||||
), |
), |
||||
path( |
path( |
||||
'school/<int:pk>/delete', |
'school/<int:pk>/jury_2', |
||||
DeleteSchool.as_view(), |
views.edit_jury_2, |
||||
name='delete-school' |
name='edit-jury-2' |
||||
), |
), |
||||
] |
] |
||||
|
|||||
@ -1,199 +1,181 @@ |
|||||
from django.contrib.auth.models import User, Group |
|
||||
from django.contrib.auth.mixins import PermissionRequiredMixin, LoginRequiredMixin |
|
||||
from django.views.generic import CreateView, UpdateView, DeleteView, DetailView |
|
||||
from django.contrib.auth.views import LoginView, LogoutView, PasswordChangeView, login_required |
|
||||
from django.contrib.auth.hashers import make_password |
|
||||
from django.contrib.messages.views import SuccessMessageMixin |
|
||||
from django.contrib import messages |
from django.contrib import messages |
||||
from django.urls import reverse, reverse_lazy |
from django.urls import reverse |
||||
from django.shortcuts import get_object_or_404, redirect |
from django.shortcuts import get_object_or_404, redirect, render |
||||
|
from django.contrib.admin.views.decorators import staff_member_required |
||||
|
|
||||
|
from content.models import Category |
||||
|
|
||||
from .models import School |
from .models import School |
||||
from content.models import Content |
from . import forms |
||||
|
|
||||
|
|
||||
class CreateUser(CreateView): |
@staff_member_required |
||||
model = User |
def create_user(request): |
||||
fields = [ |
user_form = forms.CreateUser(request.POST or None) |
||||
'first_name', |
if user_form.is_valid(): |
||||
'last_name', |
u = user_form.save() |
||||
'email', |
messages.success(request, "L'utilisateur {} {} a bien été créé.".format( |
||||
'username', |
u.first_name, u.last_name)) |
||||
'password', |
return redirect(reverse('settings:index')) |
||||
] |
return render(request, 'edit.html', { |
||||
template_name = 'edit.html' |
'form': user_form, |
||||
|
'title': "Création d'un utilisateur", |
||||
def get_success_url(self): |
'validate': "Créer" |
||||
return reverse( |
}) |
||||
'users:create-userprofile', |
|
||||
kwargs={'pk': self.object.pk} |
|
||||
) |
@staff_member_required |
||||
|
def create_school(request): |
||||
def get_context_data(self, **kwargs): |
school_form = forms.CreateSchool(request.POST or None) |
||||
context = super().get_context_data(**kwargs) |
if school_form.is_valid(): |
||||
context['title'] = "Inscription" |
s = school_form.save() |
||||
context['validate'] = "S'inscrire" |
messages.success(request, "L'école {} a bien été créée.".format(s.name)) |
||||
return context |
return redirect(redirect('settings:index')) |
||||
|
return render(request, 'edit.html', { |
||||
def form_valid(self, form): |
'form': school_form, |
||||
r = super().form_valid(form) |
'title': "Création d'une école", |
||||
self.object.set_password(form.cleaned_data['password']) |
'validate': "Créer" |
||||
self.object.save() |
}) |
||||
return r |
|
||||
|
|
||||
class Profile(LoginRequiredMixin, UpdateView): |
def school(request, pk): |
||||
model = User |
school = get_object_or_404(School, pk=pk) |
||||
template_name = 'users/profile.html' |
can = request.user.is_staff or request.user == school.admin |
||||
fields = [ |
if not can: |
||||
'username', |
messages.error(request, 'Vous ne pouvez pas accéder à cette page') |
||||
'first_name', |
return redirect(reverse('home')) |
||||
'last_name', |
return render(request, 'users/school.html', {'school':school}) |
||||
'email' |
|
||||
] |
|
||||
|
def edit_phone(request, pk): |
||||
def get_context_data(self, **kwargs): |
school = get_object_or_404(School, pk=pk) |
||||
context = super().get_context_data(**kwargs) |
can = request.user.is_staff or request.user == school.admin |
||||
context['title'] = self.object.username |
if not can: |
||||
context['validate'] = "Modifier" |
messages.error(request, 'Vous ne pouvez pas accéder à cette page') |
||||
return context |
return redirect(reverse('settings:index')) |
||||
|
school_form = forms.EditPhone(request.POST or None, instance=school) |
||||
def get_success_url(self): |
if school_form.is_valid(): |
||||
return reverse( |
s = school_form.save() |
||||
'users:profile', |
messages.success(request, "L'école {} a bien été modifiée.".format(s.name)) |
||||
kwargs={'pk': self.object.pk} |
return redirect(redirect('settings:index')) |
||||
) |
return render(request, 'edit.html', { |
||||
|
'form': school_form, |
||||
|
'title': "Édition du numéro de téléphone", |
||||
class CreateSchool(LoginRequiredMixin, PermissionRequiredMixin, CreateView): |
'validate': "Modifier" |
||||
permission_required = 'users.add_schoolprofile' |
}) |
||||
model = School |
|
||||
fields = ['name'] |
|
||||
template_name = 'edit.html' |
def edit_logo(request, pk): |
||||
success_url = reverse_lazy('settings:index') |
school = get_object_or_404(School, pk=pk) |
||||
|
can = request.user.is_staff or request.user == school.admin |
||||
def get_context_data(self, **kwargs): |
if not can: |
||||
context = super().get_context_data(**kwargs) |
messages.error(request, 'Vous ne pouvez pas accéder à cette page') |
||||
context['title'] = "Création de l'école" |
return redirect(reverse('settings:index')) |
||||
context['validate'] = "Créer" |
school_form = forms.EditLogo(request.POST or None, instance=school) |
||||
return context |
if school_form.is_valid(): |
||||
|
s = school_form.save() |
||||
def form_valid(self, form): |
messages.success(request, "L'école {} a bien été modifiée.".format(s.name)) |
||||
response = super(CreateSchool, self).form_valid(form) |
return redirect(redirect('settings:index')) |
||||
profile = School() |
return render(request, 'edit.html', { |
||||
profile.group = form.instance |
'form': school_form, |
||||
profile.save() |
'title': "Édition du logo", |
||||
return response |
'validate': "Modifier" |
||||
|
}) |
||||
|
|
||||
class EditSchoolName(LoginRequiredMixin, PermissionRequiredMixin, UpdateView): |
|
||||
model = School |
def edit_mail(request, pk): |
||||
fields = ['name'] |
school = get_object_or_404(School, pk=pk) |
||||
template_name = 'edit.html' |
can = request.user.is_staff or request.user == school.admin |
||||
|
if not can: |
||||
def get_success_url(self): |
messages.error(request, 'Vous ne pouvez pas accéder à cette page') |
||||
return reverse('users:edit-school-phone', kwargs={'pk':self.object.school.pk}) |
return redirect(reverse('settings:index')) |
||||
|
user_form = forms.EditMail(request.POST or None, instance=school.admin) |
||||
def get_context_data(self, **kwargs): |
if user_form.is_valid(): |
||||
context = super().get_context_data(**kwargs) |
s = user_form.save() |
||||
context['title'] = "Édition de l'école" |
messages.success(request, "L'école {} a bien été modifiée.".format(s.name)) |
||||
context['validate'] = "Modifier" |
return redirect(redirect('settings:index')) |
||||
return context |
return render(request, 'edit.html', { |
||||
|
'form': user_form, |
||||
def has_permission(self): |
'title': "Édition du numéro du mail", |
||||
return self.request.user.has_perm('users.manage_'+str(self.kwargs['pk'])) |
'validate': "Modifier" |
||||
|
}) |
||||
def form_valid(self, *args, **kwargs): |
|
||||
r = super().form_valid(*args, **kwargs) |
|
||||
self.object.school.save() |
def edit_jury_1(request, pk): |
||||
return r |
school = get_object_or_404(School, pk=pk) |
||||
|
can = request.user.is_staff or request.user == school.admin |
||||
|
if not can: |
||||
class EditSchoolPhone(LoginRequiredMixin, PermissionRequiredMixin, UpdateView): |
messages.error(request, 'Vous ne pouvez pas accéder à cette page') |
||||
model = School |
return redirect(reverse('settings:index')) |
||||
fields = ['phone'] |
school_form = forms.EditJury1(request.POST or None, instance=school) |
||||
template_name = 'edit.html' |
if school_form.is_valid(): |
||||
|
s = school_form.save() |
||||
def get_success_url(self): |
messages.success(request, "L'école {} a bien été modifiée.".format(s.name)) |
||||
return reverse('users:school', kwargs={'pk':self.object.group.pk}) |
return redirect(redirect('settings:index')) |
||||
|
return render(request, 'edit.html', { |
||||
def get_context_data(self, **kwargs): |
'form': school_form, |
||||
context = super().get_context_data(**kwargs) |
'title': "Édition du jury 1", |
||||
context['title'] = "Édition de l'école" |
'validate': "Modifier" |
||||
context['validate'] = "Modifier" |
}) |
||||
return context |
|
||||
|
|
||||
def has_permission(self): |
def edit_jury_2(request, pk): |
||||
return self.request.user.has_perm('users.manage_'+str(self.kwargs['pk'])) |
school = get_object_or_404(School, pk=pk) |
||||
|
can = request.user.is_staff or request.user == school.admin |
||||
|
if not can: |
||||
class DeleteSchool(LoginRequiredMixin, PermissionRequiredMixin, DeleteView): |
messages.error(request, 'Vous ne pouvez pas accéder à cette page') |
||||
model = Group |
return redirect(reverse('settings:index')) |
||||
permission_required = 'users.delete_schoolprofile' |
school_form = forms.EditJury2(request.POST or None, instance=school) |
||||
|
if school_form.is_valid(): |
||||
|
s = school_form.save() |
||||
class School(LoginRequiredMixin, PermissionRequiredMixin, DetailView): |
messages.success(request, "L'école {} a bien été modifiée.".format(s.name)) |
||||
model = Group |
return redirect(redirect('settings:index')) |
||||
template_name = "users/school.html" |
return render(request, 'edit.html', { |
||||
|
'form': school_form, |
||||
def get_context_data(self, **kwargs): |
'title': "Édition du jury 2", |
||||
context = super().get_context_data() |
'validate': "Modifier" |
||||
context['contents'] = Content.objects.filter(school_owner=self.object.school) |
}) |
||||
context['school'] = True |
|
||||
context['members'] = User.objects.filter(userprofile__school=self.object.school) |
|
||||
context['manager_right'] = 'users.manage_' + str(self.object.pk) |
def validate(request, pk): |
||||
context['manager_group'],_ = Group.objects.get_or_create(name=str(self.object.pk)+'_admins') |
school = get_object_or_404(School, pk=pk) |
||||
return context |
can = request.user.is_staff or request.user == school.admin |
||||
|
if not can: |
||||
def has_permission(self): |
messages.error(request, 'Vous ne pouvez pas accéder à cette page') |
||||
return self.request.user.has_perm('users.view_'+str(self.kwargs['pk'])) |
return redirect(reverse('settings:index')) |
||||
|
jury_1_ok = any([ |
||||
|
school.first_name_j1 is not None, |
||||
class Logout(SuccessMessageMixin, LogoutView): |
school.last_name_j1 is not None, |
||||
success_message = "Vous vous êtes bien déconnecté." |
school.phone_j1 is not None, |
||||
|
school.mail_j1 is not None |
||||
|
]) |
||||
class Login(SuccessMessageMixin, LoginView): |
jury_2_ok = any([ |
||||
template_name = "edit.html" |
school.first_name_j2 is not None, |
||||
success_message = "Bienvenue !" |
school.last_name_j2 is not None, |
||||
extra_context = { |
school.phone_j2 is not None, |
||||
'title' : "Connexion", |
school.mail_j2 is not None |
||||
'validate' : "Se connecter", |
]) |
||||
} |
logo_ok = school.logo is not None |
||||
|
phone_ok = school.phone is not None |
||||
|
mail_ok = school.admin.email is not None |
||||
class PasswordChange(SuccessMessageMixin, PasswordChangeView): |
if not jury_1_ok: |
||||
template_name = "edit.html" |
messages.warning(request, 'Pas de jury n°1 défini.') |
||||
success_url = reverse_lazy("home") |
if not jury_2_ok: |
||||
success_message = "Le mot de passe a été changé." |
messages.warning(request, 'Pas de jury n°2 défini.') |
||||
extra_context = { |
if not logo_ok: |
||||
'title' : "Changer le mot de passe", |
messages.warning(request, 'Pas de logo défini.') |
||||
'validate' : "Changer", |
if not phone_ok: |
||||
} |
messages.error(request, 'Pas de téléphone défini.') |
||||
|
if not mail_ok: |
||||
|
messages.error(request, 'Pas de mail défini.') |
||||
@login_required |
|
||||
def promote_user(request, school_pk, user_pk): |
for category in Category.objects.all(): |
||||
school = get_object_or_404(Group, pk=school_pk) |
if not category.content_set.filter(school_owner=school): |
||||
user = get_object_or_404(User, pk=user_pk) |
messages.warning(request, 'Pas de contenu dans la catégorie {}.'.format(category.name)) |
||||
if request.user.has_perm('manage_'+str(school.pk)): |
|
||||
admins,_ = Group.objects.get_or_create(name=str(school.pk)+'_admins') |
if phone_ok and mail_ok: |
||||
user.groups.add(admins) |
school.validated = True |
||||
user.save() |
school.save() |
||||
messages.success(request, user.username + ' a été ajouté aux administrateurs de ' + school.name) |
messages.success(request, 'Inscription validée.') |
||||
return redirect(reverse('users:school', kwargs={'pk':school.pk})) |
|
||||
messages.error(request, "Vous n'aves pas ce droit.") |
return redirect(reverse('settings:index')) |
||||
return redirect('home') |
|
||||
|
|
||||
|
|
||||
@login_required |
|
||||
def degrade_user(request, school_pk, user_pk): |
|
||||
school = get_object_or_404(Group, pk=school_pk) |
|
||||
user = get_object_or_404(User, pk=user_pk) |
|
||||
if request.user.has_perm('manage_'+str(school.pk)): |
|
||||
admins,_ = Group.objects.get_or_create(name=str(school.pk)+'_admins') |
|
||||
user.groups.remove(admins) |
|
||||
user.save() |
|
||||
messages.success(request, user.username + ' a été enlevé des administrateurs de ' + school.name) |
|
||||
return redirect(reverse('users:school', kwargs={'pk':school.pk})) |
|
||||
messages.error(request, "Vous n'aves pas ce droit.") |
|
||||
return redirect('home') |
|
||||
|
|||||
Loading…
Reference in new issue