forms.py 3.23 KB
Newer Older
1 2
# -*- coding: utf-8 -*-
from django.forms import ModelForm, PasswordInput, CharField, ValidationError
Mathilde Espinasse's avatar
Mathilde Espinasse committed
3
from django.utils.translation import ugettext_lazy as _
Daniel STAN's avatar
Daniel STAN committed
4 5 6
from models import Profile

class ProfileForm(ModelForm):
7 8
    """ Formulaire d'édition de profil Cr@ns, avec confirmation de changement de
    mot de passe. Basé sur le modèle, il l'étend légèrement. """
Daniel STAN's avatar
Daniel STAN committed
9 10
    class Meta:
        model = Profile
11 12 13 14 15 16 17 18 19
        """user et num ne doivent pas être modifiés à la main. (l'un dépend de 
           l'autre, et cela n'est pas au choix de l'utilisateur, anyway)
           password est gardé tel quel, on utilise nos validations et champs
           perso pour le modifier"""
        exclude = ('user', 'num', 'password')

    """ Premier champ de mdp, à laisser vide si inchangé"""
    pass_change1 = CharField(max_length=255,
                             widget=PasswordInput,
Mathilde Espinasse's avatar
Mathilde Espinasse committed
20
                             label=_("Mot de passe (laisser vide si inchangé)"),
21 22 23 24
                             required=False)
    """ Champ de confirmation """
    pass_change2 = CharField(max_length=255,
                             widget=PasswordInput,
Mathilde Espinasse's avatar
Mathilde Espinasse committed
25
                             label=_("Mot de passe (répéter)"),
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
                             required=False)
    
    def __init__(self, *args, **kwargs):
        """ Construit un formulaire. On rajoute un argument facultatif: l'user
            qui édite ce formulaire (pour la création de l'objet).
            On récupère aussi une instance de profil, éventuellement. Si elle
            n'existe pas, c'est que l'on doit créer le profil, le mdp est donc
            obligatoire (sinon non).
            """
        self.user = kwargs.get('user',None)
        if kwargs.has_key('user'):
            del kwargs['user']
        super(ProfileForm, self).__init__(*args, **kwargs)
        self.need_pass = kwargs.get('instance',None) == None

Daniel STAN's avatar
Daniel STAN committed
41

42 43 44 45 46 47 48
    def clean(self):
        """ En plus des vérifications habituelles, on vérifie que les deux mdp
        sont identiques, si renseignés. Et renseignés si obligatoires."""
        cleaned_data = super(ProfileForm, self).clean()
        p1 = cleaned_data.get('pass_change1','')
        p2 = cleaned_data.get('pass_change2','')
        if self.need_pass and len(p1) == 0:
Mathilde Espinasse's avatar
Mathilde Espinasse committed
49
            raise ValidationError({'pass_change1': [_(u'Vous devez rentrer un mot de passe (il n\'a jamais été défini)'),]})
50
        if p1 != p2:
Mathilde Espinasse's avatar
Mathilde Espinasse committed
51
            raise ValidationError({'pass_change1': [_(u'Les mots de passe ne correspondent pas'),]})
52 53
        # assert( p1 == p2 )
        if 0 < len(p1) and len(p1) < 6:
Mathilde Espinasse's avatar
Mathilde Espinasse committed
54
            raise ValidationError({'pass_change1': [_(u'Le mot de passe doit posséder au moins 6 caractères'),]})
55 56 57 58 59 60 61 62 63 64 65 66 67 68
        return cleaned_data

    def save(self, commit=True):
        """ On applique deux trois modifs avant de réellement sauver: on
        remplace l'user et on redéfinie le mdp si changé"""
        obj = super(ProfileForm, self).save(commit=False)
        obj.set_user(self.user) # important: on doit calculer l'user et le num
                                # AVANT de définir le pass
        if self.cleaned_data.get('pass_change1','') != '':
            obj.set_password(self.cleaned_data['pass_change1'])
        if commit:
            return obj.save()
        else:
            return obj