]>
Commit | Line | Data |
---|---|---|
9137135a MT |
1 | #!/usr/bin/python |
2 | ||
f6e6ff79 MT |
3 | import pakfire |
4 | ||
5 | import datetime | |
9137135a | 6 | import httplib |
f6e6ff79 | 7 | import pytz |
9137135a MT |
8 | import time |
9 | import tornado.locale | |
10 | import tornado.web | |
f6e6ff79 | 11 | import traceback |
9137135a MT |
12 | |
13 | import backend | |
14 | import backend.misc | |
15 | ||
16 | class 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 |