Revision f7400729 snf-astakos-app/astakos/im/forms.py

b/snf-astakos-app/astakos/im/forms.py
453 453
        return user
454 454

  
455 455

  
456

  
456 457
class FeedbackForm(forms.Form):
457 458
    """
458 459
    Form for writing feedback.
......
910 911
        required=True
911 912
    )
912 913

  
914

  
913 915
class ProjectSearchForm(forms.Form):
914 916
    q = forms.CharField(max_length=200, label='Search project', required=False)
915 917

  
918

  
919
class ExtendedProfileForm(ProfileForm):
920
    """
921
    Profile form that combines `email change` and `password change` user
922
    actions by propagating submited data to internal EmailChangeForm
923
    and ExtendedPasswordChangeForm objects.
924
    """
925

  
926
    password_change_form = None
927
    email_change_form = None
928
    extra_forms_fields = {
929
        'email': ['new_email_address'],
930
        'password': ['old_password', 'new_password1', 'new_password2']
931
    }
932

  
933
    change_password = forms.BooleanField(initial=False, required=False)
934
    change_email = forms.BooleanField(initial=False, required=False)
935

  
936
    def __init__(self, *args, **kwargs):
937
        super(ExtendedProfileForm, self).__init__(*args, **kwargs)
938
        self._init_extra_forms()
939
        self.save_extra_forms = []
940
        self.success_messages = []
941

  
942
    def _init_extra_form_fields(self):
943
        self.fields.update(self.email_change_form.fields)
944
        self.fields.update(self.password_change_form.fields)
945

  
946
        self.fields['new_email_address'].required = False
947
        self.fields['old_password'].required = False
948
        self.fields['new_password1'].required = False
949
        self.fields['new_password2'].required = False
950

  
951
    def _update_extra_form_errors(self):
952
        if self.cleaned_data.get('change_password'):
953
            self.errors.update(self.password_change_form.errors)
954
        if self.cleaned_data.get('change_email'):
955
            self.errors.update(self.email_change_form.errors)
956

  
957
    def _init_extra_forms(self):
958
        self.email_change_form = EmailChangeForm(self.data)
959
        self.password_change_form = ExtendedPasswordChangeForm(user=self.instance,
960
                                   data=self.data)
961
        self._init_extra_form_fields()
962

  
963
    def is_valid(self):
964
        password, email = True, True
965
        profile = super(ExtendedProfileForm, self).is_valid()
966
        if profile and self.cleaned_data.get('change_password'):
967
            password = self.password_change_form.is_valid()
968
        if profile and self.cleaned_data.get('change_email'):
969
            email = self.email_change_form.is_valid()
970

  
971
        if not password or not email:
972
            self._update_extra_form_errors()
973

  
974
        return all([profile, password, email])
975

  
976
    def save(self, *args, **kwargs):
977
        if 'email' in self.save_extra_forms:
978
            self.email_change_email.save(*args, **kwargs)
979
        if 'password' in self.save_extra_forms:
980
            self.password_change_form.save(*args, **kwargs)
981
        return super(ExtendedProfileForm, self).save(*args, **kwargs)
982

  

Also available in: Unified diff