diff --git a/PyRIGS/decorators.py b/PyRIGS/decorators.py index 67d8964c..4af93097 100644 --- a/PyRIGS/decorators.py +++ b/PyRIGS/decorators.py @@ -2,8 +2,9 @@ from django.contrib.auth import REDIRECT_FIELD_NAME from django.shortcuts import render_to_response from django.template import RequestContext from django.http import HttpResponseRedirect +from django.core.urlresolvers import reverse -def user_passes_test_with_403(test_func, login_url=None): +def user_passes_test_with_403(test_func, login_url=None, oembed_view=None): """ Decorator for views that checks that the user passes the given test. @@ -13,12 +14,20 @@ def user_passes_test_with_403(test_func, login_url=None): if not login_url: from django.conf import settings login_url = settings.LOGIN_URL + def _dec(view_func): def _checklogin(request, *args, **kwargs): if test_func(request.user): return view_func(request, *args, **kwargs) elif not request.user.is_authenticated(): - return HttpResponseRedirect('%s?%s=%s' % (login_url, REDIRECT_FIELD_NAME, request.get_full_path())) + if oembed_view is not None: + extra_context = {} + extra_context['oembed_url'] = request.scheme + '://' + request.META['HTTP_HOST'] + reverse(oembed_view, kwargs=kwargs) + extra_context['login_url'] = "{0}?{1}={2}".format(login_url, REDIRECT_FIELD_NAME, request.get_full_path()) + resp = render_to_response('login_redirect_embed.html', extra_context, context_instance=RequestContext(request)) + return resp + else: + return HttpResponseRedirect('%s?%s=%s' % (login_url, REDIRECT_FIELD_NAME, request.get_full_path())) else: resp = render_to_response('403.html', context_instance=RequestContext(request)) resp.status_code = 403 @@ -28,12 +37,12 @@ def user_passes_test_with_403(test_func, login_url=None): return _checklogin return _dec -def permission_required_with_403(perm, login_url=None): +def permission_required_with_403(perm, login_url=None, oembed_view=None): """ Decorator for views that checks whether a user has a particular permission enabled, redirecting to the log-in page or rendering a 403 as necessary. """ - return user_passes_test_with_403(lambda u: u.has_perm(perm), login_url=login_url) + return user_passes_test_with_403(lambda u: u.has_perm(perm), login_url=login_url, oembed_view=oembed_view) from RIGS import models diff --git a/RIGS/urls.py b/RIGS/urls.py index 53bba8da..16da83da 100644 --- a/RIGS/urls.py +++ b/RIGS/urls.py @@ -80,7 +80,7 @@ urlpatterns = patterns('', name='activity_feed'), url(r'^event/(?P\d+)/$', - permission_required_with_403('RIGS.view_event')(rigboard.EventDetail.as_view()), + permission_required_with_403('RIGS.view_event', oembed_view="event_oembed")(rigboard.EventDetail.as_view()), name='event_detail'), url(r'^event/(?P\d+)/oembed/$', rigboard.EventOembed.as_view(), diff --git a/templates/login_redirect_embed.html b/templates/login_redirect_embed.html new file mode 100644 index 00000000..afd3487c --- /dev/null +++ b/templates/login_redirect_embed.html @@ -0,0 +1,24 @@ +{% extends 'base.html' %} +{% load staticfiles %} +{% block title %}Login Required{% endblock %} + +{% block js %} + +{% endblock %} + +{% block extra-head %} + {% if oembed_url %} + + {% endif %} +{% endblock %} + +{% block content %} +
+

Login is required for this page

+ Login +
+{% endblock %}