X-Git-Url: https://code.grnet.gr/git/astakos/blobdiff_plain/23447441525466122183ea8869bba881780bf33e..068284664bb6352ced88d15b60f957e4b2c1c193:/snf-astakos-app/astakos/im/views.py diff --git a/snf-astakos-app/astakos/im/views.py b/snf-astakos-app/astakos/im/views.py index c69ea75..1936d9f 100644 --- a/snf-astakos-app/astakos/im/views.py +++ b/snf-astakos-app/astakos/im/views.py @@ -52,14 +52,15 @@ from django.http import HttpResponseRedirect, HttpResponseBadRequest from django.db.utils import IntegrityError from django.contrib.auth.views import password_change from django.core.exceptions import ValidationError +from django.db.models import Q from astakos.im.models import AstakosUser, Invitation, ApprovalTerms from astakos.im.activation_backends import get_backend, SimpleBackend from astakos.im.util import get_context, prepare_response, set_cookie, get_query from astakos.im.forms import * from astakos.im.functions import send_greeting, send_feedback, SendMailError, \ - invite as invite_func, logout as auth_logout -from astakos.im.settings import DEFAULT_CONTACT_EMAIL, DEFAULT_FROM_EMAIL, COOKIE_NAME, COOKIE_DOMAIN, IM_MODULES, SITENAME, LOGOUT_NEXT + invite as invite_func, logout as auth_logout, activate as activate_func, switch_account_to_shibboleth +from astakos.im.settings import DEFAULT_CONTACT_EMAIL, DEFAULT_FROM_EMAIL, COOKIE_NAME, COOKIE_DOMAIN, IM_MODULES, SITENAME, LOGOUT_NEXT, LOGGING_LEVEL logger = logging.getLogger(__name__) @@ -261,7 +262,7 @@ def edit_profile(request, template_name='im/profile.html', extra_context={}): next = request.POST.get('next') if next: return redirect(next) - msg = _('Profile has been updated successfully') + msg = _('

Profile has been updated successfully

