def extra(request, provider): """ 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(settings.EXTRA_FORM)(request.POST) if form.is_valid(): user = form.save(request, identity, provider) del request.session['identity'] if not settings.PUBLICAUTH_ACTIVATION_REQUIRED: user = auth.authenticate(identity=identity, provider=provider) if user: auth.login(request, user) next_url = request.session['next_url'] del request.session['next_url'] return redirect(next_url) else: messages.warning(request, lang.ACTIVATION_REQUIRED_TEXT) return redirect(settings.ACTIVATION_REDIRECT_URL) else: initial = request.session['extra'] form = str_to_class(settings.EXTRA_FORM)(initial=initial) return {'form': form}
def fill_extra_fields(self, request, extra): """ Try to fetch extra data from provider, if this data is enough to validate settings.EXTRA_FORM then call save method of form class and login the user. The extra parameter can be some complex object this is why we use method function 'extra_data' to extract data from this object. Also we need to create a dictionary with remapped keys from profile mapping settings. """ data = {} if extra: for backend_field, form_field in self.PROFILE_MAPPING.items(): data.update(self.extract_data(extra, backend_field, form_field)) form = str_to_class(settings.EXTRA_FORM)(data) if form.is_valid(): form.save(request, self.identity, self.provider) self.login_user(request) else: return data