error.py
91 lines
| 3.3 KiB
| text/x-python
|
PythonLexer
Marcin Kuzminski
|
r0 | import logging | ||
r125 | import cgi | |||
import os | ||||
Marcin Kuzminski
|
r14 | import paste.fileapp | ||
Marcin Kuzminski
|
r87 | from pylons import tmpl_context as c, app_globals as g, request, config | ||
Marcin Kuzminski
|
r0 | from pylons.controllers.util import forward | ||
from pylons.i18n.translation import _ | ||||
from pylons_app.lib.base import BaseController, render | ||||
r125 | from pylons.middleware import media_path | |||
from pylons_app.lib.utils import check_repo | ||||
r215 | from pylons_app.lib.filters import clean_repo | |||
log = logging.getLogger(__name__) | ||||
Marcin Kuzminski
|
r0 | |||
class ErrorController(BaseController): | ||||
""" | ||||
Generates error documents as and when they are required. | ||||
The ErrorDocuments middleware forwards to ErrorController when error | ||||
related status codes are returned from the application. | ||||
This behaviour can be altered by changing the parameters to the | ||||
ErrorDocuments middleware in your config/middleware.py file. | ||||
""" | ||||
r215 | # def __before__(self): | |||
# super(ErrorController, self).__before__() | ||||
Marcin Kuzminski
|
r87 | |||
Marcin Kuzminski
|
r0 | def document(self): | ||
resp = request.environ.get('pylons.original_response') | ||||
r215 | ||||
Marcin Kuzminski
|
r14 | log.debug(resp.status) | ||
Marcin Kuzminski
|
r87 | |||
e = request.environ | ||||
c.serv_p = r'%(protocol)s://%(host)s/' % { | ||||
'protocol': e.get('wsgi.url_scheme'), | ||||
'host':e.get('HTTP_HOST'), | ||||
} | ||||
r125 | ||||
Marcin Kuzminski
|
r87 | if resp.status_int == 404: | ||
r215 | org_e = request.environ.get('pylons.original_request').environ | |||
c.repo_name = repo_name = org_e['PATH_INFO'].split('/')[1] | ||||
c.repo_name_cleaned = clean_repo(c.repo_name) | ||||
if check_repo(repo_name, g.base_path): | ||||
r125 | return render('/errors/error_404.html') | |||
Marcin Kuzminski
|
r87 | |||
Marcin Kuzminski
|
r0 | c.error_message = cgi.escape(request.GET.get('code', str(resp.status))) | ||
c.error_explanation = self.get_error_explanation(resp.status_int) | ||||
#redirect to when error with given seconds | ||||
Marcin Kuzminski
|
r14 | c.redirect_time = 0 | ||
Marcin Kuzminski
|
r0 | c.redirect_module = _('Home page')# name to what your going to be redirected | ||
c.url_redirect = "/" | ||||
return render('/errors/error_document.html') | ||||
Marcin Kuzminski
|
r14 | |||
def img(self, id): | ||||
"""Serve Pylons' stock images""" | ||||
return self._serve_file(os.path.join(media_path, 'img', id)) | ||||
def style(self, id): | ||||
"""Serve Pylons' stock stylesheets""" | ||||
return self._serve_file(os.path.join(media_path, 'style', id)) | ||||
Marcin Kuzminski
|
r0 | def _serve_file(self, path): | ||
"""Call Paste's FileApp (a WSGI application) to serve the file | ||||
at the specified path | ||||
""" | ||||
Marcin Kuzminski
|
r14 | fapp = paste.fileapp.FileApp(path) | ||
return fapp(request.environ, self.start_response) | ||||
Marcin Kuzminski
|
r0 | |||
def get_error_explanation(self, code): | ||||
''' get the error explanations of int codes | ||||
[400, 401, 403, 404, 500]''' | ||||
try: | ||||
code = int(code) | ||||
except: | ||||
code = 500 | ||||
if code == 400: | ||||
return _('The request could not be understood by the server due to malformed syntax.') | ||||
if code == 401: | ||||
return _('Unathorized access to resource') | ||||
if code == 403: | ||||
return _("You don't have permission to view this page") | ||||
if code == 404: | ||||
return _('The resource could not be found') | ||||
if code == 500: | ||||
return _('The server encountered an unexpected condition which prevented it from fulfilling the request.') | ||||