Source

django-publicauth / publicauth / backends / __init__.py

Diff from to

File publicauth/backends/__init__.py

+from django.shortcuts import render_to_response, redirect
+from django.conf import settings as global_settings
 from django.utils.translation import ugettext as _
 from django.contrib.auth.models import User
+from django.template import RequestContext
+from django.contrib import messages
 from django.contrib import auth
-from django.conf import settings as global_settings
+from django.http import Http404
 
 from annoying.exceptions import Redirect
 
 from publicauth.models import PublicID
 from publicauth.utils import str_to_class
 from publicauth import settings
+from publicauth import lang
 
 
 class BaseBackend(object):
 
     PROFILE_MAPPING = property(lambda self: getattr(global_settings, "%s_PROFILE_MAPPING" % self.provider.upper(), {}))
+    EXTRA_FORM = property(lambda self: getattr(global_settings, "%s_EXTRA_FORM" % self.provider.upper(), 'publicauth.forms.ExtraForm'))
 
     def __init__(self, provider):
         self.provider = provider
         return self._identity
 
     def begin(self, request, data):
-        pass
+        raise NotImplementedError
 
     def complete(self, request):
         """
         and user with such identity doesnt exists.
         Merge accounts if user already logged in and identity is new.
         """
-        pass
+        raise NotImplementedError
     
     def attach_account(self, request, user):
         """
         account and then login user.
         """
         PublicID.objects.create(user=user, identity=self.get_identity(), provider=self.provider)
-        request.flash['success'] =  _('OpenId record was added to your account')
+        messages.add_message(request, messages.SUCCESS, lang.ACCOUNTS_MERGED)
         auth.authenticate(identity=self.get_identity(), provider=self.provider)
         auth.login(request, user)
         raise Redirect(global_settings.LOGIN_REDIRECT_URL)
 
     def login_user(self, request):
         if settings.PUBLICID_ACTIVATION_REQUIRED and not request.user.is_active:
-            request.flash['error'] =  _('Your account is not activated. Please activate it first.')
+            messages.add_message(request, messages.ERROR, lang.NOT_ACTIVATED)
             raise Redirect("/")
+
         user = auth.authenticate(identity=self.get_identity(), provider=self.provider)
         if user:
-            request.flash['success'] =  _('You have successfully authenticated')
+            messages.add_message(request, messages.SUCCESS, lang.SUCCESSFULLY_AUTHENTICATED)
             auth.login(request, user)
             raise Redirect(global_settings.LOGIN_REDIRECT_URL)
 
         for field in self.PROFILE_MAPPING:
             data.update(self.extract_data(extra, field))
 
-        form = str_to_class(settings.PUBLICID_EXTRA_FORM)(data, fields=self.PROFILE_MAPPING)
+        form = str_to_class(self.EXTRA_FORM)(data, fields=self.PROFILE_MAPPING)
         if form.is_valid():
             form.save(self.get_identity(), self.provider)
             user = auth.authenticate(identity=self.get_identity(), provider=self.provider)
 
     def validate_response(self, request):
         pass
+
+
+    def extra(self, request):
+        """
+        Handle registration of new user with extra data for profile
+        """
+        try:
+            identity = request.session['identity']
+        except KeyError:
+            raise Http404
+
+        if request.method == "POST":
+            form = str_to_class(self.EXTRA_FORM)(request.POST)
+            if form.is_valid():
+                user = form.save(identity, self.provider)
+                del request.session['identity']
+                user = auth.authenticate(identity=identity, provider=self.provider)
+                if user:
+                    auth.login(request, user)
+                    next_url = request.session['next_url']
+                    del request.session['next_url']
+                    return redirect(next_url)
+        else:
+            initial = request.session['extra']
+            form = str_to_class(self.EXTRA_FORM)(initial=initial)
+
+        return render_to_response(     
+                                    "publicauth/extra.html", 
+                                    {'form': form}, 
+                                    context_instance=RequestContext(request)
+                                )
+