]> git.openstreetmap.org Git - osqa.git/blobdiff - forum/views/auth.py
Adds the option to create static pages with several options to customize its behaviour.
[osqa.git] / forum / views / auth.py
index 4857b715e1854ba55efeb365ce2352b1fc5fbe1e..ebccf0eefdc5669a8953537eb71ffb7788f94d1a 100644 (file)
@@ -2,7 +2,7 @@ from django.shortcuts import render_to_response, get_object_or_404
 from django.template import RequestContext
 from django.core.urlresolvers import reverse
 from forum.models import User
-from django.http import HttpResponseRedirect, Http404
+from django.http import HttpResponseRedirect, Http404, HttpResponseForbidden
 from django.utils.safestring import mark_safe
 from django.utils.translation import ugettext as _
 from django.utils.http import urlquote_plus
@@ -12,14 +12,15 @@ from django.http import get_host
 import types
 import datetime
 
-from forum.authentication.forms import SimpleRegistrationForm, SimpleEmailSubscribeForm, \
+from forum.forms import SimpleRegistrationForm, SimpleEmailSubscribeForm, \
         TemporaryLoginRequestForm, ChangePasswordForm, SetPasswordForm
-from forum.utils.mail import send_email
+from forum.utils.mail import send_email, send_template_email
 
 from forum.authentication.base import InvalidAuthentication
-from forum.authentication import AUTH_PROVIDERS, user_logged_in
+from forum.authentication import AUTH_PROVIDERS
 
 from forum.models import AuthKeyUserAssociation, ValidationHash, Question, Answer
+from forum.actions import UserJoinsAction
 
 def signin_page(request, action=None):
     if action is None:
@@ -84,7 +85,9 @@ def prepare_provider_signin(request, provider):
         except InvalidAuthentication, e:
             request.session['auth_error'] = e.message
 
-        return HttpResponseRedirect(reverse('auth_signin'))    
+        return HttpResponseRedirect(reverse('auth_signin'))
+    else:
+        raise Http404()
 
 
 def process_provider_signin(request, provider):
@@ -114,7 +117,7 @@ def process_provider_signin(request, provider):
                     uassoc = AuthKeyUserAssociation(user=request.user, key=assoc_key, provider=provider)
                     uassoc.save()
                     request.user.message_set.create(message=_('The new credentials are now associated with your account'))
-                    return HttpResponseRedirect(reverse('user_authsettings'))
+                    return HttpResponseRedirect(reverse('user_authsettings', args=[request.user.id]))
 
             return HttpResponseRedirect(reverse('auth_signin'))
         else:
@@ -144,11 +147,10 @@ def external_register(request):
 
             if User.objects.all().count() == 0:
                 user_.is_superuser = True
+                user_.is_staff = True
             
             user_.save()
-
-            if not user_.email_isvalid:
-                send_validation_email(user_)
+            UserJoinsAction(user=user_, ip=request.META['REMOTE_ADDR']).save()
 
             try:
                 assoc_key = request.session['assoc_key']
@@ -157,7 +159,7 @@ def external_register(request):
                 request.session['auth_error'] = _("Oops, something went wrong in the middle of this process. Please try again.")
                 return HttpResponseRedirect(request.session.get('on_signin_url', reverse('auth_signin'))) 
 
-            uassoc = AuthKeyUserAssociation(user=user_, key=request.session['assoc_key'], provider=request.session['auth_provider'])
+            uassoc = AuthKeyUserAssociation(user=user_, key=assoc_key, provider=auth_provider)
             uassoc.save()
 
             if email_feeds_form.cleaned_data['subscribe'] == 'n':
@@ -167,20 +169,17 @@ def external_register(request):
             del request.session['assoc_key']
             del request.session['auth_provider']
 
-            if user_.email_isvalid:
-                return login_and_forward(request, user_)
-            else:
-                return HttpResponseRedirect(reverse('index'))
+            return login_and_forward(request, user_, message=_("A welcome email has been sent to your email address. "))
     else:
         provider_class = AUTH_PROVIDERS[request.session['auth_provider']].consumer
         user_data = provider_class.get_user_data(request.session['assoc_key'])
 
+        if not user_data:
+            user_data = request.session.get('auth_consumer_data', {})
+
         username = user_data.get('username', '')
         email = user_data.get('email', '')
 
-        if not email:
-            email = request.session.get('auth_email_request', '')
-
         if email:
             request.session['auth_validated_email'] = email
 
@@ -216,10 +215,7 @@ def request_temp_login(request):
             except:
                 hash = ValidationHash.objects.create_new(user, 'templogin', [user.id])
 
