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