Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- This document explains how to put together an invite only plus django social auth.
- django social auth : https://github.com/omab/django-social-auth/
- invitation application comes from http://code.larlet.fr/django-invitation/overview/
- follow the instructions for installing invitation application and social auth.
- Now, the only thing you need to change in invitation application is adding one line to save invitation key in request.session.
- After that you have to write your own piplines, my application with those custom pipelines is called "main" and templates go into "socialauth" folder.
- #invitation.views
- def invited(request, invitation_key=None, extra_context=None):
- if getattr(settings, 'INVITE_MODE', False):
- if invitation_key and is_key_valid(invitation_key):
- template_name = 'invitation/invited.html'
- else:
- template_name = 'invitation/wrong_invitation_key.html'
- extra_context = extra_context is not None and extra_context.copy() or {}
- extra_context.update({'invitation_key': invitation_key})
- request.session['invitation_key']= invitation_key #the only line changed in this view:)
- return direct_to_template(request, template_name, extra_context)
- else:
- return HttpResponseRedirect(reverse('registration_register'))
- # settings.py
- SOCIAL_AUTH_PIPELINE = (
- 'social_auth.backends.pipeline.social.social_auth_user',
- #'main.pipeline.social_auth_user',
- 'social_auth.backends.pipeline.associate.associate_by_email',
- 'social_auth.backends.pipeline.misc.save_status_to_session',
- 'main.pipeline.redirect_to_form',
- 'main.pipeline.username',
- #'social_auth.backends.pipeline.user.get_username',
- 'social_auth.backends.pipeline.user.create_user',
- 'social_auth.backends.pipeline.social.associate_user',
- 'social_auth.backends.pipeline.social.load_extra_data',
- 'social_auth.backends.pipeline.user.update_user_details',
- 'social_auth.backends.pipeline.misc.save_status_to_session',
- 'main.pipeline.redirect_to_form2',
- #'main.pipeline.first_name',
- 'main.pipeline.email',
- )
- #main.pipeline
- from django.http import HttpResponseRedirect
- def redirect_to_form(*args, **kwargs):
- if not kwargs['request'].session.get('saved_username') and \
- kwargs.get('user') is None:
- return HttpResponseRedirect('/formusername/')
- from django.http import Http404
- def username(request, *args, **kwargs):
- if kwargs.get('user'):
- username = kwargs['user'].username
- else:
- username = request.session.get('saved_username')
- return {'username': username}
- def redirect_to_form2(*args, **kwargs):
- if not kwargs['request'].session.get('email_address') and not kwargs.get('user').email:
- return HttpResponseRedirect('/formemail/')
- def email(request, *args, **kwargs):
- if kwargs.get('user') and request.session.get('email_address'):
- email = request.session['email_address']
- user = kwargs['user']
- user.email = email
- user.save()
- def first_name(request, *args, **kwargs):
- if 'saved_first_name' in request.session:
- user = kwargs['user']
- user.first_name = request.session.get('saved_first_name')
- user.save()
- #main.urls
- #social auth customization
- urlpatterns += patterns('main.views',
- url(r'^error/$', 'error', name='error'),
- url(r'^formusername/$', 'formusername', name='formusername'),
- url(r'^formemail/$', 'formemail', name='formemail'),
- )
- #main.views
- """
- Social Auth customized
- """
- from social_auth.utils import setting
- def error(request):
- """Error view"""
- messages = get_messages(request)
- return render_to_response('socialauth/error.html', {'version': version,
- 'messages': messages},
- RequestContext(request))
- from invitation.models import InvitationKey
- is_key_valid = InvitationKey.objects.is_key_valid
- def formusername(request):
- if request.method == 'POST' and request.POST.get('username') and request.session.get('invitation_key'):
- if is_key_valid(request.session['invitation_key']):
- if (not User.objects.filter(username= request.POST['username']).exists()):
- name = setting('SOCIAL_AUTH_PARTIAL_PIPELINE_KEY', 'partial_pipeline')
- request.session['saved_username'] = request.POST['username']
- backend = request.session[name]['backend']
- return redirect('socialauth_complete', backend=backend)
- else:
- return render_to_response('socialauth/form.html', {'error': _('Username already exists!')}, RequestContext(request))
- else:
- render_to_response('socialauth/form.html', {'error': _('Invalid Invitation Key')}, RequestContext(request))
- return render_to_response('socialauth/form.html', {}, RequestContext(request))
- def formemail(request):
- if request.method == 'POST' and request.POST.get('email_address'):
- request.session['email_address'] = request.POST['email_address']
- name = setting('SOCIAL_AUTH_PARTIAL_PIPELINE_KEY', 'partial_pipeline')
- backend = request.session[name]['backend']
- return redirect('socialauth_complete', backend=backend)
- return render_to_response('socialauth/form2.html', {}, RequestContext(request))
- #templates.socialauth.form.html
- {% extends "base.html" %}
- {% block heading %}User basic form{% endblock %}
- {% block content %}
- <form action="" method="post">
- {% csrf_token %}
- <p>{% if error%} {{error}} {%endif%}</p>
- <p>
- <label for="id_username">username</label>
- <input type="text" name="username" id="id_username" value="" />
- </p>
- <input type="submit" value="Send" />
- </form>
- {% endblock %}
- #templates.socialauth.form2.html
- {% extends "base.html" %}
- {% block heading %}Email Form{% endblock %}
- {% block content %}
- <form action="" method="post">
- {% csrf_token %}
- <p>
- <label for="id_email">Email Address</label>
- <input type="text" name="email_address" id="id_email" value="" />
- </p>
- <input type="submit" value="Send" />
- </form>
- {% endblock %}
Advertisement
Add Comment
Please, Sign In to add comment