]> git.ipfire.org Git - people/jschlag/pbs.git/blame - web/handlers_base.py
Re-add search box in top navigation bar.
[people/jschlag/pbs.git] / web / handlers_base.py
CommitLineData
9137135a
MT
1#!/usr/bin/python
2
f6e6ff79
MT
3import pakfire
4
5import datetime
9137135a 6import httplib
f6e6ff79 7import pytz
9137135a
MT
8import time
9import tornado.locale
10import tornado.web
f6e6ff79 11import traceback
9137135a
MT
12
13import backend
14import backend.misc
15
16class BaseHandler(tornado.web.RequestHandler):
f6e6ff79
MT
17 @property
18 def cache(self):
19 return self.pakfire.cache
20
9137135a 21 def get_current_user(self):
f6e6ff79
MT
22 session_id = self.get_cookie("session_id")
23 if not session_id:
24 return
25
20d7f5eb
MT
26 # Get the session from the database.
27 session = self.pakfire.sessions.get(session_id)
28
29 # Return nothing, if no session was found.
30 if not session:
9137135a
MT
31 return
32
f6e6ff79 33 # Update the session lifetime.
20d7f5eb
MT
34 session.refresh(self.request.remote_ip)
35 self.set_cookie("session_id", session.id, expires=session.valid_until)
f6e6ff79
MT
36
37 # If the session impersonated a user, we return that one.
20d7f5eb
MT
38 if session.impersonated_user:
39 return session.impersonated_user
f6e6ff79
MT
40
41 # By default, we return the user of this session.
20d7f5eb 42 return session.user
9137135a
MT
43
44 def get_user_locale(self):
45 DEFAULT_LOCALE = tornado.locale.get("en_US")
46 ALLOWED_LOCALES = \
47 [tornado.locale.get(l) for l in tornado.locale.get_supported_locales(None)]
48
49 # One can append "?locale=de" to mostly and URI on the site and
50 # another output that guessed.
51 locale = self.get_argument("locale", None)
52 if locale:
53 locale = tornado.locale.get(locale)
54 for locale in ALLOWED_LOCALES:
55 return locale
56
57 # Get the locale from the user settings.
58 if self.current_user and self.current_user.locale:
59 locale = tornado.locale.get(self.current_user.locale)
60 if locale in ALLOWED_LOCALES:
61 return locale
62
63 # If no locale was provided we guess what the browser sends us
64 locale = self.get_browser_locale()
65 if locale in ALLOWED_LOCALES:
66 return locale
67
68 # If no one of the cases above worked we use our default locale
69 return DEFAULT_LOCALE
70
f6e6ff79
MT
71 @property
72 def remote_address(self):
73 """
74 Returns the IP address the request came from.
75 """
76 remote_ips = self.request.remote_ip.split(", ")
77
78 return remote_ips[-1]
79
80 @property
81 def timezone(self):
82 if self.current_user:
83 return self.current_user.timezone
84
85 return pytz.utc
86
87 def format_date(self, date, relative=True, shorter=False,
88 full_format=False):
89 # XXX not very precise but working for now.
90 gmt_offset = self.timezone.utcoffset(date).total_seconds() / -60
91
92 return self.locale.format_date(date, gmt_offset=gmt_offset,
93 relative=relative, shorter=shorter, full_format=full_format)
94
9137135a
MT
95 @property
96 def render_args(self):
20d7f5eb
MT
97 session = None
98 if self.current_user:
99 session = self.current_user.session
100
f6e6ff79
MT
101 ret = {
102 "bugtracker" : self.pakfire.bugzilla,
103 "hostname" : self.request.host,
104 "format_date" : self.format_date,
105 "format_size" : backend.misc.format_size,
106 "friendly_time" : backend.misc.friendly_time,
107 "format_email" : backend.misc.format_email,
108 "format_filemode" : backend.misc.format_filemode,
109 "lang" : self.locale.code[:2],
110 "pakfire_version" : pakfire.__version__,
20d7f5eb 111 "session" : session,
f6e6ff79 112 "year" : time.strftime("%Y"),
9137135a
MT
113 }
114
f6e6ff79
MT
115 return ret
116
9137135a
MT
117 def render(self, *args, **kwargs):
118 kwargs.update(self.render_args)
119 tornado.web.RequestHandler.render(self, *args, **kwargs)
120
121 def render_string(self, *args, **kwargs):
122 kwargs.update(self.render_args)
123 return tornado.web.RequestHandler.render_string(self, *args, **kwargs)
124
f6e6ff79 125 def get_error_html(self, status_code, exception=None, **kwargs):
ae4c835a 126 error_document = "errors/error.html"
f6e6ff79
MT
127
128 kwargs.update({
129 "code" : status_code,
130 "message" : httplib.responses[status_code],
131 })
132
ae4c835a
MT
133 if status_code in (400, 403, 404):
134 error_document = "errors/error-%s.html" % status_code
f6e6ff79
MT
135
136 # Collect more information about the exception if possible.
137 if exception:
138 exception = traceback.format_exc()
139
140 return self.render_string(error_document, exception=exception, **kwargs)
9137135a
MT
141
142 @property
143 def pakfire(self):
144 return self.application.pakfire
145
f6e6ff79
MT
146 @property
147 def arches(self):
148 return self.pakfire.arches
149
150 @property
151 def mirrors(self):
152 return self.pakfire.mirrors
153
154 @property
155 def public(self):
156 """
157 Indicates what level of public/non-public things a user
158 may see.
159 """
160 if self.current_user and self.current_user.is_admin():
161 public = None
162 else:
163 public = True
164
165 return public