[973924]: / qiita_pet / handlers / base_handlers.py

Download this file

112 lines (91 with data), 3.6 kB

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
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()