move a few things away in to-be-integrated/
[myslice.git] / unfold / loginrequired.py
diff --git a/unfold/loginrequired.py b/unfold/loginrequired.py
new file mode 100644 (file)
index 0000000..0f46ff7
--- /dev/null
@@ -0,0 +1,53 @@
+from django.contrib.auth.decorators     import login_required
+from django.utils.decorators            import method_decorator
+from django.http                        import HttpResponseRedirect
+# for 'as_view' that we need to call in urls.py and the like
+from django.views.generic.base          import TemplateView
+
+from manifold.manifoldresult            import ManifoldException
+
+########## the base class for views that require a login
+class LoginRequiredView (TemplateView):
+
+    @method_decorator(login_required)
+    def dispatch(self, request, *args, **kwargs):
+        return super(LoginRequiredView, self).dispatch(request, *args, **kwargs)
+
+
+########## the base class for views that need to protect against ManifoldException
+# a decorator for view classes to catch manifold exceptions
+# by design views should not directly exercise a manifold query
+# given that these are asynchroneous, you would expect a view to just 
+# return a mundane skeleton
+# however of course this is not always true, 
+# e.g. we deal with metadata some other way, and so
+# it is often a good idea for a view to monitor these exceptions
+# and to take this opportunity to logout people 
+
+def logout_on_manifold_exception (fun_that_returns_httpresponse):
+    def wrapped (request, *args, **kwds):
+        print 'wrapped by logout_on_manifold_exception'
+        try:
+            return fun_that_returns_httpresponse(request,*args, **kwds)
+        except ManifoldException, manifold_result:
+            # xxx we need a means to display this message to user...
+            from django.contrib.auth import logout
+            logout(request)
+            return HttpResponseRedirect ('/')
+        except Exception, e:
+            # xxx we need to sugarcoat this error message in some error template...
+            print "Unexpected exception",e
+            import traceback
+            traceback.print_exc()
+            return HttpResponseRedirect ('/')
+    return wrapped
+
+# at first sight this matters only for views that require login
+# so for now we expose a single class that behaves like 
+# login_required + logout_on_manifold_exception
+class LoginRequiredAutoLogoutView (TemplateView):
+
+    @logout_on_manifold_exception
+    @method_decorator(login_required)
+    def dispatch (self, request, *args, **kwds):
+        return super(LoginRequiredAutoLogoutView,self).dispatch(request,*args,**kwds)