Commit b588c771 authored by Antoine Bernard's avatar Antoine Bernard

[grammar] PEP8, lisibilité, et quelques commentaires.

* https://www.python.org/dev/peps/pep-0008/
* https://github.com/cbrueffer/pep8-git-hook
* On va faire une task qui consiste à PEP8-iser tout les projets Crans tiens.
parent b849cae3
......@@ -19,6 +19,7 @@ from django.utils.translation import ugettext_lazy as _
class BaseCompteForm(forms.Form):
nom = forms.CharField(label=_(u'Nom'), max_length=40, required=True)
def __init__(self, ldap_user=None, *args, **kwargs):
super(BaseCompteForm, self).__init__(*args, **kwargs)
if ldap_user:
......@@ -40,11 +41,27 @@ class BaseCompteForm(forms.Form):
class CompteForm(BaseCompteForm):
prenom = forms.CharField(label=_(u'Prénom'), max_length=40, required=True)
tel = forms.CharField(label=_(u'Téléphone'), max_length=15, required=True)
etudes = forms.CharField(label=_(u'Etablissement'), max_length=100, required=True)
contourneGreylist = forms.BooleanField(label=_(u'Contournement du greylisting'), required=False)
def __init__(self, ldap_user = None, *args, **kwargs):
prenom = forms.CharField(
label=_(u'Prénom'),
max_length=40,
required=True,
)
tel = forms.CharField(
label=_(u'Téléphone'),
max_length=15,
required=True,
)
etudes = forms.CharField(
label=_(u'Etablissement'),
max_length=100,
required=True,
)
contourneGreylist = forms.BooleanField(
label=_(u'Contournement du greylisting'),
required=False,
)
def __init__(self, ldap_user=None, *args, **kwargs):
"""
On initialise le formulaire par rapport aux données du ldap_user
"""
......@@ -117,8 +134,19 @@ class AliasForm(forms.Form):
mailAlias = forms.EmailField(label=_(u'Nouvel alias Mail'), max_length=40, required=False)
class BasePassForm(forms.Form):
newpasswd1 = forms.CharField(label=_(u'Nouveau mot de passe'), max_length=255, widget=widgets.PasswordInput, required=False)
newpasswd2 = forms.CharField(label=_(u'Retaper le mot de passe'), max_length=255, widget=widgets.PasswordInput, required=False)
newpasswd1 = forms.CharField(
label=_(u'Nouveau mot de passe'),
max_length=255,
widget=widgets.PasswordInput,
required=False,
)
newpasswd2 = forms.CharField(
label=_(u'Retaper le mot de passe'),
max_length=255,
widget=widgets.PasswordInput,
required=False,
)
def clean(self):
newpasswd1 = self.cleaned_data.get('newpasswd1')
newpasswd2 = self.cleaned_data.get('newpasswd2')
......@@ -150,12 +178,31 @@ class PassForm(BasePassForm):
passwdexists = forms.CharField(label=_(u'Ancien mot de passe'), max_length=255, widget=widgets.PasswordInput, required=True)
class SoldeForm(forms.Form):
montant = forms.DecimalField(label=_(u'Montant à ajouter ou supprimer'), required=True)
mode = forms.ChoiceField(label=_(u'Mode de réglement'), choices=tuple([("", "<choisis un mode de réglement>")] + factures.SOLDE.items()), required=True)
commentaire = forms.CharField(label=_(u'Commentaire'), max_length=255, required=False)
montant = forms.DecimalField(
label=_(u'Montant à ajouter ou supprimer'),
required=True,
)
mode = forms.ChoiceField(
label=_(u'Mode de réglement'),
choices=tuple(
[("", "<choisis un mode de réglement>")] + factures.SOLDE.items()
),
required=True,
)
commentaire = forms.CharField(
label=_(u'Commentaire'),
max_length=255,
required=False,
)
class VenteForm(forms.Form):
articles = forms.MultipleChoiceField(label=_(u'Articles disponibles'), choices=tuple((a,b['designation'] + " : " + str(b['pu']) + u"€" ) for a, b in factures.ITEMS.items()), required=True)
articles = forms.MultipleChoiceField(
label=_(u'Articles disponibles'),
choices=tuple(
(a, b['designation'] + " : " + str(b['pu']) + u"€")\
for a, b in factures.ITEMS.items()),
required=True,
)
mode = forms.ChoiceField(label=_(u'Mode de réglement'), choices=tuple([("", "<choisis un mode de réglement>")] + factures.VENTE.items()), required=True)
commentaire = forms.CharField(label=_(u'Commentaire'), max_length=255, required=False)
......@@ -186,7 +233,7 @@ class ComptecransForm(forms.Form):
prenom = unicode(unicodedata.normalize('NFKD', unicode(ldap_user['prenom'][0])).encode('ascii', 'ignore')).lower().replace(' ', '-')
login_crans = nom
baselogin = nom
for rang,let in enumerate(prenom):
for rang, let in enumerate(prenom):
if ldap_conn.search(_(u'uid=%s') % login_crans) == []:
break
else:
......@@ -223,13 +270,13 @@ class EmenagementForm(forms.Form):
"""
chbre = self.cleaned_data['chbre']
try:
luser['chbre'] = chbre
luser['chbre'] = chbre
if 'adherent' in luser.get("objectClass", []):
luser['postalAddress'] = []
luser['postalAddress'] = []
return True
except ValueError as e:
self._errors.setdefault('chbre', ErrorList()).append(e )
return False
self._errors.setdefault('chbre', ErrorList()).append(e)
return False
except UniquenessError:
# La chambre est occupée
if not confirm:
......@@ -237,18 +284,28 @@ class EmenagementForm(forms.Form):
squatteur = conn.search('chbre=%s' % chbre, mode='w')[0]
if 'adherent' in luser.get("objectClass", []):
denomination = _(u"Cette chambre")
uid = "aid = %s" % squatteur.get('aid',[''])[0]
uid = "aid = %s" % squatteur.get('aid', [''])[0]
else:
denomination = _(u("Ce local"))
uid = "cid = %s" % squatteur.get('cid',[''])[0]
self._errors.setdefault('chbre', ErrorList()).append(_(u"%(denomination)s est déjà occupé(e) par %(squatteur_prenom)s %(squatteur_nom)s, %(uid)s, corrigez la saisie ou revalidez pour confirmer.") % { 'denomination': denomination , 'squatteur_prenom' : squatteur.get('prenom',[''])[0] , 'squatteur_nom' : squatteur.get('nom',[''])[0] , 'uid' : uid } )
return 'confirm' # Ce confirm doit être rattrapé par la view
uid = "cid = %s" % squatteur.get('cid', [''])[0]
self._errors.setdefault('chbre', ErrorList()).append(
_(u"%(denomination)s est déjà occupé(e) par %(squatteur_prenom)s\
%(squatteur_nom)s, %(uid)s, corrigez la saisie\
ou revalidez pour confirmer.") %
{
'denomination': denomination,
'squatteur_prenom' : squatteur.get('prenom', [''])[0],
'squatteur_nom' : squatteur.get('nom', [''])[0],
'uid' : uid,
}
)
return 'confirm' # Ce confirm doit être rattrapé par la view
else:
squatteur = conn.search(u'chbre=%s' % chbre, mode='w')[0]
squatteur['chbre'] = '????' # on vire le squatteur si on a eu une confirmation
squatteur.history_gen()
squatteur.save()
luser['chbre'] = chbre
luser['chbre'] = chbre
return True
class DemenagementForm(EmenagementForm):
......@@ -261,7 +318,7 @@ class DemenagementForm(EmenagementForm):
def __init__(self, ldap_user=None, *args, **kwargs):
super(DemenagementForm, self).__init__(*args, **kwargs)
if ldap_user:
_postalAddress = ['','','','']
_postalAddress = ['', '', '', '']
for i in xrange(len(ldap_user['postalAddress'])):
_postalAddress[i] = ldap_user['postalAddress'][i]
......@@ -269,11 +326,13 @@ class DemenagementForm(EmenagementForm):
self.fields['postalAddress2'].initial = _postalAddress[1]
self.fields['postalAddress3'].initial = _postalAddress[2]
self.fields['postalAddress4'].initial = _postalAddress[3]
def clean(self):
datas = [field for field in self.cleaned_data if self.cleaned_data[field]]
if "chbre" in datas and len(datas)>1 :
if "chbre" in datas and len(datas) > 1:
print self.cleaned_data
raise forms.ValidationError(_(u"Impossible d'avoir une chambre et une adresse extérieure"))
def apply(self, luser, confirm, conn):
"""
Fonction d'application des modifications à l'objet ldap. Doit être appellé après un form.valid
......@@ -282,11 +341,16 @@ class DemenagementForm(EmenagementForm):
# Soit on met un chambre, soit une adresse extérieure
if chbre:
# Si on met une chambre, c'est comme pour EmenagementForm
return super(DemenagementForm, self).apply(luser,confirm, conn)
return super(DemenagementForm, self).apply(luser, confirm, conn)
else:
# Sinon, on ajoute l'adresse extérieur
luser['chbre'] = 'EXT'
luser['postalAddress'] = [self.cleaned_data['postalAddress'], self.cleaned_data['postalAddress2'], self.cleaned_data['postalAddress3'], self.cleaned_data['postalAddress4']]
luser['postalAddress'] = [
self.cleaned_data['postalAddress'],
self.cleaned_data['postalAddress2'],
self.cleaned_data['postalAddress3'],
self.cleaned_data['postalAddress4'],
]
if self.cleaned_data['del_machines']:
for m in luser.machines():
m.delete()
......@@ -294,8 +358,16 @@ class DemenagementForm(EmenagementForm):
class NewCompteForm(CompteForm):
mail = forms.CharField(label=_(u'Email'), max_length=40, validators=[validate_email], required=False)
naissance = forms.DateField(label=_(u'Date de naissance'), required=True)
mail = forms.CharField(
label=_(u'Email'),
max_length=40,
validators=[validate_email],
required=False,
)
naissance = forms.DateField(
label=_(u'Date de naissance'),
required=True,
)
def check_date(self):
""" Verifie la date de naissance """
......
......@@ -39,7 +39,7 @@ class RedirectHomeMixin(object):
"""
Mixin permettant de rediriger vers le compte de l'utilisateur modifié et non du request.user
"""
def dispatch(self, request, uid, ptype=u'adh', next = None, *args, **kwargs):
def dispatch(self, request, uid, ptype=u'adh', next=None, *args, **kwargs):
if not next:
if not uid:
next = reverse('compte:afficher')
......@@ -47,7 +47,7 @@ class RedirectHomeMixin(object):
next = reverse('compte:afficher_club', args=(uid,))
else:
next = reverse('compte:afficher', args=(uid,))
return super(RedirectHomeMixin, self).dispatch(request, uid=uid, next=next, ptype = ptype, *args, **kwargs)
return super(RedirectHomeMixin, self).dispatch(request, uid=uid, next=next, ptype=ptype, *args, **kwargs)
def get_luser(request, uid, ptype, mode='ro'):
if ptype == 'adh':
......@@ -72,7 +72,7 @@ class ClubView(CableurOrSelfMixin, View):
# On a juste a peupler le form avec les informations de l'utilisateur
luser = conn_pool.get_conn(request.user).search(u'cid=%s' % cid)[0]
# Si il n'y a pas de compte crans derrière, uid vaut false et l'app de cablage n'affiche pas tout
uid = luser.get('uid',False)
uid = luser.get('uid', False)
form = BaseCompteForm(luser)
context = {
'form': form,
......@@ -85,7 +85,7 @@ class ClubView(CableurOrSelfMixin, View):
def post(self, request, cid, *args, **kwargs):
luser = conn_pool.get_conn(request.user).search(u'cid=%s' % cid)[0]
# Si il n'y a pas de compte crans derrière, uid vaut false et l'app de cablage n'affiche pas tout
uid = luser.get('uid',False)
uid = luser.get('uid', False)
form = BaseCompteForm(luser, request.POST)
if form.is_valid():
luser = conn_pool.get_conn(request.user).search(u'cid=%s' % cid, mode="w")[0]
......@@ -130,7 +130,7 @@ class CompteView(CableurOrSelfMixin, View):
def get(self, request, aid, *args, **kwargs):
luser = conn_pool.get_conn(request.user).search(u'aid=%s' % aid)[0]
# Si il n'y a pas de compte crans derrière, uid vaut false et l'app de cablage n'affiche pas tout
uid = luser.get('uid',False)
uid = luser.get('uid', False)
if uid:
redirection_mail = subprocess.Popen(["sudo", "-n", "/usr/scripts/utils/forward.py", "--read", "--name=%s" % luser['uid'][0]], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
mailredirect = redirection_mail.stdout.readlines()
......@@ -153,7 +153,7 @@ class CompteView(CableurOrSelfMixin, View):
def post(self, request, aid, *args, **kwargs):
luser = conn_pool.get_conn(request.user).search(u'aid=%s' % aid)[0]
uid = luser.get('uid',False)
uid = luser.get('uid', False)
form = CompteForm(luser, request.POST)
if form.is_valid():
luser = conn_pool.get_conn(request.user).search(u'aid=%s' % aid, mode="w")[0]
......@@ -192,10 +192,19 @@ class ChgPassView(CableurOrSelfMixin, RedirectHomeMixin, View):
form = BasePassForm()
else:
form = PassForm()
return render(request, self.template_name, {'form': form, 'ptype': ptype, 'ide': uid, 'cablage': cablage})
return render(
request,
self.template_name,
{
'form': form,
'ptype': ptype,
'ide': uid,
'cablage': cablage,
},
)
@method_decorator(sensitive_post_parameters())
def post(self, request, uid, ptype, cablage, next = '/compte/', *args, **kwargs):
def post(self, request, uid, ptype, cablage, next='/compte/', *args, **kwargs):
# Selon si on est cableur on a besoin ou pas de rentrer l'ancien mdp
if cablage:
form = BasePassForm(request.POST)
......@@ -204,7 +213,10 @@ class ChgPassView(CableurOrSelfMixin, RedirectHomeMixin, View):
luser = get_luser(request, uid, ptype, 'w')
if form.is_valid():
# Soit on est en train de cabler soit l'ancien mot de passe est bon
if cablage or ldap_context.verify(unicode(form.cleaned_data['passwdexists']), unicode(luser['userPassword'][0])):
if cablage or ldap_context.verify(
unicode(form.cleaned_data['passwdexists']),
unicode(luser['userPassword'][0])
):
if form.apply(luser):
luser.history_gen()
luser.save()
......@@ -255,7 +267,7 @@ class RedirectionView(CableurOrSelfMixin, RedirectHomeMixin, View):
else:
luser = conn_pool.get_conn(request.user).search(u'aid=%s' % uid, mode='w')[0]
with luser as adh:
adh['mailExt']=mailredirect
adh['mailExt'] = mailredirect
adh.history_gen()
adh.save()
messages.success(request, _(u"""Votre redirection a bien été prise en compte"""))
......@@ -267,22 +279,33 @@ redirection = RedirectionView.as_view()
class DeleteForwardView(CableurOrSelfMixin, RedirectHomeMixin, View):
"""
Classe pour la suppresion d'une redirection mail.
Classe pour la suppresion d'une redirection mail.
"""
def get(self,request,uid,next="/compte/",*args,**kwargs):
def get(self, request, uid, next="/compte/", *args, **kwargs):
luser = conn_pool.get_conn(request.user).search(u'aid=%s' % uid, mode='w')[0]
try:
redirection_mail = subprocess.Popen(["sudo","-n","/usr/scripts/utils/forward.py", "--delete", "--name=%s" %luser['uid'][0]])
messages.success(request, _(u"Votre redirection a été supprimée, pensez à consulter régulièrement votre adresse Cr@ns !"))
redirection_mail = subprocess.Popen(
[
"sudo",
"-n",
"/usr/scripts/utils/forward.py",
"--delete",
"--name=%s" % luser['uid'][0]
]
)
messages.success(
request,
_(u"Votre redirection a été supprimée, pensez à consulter régulièrement votre adresse Cr@ns !")
)
except ValueError as e:
messages.error(request,e)
messages.error(request, e)
return redirect(next)
deleteforward = DeleteForwardView.as_view()
class DeleteAliasView(CableurMixin, RedirectHomeMixin, View):
"""
Classe pour la réinitialisation du mot de passe et l'impression d'un ticket
Classe pour la réinitialisation du mot de passe et l'impression d'un ticket
"""
def get(self, request, uid, ptype, alias_id, next='/compte/', *args, **kwargs):
# Vue de suppresion d'un alias. N'a pas de visuel, redirige juste vers le home
......@@ -339,15 +362,22 @@ class SoldeView(CableurMixin, RedirectHomeMixin, View):
template_name = "compte/solde.html"
def get(self, request, uid, ptype, *args, **kwargs):
form = SoldeForm()
return render(request, self.template_name, {'form': form, 'ptype': ptype, 'ide': uid})
return render(request,
self.template_name,
{
'form': form,
'ptype': ptype,
'ide': uid,
}
)
def post(self, request, uid, ptype, next='/compte/', *args, **kwargs):
form = SoldeForm(request.POST)
luser = get_luser(request, uid, ptype, 'w')
if form.is_valid():
fact = {
'modePaiement': [form.cleaned_data['mode']],
'article': [u'%s~~%s~~1~~%s' % ('SOLDE', 'Rechargement de solde ' + form.cleaned_data['commentaire'],float(form.cleaned_data['montant']))],
'modePaiement': [form.cleaned_data['mode']],
'article': [u'%s~~%s~~1~~%s' % ('SOLDE', 'Rechargement de solde ' + form.cleaned_data['commentaire'],float(form.cleaned_data['montant']))],
}
with conn_pool.get_conn(request.user).newFacture(luser.dn, fact) as facture:
try:
......@@ -408,14 +438,23 @@ vente = VenteView.as_view()
class AdhesionView(CableurOrSelfMixin, RedirectHomeMixin, View):
"""
Classe de base pour l'adhésion
Classe de base pour l'adhésion
"""
template_name = "compte/adhesion.html"
def get(self, request, uid, ptype, cablage, *args, **kwargs):
form = AdhesionForm(request.POST, is_cableur=cablage)
return render(request, self.template_name, {'form': form, 'ptype': ptype, 'ide': uid, 'cablage': cablage})
return render(
request,
self.template_name,
{
'form': form,
'ptype': ptype,
'ide': uid,
'cablage': cablage,
}
)
def post(self, request, uid, ptype, cablage, next = '/compte/', *args, **kwargs):
def post(self, request, uid, ptype, cablage, next='/compte/', *args, **kwargs):
def connexion_possible(nbrmois, luser):
# Determine le nombre de mois possible avant la readhesion
......@@ -424,7 +463,7 @@ class AdhesionView(CableurOrSelfMixin, RedirectHomeMixin, View):
if reste_adhesion.months < 0:
nbrmois = 0
return nbrmois
if nbrmois > reste_adhesion.months and reste_adhesion.years==0:
if nbrmois > reste_adhesion.months and reste_adhesion.years == 0:
if reste_adhesion.days > 15:
nbrmois = reste_adhesion.months + 1
else:
......
......@@ -53,7 +53,8 @@ DROITS_SPECIAUX = { # Dictionnaire de groupe devant contenir les droits correspo
def get_or_create_cransgroup(name):
""" Crée le groupe crans_name avec le droit crans_name.
"""
Crée le groupe crans_name avec le droit crans_name.
"""
group, created = Group.objects.get_or_create(name=name)
if created:
......@@ -67,9 +68,10 @@ def get_or_create_cransgroup(name):
return group
def refresh_droits(user, cl_user, allow_staff=False):
"""Rafraîchit les droits de l'utilisateur django `user' depuis
l'utilisateur LDAP `cl_user'.
N'ajoute pas les droits crans si allow_staff=False (default)
"""
Rafraîchit les droits de l'utilisateur django `user' depuis
l'utilisateur LDAP `cl_user'.
N'ajoute pas les droits crans si allow_staff=False (default)
"""
cl_droits_reels = set(x.value for x in cl_user.get('droits', []))
......@@ -101,8 +103,10 @@ def refresh_droits(user, cl_user, allow_staff=False):
user.save()
def refresh_fields(user, cl_user):
"""Rafraîchit les champs correspondants à l'utilisateur (nom,
prénom, email)"""
"""
Rafraîchit les champs correspondants à l'utilisateur
(nom, prénom, email)
"""
user.first_name = unicode(cl_user.get('prenom', [u"club"])[0])
user.last_name = unicode(cl_user['nom'][0])
......@@ -119,32 +123,45 @@ def post_cas_login(sender, user, created, attributes, ticket, service, **kwargs)
refresh_fields(user, ldap_user)
class LDAPUserBackend(ModelBackend):
"""Authentifie un utilisateur à l'aide de la base LDAP"""
"""
Authentifie un utilisateur à l'aide de la base LDAP
"""
supports_anonymous_user = False
@sensitive_variables('password')
def authenticate(self, username=None, password=None, **kwargs):
"""Authentifie l'utilisateur sur la base LDAP. Crée un
utilisateur django s'il n'existe pas encore."""
"""
Authentifie l'utilisateur sur la base LDAP. Crée un
utilisateur django s'il n'existe pas encore.
"""
# Si ``username`` ou ``password`` 'est pas fourni, on quitte
if not username or not password:
return None
# Sinon, on ouvre une connexion
shortcut = lc_ldap.shortcuts.lc_ldap_test if settings.BASE_LDAP_TEST else lc_ldap.shortcuts.lc_ldap
try:
conn = shortcut(user = username, cred = password)
myself = conn.search(dn = conn.dn, scope = ldap.SCOPE_BASE)
# On ouvre une connection à la base LDAP avec les credentials de l'user
conn = shortcut(user=username, cred=password)
myself = conn.search(dn=conn.dn, scope=ldap.SCOPE_BASE)
ldap_user = myself[0]
except IndexError:
# Si pas de resultats, on renvoie ``None``
return None
except ldap.INVALID_CREDENTIALS:
# Si les identifiants sont invalides, on renvoie ``None``
return None
django_username = username
try:
# On essaie de récupérer l'utilisateur dans la base
user = User.objects.get(username=django_username)
except User.DoesNotExist:
user = User(username=django_username, password="LDAP Backend User!")
# Si l'utilisateur n'est pas dans la base, on le cré
user = User(
username=django_username,
password="LDAP Backend User!",
)
user.save()
conn_pool.CONNS[django_username] = conn
refresh_droits(user, ldap_user)
......@@ -152,7 +169,9 @@ class LDAPUserBackend(ModelBackend):
return user
def get_user(self, uid):
"""Récupère l'objet django correspondant à l'uid"""
"""
Récupère l'objet django correspondant à l'uid
"""
try:
return User.objects.get(pk=uid)
except User.DoesNotExist:
......
......@@ -28,7 +28,9 @@ def trigger_generate(server):
generate.trigger(server, background=True)
def create_machine(user, type, mac, host, club=None, adherent=None):
"""Crée une machine pour l'utilisateur ldap `user`, où `type` est
"""
Crée une machine pour l'utilisateur ldap `user`
où `type` est
"wifi-adh", "wifi-adh-v6", "fil" etc.
Et `club` est un éventuel cid (int).
"""
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment