]> git.ipfire.org Git - people/jschlag/pbs.git/blob - src/web/handlers_base.py
Make database available from BaseHandler
[people/jschlag/pbs.git] / src / web / handlers_base.py
1 #!/usr/bin/python
2
3 import pakfire
4
5 import datetime
6 import httplib
7 import pytz
8 import time
9 import tornado.locale
10 import tornado.web
11 import traceback
12
13 from .. import misc
14 from ..decorators import *
15
16 class BaseHandler(tornado.web.RequestHandler):
17 @property
18 def backend(self):
19 return self.application.backend
20
21 @property
22 def db(self):
23 return self.backend.db
24
25 @lazy_property
26 def session(self):
27 # Get the session from the cookie
28 session_id = self.get_cookie("session_id", None)
29
30 # Search for a valid database session
31 if session_id:
32 session = self.backend.sessions.get(session_id)
33
34 # Found a valid session
35 if session:
36 return session
37
38 def get_current_user(self):
39 if self.session:
40 return self.session.impersonated_user or self.session.user
41
42 def get_user_locale(self):
43 # Get the locale from the user settings.
44 if self.current_user and self.current_user.locale:
45 locale = tornado.locale.get(self.current_user.locale)
46 if locale:
47 return locale
48
49 # If no locale was provided, we take what ever the browser requested.
50 return self.get_browser_locale()
51
52 @property
53 def remote_address(self):
54 """
55 Returns the IP address the request came from.
56 """
57 remote_ips = self.request.remote_ip.split(", ")
58
59 return remote_ips[-1]
60
61 @property
62 def timezone(self):
63 if self.current_user:
64 return self.current_user.timezone
65
66 return pytz.utc
67
68 def format_date(self, date, relative=True, shorter=False,
69 full_format=False):
70 # XXX not very precise but working for now.
71 gmt_offset = self.timezone.utcoffset(date).total_seconds() / -60
72
73 return self.locale.format_date(date, gmt_offset=gmt_offset,
74 relative=relative, shorter=shorter, full_format=full_format)
75
76 def get_template_namespace(self):
77 ns = tornado.web.RequestHandler.get_template_namespace(self)
78
79 ns.update({
80 "bugtracker" : self.pakfire.bugzilla,
81 "hostname" : self.request.host,
82 "format_date" : self.format_date,
83 "format_size" : misc.format_size,
84 "friendly_time" : misc.friendly_time,
85 "format_email" : misc.format_email,
86 "format_filemode" : misc.format_filemode,
87 "lang" : self.locale.code[:2],
88 "pakfire_version" : pakfire.__version__,
89 "session" : self.session,
90 "year" : time.strftime("%Y"),
91 })
92
93 return ns
94
95 def get_error_html(self, status_code, exception=None, **kwargs):
96 error_document = "errors/error.html"
97
98 kwargs.update({
99 "code" : status_code,
100 "message" : httplib.responses[status_code],
101 })
102
103 if status_code in (400, 403, 404):
104 error_document = "errors/error-%s.html" % status_code
105
106 # Collect more information about the exception if possible.
107 if exception:
108 exception = traceback.format_exc()
109
110 return self.render_string(error_document, exception=exception, **kwargs)
111
112 @property
113 def pakfire(self):
114 return self.backend
115
116 @property
117 def arches(self):
118 return self.pakfire.arches
119
120 @property
121 def mirrors(self):
122 return self.pakfire.mirrors
123
124 @property
125 def public(self):
126 """
127 Indicates what level of public/non-public things a user
128 may see.
129 """
130 if self.current_user and self.current_user.is_admin():
131 public = None
132 else:
133 public = True
134
135 return public