@ -1,220 +1,266 @@
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 . urls import reverse , reverse_lazy
from django . shortcuts import get_object_or_404 , redirect
from . models import UserProfile , SchoolProfile
from content . models import Content
class CreateUser ( CreateView ) :
model = User
fields = [
' first_name ' ,
' last_name ' ,
' email ' ,
' username ' ,
' password ' ,
]
template_name = ' edit.html '
def get_success_url ( self ) :
return reverse (
' users:create-userprofile ' ,
kwargs = { ' pk ' : self . object . pk }
from django . core . mail import send_mail
from django . shortcuts import get_object_or_404 , redirect , render
from django . contrib . admin . views . decorators import staff_member_required
from django . template . loader import render_to_string
from django . contrib . auth import views as auth_views
from settings . forms import SelectUserForm
from content . models import Category
from . models import School
from . import forms
@staff_member_required
def create_user ( request ) :
user_form = forms . CreateUser ( request . POST or None )
if user_form . is_valid ( ) :
u = user_form . save ( )
send_mail (
" Bienvenue sur Il était une fois dans l ' Est. " ,
render_to_string ( " users/welcome_user.txt " , { ' id ' : u . username } ) ,
" noreply.festart@rezometz.org " ,
[ u . email ] ,
fail_silently = False
)
def get_context_data ( self , * * kwargs ) :
context = super ( ) . get_context_data ( * * kwargs )
context [ ' title ' ] = " Inscription "
context [ ' validate ' ] = " S ' inscrire "
return context
def form_valid ( self , form ) :
r = super ( ) . form_valid ( form )
self . object . set_password ( form . cleaned_data [ ' password ' ] )
self . object . save ( )
messages . success ( request , " L ' utilisateur {} {} a bien été créé un mail lui a été envoyé pour réinitialiser son mot de passe. " . format (
u . first_name , u . last_name ) )
return redirect ( reverse ( ' settings:index ' ) )
return render ( request , ' edit.html ' , {
' form ' : user_form ,
' title ' : " Création d ' un utilisateur " ,
' validate ' : " Créer "
} )
@staff_member_required
def create_school ( request ) :
school_form = forms . CreateSchool ( request . POST or None )
if school_form . is_valid ( ) :
s = school_form . save ( )
messages . success (
request , " L ' école {} a bien été créée. " . format ( s . name ) )
return redirect ( reverse ( ' settings:index ' ) )
return render ( request , ' edit.html ' , {
' form ' : school_form ,
' title ' : " Création d ' une école " ,
' validate ' : " Créer "
} )
def school ( request , pk ) :
school = get_object_or_404 ( School , pk = pk )
can = request . user . is_staff or request . user == school . admin
if not can :
messages . error ( request , ' Vous ne pouvez pas accéder à cette page ' )
return redirect ( reverse ( ' home ' ) )
return render ( request , ' users/school.html ' , { ' school ' : school } )
def edit_phone ( request , pk ) :
school = get_object_or_404 ( School , pk = pk )
can = request . user . is_staff or request . user == school . admin
if not can :
messages . error ( request , ' Vous ne pouvez pas accéder à cette page ' )
return redirect ( reverse ( ' home ' ) )
school_form = forms . EditPhone ( request . POST or None , instance = school )
if school_form . is_valid ( ) :
s = school_form . save ( )
messages . success (
request , " L ' école {} a bien été modifiée. " . format ( s . name ) )
return redirect ( s . get_absolute_url ( ) )
return render ( request , ' edit.html ' , {
' form ' : school_form ,
' title ' : " Édition du numéro de téléphone " ,
' validate ' : " Modifier "
} )
def edit_logo ( request , pk ) :
school = get_object_or_404 ( School , pk = pk )
can = request . user . is_staff or request . user == school . admin
if not can :
messages . error ( request , ' Vous ne pouvez pas accéder à cette page ' )
return redirect ( reverse ( ' home ' ) )
school_form = forms . EditLogo ( request . POST or None , instance = school )
if school_form . is_valid ( ) :
s = school_form . save ( )
messages . success (
request , " L ' école {} a bien été modifiée. " . format ( s . name ) )
return redirect ( s . get_absolute_url ( ) )
return render ( request , ' edit.html ' , {
' form ' : school_form ,
' title ' : " Édition du logo " ,
' validate ' : " Modifier "
} )
def edit_mail ( request , pk ) :
school = get_object_or_404 ( School , pk = pk )
can = request . user . is_staff or request . user == school . admin
if not can :
messages . error ( request , ' Vous ne pouvez pas accéder à cette page ' )
return redirect ( reverse ( ' home ' ) )
user_form = forms . EditMail ( request . POST or None , instance = school . admin )
if user_form . is_valid ( ) :
s = user_form . save ( )
messages . success (
request , " L ' école {} a bien été modifiée. " . format ( s . school . name ) )
return redirect ( s . school . get_absolute_url ( ) )
return render ( request , ' edit.html ' , {
' form ' : user_form ,
' title ' : " Édition du numéro du mail " ,
' validate ' : " Modifier "
} )
def edit_jury_1 ( request , pk ) :
school = get_object_or_404 ( School , pk = pk )
can = request . user . is_staff or request . user == school . admin
if not can :
messages . error ( request , ' Vous ne pouvez pas accéder à cette page ' )
return redirect ( reverse ( ' home ' ) )
school_form = forms . EditJury1 ( request . POST or None , instance = school )
if school_form . is_valid ( ) :
s = school_form . save ( )
messages . success (
request , " L ' école {} a bien été modifiée. " . format ( s . name ) )
return redirect ( s . get_absolute_url ( ) )
return render ( request , ' edit.html ' , {
' form ' : school_form ,
' title ' : " Édition du jury 1 " ,
' validate ' : " Modifier "
} )
def edit_jury_2 ( request , pk ) :
school = get_object_or_404 ( School , pk = pk )
can = request . user . is_staff or request . user == school . admin
if not can :
messages . error ( request , ' Vous ne pouvez pas accéder à cette page ' )
return redirect ( reverse ( ' home ' ) )
school_form = forms . EditJury2 ( request . POST or None , instance = school )
if school_form . is_valid ( ) :
s = school_form . save ( )
messages . success (
request , " L ' école {} a bien été modifiée. " . format ( s . name ) )
return redirect ( s . get_absolute_url ( ) )
return render ( request , ' edit.html ' , {
' form ' : school_form ,
' title ' : " Édition du jury 2 " ,
' validate ' : " Modifier "
} )
def edit_name ( request , pk ) :
school = get_object_or_404 ( School , pk = pk )
can = request . user . is_staff or request . user == school . admin
if not can :
messages . error ( request , ' Vous ne pouvez pas accéder à cette page ' )
return redirect ( reverse ( ' home ' ) )
school_form = forms . EditName ( request . POST or None , instance = school )
if school_form . is_valid ( ) :
s = school_form . save ( )
messages . success (
request , " L ' école {} a bien été modifiée. " . format ( s . name ) )
return redirect ( s . get_absolute_url ( ) )
return render ( request , ' edit.html ' , {
' form ' : school_form ,
' title ' : " Édition du nom " ,
' validate ' : " Modifier "
} )
@staff_member_required
def edit_admin ( request , pk ) :
school = get_object_or_404 ( School , pk = pk )
user_form = SelectUserForm ( request . POST or None )
user_form . populate ( )
if user_form . is_valid ( ) :
user = user_form . get_user ( )
school . admin = user
school . save ( )
user . save ( )
messages . success ( request , user . username +
' a été nommé admin de ' + school . name )
return redirect ( reverse ( ' settings:index ' ) )
return render ( request , ' edit.html ' , {
' form ' : user_form ,
' title ' : " Définir l ' administrateur de {} " . format ( school . name ) ,
' validate ' : ' Ajouter '
} )
def validate ( request , pk ) :
school = get_object_or_404 ( School , pk = pk )
can = request . user . is_staff or request . user == school . admin
if not can :
messages . error ( request , ' Vous ne pouvez pas accéder à cette page ' )
return redirect ( reverse ( ' home ' ) )
jury_1_ok = any ( [
school . first_name_j1 ,
school . last_name_j1 ,
school . phone_j1 ,
school . mail_j1
] )
jury_2_ok = any ( [
school . first_name_j2 ,
school . last_name_j2 ,
school . phone_j2 ,
school . mail_j2
] )
logo_ok = school . logo
phone_ok = school . phone
mail_ok = school . admin . email
if not jury_1_ok :
messages . warning ( request , ' Pas de jury n°1 défini. ' )
if not jury_2_ok :
messages . warning ( request , ' Pas de jury n°2 défini. ' )
if not logo_ok :
messages . warning ( request , ' Pas de logo défini. ' )
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. ' )
for category in Category . objects . all ( ) :
if not category . content_set . filter ( school_owner = school ) :
messages . warning (
request , ' Pas de contenu dans la catégorie {} . ' . format ( category . name ) )
if phone_ok and mail_ok :
school . validated = True
school . save ( )
messages . success ( request , ' Inscription validée. ' )
return redirect ( school . get_absolute_url ( ) )
class PasswordChangeDoneView ( auth_views . PasswordChangeDoneView ) :
template_name = " home.html "
def dispatch ( self , * args , * * kwargs ) :
r = super ( ) . dispatch ( * args , * * kwargs )
messages . success ( self . request , " Le mot de passe a été changé. " )
return r
class Profile ( LoginRequiredMixin , UpdateView ) :
model = User
template_name = ' users/profile.html '
fields = [
' username ' ,
' first_name ' ,
' last_name ' ,
' email '
]
def get_context_data ( self , * * kwargs ) :
context = super ( ) . get_context_data ( * * kwargs )
context [ ' title ' ] = self . object . username
context [ ' validate ' ] = " Modifier "
return context
def get_success_url ( self ) :
return reverse (
' users:profile ' ,
kwargs = { ' pk ' : self . object . pk }
)
class CreateUserProfile ( CreateView ) :
model = UserProfile
fields = [ ' school ' ]
template_name = ' edit.html '
class PasswordResetView ( auth_views . PasswordResetView ) :
template_name = " edit.html "
success_url = reverse_lazy ( ' home ' )
def get_context_data ( self , * * kwargs ) :
context = super ( ) . get_context_data ( * * kwargs )
context [ ' title ' ] = " Choix de l ' école "
context [ ' validate ' ] = " Choisir "
return context
email_template_name = " users/password_reset_mail.html "
def form_valid ( self , form ) :
form . instance . user = get_object_or_404 ( User , pk = self . kwargs [ ' pk ' ] )
return super ( CreateUserProfile , self ) . form_valid ( form )
messages . success ( self . request , " Un mail pour le changement de mot de passe a été envoyé. " )
return super ( ) . form_valid ( form )
class CreateSchool ( LoginRequiredMixin , PermissionRequiredMixin , CreateView ) :
permission_required = ' users.add_schoolprofile '
model = Group
fields = [ ' name ' ]
template_name = ' edit.html '
success_url = reverse_lazy ( ' settings:index ' )
def get_context_data ( self , * * kwargs ) :
context = super ( ) . get_context_data ( * * kwargs )
context [ ' title ' ] = " Création de l ' école "
context [ ' validate ' ] = " Créer "
return context
class PasswordResetCompleteView ( auth_views . PasswordResetCompleteView ) :
template_name = " home.html "
def form_valid ( self , form ) :
response = super ( CreateSchool , self ) . form_valid ( form )
profile = SchoolProfile ( )
profile . group = form . instance
profile . save ( )
return response
class EditSchoolName ( LoginRequiredMixin , PermissionRequiredMixin , UpdateView ) :
model = Group
fields = [ ' name ' ]
template_name = ' edit.html '
queryset = Group . objects . filter ( school__isnull = False )
def get_success_url ( self ) :
return reverse ( ' users:edit-school-phone ' , kwargs = { ' pk ' : self . object . school . pk } )
def get_context_data ( self , * * kwargs ) :
context = super ( ) . get_context_data ( * * kwargs )
context [ ' title ' ] = " Édition de l ' école "
context [ ' validate ' ] = " Modifier "
return context
def has_permission ( self ) :
return self . request . user . has_perm ( ' users.manage_ ' + str ( self . kwargs [ ' pk ' ] ) )
def form_valid ( self , * args , * * kwargs ) :
r = super ( ) . form_valid ( * args , * * kwargs )
self . object . school . save ( )
def dispatch ( self , * args , * * kwargs ) :
r = super ( ) . dispatch ( * args , * * kwargs )
messages . success ( self . request , " Votre mot de passe a été réinitialisé. " )
return r
class EditSchoolPhone ( LoginRequiredMixin , PermissionRequiredMixin , UpdateView ) :
model = SchoolProfile
fields = [ ' phone ' ]
template_name = ' edit.html '
def get_success_url ( self ) :
return reverse ( ' users:school ' , kwargs = { ' pk ' : self . object . group . pk } )
def get_context_data ( self , * * kwargs ) :
context = super ( ) . get_context_data ( * * kwargs )
context [ ' title ' ] = " Édition de l ' école "
context [ ' validate ' ] = " Modifier "
return context
def has_permission ( self ) :
return self . request . user . has_perm ( ' users.manage_ ' + str ( self . kwargs [ ' pk ' ] ) )
class DeleteSchool ( LoginRequiredMixin , PermissionRequiredMixin , DeleteView ) :
model = Group
permission_required = ' users.delete_schoolprofile '
queryset = Group . objects . filter ( school__isnull = False )
class School ( LoginRequiredMixin , PermissionRequiredMixin , DetailView ) :
model = Group
template_name = " users/school.html "
queryset = Group . objects . filter ( school__isnull = False )
def get_context_data ( self , * * kwargs ) :
context = super ( ) . get_context_data ( )
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 )
context [ ' manager_group ' ] , _ = Group . objects . get_or_create ( name = str ( self . object . pk ) + ' _admins ' )
return context
def has_permission ( self ) :
return self . request . user . has_perm ( ' users.view_ ' + str ( self . kwargs [ ' pk ' ] ) )
class Logout ( SuccessMessageMixin , LogoutView ) :
success_message = " Vous vous êtes bien déconnecté. "
class Login ( SuccessMessageMixin , LoginView ) :
template_name = " edit.html "
success_message = " Bienvenue ! "
extra_context = {
' title ' : " Connexion " ,
' validate ' : " Se connecter " ,
}
class PasswordChange ( SuccessMessageMixin , PasswordChangeView ) :
template_name = " edit.html "
success_url = reverse_lazy ( " home " )
success_message = " Le mot de passe a été changé. "
extra_context = {
' title ' : " Changer le mot de passe " ,
' validate ' : " Changer " ,
}
@login_required
def promote_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 . add ( admins )
user . save ( )
messages . success ( request , user . username + ' a été ajouté aux 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 ' )
@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 ' )