2017-09-10 14:53:02 +00:00
# -*- mode: python; coding: utf-8 -*-
2017-01-15 23:01:18 +00:00
# Re2o est un logiciel d'administration développé initiallement au rezometz. Il
# se veut agnostique au réseau considéré, de manière à être installable en
# quelques clics.
#
# Copyright © 2017 Gabriel Détraz
# Copyright © 2017 Goulven Kermarec
# Copyright © 2017 Augustin Lemesle
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
2017-10-14 18:18:12 +00:00
"""
Definition des forms pour l ' application users.
2017-01-15 23:01:18 +00:00
2017-10-14 18:18:12 +00:00
Modification , creation de :
- un user ( informations personnelles )
- un bannissement
- le mot de passe d ' un user
- une whiteliste
- un user de service
"""
2016-07-01 20:47:08 +00:00
2017-09-10 23:29:24 +00:00
from __future__ import unicode_literals
2016-07-01 20:47:08 +00:00
from django import forms
2017-07-06 17:01:04 +00:00
from django . forms import ModelForm , Form
2016-07-08 01:12:28 +00:00
from django . contrib . auth . forms import ReadOnlyPasswordHashField
2016-11-21 19:14:25 +00:00
from django . core . validators import MinLengthValidator
2017-05-26 01:07:10 +00:00
from django . utils import timezone
2017-12-31 16:11:19 +00:00
from django . contrib . auth . models import Group , Permission
2018-08-15 17:15:26 +00:00
from django . utils . translation import ugettext_lazy as _
2018-09-20 13:38:36 +00:00
from django . utils . safestring import mark_safe
2016-07-08 01:12:28 +00:00
2018-08-28 18:18:09 +00:00
from machines . models import Interface , Machine , Nas
from topologie . models import Port
2017-10-14 18:18:12 +00:00
from preferences . models import OptionalUser
2018-04-26 13:08:04 +00:00
from re2o . utils import remove_user_room , get_input_formats_help_text
2018-04-14 23:16:49 +00:00
from re2o . mixins import FormRevMixin
from re2o . field_permissions import FieldPermissionFormMixin
2018-09-20 08:57:31 +00:00
from preferences . models import GeneralOption
2018-05-05 15:58:13 +00:00
from . widgets import DateTimePicker
2018-03-24 18:06:49 +00:00
from . models import (
User ,
ServiceUser ,
School ,
ListRight ,
Whitelist ,
2018-08-01 11:06:25 +00:00
EMailAddress ,
2018-03-24 18:06:49 +00:00
ListShell ,
Ban ,
Adherent ,
Club
)
2017-12-28 16:47:02 +00:00
2016-07-01 20:47:08 +00:00
2018-03-31 15:18:39 +00:00
class PassForm ( FormRevMixin , FieldPermissionFormMixin , forms . ModelForm ) :
2017-10-14 18:18:12 +00:00
""" Formulaire de changement de mot de passe. Verifie que les 2
nouveaux mots de passe renseignés sont identiques et respectent
une norme """
2018-01-31 04:51:47 +00:00
selfpasswd = forms . CharField (
2018-08-15 17:15:26 +00:00
label = _ ( " Current password " ) ,
2018-01-31 04:51:47 +00:00
max_length = 255 ,
widget = forms . PasswordInput
)
2017-10-14 18:18:12 +00:00
passwd1 = forms . CharField (
2018-08-15 17:15:26 +00:00
label = _ ( " New password " ) ,
2017-10-14 18:18:12 +00:00
max_length = 255 ,
validators = [ MinLengthValidator ( 8 ) ] ,
widget = forms . PasswordInput
)
passwd2 = forms . CharField (
2018-08-15 17:15:26 +00:00
label = _ ( " New password confirmation " ) ,
2017-10-14 18:18:12 +00:00
max_length = 255 ,
validators = [ MinLengthValidator ( 8 ) ] ,
widget = forms . PasswordInput
)
2016-07-08 01:12:28 +00:00
2018-01-31 04:51:47 +00:00
class Meta :
model = User
fields = [ ]
2017-09-21 16:47:47 +00:00
def clean_passwd2 ( self ) :
2017-10-14 18:18:12 +00:00
""" Verifie que passwd1 et 2 sont identiques """
2017-09-21 16:47:47 +00:00
# Check that the two password entries match
password1 = self . cleaned_data . get ( " passwd1 " )
password2 = self . cleaned_data . get ( " passwd2 " )
if password1 and password2 and password1 != password2 :
2018-04-14 01:25:05 +00:00
raise forms . ValidationError (
2018-08-15 17:15:26 +00:00
_ ( " The new passwords don ' t match. " )
2018-04-14 01:25:05 +00:00
)
2017-09-21 16:47:47 +00:00
return password2
2016-07-08 01:12:28 +00:00
2018-01-31 04:51:47 +00:00
def clean_selfpasswd ( self ) :
""" Verifie si il y a lieu que le mdp self est correct """
2018-04-14 01:25:05 +00:00
if not self . instance . check_password (
2018-04-14 23:16:49 +00:00
self . cleaned_data . get ( " selfpasswd " )
) :
2018-08-15 17:15:26 +00:00
raise forms . ValidationError ( _ ( " The current password is incorrect. " ) )
2018-01-31 04:51:47 +00:00
return
def save ( self , commit = True ) :
""" Changement du mot de passe """
user = super ( PassForm , self ) . save ( commit = False )
user . set_password ( self . cleaned_data . get ( " passwd1 " ) )
user . save ( )
2017-10-14 18:18:12 +00:00
2018-03-31 15:18:39 +00:00
class UserCreationForm ( FormRevMixin , forms . ModelForm ) :
2016-07-08 01:12:28 +00:00
""" A form for creating new users. Includes all the required
2017-10-14 18:18:12 +00:00
fields , plus a repeated password .
Formulaire pour la création d ' un user. N ' est utilisé que pour
l ' admin, lors de la creation d ' un user par admin . Inclu tous les
champs obligatoires """
password1 = forms . CharField (
2018-08-15 17:15:26 +00:00
label = _ ( " Password " ) ,
2017-10-14 18:18:12 +00:00
widget = forms . PasswordInput ,
validators = [ MinLengthValidator ( 8 ) ] ,
max_length = 255
)
password2 = forms . CharField (
2018-08-15 17:15:26 +00:00
label = _ ( " Password confirmation " ) ,
2017-10-14 18:18:12 +00:00
widget = forms . PasswordInput ,
validators = [ MinLengthValidator ( 8 ) ] ,
max_length = 255
)
2018-08-15 17:15:26 +00:00
is_admin = forms . BooleanField ( label = _ ( " Is admin " ) )
2016-07-08 01:12:28 +00:00
2017-10-08 20:22:04 +00:00
def __init__ ( self , * args , * * kwargs ) :
2017-10-08 23:34:49 +00:00
prefix = kwargs . pop ( ' prefix ' , self . Meta . model . __name__ )
2017-10-08 20:22:04 +00:00
super ( UserCreationForm , self ) . __init__ ( * args , prefix = prefix , * * kwargs )
2018-08-09 21:43:35 +00:00
def clean_email ( self ) :
if not OptionalUser . objects . first ( ) . local_email_domain in self . cleaned_data . get ( ' email ' ) :
return self . cleaned_data . get ( ' email ' ) . lower ( )
else :
2018-08-15 17:15:26 +00:00
raise forms . ValidationError ( _ ( " You can ' t use an internal address "
" as your external address. " ) )
2018-08-09 21:43:35 +00:00
2016-07-08 01:12:28 +00:00
class Meta :
2017-10-23 03:02:55 +00:00
model = Adherent
2018-07-30 15:00:41 +00:00
fields = ( ' pseudo ' , ' surname ' , ' email ' )
2016-07-08 01:12:28 +00:00
def clean_password2 ( self ) :
2017-10-14 18:18:12 +00:00
""" Verifie que password1 et 2 sont identiques """
2016-07-08 01:12:28 +00:00
# Check that the two password entries match
password1 = self . cleaned_data . get ( " password1 " )
password2 = self . cleaned_data . get ( " password2 " )
if password1 and password2 and password1 != password2 :
2018-08-15 17:15:26 +00:00
raise forms . ValidationError ( _ ( " The passwords don ' t match. " ) )
2016-07-08 01:12:28 +00:00
return password2
def save ( self , commit = True ) :
# Save the provided password in hashed format
user = super ( UserCreationForm , self ) . save ( commit = False )
user . set_password ( self . cleaned_data [ " password1 " ] )
user . save ( )
user . is_admin = self . cleaned_data . get ( " is_admin " )
return user
2017-10-14 18:18:12 +00:00
2018-03-31 15:18:39 +00:00
class ServiceUserCreationForm ( FormRevMixin , forms . ModelForm ) :
2016-07-31 03:03:07 +00:00
""" A form for creating new users. Includes all the required
2017-10-14 18:18:12 +00:00
fields , plus a repeated password .
Formulaire pour la creation de nouveaux serviceusers .
Requiert seulement un mot de passe ; et un pseudo """
password1 = forms . CharField (
2018-08-15 17:15:26 +00:00
label = _ ( " Password " ) ,
2017-10-14 18:18:12 +00:00
widget = forms . PasswordInput ,
min_length = 8 ,
max_length = 255
)
password2 = forms . CharField (
2018-08-15 17:15:26 +00:00
label = _ ( " Password confirmation " ) ,
2017-10-14 18:18:12 +00:00
widget = forms . PasswordInput ,
min_length = 8 ,
max_length = 255
)
2016-07-31 03:03:07 +00:00
2017-10-08 20:22:04 +00:00
def __init__ ( self , * args , * * kwargs ) :
2017-10-08 23:34:49 +00:00
prefix = kwargs . pop ( ' prefix ' , self . Meta . model . __name__ )
2017-10-14 18:18:12 +00:00
super ( ServiceUserCreationForm , self ) . __init__ (
* args ,
prefix = prefix ,
* * kwargs
)
2017-10-08 20:22:04 +00:00
2016-07-31 03:03:07 +00:00
class Meta :
model = ServiceUser
fields = ( ' pseudo ' , )
def clean_password2 ( self ) :
2017-10-14 18:18:12 +00:00
""" Verifie que password1 et 2 sont indentiques """
2016-07-31 03:03:07 +00:00
# Check that the two password entries match
password1 = self . cleaned_data . get ( " password1 " )
password2 = self . cleaned_data . get ( " password2 " )
if password1 and password2 and password1 != password2 :
2018-08-15 17:15:26 +00:00
raise forms . ValidationError ( _ ( " The passwords don ' t match. " ) )
2016-07-31 03:03:07 +00:00
return password2
def save ( self , commit = True ) :
# Save the provided password in hashed format
user = super ( ServiceUserCreationForm , self ) . save ( commit = False )
user . set_password ( self . cleaned_data [ " password1 " ] )
user . save ( )
return user
2016-07-08 01:12:28 +00:00
2017-10-14 18:18:12 +00:00
2018-03-31 15:18:39 +00:00
class UserChangeForm ( FormRevMixin , forms . ModelForm ) :
2016-07-08 01:12:28 +00:00
""" A form for updating users. Includes all the fields on
the user , but replaces the password field with admin ' s
password hash display field .
2017-10-14 18:18:12 +00:00
Formulaire pour la modification d ' un user coté admin
2016-07-08 01:12:28 +00:00
"""
password = ReadOnlyPasswordHashField ( )
2018-08-15 17:15:26 +00:00
is_admin = forms . BooleanField ( label = _ ( " Is admin " ) , required = False )
2016-07-08 01:12:28 +00:00
class Meta :
2017-10-23 03:02:55 +00:00
model = Adherent
2018-08-05 10:44:21 +00:00
fields = ( ' pseudo ' , ' password ' , ' surname ' , ' email ' )
2016-07-08 01:12:28 +00:00
def __init__ ( self , * args , * * kwargs ) :
2017-10-08 23:34:49 +00:00
prefix = kwargs . pop ( ' prefix ' , self . Meta . model . __name__ )
2017-10-08 20:22:04 +00:00
super ( UserChangeForm , self ) . __init__ ( * args , prefix = prefix , * * kwargs )
2018-08-15 17:15:26 +00:00
print ( _ ( " User is admin: %s " ) % kwargs [ ' instance ' ] . is_admin )
2016-07-08 01:12:28 +00:00
self . initial [ ' is_admin ' ] = kwargs [ ' instance ' ] . is_admin
def clean_password ( self ) :
2017-10-14 18:18:12 +00:00
""" Dummy fun """
2016-07-08 01:12:28 +00:00
# Regardless of what the user provides, return the initial value.
# This is done here, rather than on the field, because the
# field does not have access to the initial value
return self . initial [ " password " ]
def save ( self , commit = True ) :
# Save the provided password in hashed format
user = super ( UserChangeForm , self ) . save ( commit = False )
user . is_admin = self . cleaned_data . get ( " is_admin " )
if commit :
user . save ( )
return user
2016-07-20 10:06:33 +00:00
2017-10-14 18:18:12 +00:00
2018-03-31 15:18:39 +00:00
class ServiceUserChangeForm ( FormRevMixin , forms . ModelForm ) :
2016-07-31 03:03:07 +00:00
""" A form for updating users. Includes all the fields on
the user , but replaces the password field with admin ' s
password hash display field .
2017-10-14 18:18:12 +00:00
Formulaire pour l ' edition des service users coté admin
2016-07-31 03:03:07 +00:00
"""
password = ReadOnlyPasswordHashField ( )
2017-10-08 20:22:04 +00:00
def __init__ ( self , * args , * * kwargs ) :
2017-10-08 23:34:49 +00:00
prefix = kwargs . pop ( ' prefix ' , self . Meta . model . __name__ )
2017-10-14 18:18:12 +00:00
super ( ServiceUserChangeForm , self ) . __init__ (
* args ,
prefix = prefix ,
* * kwargs
)
2017-10-08 20:22:04 +00:00
2016-07-31 03:03:07 +00:00
class Meta :
model = ServiceUser
fields = ( ' pseudo ' , )
def clean_password ( self ) :
2017-10-14 18:18:12 +00:00
""" Dummy fun """
2016-07-31 03:03:07 +00:00
return self . initial [ " password " ]
2017-10-14 18:18:12 +00:00
2016-07-20 10:06:33 +00:00
class ResetPasswordForm ( forms . Form ) :
2017-10-14 18:18:12 +00:00
""" Formulaire de demande de reinitialisation de mot de passe,
mdp oublié """
2018-08-15 17:15:26 +00:00
pseudo = forms . CharField ( label = _ ( " Username " ) , max_length = 255 )
2016-07-20 10:06:33 +00:00
email = forms . EmailField ( max_length = 255 )
2017-05-26 01:07:10 +00:00
2017-10-14 18:18:12 +00:00
2017-05-26 01:07:10 +00:00
class MassArchiveForm ( forms . Form ) :
2017-10-14 18:18:12 +00:00
""" Formulaire d ' archivage des users inactif. Prend en argument
du formulaire la date de depart avant laquelle archiver les
users """
2017-05-26 01:07:10 +00:00
date = forms . DateTimeField ( help_text = ' %d / % m/ % y ' )
def clean ( self ) :
2017-10-14 18:18:12 +00:00
cleaned_data = super ( MassArchiveForm , self ) . clean ( )
2017-05-26 01:07:10 +00:00
date = cleaned_data . get ( " date " )
if date :
2018-03-31 15:18:39 +00:00
if date > timezone . now ( ) :
2018-08-15 17:15:26 +00:00
raise forms . ValidationError ( _ ( " Impossible to archive users "
" whose end access date is in "
" the future. " ) )
2017-10-14 18:18:12 +00:00
2017-07-06 17:01:04 +00:00
2018-03-31 15:18:39 +00:00
class AdherentForm ( FormRevMixin , FieldPermissionFormMixin , ModelForm ) :
2017-10-14 18:18:12 +00:00
""" Formulaire de base d ' edition d ' un user. Formulaire de base, utilisé
pour l ' edition de self par self ou un cableur. On formate les champs
avec des label plus jolis """
2017-07-06 17:01:04 +00:00
def __init__ ( self , * args , * * kwargs ) :
2017-10-08 23:34:49 +00:00
prefix = kwargs . pop ( ' prefix ' , self . Meta . model . __name__ )
2017-10-25 21:37:12 +00:00
super ( AdherentForm , self ) . __init__ ( * args , prefix = prefix , * * kwargs )
2018-08-15 17:15:26 +00:00
self . fields [ ' name ' ] . label = _ ( " First name " )
self . fields [ ' surname ' ] . label = _ ( " Surname " )
self . fields [ ' email ' ] . label = _ ( " Email address " )
self . fields [ ' school ' ] . label = _ ( " School " )
self . fields [ ' comment ' ] . label = _ ( " Comment " )
self . fields [ ' room ' ] . label = _ ( " Room " )
self . fields [ ' room ' ] . empty_label = _ ( " No room " )
self . fields [ ' school ' ] . empty_label = _ ( " Select a school " )
2018-07-30 15:00:41 +00:00
2018-08-09 21:43:35 +00:00
def clean_email ( self ) :
if not OptionalUser . objects . first ( ) . local_email_domain in self . cleaned_data . get ( ' email ' ) :
return self . cleaned_data . get ( ' email ' ) . lower ( )
else :
2018-08-15 17:15:26 +00:00
raise forms . ValidationError (
_ ( " You can ' t use a {} address. " ) . format (
OptionalUser . objects . first ( ) . local_email_domain ) )
2018-08-09 21:43:35 +00:00
2017-07-06 17:01:04 +00:00
class Meta :
2017-10-23 01:22:00 +00:00
model = Adherent
2017-07-06 17:01:04 +00:00
fields = [
' name ' ,
' surname ' ,
' pseudo ' ,
2018-08-05 10:44:21 +00:00
' email ' ,
2017-07-06 17:01:04 +00:00
' school ' ,
' comment ' ,
2018-08-18 11:10:36 +00:00
' telephone ' ,
2018-09-20 06:39:48 +00:00
' room '
2017-07-06 17:01:04 +00:00
]
2018-08-09 21:43:35 +00:00
2017-07-06 17:01:04 +00:00
def clean_telephone ( self ) :
2017-10-14 18:18:12 +00:00
""" Verifie que le tel est présent si ' option est validée
dans preferences """
2017-07-06 17:01:04 +00:00
telephone = self . cleaned_data [ ' telephone ' ]
2018-01-30 22:07:43 +00:00
if not telephone and OptionalUser . get_cached_value ( ' is_tel_mandatory ' ) :
2017-10-14 18:18:12 +00:00
raise forms . ValidationError (
2018-08-15 17:15:26 +00:00
_ ( " A valid telephone number is required. " )
2017-10-14 18:18:12 +00:00
)
2017-07-06 17:01:04 +00:00
return telephone
2017-10-25 21:37:12 +00:00
force = forms . BooleanField (
2018-08-15 17:15:26 +00:00
label = _ ( " Force the move? " ) ,
2017-10-25 21:37:12 +00:00
initial = False ,
required = False
)
def clean_force ( self ) :
""" On supprime l ' ancien user de la chambre si et seulement si la
case est cochée """
if self . cleaned_data . get ( ' force ' , False ) :
2018-05-14 21:58:05 +00:00
remove_user_room ( self . cleaned_data . get ( ' room ' ) )
2017-10-25 21:37:12 +00:00
return
2017-10-14 18:18:12 +00:00
2018-09-19 13:40:53 +00:00
class AdherentCreationForm ( AdherentForm ) :
""" Formulaire de création d ' un user.
AdherentForm auquel on ajoute une checkbox afin d ' éviter les
doublons d ' utilisateurs " " "
2018-09-19 21:24:15 +00:00
# Champ permettant d'éviter au maxium les doublons d'utilisateurs
former_user_check_info = _ ( " If you already have an account, please use it. " \
+ " If your lost access to it, please consider " \
+ " using the forgotten password button on the " \
+ " login page or contacting support. " )
former_user_check = forms . BooleanField ( required = True , help_text = former_user_check_info )
2018-09-20 06:39:48 +00:00
former_user_check . label = _ ( " I have not had an account before " )
2017-10-25 21:37:12 +00:00
2018-09-20 08:57:31 +00:00
# Checkbox for GTU
gtu_check = forms . BooleanField ( required = True )
gtu_check . label = mark_safe ( " {} <a href= ' /media/ {} ' download= ' CGU ' > {} </a> {} " . format (
_ ( " I commit to accept the " ) , GeneralOption . get_cached_value ( ' GTU ' ) , _ ( " General Terms of Use " ) , _ ( " . " ) ) )
2018-09-19 21:24:15 +00:00
def __init__ ( self , * args , * * kwargs ) :
super ( AdherentCreationForm , self ) . __init__ ( * args , * * kwargs )
2018-09-20 06:39:48 +00:00
class AdherentEditForm ( AdherentForm ) :
""" Formulaire d ' édition d ' un user.
AdherentForm incluant la modification des champs gpg et shell """
2018-09-29 20:52:57 +00:00
def __init__ ( self , * args , * * kwargs ) :
2018-09-20 06:39:48 +00:00
super ( AdherentEditForm , self ) . __init__ ( * args , * * kwargs )
self . fields [ ' gpg_fingerprint ' ] . widget . attrs [ ' placeholder ' ] = _ ( " Leave empty if you don ' t have any GPG key. " )
if ' shell ' in self . fields :
self . fields [ ' shell ' ] . empty_label = _ ( " Default shell " )
def clean_gpg_fingerprint ( self ) :
""" Format the GPG fingerprint """
gpg_fingerprint = self . cleaned_data . get ( ' gpg_fingerprint ' , None )
if gpg_fingerprint :
return gpg_fingerprint . replace ( ' ' , ' ' ) . upper ( )
class Meta :
model = Adherent
fields = [
' name ' ,
' surname ' ,
' pseudo ' ,
' email ' ,
' school ' ,
' comment ' ,
' telephone ' ,
' room ' ,
' shell ' ,
' gpg_fingerprint '
]
2018-09-19 21:24:15 +00:00
2018-03-31 15:18:39 +00:00
class ClubForm ( FormRevMixin , FieldPermissionFormMixin , ModelForm ) :
2017-10-23 03:02:55 +00:00
""" Formulaire de base d ' edition d ' un user. Formulaire de base, utilisé
pour l ' edition de self par self ou un cableur. On formate les champs
avec des label plus jolis """
def __init__ ( self , * args , * * kwargs ) :
prefix = kwargs . pop ( ' prefix ' , self . Meta . model . __name__ )
2017-10-25 21:37:12 +00:00
super ( ClubForm , self ) . __init__ ( * args , prefix = prefix , * * kwargs )
2018-08-15 17:15:26 +00:00
self . fields [ ' surname ' ] . label = _ ( " Name " )
self . fields [ ' school ' ] . label = _ ( " School " )
self . fields [ ' comment ' ] . label = _ ( " Comment " )
self . fields [ ' room ' ] . label = _ ( " Room " )
self . fields [ ' room ' ] . empty_label = _ ( " No room " )
self . fields [ ' school ' ] . empty_label = _ ( " Select a school " )
self . fields [ ' mailing ' ] . label = _ ( " Use a mailing list " )
2017-10-23 03:02:55 +00:00
class Meta :
model = Club
fields = [
' surname ' ,
' pseudo ' ,
' school ' ,
' comment ' ,
' room ' ,
' telephone ' ,
2017-12-28 16:47:02 +00:00
' shell ' ,
2018-03-07 16:02:31 +00:00
' mailing '
2017-10-23 03:02:55 +00:00
]
def clean_telephone ( self ) :
""" Verifie que le tel est présent si ' option est validée
dans preferences """
telephone = self . cleaned_data [ ' telephone ' ]
2018-01-30 22:07:43 +00:00
if not telephone and OptionalUser . get_cached_value ( ' is_tel_mandatory ' ) :
2017-10-23 03:02:55 +00:00
raise forms . ValidationError (
2018-08-15 17:15:26 +00:00
_ ( " A valid telephone number is required. " )
2017-10-23 03:02:55 +00:00
)
return telephone
2018-03-31 15:18:39 +00:00
class ClubAdminandMembersForm ( FormRevMixin , ModelForm ) :
2017-11-20 03:41:29 +00:00
""" Permet d ' éditer la liste des membres et des administrateurs
d ' un club " " "
class Meta :
model = Club
fields = [ ' administrators ' , ' members ' ]
def __init__ ( self , * args , * * kwargs ) :
prefix = kwargs . pop ( ' prefix ' , self . Meta . model . __name__ )
2018-04-14 01:25:05 +00:00
super ( ClubAdminandMembersForm , self ) . __init__ (
* args ,
prefix = prefix ,
* * kwargs
)
2017-11-20 03:41:29 +00:00
2018-03-31 15:18:39 +00:00
class PasswordForm ( FormRevMixin , ModelForm ) :
2017-10-14 18:18:12 +00:00
""" Formulaire de changement brut de mot de passe.
Ne pas utiliser sans traitement """
2017-07-06 17:01:04 +00:00
class Meta :
model = User
fields = [ ' password ' , ' pwd_ntlm ' ]
2017-10-08 20:22:04 +00:00
def __init__ ( self , * args , * * kwargs ) :
2017-10-08 23:34:49 +00:00
prefix = kwargs . pop ( ' prefix ' , self . Meta . model . __name__ )
2017-10-08 20:22:04 +00:00
super ( PasswordForm , self ) . __init__ ( * args , prefix = prefix , * * kwargs )
2017-10-14 18:18:12 +00:00
2018-03-31 15:18:39 +00:00
class ServiceUserForm ( FormRevMixin , ModelForm ) :
2017-10-04 15:53:30 +00:00
""" Modification d ' un service user """
2017-10-14 18:18:12 +00:00
password = forms . CharField (
2018-08-15 17:15:26 +00:00
label = _ ( " New password " ) ,
2017-10-14 18:18:12 +00:00
max_length = 255 ,
validators = [ MinLengthValidator ( 8 ) ] ,
widget = forms . PasswordInput ,
required = False
)
2017-07-06 17:01:04 +00:00
class Meta :
model = ServiceUser
2018-05-02 19:10:28 +00:00
fields = ( ' pseudo ' , ' access_group ' , ' comment ' )
2017-07-06 17:01:04 +00:00
2017-10-08 20:22:04 +00:00
def __init__ ( self , * args , * * kwargs ) :
2017-10-08 23:34:49 +00:00
prefix = kwargs . pop ( ' prefix ' , self . Meta . model . __name__ )
2017-10-08 20:22:04 +00:00
super ( ServiceUserForm , self ) . __init__ ( * args , prefix = prefix , * * kwargs )
2018-05-02 19:10:28 +00:00
def save ( self , commit = True ) :
""" Changement du mot de passe """
user = super ( ServiceUserForm , self ) . save ( commit = False )
if self . cleaned_data [ ' password ' ] :
user . set_password ( self . cleaned_data . get ( " password " ) )
user . save ( )
2017-10-14 18:18:12 +00:00
2017-07-06 17:01:04 +00:00
class EditServiceUserForm ( ServiceUserForm ) :
2017-10-14 18:18:12 +00:00
""" Formulaire d ' edition de base d ' un service user. Ne permet
d ' editer que son group d ' acl et son commentaire """
2017-07-06 17:01:04 +00:00
class Meta ( ServiceUserForm . Meta ) :
2017-10-14 18:18:12 +00:00
fields = [ ' access_group ' , ' comment ' ]
2017-07-06 17:01:04 +00:00
2018-03-31 15:18:39 +00:00
class StateForm ( FormRevMixin , ModelForm ) :
2017-10-04 15:53:30 +00:00
""" Changement de l ' état d ' un user """
2017-07-06 17:01:04 +00:00
class Meta :
model = User
fields = [ ' state ' ]
2017-10-08 20:22:04 +00:00
def __init__ ( self , * args , * * kwargs ) :
2017-10-08 23:34:49 +00:00
prefix = kwargs . pop ( ' prefix ' , self . Meta . model . __name__ )
2017-10-08 20:22:04 +00:00
super ( StateForm , self ) . __init__ ( * args , prefix = prefix , * * kwargs )
2017-07-06 17:01:04 +00:00
2018-05-03 12:22:52 +00:00
class GroupForm ( FieldPermissionFormMixin , FormRevMixin , ModelForm ) :
2017-12-31 16:11:19 +00:00
""" Gestion des groupes d ' un user """
groups = forms . ModelMultipleChoiceField (
Group . objects . all ( ) ,
widget = forms . CheckboxSelectMultiple ,
required = False
)
class Meta :
model = User
2018-05-03 12:08:05 +00:00
fields = [ ' is_superuser ' , ' groups ' ]
2017-12-31 16:11:19 +00:00
def __init__ ( self , * args , * * kwargs ) :
prefix = kwargs . pop ( ' prefix ' , self . Meta . model . __name__ )
super ( GroupForm , self ) . __init__ ( * args , prefix = prefix , * * kwargs )
2018-05-03 12:22:52 +00:00
if ' is_superuser ' in self . fields :
2018-08-15 17:15:26 +00:00
self . fields [ ' is_superuser ' ] . label = _ ( " Superuser " )
2017-12-31 16:11:19 +00:00
2018-03-31 15:18:39 +00:00
class SchoolForm ( FormRevMixin , ModelForm ) :
2017-10-14 18:18:12 +00:00
""" Edition, creation d ' un école """
2017-07-06 17:01:04 +00:00
class Meta :
model = School
fields = [ ' name ' ]
def __init__ ( self , * args , * * kwargs ) :
2017-10-08 23:34:49 +00:00
prefix = kwargs . pop ( ' prefix ' , self . Meta . model . __name__ )
2017-10-08 20:22:04 +00:00
super ( SchoolForm , self ) . __init__ ( * args , prefix = prefix , * * kwargs )
2018-08-15 17:15:26 +00:00
self . fields [ ' name ' ] . label = _ ( " School " )
2017-07-06 17:01:04 +00:00
2017-10-14 18:18:12 +00:00
2018-03-31 15:18:39 +00:00
class ShellForm ( FormRevMixin , ModelForm ) :
2018-03-24 18:06:49 +00:00
""" Edition, creation d ' un école """
class Meta :
model = ListShell
fields = [ ' shell ' ]
def __init__ ( self , * args , * * kwargs ) :
prefix = kwargs . pop ( ' prefix ' , self . Meta . model . __name__ )
super ( ShellForm , self ) . __init__ ( * args , prefix = prefix , * * kwargs )
2018-08-15 17:15:26 +00:00
self . fields [ ' shell ' ] . label = _ ( " Shell name " )
2018-03-24 18:06:49 +00:00
2018-03-31 15:18:39 +00:00
class ListRightForm ( FormRevMixin , ModelForm ) :
2017-10-14 18:18:12 +00:00
""" Edition, d ' un groupe , équivalent à un droit
2018-04-29 14:37:18 +00:00
Ne permet pas d ' editer le gid, car il sert de primary key " " "
2017-12-31 16:11:19 +00:00
permissions = forms . ModelMultipleChoiceField (
2018-01-31 01:46:48 +00:00
Permission . objects . all ( ) . select_related ( ' content_type ' ) ,
2017-12-31 16:11:19 +00:00
widget = forms . CheckboxSelectMultiple ,
required = False
)
2017-07-06 17:01:04 +00:00
class Meta :
model = ListRight
2018-04-29 14:37:18 +00:00
fields = ( ' name ' , ' unix_name ' , ' critical ' , ' permissions ' , ' details ' )
2017-07-06 17:01:04 +00:00
def __init__ ( self , * args , * * kwargs ) :
2017-10-08 23:34:49 +00:00
prefix = kwargs . pop ( ' prefix ' , self . Meta . model . __name__ )
2017-10-08 20:22:04 +00:00
super ( ListRightForm , self ) . __init__ ( * args , prefix = prefix , * * kwargs )
2018-08-15 17:15:26 +00:00
self . fields [ ' unix_name ' ] . label = _ ( " Name of the group of rights " )
2017-07-06 17:01:04 +00:00
2017-10-14 18:18:12 +00:00
2017-07-06 17:01:04 +00:00
class NewListRightForm ( ListRightForm ) :
2017-10-14 18:18:12 +00:00
""" Ajout d ' un groupe/list de droit """
2017-07-06 17:01:04 +00:00
class Meta ( ListRightForm . Meta ) :
2018-04-29 14:37:18 +00:00
fields = ( ' name ' , ' unix_name ' , ' gid ' , ' critical ' , ' permissions ' ,
' details ' )
2017-07-06 17:01:04 +00:00
def __init__ ( self , * args , * * kwargs ) :
super ( NewListRightForm , self ) . __init__ ( * args , * * kwargs )
2018-08-15 17:15:26 +00:00
self . fields [ ' gid ' ] . label = _ ( " GID. Warning: this field must not be "
" edited after creation. " )
2017-10-14 18:18:12 +00:00
2017-07-06 17:01:04 +00:00
2017-08-18 22:01:06 +00:00
class DelListRightForm ( Form ) :
2017-10-14 18:18:12 +00:00
""" Suppression d ' un ou plusieurs groupes """
listrights = forms . ModelMultipleChoiceField (
2017-12-13 17:35:16 +00:00
queryset = ListRight . objects . none ( ) ,
2018-08-15 17:15:26 +00:00
label = _ ( " Current groups of rights " ) ,
2017-10-14 18:18:12 +00:00
widget = forms . CheckboxSelectMultiple
)
2017-12-13 17:35:16 +00:00
def __init__ ( self , * args , * * kwargs ) :
instances = kwargs . pop ( ' instances ' , None )
super ( DelListRightForm , self ) . __init__ ( * args , * * kwargs )
if instances :
2017-12-31 16:11:19 +00:00
self . fields [ ' listrights ' ] . queryset = instances
2017-12-13 17:35:16 +00:00
else :
2017-12-31 16:11:19 +00:00
self . fields [ ' listrights ' ] . queryset = ListRight . objects . all ( )
2017-12-13 17:35:16 +00:00
2017-07-06 17:01:04 +00:00
2017-08-18 22:01:06 +00:00
class DelSchoolForm ( Form ) :
2017-10-14 18:18:12 +00:00
""" Suppression d ' une ou plusieurs écoles """
schools = forms . ModelMultipleChoiceField (
2017-12-13 17:35:16 +00:00
queryset = School . objects . none ( ) ,
2018-08-15 17:15:26 +00:00
label = _ ( " Current schools " ) ,
2017-10-14 18:18:12 +00:00
widget = forms . CheckboxSelectMultiple
)
2017-12-12 03:33:50 +00:00
def __init__ ( self , * args , * * kwargs ) :
2017-12-13 17:35:16 +00:00
instances = kwargs . pop ( ' instances ' , None )
2017-12-12 03:33:50 +00:00
super ( DelSchoolForm , self ) . __init__ ( * args , * * kwargs )
2017-12-13 17:35:16 +00:00
if instances :
self . fields [ ' schools ' ] . queryset = instances
else :
self . fields [ ' schools ' ] . queryset = School . objects . all ( )
2017-12-12 03:33:50 +00:00
2017-07-06 17:01:04 +00:00
2018-03-31 15:18:39 +00:00
class BanForm ( FormRevMixin , ModelForm ) :
2017-10-14 18:18:12 +00:00
""" Creation, edition d ' un objet bannissement """
2017-07-06 17:01:04 +00:00
def __init__ ( self , * args , * * kwargs ) :
2017-10-08 23:34:49 +00:00
prefix = kwargs . pop ( ' prefix ' , self . Meta . model . __name__ )
2017-10-08 20:22:04 +00:00
super ( BanForm , self ) . __init__ ( * args , prefix = prefix , * * kwargs )
2018-08-15 17:15:26 +00:00
self . fields [ ' date_end ' ] . label = _ ( " End date " )
2018-05-12 19:21:00 +00:00
self . fields [ ' date_end ' ] . localize = False
2017-07-06 17:01:04 +00:00
class Meta :
model = Ban
exclude = [ ' user ' ]
2018-05-12 19:21:00 +00:00
widgets = { ' date_end ' : DateTimePicker }
2017-07-06 17:01:04 +00:00
2018-03-31 15:18:39 +00:00
class WhitelistForm ( FormRevMixin , ModelForm ) :
2017-10-14 18:18:12 +00:00
""" Creation, edition d ' un objet whitelist """
2017-07-06 17:01:04 +00:00
def __init__ ( self , * args , * * kwargs ) :
2017-10-08 23:34:49 +00:00
prefix = kwargs . pop ( ' prefix ' , self . Meta . model . __name__ )
2017-10-08 20:22:04 +00:00
super ( WhitelistForm , self ) . __init__ ( * args , prefix = prefix , * * kwargs )
2018-08-15 17:15:26 +00:00
self . fields [ ' date_end ' ] . label = _ ( " End date " )
2018-05-05 15:58:13 +00:00
self . fields [ ' date_end ' ] . localize = False
2017-07-06 17:01:04 +00:00
class Meta :
model = Whitelist
exclude = [ ' user ' ]
2018-05-05 15:58:13 +00:00
widgets = { ' date_end ' : DateTimePicker }
2018-06-26 16:46:57 +00:00
2018-08-01 11:06:25 +00:00
class EMailAddressForm ( FormRevMixin , ModelForm ) :
""" Create and edit a local email address """
2018-06-26 16:46:57 +00:00
def __init__ ( self , * args , * * kwargs ) :
prefix = kwargs . pop ( ' prefix ' , self . Meta . model . __name__ )
2018-08-01 11:06:25 +00:00
super ( EMailAddressForm , self ) . __init__ ( * args , prefix = prefix , * * kwargs )
2018-08-15 17:15:26 +00:00
self . fields [ ' local_part ' ] . label = _ ( " Local part of the email address " )
self . fields [ ' local_part ' ] . help_text = _ ( " Can ' t contain @ " )
2018-08-14 10:21:58 +00:00
2018-08-09 21:43:35 +00:00
def clean_local_part ( self ) :
return self . cleaned_data . get ( ' local_part ' ) . lower ( )
2018-06-26 16:46:57 +00:00
class Meta :
2018-08-01 11:06:25 +00:00
model = EMailAddress
2018-06-29 14:36:04 +00:00
exclude = [ ' user ' ]
2018-06-27 21:13:43 +00:00
2018-07-30 15:00:41 +00:00
class EmailSettingsForm ( FormRevMixin , FieldPermissionFormMixin , ModelForm ) :
""" Edit email-related settings """
2018-06-27 21:13:43 +00:00
def __init__ ( self , * args , * * kwargs ) :
prefix = kwargs . pop ( ' prefix ' , self . Meta . model . __name__ )
2018-07-30 15:00:41 +00:00
super ( EmailSettingsForm , self ) . __init__ ( * args , prefix = prefix , * * kwargs )
2018-08-15 17:15:26 +00:00
self . fields [ ' email ' ] . label = _ ( " Main email address " )
2018-07-30 15:00:41 +00:00
if ' local_email_redirect ' in self . fields :
2018-08-15 17:15:26 +00:00
self . fields [ ' local_email_redirect ' ] . label = _ ( " Redirect local emails " )
2018-07-30 15:00:41 +00:00
if ' local_email_enabled ' in self . fields :
2018-08-15 17:15:26 +00:00
self . fields [ ' local_email_enabled ' ] . label = _ ( " Use local emails " )
2018-06-27 21:13:43 +00:00
2018-08-09 21:43:35 +00:00
def clean_email ( self ) :
if not OptionalUser . objects . first ( ) . local_email_domain in self . cleaned_data . get ( ' email ' ) :
return self . cleaned_data . get ( ' email ' ) . lower ( )
else :
2018-08-15 17:15:26 +00:00
raise forms . ValidationError (
_ ( " You can ' t use a {} address. " ) . format (
OptionalUser . objects . first ( ) . local_email_domain ) )
2018-08-09 21:43:35 +00:00
2018-06-27 21:13:43 +00:00
class Meta :
2018-06-29 14:36:04 +00:00
model = User
2018-08-14 10:21:58 +00:00
fields = [ ' email ' , ' local_email_enabled ' , ' local_email_redirect ' ]
2018-08-15 17:15:26 +00:00
2018-08-28 18:18:09 +00:00
class InitialRegisterForm ( forms . Form ) :
register_room = forms . BooleanField ( required = False )
register_machine = forms . BooleanField ( required = False )
def __init__ ( self , * args , * * kwargs ) :
switch_ip = kwargs . pop ( ' switch_ip ' )
switch_port = kwargs . pop ( ' switch_port ' )
client_mac = kwargs . pop ( ' client_mac ' )
self . user = kwargs . pop ( ' user ' )
if switch_ip and switch_port :
# Looking for a port
port = Port . objects . filter ( switch__interface__ipv4__ipv4 = switch_ip , port = switch_port ) . first ( )
# If a port exists, checking there is a room AND radius
if port :
if port . get_port_profile . radius_type != ' NO ' and port . get_port_profile . radius_mode == ' STRICT ' and hasattr ( port , ' room ' ) :
# Requesting user is not in this room ?
if self . user . room != port . room :
self . new_room = port . room
if client_mac and switch_ip :
# If this interface doesn't already exists
if not Interface . objects . filter ( mac_address = client_mac ) :
self . mac_address = client_mac
self . nas_type = Nas . objects . filter ( nas_type__interface__ipv4__ipv4 = switch_ip ) . first ( )
super ( InitialRegisterForm , self ) . __init__ ( * args , * * kwargs )
if hasattr ( self , ' new_room ' ) :
2018-08-28 21:17:45 +00:00
self . fields [ ' register_room ' ] . label = _ ( " New connection from room %s . Is it yours? If that is the case, type OK. " % self . new_room )
2018-08-28 18:18:09 +00:00
else :
self . fields . pop ( ' register_room ' )
if hasattr ( self , ' mac_address ' ) :
2018-08-28 21:17:45 +00:00
self . fields [ ' register_machine ' ] . label = _ ( " New connection from new device. Register it? Say Yes to get Internet access from it (MAC Address : %s ). " % self . mac_address )
2018-08-28 18:18:09 +00:00
else :
self . fields . pop ( ' register_machine ' )
def clean_register_room ( self ) :
if self . cleaned_data [ ' register_room ' ] :
if self . user . is_class_adherent :
remove_user_room ( self . new_room )
user = self . user . adherent
user . room = self . new_room
user . save ( )
if self . user . is_class_club :
user = self . user . club
user . room = self . new_room
user . save ( )
def clean_register_machine ( self ) :
if self . cleaned_data [ ' register_machine ' ] :
if self . mac_address and self . nas_type :
self . user . autoregister_machine ( self . mac_address , self . nas_type )