]> git.ipfire.org Git - pbs.git/blame - src/web/base.py
web: Refactor the error page
[pbs.git] / src / web / base.py
CommitLineData
9137135a
MT
1#!/usr/bin/python
2
15a45292 3import http.client
9137135a
MT
4import time
5import tornado.locale
6import tornado.web
f6e6ff79 7import traceback
9137135a 8
14d7ed77 9from .. import __version__
2c909128 10from .. import misc
d2738057 11from ..decorators import *
9137135a
MT
12
13class BaseHandler(tornado.web.RequestHandler):
c6c94528
MT
14 @property
15 def backend(self):
16 return self.application.backend
17
18 @property
19 def db(self):
20 return self.backend.db
21
d2738057
MT
22 @lazy_property
23 def session(self):
24 # Get the session from the cookie
25 session_id = self.get_cookie("session_id", None)
f6e6ff79 26
d2738057
MT
27 # Search for a valid database session
28 if session_id:
72568c46 29 return self.backend.sessions.get(session_id)
9137135a 30
d2738057
MT
31 def get_current_user(self):
32 if self.session:
70987fab 33 return self.session.user
bdeb3c62 34
9137135a 35 def get_user_locale(self):
4947da2d
MT
36 # Get the locale from the user settings
37 if self.current_user:
38 return self.current_user.locale
9137135a 39
4947da2d 40 # If no locale was provided, we take what ever the browser requested
214463e3 41 return self.get_browser_locale()
9137135a 42
f6e6ff79 43 @property
12d79e59 44 def current_address(self):
f6e6ff79
MT
45 """
46 Returns the IP address the request came from.
47 """
371a879e 48 return self.request.headers.get("X-Real-IP") or self.request.remote_ip
f6e6ff79 49
61c74986
MT
50 @property
51 def user_agent(self):
52 """
53 Returns the HTTP user agent
54 """
55 return self.request.headers.get("User-Agent", None)
56
6468877e
MT
57 def format_date(self, date, relative=True, shorter=False, full_format=False):
58 return self.locale.format_date(date, relative=relative,
59 shorter=shorter, full_format=full_format)
f6e6ff79 60
8fa68307
MT
61 def get_template_namespace(self):
62 ns = tornado.web.RequestHandler.get_template_namespace(self)
63
64 ns.update({
fe9b927c 65 "backend" : self.backend,
f6e6ff79
MT
66 "hostname" : self.request.host,
67 "format_date" : self.format_date,
2c909128 68 "format_size" : misc.format_size,
14d7ed77 69 "version" : __version__,
f6e6ff79 70 "year" : time.strftime("%Y"),
8fa68307 71 })
9137135a 72
8fa68307 73 return ns
9137135a 74
703e79ed 75 def write_error(self, status_code, exc_info=None, **kwargs):
ae4c835a
MT
76 if status_code in (400, 403, 404):
77 error_document = "errors/error-%s.html" % status_code
703e79ed
MT
78 else:
79 error_document = "errors/error.html"
80
81 try:
15a45292 82 status_message = http.client.responses[status_code]
703e79ed
MT
83 except KeyError:
84 status_message = None
f6e6ff79
MT
85
86 # Collect more information about the exception if possible.
703e79ed
MT
87 if exc_info:
88 tb = traceback.format_exception(*exc_info)
89 else:
90 tb = None
f6e6ff79 91
703e79ed 92 self.render(error_document, status_code=status_code,
1de7b85e 93 status_message=status_message, exc_info=exc_info, tb=tb, **kwargs)
1af6c96c
MT
94
95 # Typed Arguments
96
0bcebf53
MT
97 def get_argument_bool(self, name):
98 arg = self.get_argument(name, default=None)
99
100 return arg == "on"
101
1af6c96c
MT
102 def get_argument_int(self, *args, **kwargs):
103 arg = self.get_argument(*args, **kwargs)
104
0bcebf53
MT
105 # Return nothing
106 if not arg:
107 return None
108
1af6c96c
MT
109 try:
110 return int(arg)
111 except (TypeError, ValueError):
112 raise tornado.web.HTTPError(400, "%s is not an integer" % arg)
98ee6714
MT
113
114 def get_argument_distro(self, *args, **kwargs):
115 slug = self.get_argument(*args, **kwargs)
116
117 if slug:
118 return self.backend.distros.get_by_slug(slug)
f004aee7
MT
119
120 def get_argument_user(self, *args, **kwargs):
121 name = self.get_argument(*args, **kwargs)
122
123 if name:
124 return self.backend.users.get_by_name(name)