annotate pylons_app/controllers/error.py @ 272:a83e86e3f580

fixed bug when displaying html not escaped data as raw diff.
author Marcin Kuzminski <marcin@python-works.com>
date Tue, 08 Jun 2010 23:02:24 +0200
parents 6ada8c223374
children 9a70fe918a81
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
1 import logging
125
2811259dc12d Moved check_repo function to utils, error controller check for first name in url, for this repo and only prints 404 make repo template if repo does not exists, moded check repo from admin
Marcin Kuzminski <marcin@python-works.com>
parents: 101
diff changeset
2 import cgi
2811259dc12d Moved check_repo function to utils, error controller check for first name in url, for this repo and only prints 404 make repo template if repo does not exists, moded check repo from admin
Marcin Kuzminski <marcin@python-works.com>
parents: 101
diff changeset
3 import os
14
923f0e6ab010 change error controller,
Marcin Kuzminski
parents: 0
diff changeset
4 import paste.fileapp
87
9f6300b96380 Updated error handling, from mercurial to pylons. + added tempalte for 404
Marcin Kuzminski <marcin@python-blog.com>
parents: 14
diff changeset
5 from pylons import tmpl_context as c, app_globals as g, request, config
0
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
6 from pylons.controllers.util import forward
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
7 from pylons.i18n.translation import _
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
8 from pylons_app.lib.base import BaseController, render
125
2811259dc12d Moved check_repo function to utils, error controller check for first name in url, for this repo and only prints 404 make repo template if repo does not exists, moded check repo from admin
Marcin Kuzminski <marcin@python-works.com>
parents: 101
diff changeset
9 from pylons.middleware import media_path
2811259dc12d Moved check_repo function to utils, error controller check for first name in url, for this repo and only prints 404 make repo template if repo does not exists, moded check repo from admin
Marcin Kuzminski <marcin@python-works.com>
parents: 101
diff changeset
10 from pylons_app.lib.utils import check_repo
260
6ada8c223374 made global funcion to clean repo names, and remove all special chars from the name.
Marcin Kuzminski <marcin@python-works.com>
parents: 215
diff changeset
11 import pylons_app.lib.helpers as h
215
70f645fa97cc Moved repo creation to admin/repos, as part of crud controller. Now repo creation is based on a form, which can be auto filled with data from 404 page. Fixed the error controller to properly give the repo name.
Marcin Kuzminski <marcin@python-works.com>
parents: 191
diff changeset
12 log = logging.getLogger(__name__)
0
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
13
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
14 class ErrorController(BaseController):
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
15 """
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
16 Generates error documents as and when they are required.
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
17
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
18 The ErrorDocuments middleware forwards to ErrorController when error
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
19 related status codes are returned from the application.
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
20
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
21 This behaviour can be altered by changing the parameters to the
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
22 ErrorDocuments middleware in your config/middleware.py file.
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
23 """
215
70f645fa97cc Moved repo creation to admin/repos, as part of crud controller. Now repo creation is based on a form, which can be auto filled with data from 404 page. Fixed the error controller to properly give the repo name.
Marcin Kuzminski <marcin@python-works.com>
parents: 191
diff changeset
24 # def __before__(self):
70f645fa97cc Moved repo creation to admin/repos, as part of crud controller. Now repo creation is based on a form, which can be auto filled with data from 404 page. Fixed the error controller to properly give the repo name.
Marcin Kuzminski <marcin@python-works.com>
parents: 191
diff changeset
25 # super(ErrorController, self).__before__()
87
9f6300b96380 Updated error handling, from mercurial to pylons. + added tempalte for 404
Marcin Kuzminski <marcin@python-blog.com>
parents: 14
diff changeset
26
0
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
27 def document(self):
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
28 resp = request.environ.get('pylons.original_response')
215
70f645fa97cc Moved repo creation to admin/repos, as part of crud controller. Now repo creation is based on a form, which can be auto filled with data from 404 page. Fixed the error controller to properly give the repo name.
Marcin Kuzminski <marcin@python-works.com>
parents: 191
diff changeset
29
14
923f0e6ab010 change error controller,
Marcin Kuzminski
parents: 0
diff changeset
30 log.debug(resp.status)
87
9f6300b96380 Updated error handling, from mercurial to pylons. + added tempalte for 404
Marcin Kuzminski <marcin@python-blog.com>
parents: 14
diff changeset
31
9f6300b96380 Updated error handling, from mercurial to pylons. + added tempalte for 404
Marcin Kuzminski <marcin@python-blog.com>
parents: 14
diff changeset
32 e = request.environ
9f6300b96380 Updated error handling, from mercurial to pylons. + added tempalte for 404
Marcin Kuzminski <marcin@python-blog.com>
parents: 14
diff changeset
33 c.serv_p = r'%(protocol)s://%(host)s/' % {
9f6300b96380 Updated error handling, from mercurial to pylons. + added tempalte for 404
Marcin Kuzminski <marcin@python-blog.com>
parents: 14
diff changeset
34 'protocol': e.get('wsgi.url_scheme'),
9f6300b96380 Updated error handling, from mercurial to pylons. + added tempalte for 404
Marcin Kuzminski <marcin@python-blog.com>
parents: 14
diff changeset
35 'host':e.get('HTTP_HOST'),
9f6300b96380 Updated error handling, from mercurial to pylons. + added tempalte for 404
Marcin Kuzminski <marcin@python-blog.com>
parents: 14
diff changeset
36 }
125
2811259dc12d Moved check_repo function to utils, error controller check for first name in url, for this repo and only prints 404 make repo template if repo does not exists, moded check repo from admin
Marcin Kuzminski <marcin@python-works.com>
parents: 101
diff changeset
37
2811259dc12d Moved check_repo function to utils, error controller check for first name in url, for this repo and only prints 404 make repo template if repo does not exists, moded check repo from admin
Marcin Kuzminski <marcin@python-works.com>
parents: 101
diff changeset
38
87
9f6300b96380 Updated error handling, from mercurial to pylons. + added tempalte for 404
Marcin Kuzminski <marcin@python-blog.com>
parents: 14
diff changeset
39 if resp.status_int == 404:
215
70f645fa97cc Moved repo creation to admin/repos, as part of crud controller. Now repo creation is based on a form, which can be auto filled with data from 404 page. Fixed the error controller to properly give the repo name.
Marcin Kuzminski <marcin@python-works.com>
parents: 191
diff changeset
40 org_e = request.environ.get('pylons.original_request').environ
70f645fa97cc Moved repo creation to admin/repos, as part of crud controller. Now repo creation is based on a form, which can be auto filled with data from 404 page. Fixed the error controller to properly give the repo name.
Marcin Kuzminski <marcin@python-works.com>
parents: 191
diff changeset
41 c.repo_name = repo_name = org_e['PATH_INFO'].split('/')[1]
260
6ada8c223374 made global funcion to clean repo names, and remove all special chars from the name.
Marcin Kuzminski <marcin@python-works.com>
parents: 215
diff changeset
42 c.repo_name_cleaned = h.repo_name_slug(c.repo_name)
215
70f645fa97cc Moved repo creation to admin/repos, as part of crud controller. Now repo creation is based on a form, which can be auto filled with data from 404 page. Fixed the error controller to properly give the repo name.
Marcin Kuzminski <marcin@python-works.com>
parents: 191
diff changeset
43 if check_repo(repo_name, g.base_path):
125
2811259dc12d Moved check_repo function to utils, error controller check for first name in url, for this repo and only prints 404 make repo template if repo does not exists, moded check repo from admin
Marcin Kuzminski <marcin@python-works.com>
parents: 101
diff changeset
44 return render('/errors/error_404.html')
87
9f6300b96380 Updated error handling, from mercurial to pylons. + added tempalte for 404
Marcin Kuzminski <marcin@python-blog.com>
parents: 14
diff changeset
45
0
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
46 c.error_message = cgi.escape(request.GET.get('code', str(resp.status)))
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
47 c.error_explanation = self.get_error_explanation(resp.status_int)
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
48
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
49 #redirect to when error with given seconds
14
923f0e6ab010 change error controller,
Marcin Kuzminski
parents: 0
diff changeset
50 c.redirect_time = 0
0
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
51 c.redirect_module = _('Home page')# name to what your going to be redirected
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
52 c.url_redirect = "/"
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
53
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
54 return render('/errors/error_document.html')
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
55
14
923f0e6ab010 change error controller,
Marcin Kuzminski
parents: 0
diff changeset
56
923f0e6ab010 change error controller,
Marcin Kuzminski
parents: 0
diff changeset
57 def img(self, id):
923f0e6ab010 change error controller,
Marcin Kuzminski
parents: 0
diff changeset
58 """Serve Pylons' stock images"""
923f0e6ab010 change error controller,
Marcin Kuzminski
parents: 0
diff changeset
59 return self._serve_file(os.path.join(media_path, 'img', id))
923f0e6ab010 change error controller,
Marcin Kuzminski
parents: 0
diff changeset
60
923f0e6ab010 change error controller,
Marcin Kuzminski
parents: 0
diff changeset
61 def style(self, id):
923f0e6ab010 change error controller,
Marcin Kuzminski
parents: 0
diff changeset
62 """Serve Pylons' stock stylesheets"""
923f0e6ab010 change error controller,
Marcin Kuzminski
parents: 0
diff changeset
63 return self._serve_file(os.path.join(media_path, 'style', id))
923f0e6ab010 change error controller,
Marcin Kuzminski
parents: 0
diff changeset
64
0
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
65 def _serve_file(self, path):
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
66 """Call Paste's FileApp (a WSGI application) to serve the file
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
67 at the specified path
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
68 """
14
923f0e6ab010 change error controller,
Marcin Kuzminski
parents: 0
diff changeset
69 fapp = paste.fileapp.FileApp(path)
923f0e6ab010 change error controller,
Marcin Kuzminski
parents: 0
diff changeset
70 return fapp(request.environ, self.start_response)
0
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
71
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
72 def get_error_explanation(self, code):
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
73 ''' get the error explanations of int codes
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
74 [400, 401, 403, 404, 500]'''
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
75 try:
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
76 code = int(code)
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
77 except:
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
78 code = 500
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
79
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
80 if code == 400:
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
81 return _('The request could not be understood by the server due to malformed syntax.')
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
82 if code == 401:
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
83 return _('Unathorized access to resource')
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
84 if code == 403:
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
85 return _("You don't have permission to view this page")
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
86 if code == 404:
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
87 return _('The resource could not be found')
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
88 if code == 500:
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
89 return _('The server encountered an unexpected condition which prevented it from fulfilling the request.')
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
90
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
91