-            send_email(_("Temporary login link"), [(user.username, user.email)], "auth/temp_login_email.html", {
-                'temp_login_code': hash,
-                'user': user
-            })
+            send_template_email([user], "auth/temp_login_email.html", {'temp_login_code': hash})
 
             request.user.message_set.create(message=_("An email has been sent with your temporary login key"))
 
@@ -235,18 +231,11 @@ def temp_signin(request, user, code):
     user = get_object_or_404(User, id=user)
 
     if (ValidationHash.objects.validate(code, user, 'templogin', [user.id])):
-        return login_and_forward(request,  user, reverse('user_authsettings'),
+        return login_and_forward(request,  user, reverse('user_authsettings', kwargs={'id': user.id}),
                 _("You are logged in with a temporary access key, please take the time to fix your issue with authentication."))
     else:
         raise Http404()
-
-def send_validation_email(user):
-    hash = ValidationHash.objects.create_new(user, 'email', [user.email])
-    send_email(_("Email Validation"), [(user.username, user.email)], "auth/email_validation.html", {
-        'validation_code': hash,
-        'user': user
-    })
-
+    
 def validate_email(request, user, code):
     user = get_object_or_404(User, id=user)
 
@@ -258,35 +247,36 @@ def validate_email(request, user, code):
         raise Http404()
 
 @login_required
-def auth_settings(request):
-    """
-    change password view.
+def auth_settings(request, id):
+    user_ = get_object_or_404(User, id=id)
+
+    if not (request.user.is_superuser or request.user == user_):
+        return HttpResponseForbidden()
 
-    url : /changepw/
-    template: authopenid/changepw.html
-    """
-    user_ = request.user
     auth_keys = user_.auth_keys.all()
 
-    if user_.has_usable_password():
-        FormClass = ChangePasswordForm
-    else:
+    if request.user.is_superuser or (not user_.has_usable_password()):
         FormClass = SetPasswordForm
+    else:
+        FormClass = ChangePasswordForm
 
     if request.POST:
         form = FormClass(request.POST, user=user_)
         if form.is_valid():
-            if user_.has_usable_password():
-                request.user.message_set.create(message=_("Your password was changed"))
-            else:
-                request.user.message_set.create(message=_("New password set"))
-                FormClass = ChangePasswordForm
-                
+            is_new_pass = not user_.has_usable_password()
             user_.set_password(form.cleaned_data['password1'])
             user_.save()
-            return HttpResponseRedirect(reverse('user_authsettings'))
-    
-    form = FormClass(user=user_)
+
+            if is_new_pass:
+                request.user.message_set.create(message=_("New password set"))
+                if not request.user.is_superuser:
+                    form = ChangePasswordForm(user=user_)
+            else:
+                request.user.message_set.create(message=_("Your password was changed"))
+
+            return HttpResponseRedirect(reverse('user_authsettings', kwargs={'id': user_.id}))
+    else:
+        form = FormClass(user=user_)
 
     auth_keys_list = []
 
@@ -305,6 +295,8 @@ def auth_settings(request):
         })
 
     return render_to_response('auth/auth_settings.html', {
+        'view_user': user_,
+        "can_view_private": (user_ == request.user) or request.user.is_superuser,
         'form': form,
         'has_password': user_.has_usable_password(),
         'auth_keys': auth_keys_list,
@@ -312,11 +304,12 @@ def auth_settings(request):
 
 def remove_external_provider(request, id):
     association = get_object_or_404(AuthKeyUserAssociation, id=id)
-    if not association.user == request.user:
-        raise Http404()
+    if not (request.user.is_superuser or request.user == association.user):
+        return HttpResponseForbidden()
+
     request.user.message_set.create(message=_("You removed the association with %s") % association.provider)
     association.delete()
-    return HttpResponseRedirect(reverse('user_authsettings'))
+    return HttpResponseRedirect(reverse('user_authsettings', kwargs={'id': association.user.id}))
 
 def newquestion_signin_action(user):
     question = Question.objects.filter(author=user).order_by('-added_at')[0]
@@ -336,7 +329,17 @@ def login_and_forward(request,  user, forward=None, message=None):
     user.backend = "django.contrib.auth.backends.ModelBackend"
     login(request,  user)
 
-    user_logged_in.send(user=user,old_session=old_session,sender=None)
+    temp_data = request.session.pop('temp_node_data', None)
+    if temp_data:
+        request.POST = temp_data
+        node_type = request.session.pop('temp_node_type')
+
+        if node_type == "question":
+            from forum.views.writers import ask
+            return ask(request)
+        elif node_type == "answer":
+            from forum.views.writers import answer
+            return answer(request, request.session.pop('temp_question_id'))
 
     if not forward:
         signin_action = request.session.get('on_signin_action', None)