]> git.ipfire.org Git - pbs.git/blob - src/web/base.py
Run 2to3
[pbs.git] / src / web / base.py
1 #!/usr/bin/python
2
3 import http.client
4 import pytz
5 import time
6 import tornado.locale
7 import tornado.web
8 import traceback
9
10 from .. import __version__
11 from .. import misc
12 from ..decorators import *
13
14 class BaseHandler(tornado.web.RequestHandler):
15 @property
16 def backend(self):
17 return self.application.backend
18
19 @property
20 def db(self):
21 return self.backend.db
22
23 @lazy_property
24 def session(self):
25 # Get the session from the cookie
26 session_id = self.get_cookie("session_id", None)
27
28 # Search for a valid database session
29 if session_id:
30 return self.backend.sessions.get(session_id)
31
32 def get_current_user(self):
33 if self.session:
34 return self.session.impersonated_user or self.session.user
35
36 def get_user_locale(self):
37 # Get the locale from the user settings
38 if self.current_user:
39 return self.current_user.locale
40
41 # If no locale was provided, we take what ever the browser requested
42 return self.get_browser_locale()
43
44 @property
45 def current_address(self):
46 """
47 Returns the IP address the request came from.
48 """
49 return self.request.headers.get("X-Real-IP") or self.request.remote_ip
50
51 @property
52 def user_agent(self):
53 """
54 Returns the HTTP user agent
55 """
56 return self.request.headers.get("User-Agent", None)
57
58 @property
59 def timezone(self):
60 if self.current_user:
61 return self.current_user.timezone
62
63 return pytz.utc
64
65 def format_date(self, date, relative=True, shorter=False,
66 full_format=False):
67 # XXX not very precise but working for now.
68 gmt_offset = self.timezone.utcoffset(date).total_seconds() / -60
69
70 return self.locale.format_date(date, gmt_offset=gmt_offset,
71 relative=relative, shorter=shorter, full_format=full_format)
72
73 def get_template_namespace(self):
74 ns = tornado.web.RequestHandler.get_template_namespace(self)
75
76 ns.update({
77 "backend" : self.backend,
78 "hostname" : self.request.host,
79 "format_date" : self.format_date,
80 "format_size" : misc.format_size,
81 "friendly_time" : misc.friendly_time,
82 "format_filemode" : misc.format_filemode,
83 "lang" : self.locale.code[:2],
84 "session" : self.session,
85 "version" : __version__,
86 "year" : time.strftime("%Y"),
87 })
88
89 return ns
90
91 def write_error(self, status_code, exc_info=None, **kwargs):
92 if status_code in (400, 403, 404):
93 error_document = "errors/error-%s.html" % status_code
94 else:
95 error_document = "errors/error.html"
96
97 try:
98 status_message = http.client.responses[status_code]
99 except KeyError:
100 status_message = None
101
102 # Collect more information about the exception if possible.
103 if exc_info:
104 tb = traceback.format_exception(*exc_info)
105 else:
106 tb = None
107
108 self.render(error_document, status_code=status_code,
109 status_message=status_message, exc_info=exc_info, tb=tb, **kwargs)