]>
Commit | Line | Data |
---|---|---|
9137135a MT |
1 | #!/usr/bin/python |
2 | ||
15a45292 | 3 | import http.client |
9137135a MT |
4 | import time |
5 | import tornado.locale | |
6 | import tornado.web | |
f6e6ff79 | 7 | import traceback |
9137135a | 8 | |
14d7ed77 | 9 | from .. import __version__ |
2c909128 | 10 | from .. import misc |
d2738057 | 11 | from ..decorators import * |
9137135a MT |
12 | |
13 | class BaseHandler(tornado.web.RequestHandler): | |
c6c94528 MT |
14 | @property |
15 | def backend(self): | |
16 | return self.application.backend | |
17 | ||
18 | @property | |
19 | def db(self): | |
20 | return self.backend.db | |
21 | ||
d2738057 MT |
22 | @lazy_property |
23 | def session(self): | |
24 | # Get the session from the cookie | |
25 | session_id = self.get_cookie("session_id", None) | |
f6e6ff79 | 26 | |
d2738057 MT |
27 | # Search for a valid database session |
28 | if session_id: | |
72568c46 | 29 | return self.backend.sessions.get(session_id) |
9137135a | 30 | |
d2738057 MT |
31 | def get_current_user(self): |
32 | if self.session: | |
70987fab | 33 | return self.session.user |
bdeb3c62 | 34 | |
9137135a | 35 | def get_user_locale(self): |
4947da2d MT |
36 | # Get the locale from the user settings |
37 | if self.current_user: | |
38 | return self.current_user.locale | |
9137135a | 39 | |
4947da2d | 40 | # If no locale was provided, we take what ever the browser requested |
214463e3 | 41 | return self.get_browser_locale() |
9137135a | 42 | |
f6e6ff79 | 43 | @property |
12d79e59 | 44 | def current_address(self): |
f6e6ff79 MT |
45 | """ |
46 | Returns the IP address the request came from. | |
47 | """ | |
371a879e | 48 | return self.request.headers.get("X-Real-IP") or self.request.remote_ip |
f6e6ff79 | 49 | |
61c74986 MT |
50 | @property |
51 | def user_agent(self): | |
52 | """ | |
53 | Returns the HTTP user agent | |
54 | """ | |
55 | return self.request.headers.get("User-Agent", None) | |
56 | ||
6468877e MT |
57 | def format_date(self, date, relative=True, shorter=False, full_format=False): |
58 | return self.locale.format_date(date, relative=relative, | |
59 | shorter=shorter, full_format=full_format) | |
f6e6ff79 | 60 | |
8fa68307 MT |
61 | def get_template_namespace(self): |
62 | ns = tornado.web.RequestHandler.get_template_namespace(self) | |
63 | ||
64 | ns.update({ | |
fe9b927c | 65 | "backend" : self.backend, |
f6e6ff79 MT |
66 | "hostname" : self.request.host, |
67 | "format_date" : self.format_date, | |
2c909128 | 68 | "format_size" : misc.format_size, |
14d7ed77 | 69 | "version" : __version__, |
f6e6ff79 | 70 | "year" : time.strftime("%Y"), |
8fa68307 | 71 | }) |
9137135a | 72 | |
8fa68307 | 73 | return ns |
9137135a | 74 | |
703e79ed | 75 | def write_error(self, status_code, exc_info=None, **kwargs): |
ae4c835a MT |
76 | if status_code in (400, 403, 404): |
77 | error_document = "errors/error-%s.html" % status_code | |
703e79ed MT |
78 | else: |
79 | error_document = "errors/error.html" | |
80 | ||
81 | try: | |
15a45292 | 82 | status_message = http.client.responses[status_code] |
703e79ed MT |
83 | except KeyError: |
84 | status_message = None | |
f6e6ff79 MT |
85 | |
86 | # Collect more information about the exception if possible. | |
703e79ed MT |
87 | if exc_info: |
88 | tb = traceback.format_exception(*exc_info) | |
89 | else: | |
90 | tb = None | |
f6e6ff79 | 91 | |
703e79ed | 92 | self.render(error_document, status_code=status_code, |
1de7b85e | 93 | status_message=status_message, exc_info=exc_info, tb=tb, **kwargs) |
1af6c96c MT |
94 | |
95 | # Typed Arguments | |
96 | ||
0bcebf53 MT |
97 | def get_argument_bool(self, name): |
98 | arg = self.get_argument(name, default=None) | |
99 | ||
100 | return arg == "on" | |
101 | ||
1af6c96c MT |
102 | def get_argument_int(self, *args, **kwargs): |
103 | arg = self.get_argument(*args, **kwargs) | |
104 | ||
0bcebf53 MT |
105 | # Return nothing |
106 | if not arg: | |
107 | return None | |
108 | ||
1af6c96c MT |
109 | try: |
110 | return int(arg) | |
111 | except (TypeError, ValueError): | |
112 | raise tornado.web.HTTPError(400, "%s is not an integer" % arg) | |
98ee6714 MT |
113 | |
114 | def get_argument_distro(self, *args, **kwargs): | |
115 | slug = self.get_argument(*args, **kwargs) | |
116 | ||
117 | if slug: | |
118 | return self.backend.distros.get_by_slug(slug) | |
f004aee7 MT |
119 | |
120 | def get_argument_user(self, *args, **kwargs): | |
121 | name = self.get_argument(*args, **kwargs) | |
122 | ||
123 | if name: | |
124 | return self.backend.users.get_by_name(name) |