') messages.add_message(request, messages.SUCCESS, msg) except ValueError, ve: messages.add_message(request, messages.ERROR, ve) @@ -278,7 +279,7 @@ def signup(request, template_name='im/signup.html', on_success='im/signup_comple """ Allows a user to create a local account. - In case of GET request renders a form for providing the user information. + In case of GET request renders a form for entering the user information. In case of POST handles the signup. The user activation will be delegated to the backend specified by the ``backend`` keyword argument @@ -286,7 +287,7 @@ def signup(request, template_name='im/signup.html', on_success='im/signup_comple if settings.ASTAKOS_INVITATIONS_ENABLED is True or ``astakos.im.activation_backends.SimpleBackend`` if not (see activation_backends); - Upon successful user creation if ``next`` url parameter is present the user is redirected there + Upon successful user creation, if ``next`` url parameter is present the user is redirected there otherwise renders the same page with a success message. On unsuccessful creation, renders ``template_name`` with an error message. @@ -297,7 +298,6 @@ def signup(request, template_name='im/signup.html', on_success='im/signup_comple A custom template to render. This is optional; if not specified, this will default to ``im/signup.html``. - ``on_success`` A custom template to render in case of success. This is optional; if not specified, this will default to ``im/signup_complete.html``. @@ -311,7 +311,7 @@ def signup(request, template_name='im/signup.html', on_success='im/signup_comple im/signup_complete.html or ``on_success`` keyword argument. """ if request.user.is_authenticated(): - return HttpResponseRedirect(reverse('astakos.im.views.index')) + return HttpResponseRedirect(reverse('astakos.im.views.edit_profile')) provider = get_query(request).get('provider', 'local') try: @@ -333,6 +333,8 @@ def signup(request, template_name='im/signup.html', on_success='im/signup_comple additional_email = form.cleaned_data['additional_email'] if additional_email != user.email: user.additionalmail_set.create(email=additional_email) + msg = 'Additional email: %s saved for user %s.' % (additional_email, user.email) + logger._log(LOGGING_LEVEL, msg, []) if user and user.is_active: next = request.POST.get('next', '') return prepare_response(request, user, next=next) @@ -409,9 +411,13 @@ def logout(request, template='registration/logged_out.html', extra_context={}): """ Wraps `django.contrib.auth.logout` and delete the cookie. """ - auth_logout(request) response = HttpResponse() - response.delete_cookie(COOKIE_NAME, path='/', domain=COOKIE_DOMAIN) + if request.user.is_authenticated(): + email = request.user.email + auth_logout(request) + response.delete_cookie(COOKIE_NAME, path='/', domain=COOKIE_DOMAIN) + msg = 'Cookie deleted for %s' % email + logger._log(LOGGING_LEVEL, msg, []) next = request.GET.get('next') if next: response['Location'] = next @@ -421,13 +427,13 @@ def logout(request, template='registration/logged_out.html', extra_context={}): response['Location'] = LOGOUT_NEXT response.status_code = 301 return response - messages.add_message(request, messages.SUCCESS, _('You have successfully logged out.')) + messages.add_message(request, messages.SUCCESS, _('

You have successfully logged out.

')) context = get_context(request, extra_context) response.write(render_to_string(template, context_instance=context)) return response @transaction.commit_manually -def activate(request, email_template_name='im/welcome_email.txt', on_failure='im/signup.html'): +def activate(request, greeting_email_template_name='im/welcome_email.txt', helpdesk_email_template_name='im/helpdesk_notification.txt'): """ Activates the user identified by the ``auth`` request parameter, sends a welcome email and renews the user token. @@ -442,44 +448,49 @@ def activate(request, email_template_name='im/welcome_email.txt', on_failure='im except AstakosUser.DoesNotExist: return HttpResponseBadRequest(_('No such user')) + if user.is_active: + message = _('Account already active.') + messages.add_message(request, messages.ERROR, message) + return index(request) + try: - local_user = AstakosUser.objects.get(email=user.email, is_active=True) + local_user = AstakosUser.objects.get(~Q(id = user.id), email=user.email, is_active=True) except AstakosUser.DoesNotExist: - user.is_active = True - user.email_verified = True try: - user.save() - except ValidationError, e: - return HttpResponseBadRequest(e) + activate_func(user, greeting_email_template_name, helpdesk_email_template_name, verify_email=True) + response = prepare_response(request, user, next, renew=True) + transaction.commit() + return response + except SendMailError, e: + message = e.message + messages.add_message(request, messages.ERROR, message) + transaction.rollback() + return index(request) + except BaseException, e: + status = messages.ERROR + message = _('Something went wrong.') + messages.add_message(request, messages.ERROR, message) + logger.exception(e) + transaction.rollback() + return index(request) else: - # switch the existing account to shibboleth one - local_user.provider = 'shibboleth' - local_user.set_unusable_password() - local_user.third_party_identifier = user.third_party_identifier try: - local_user.save() - except ValidationError, e: - return HttpResponseBadRequest(e) - user.delete() - user = local_user - - try: - send_greeting(user, email_template_name) - response = prepare_response(request, user, next, renew=True) - transaction.commit() - return response - except SendMailError, e: - message = e.message - messages.add_message(request, messages.ERROR, message) - transaction.rollback() - return render_response(on_failure) - except BaseException, e: - status = messages.ERROR - message = _('Something went wrong.') - messages.add_message(request, messages.ERROR, message) - logger.exception(e) - transaction.rollback() - return signup(request, on_failure) + user = switch_account_to_shibboleth(user, local_user, greeting_email_template_name) + response = prepare_response(request, user, next, renew=True) + transaction.commit() + return response + except SendMailError, e: + message = e.message + messages.add_message(request, messages.ERROR, message) + transaction.rollback() + return index(request) + except BaseException, e: + status = messages.ERROR + message = _('Something went wrong.') + messages.add_message(request, messages.ERROR, message) + logger.exception(e) + transaction.rollback() + return index(request) def approval_terms(request, term_id=None, template_name='im/approval_terms.html', extra_context={}): term = None @@ -523,7 +534,9 @@ def approval_terms(request, term_id=None, template_name='im/approval_terms.html' @signed_terms_required def change_password(request): - return password_change(request, post_change_redirect=reverse('astakos.im.views.edit_profile')) + return password_change(request, + post_change_redirect=reverse('astakos.im.views.edit_profile'), + password_change_form=ExtendedPasswordChangeForm) @transaction.commit_manually def change_email(request, activation_key=None, @@ -572,4 +585,4 @@ def change_email(request, activation_key=None, return render_response(form_template_name, form = form, context_instance = get_context(request, - extra_context)) \ No newline at end of file + extra_context))