Revision f7400729

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

  
b/snf-astakos-app/astakos/im/views.py
81 81
from astakos.im.util import (
82 82
    get_context, prepare_response, get_query, restrict_next)
83 83
from astakos.im.forms import (
84
    LoginForm, InvitationForm, ProfileForm,
84
    LoginForm, InvitationForm,
85 85
    FeedbackForm, SignApprovalTermsForm,
86 86
    EmailChangeForm,
87 87
    ProjectApplicationForm, ProjectSortForm,
88 88
    AddProjectMembersForm, ProjectSearchForm,
89 89
    ProjectMembersSortForm)
90
from astakos.im.forms import ExtendedProfileForm as ProfileForm
90 91
from astakos.im.functions import (
91 92
    send_feedback, SendMailError,
92 93
    logout as auth_logout,
......
384 385
                    request.POST.get('next'),
385 386
                    domain=COOKIE_DOMAIN
386 387
                )
387
                if next:
388
                    return redirect(next)
389 388
                msg = _(astakos_messages.PROFILE_UPDATED)
390 389
                messages.success(request, msg)
390
                if next:
391
                    return redirect(next)
392
                else:
393
                    return redirect(reverse('edit_profile'))
391 394
            except ValueError, ve:
392 395
                messages.success(request, ve)
393 396
    elif request.method == "GET":

Also available in: Unified diff