Browse Source

nouvelles vues pour users

master
Hugo LEVY-FALK 8 years ago
parent
commit
0303710d26
  1. 56
      users/forms.py
  2. 4
      users/models.py
  3. 45
      users/templates/users/school.html
  4. 76
      users/urls.py
  5. 374
      users/views.py

56
users/forms.py

@ -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'
]

4
users/models.py

@ -36,6 +36,10 @@ class School(models.Model):
null=True, null=True,
blank=False, blank=False,
) )
validated = models.BooleanField(
verbose_name="Inscription validé.",
default=False
)
first_name_j1 = models.CharField( first_name_j1 = models.CharField(
max_length=255, max_length=255,
verbose_name="Prénom juré n°1" verbose_name="Prénom juré n°1"

45
users/templates/users/school.html

@ -2,50 +2,17 @@
{% load bootstrap4 %} {% load bootstrap4 %}
{% block content %} {% block content %}
<h1>{{object.name}}</h1> <h1>{{school.name}}</h1>
{% if manager_right in perms %} {% if manager_right in perms %}
Numéro de téléphone : Numéro de téléphone :
{% if object.school.phone %}{{object.school.phone}} {% if school.phone %}{{school.phone}}
<a class="btn btn-primary btn-sm" href="{% url 'users:edit-school-name' object.pk %}">
<i class="fa fa-edit"></i>
Éditer
</a>
{%else%} {%else%}
Non indiqué{%endif%}<br/> Non indiqué{%endif%}<br/>
{%endif%} {%endif%}
{% if manager_right in perms %} <a class="btn btn-primary btn-sm" href="{% url 'users:edit-school-name' school.pk %}">
<h2>Membres</h2> <i class="fa fa-edit"></i>
<table class="table table-striped"> Éditer
<thead> </a>
<th>Nom</th>
<th>Prénom</th>
<th>Pseudo</th>
<th>Administrer</th>
</thead>
<tbody>
{% for member in members %}
<tr>
<td>{{member.last_name}}</td>
<td>{{member.first_name}}</td>
<td>{{member.username}}</td>
<td>
{% if member in manager_group.user_set.all %}
<a class="btn btn-outline-danger btn-sm" href="{% url 'users:degrade-user' object.pk member.pk %}">
<i class="fa fa-trash"></i>
Enlever le privilège Administrateur
</a>
{% else %}
<a class="btn btn-outline-warning btn-sm" href="{% url 'users:promote-user' object.pk member.pk %}">
<i class="fa fa-star"></i>
Promouvoir administrateur
</a>
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endif %}
<h2>Contenus</h2> <h2>Contenus</h2>
{% if manager_right in perms %} {% if manager_right in perms %}
<a class="btn btn-success btn-sm" href="{% url 'content:content-new' %}"> <a class="btn btn-success btn-sm" href="{% url 'content:content-new' %}">

76
users/urls.py

@ -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'
), ),
] ]

374
users/views.py

@ -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…
Cancel
Save