""" This module defines operating system user related forms. """ from __future__ import unicode_literals from django import forms from django.core.urlresolvers import reverse from django.utils.translation import ugettext_lazy as _ from crispy_forms.helper import FormHelper from crispy_forms.layout import Submit from .models import User PASSWORD_MISMATCH_ERROR = _("Passwords don't match") """ Error message for non matching passwords. """ class ChangeOsUserPasswordForm(forms.ModelForm): """ A form for setting an OS user's password. """ password1 = forms.CharField( label=_('Password'), widget=forms.PasswordInput, required=False, ) password2 = forms.CharField( label=_('Password (again)'), widget=forms.PasswordInput, required=False, ) class Meta: model = User fields = [] def __init__(self, *args, **kwargs): self.helper = FormHelper() super(ChangeOsUserPasswordForm, self).__init__(*args, **kwargs) self.helper.form_action = reverse( 'set_osuser_password', kwargs={'slug': self.instance.username}) self.helper.add_input(Submit('submit', _('Set password'))) def clean_password2(self): """ Check that the two password entries match. :return: the validated password :rtype: str or None """ password1 = self.cleaned_data.get('password1') password2 = self.cleaned_data.get('password2') if password1 and password2 and password1 != password2: raise forms.ValidationError(PASSWORD_MISMATCH_ERROR) return password2 def save(self, commit=True): """ Save the provided password in hashed format. :param boolean commit: whether to save the created user :return: user instance :rtype: :py:class:`osusers.models.User` """ self.instance.set_password(self.cleaned_data['password1']) return super(ChangeOsUserPasswordForm, self).save(commit=commit)