Switch to side-by-side view

--- a
+++ b/qiita_pet/handlers/base_handlers.py
@@ -0,0 +1,111 @@
+# -----------------------------------------------------------------------------
+# Copyright (c) 2014--, The Qiita Development Team.
+#
+# Distributed under the terms of the BSD 3-clause License.
+#
+# The full license is in the file LICENSE, distributed with this software.
+# -----------------------------------------------------------------------------
+
+from tornado.web import RequestHandler
+
+from qiita_db.logger import LogEntry
+from qiita_db.user import User
+from qiita_pet.util import convert_text_html
+
+
+class BaseHandler(RequestHandler):
+    def get_current_user(self):
+        '''Overrides default method of returning user curently connected'''
+        username = self.get_secure_cookie("user")
+        if username is not None:
+            # strip off quotes added by get_secure_cookie
+            username = username.decode('ascii').strip("\"' ")
+            return User(username)
+        else:
+            self.clear_cookie("user")
+            return None
+
+    def write_error(self, status_code, **kwargs):
+        '''Overrides the error page created by Tornado'''
+        if status_code == 404:
+            # just use the 404 page as the error
+            self.render("404.html")
+            return
+
+        if status_code in {403, 405}:
+            # We don't need to log this failues in the logging table
+            return
+
+        is_admin = False
+        user = self.get_current_user()
+        if user:
+            try:
+                is_admin = user.level == 'admin'
+            except Exception:
+                # Any issue with this check leaves default as not admin
+                pass
+
+        # log the error
+        from traceback import format_exception
+        exc_info = kwargs["exc_info"]
+        trace_info = ''.join(["%s\n" % line for line in
+                             format_exception(*exc_info)])
+        req_dict = self.request.__dict__
+        # must trim body to 1024 chars to prevent huge error messages
+        req_dict['body'] = req_dict.get('body', '')[:1024]
+        request_info = ''.join(["<strong>%s</strong>: %s\n" %
+                               (k, req_dict[k]) for k in
+                                req_dict.keys() if k != 'files'])
+        error = str(exc_info[1]).split(':', 1)
+        if len(error) > 1:
+            error = error[1]
+        else:
+            error = error[0]
+
+        # render error page
+        self.render('error.html', status_code=status_code, is_admin=is_admin,
+                    error=error)
+
+        LogEntry.create(
+            'Runtime',
+            'ERROR:\n%s\nTRACE:\n%s\nHTTP INFO:\n%s\n' %
+            (error, trace_info, request_info))
+
+    def head(self):
+        """Adds proper response for head requests"""
+        self.finish()
+
+
+class MainHandler(BaseHandler):
+    '''Index page'''
+    def get(self):
+        msg = self.get_argument('message', '')
+        msg = convert_text_html(msg)
+        lvl = self.get_argument('level', '')
+        self.render("index.html", message=msg, level=lvl)
+
+
+class IFrame(BaseHandler):
+    '''Open one of the IFrame pages'''
+    def get(self):
+        msg = self.get_argument('message', '')
+        msg = convert_text_html(msg)
+        lvl = self.get_argument('level', '')
+        iframe = self.get_argument('iframe', '')
+        self.render("iframe.html", iframe=iframe, message=msg, level=lvl)
+
+
+class MockupHandler(BaseHandler):
+    def get(self):
+        self.render("mockup.html")
+
+
+class NoPageHandler(BaseHandler):
+    def get(self):
+        self.set_status(404)
+        self.render("404.html")
+
+    def head(self):
+        """Satisfy servers that this url exists"""
+        self.set_status(404)
+        self.finish()