]>
Commit | Line | Data |
---|---|---|
940227cb MT |
1 | #!/usr/bin/python |
2 | ||
60024cc8 MT |
3 | from __future__ import division |
4 | ||
940227cb | 5 | import httplib |
cc3b928d | 6 | import datetime |
940227cb MT |
7 | import time |
8 | import tornado.locale | |
9 | import tornado.web | |
10 | ||
60024cc8 MT |
11 | def format_size(b): |
12 | units = ["B", "k", "M", "G"] | |
13 | unit_pointer = 0 | |
14 | ||
15 | while b >= 1024 and unit_pointer < len(units): | |
16 | b /= 1024 | |
17 | unit_pointer += 1 | |
18 | ||
19 | return "%.1f%s" % (b, units[unit_pointer]) | |
20 | ||
21 | ||
940227cb | 22 | class BaseHandler(tornado.web.RequestHandler): |
de683d7c MT |
23 | rss_url = None |
24 | ||
940227cb MT |
25 | def get_account(self, uid): |
26 | # Find the name of the author | |
27 | return self.accounts.find(uid) | |
28 | ||
60024cc8 | 29 | def get_query_locale(self): |
940227cb | 30 | locale = self.get_argument("locale", None) |
60024cc8 MT |
31 | |
32 | if locale is None: | |
33 | return | |
34 | ||
dbf95cf2 | 35 | return tornado.locale.get(locale) |
60024cc8 MT |
36 | |
37 | def prepare(self): | |
38 | locale = self.get_query_locale() | |
940227cb | 39 | if locale: |
dbf95cf2 | 40 | self.set_cookie("locale", locale.code) |
54af860e | 41 | |
60024cc8 | 42 | def get_user_locale(self): |
45c763aa MT |
43 | # The planet is always in english. |
44 | if self.request.host == "planet.ipfire.org": | |
dbf95cf2 | 45 | return tornado.locale.get("en_US") |
45c763aa | 46 | |
60024cc8 MT |
47 | # Get the locale from the query. |
48 | locale = self.get_query_locale() | |
dbf95cf2 MT |
49 | if locale: |
50 | return locale | |
60024cc8 | 51 | |
dbf95cf2 MT |
52 | # Read the locale from the cookies. |
53 | locale = self.get_cookie("locale", None) | |
54 | if locale: | |
55 | return tornado.locale.get(locale) | |
940227cb | 56 | |
dbf95cf2 MT |
57 | # Otherwise take the browser locale. |
58 | return self.get_browser_locale() | |
940227cb MT |
59 | |
60 | @property | |
61 | def render_args(self): | |
cc3b928d MT |
62 | today = datetime.date.today() |
63 | ||
940227cb | 64 | return { |
60024cc8 | 65 | "format_size" : format_size, |
940227cb MT |
66 | "hostname" : self.request.host, |
67 | "lang" : self.locale.code[:2], | |
de683d7c | 68 | "rss_url" : self.rss_url, |
cc3b928d | 69 | "year" : today.year, |
940227cb MT |
70 | } |
71 | ||
bcc3ed4d MT |
72 | def render(self, *args, **_kwargs): |
73 | kwargs = self.render_args | |
74 | kwargs.update(_kwargs) | |
940227cb MT |
75 | tornado.web.RequestHandler.render(self, *args, **kwargs) |
76 | ||
bcc3ed4d MT |
77 | def render_string(self, *args, **_kwargs): |
78 | kwargs = self.render_args | |
79 | kwargs.update(_kwargs) | |
940227cb MT |
80 | return tornado.web.RequestHandler.render_string(self, *args, **kwargs) |
81 | ||
02f2d7fe | 82 | def write_error(self, status_code, **kwargs): |
940227cb MT |
83 | if status_code in (404, 500): |
84 | render_args = ({ | |
85 | "code" : status_code, | |
86 | "exception" : kwargs.get("exception", None), | |
87 | "message" : httplib.responses[status_code], | |
88 | }) | |
02f2d7fe | 89 | self.render("error-%s.html" % status_code, **render_args) |
940227cb | 90 | else: |
02f2d7fe | 91 | return tornado.web.RequestHandler.write_error(self, status_code, **kwargs) |
940227cb | 92 | |
3d540c40 MT |
93 | def static_url(self, path, static=True): |
94 | ret = tornado.web.RequestHandler.static_url(self, path) | |
95 | ||
0cc8f04c | 96 | |
3d540c40 MT |
97 | |
98 | return ret | |
99 | ||
9068dba1 MT |
100 | def get_remote_ip(self): |
101 | # Fix for clients behind a proxy that sends "X-Forwarded-For". | |
102 | ip_addr = self.request.remote_ip.split(", ") | |
103 | ||
104 | if ip_addr: | |
105 | ip_addr = ip_addr[-1] | |
106 | ||
107 | return ip_addr | |
108 | ||
109 | def get_remote_location(self): | |
110 | if not hasattr(self, "__remote_location"): | |
111 | remote_ip = self.get_remote_ip() | |
112 | ||
113 | self.__remote_location = self.geoip.get_location(remote_ip) | |
114 | ||
115 | return self.__remote_location | |
116 | ||
a6dc0bad MT |
117 | @property |
118 | def backend(self): | |
119 | return self.application.backend | |
120 | ||
9068dba1 MT |
121 | @property |
122 | def db(self): | |
123 | return self.backend.db | |
124 | ||
a0048e66 MT |
125 | @property |
126 | def advertisements(self): | |
9068dba1 | 127 | return self.backend.advertisements |
a0048e66 | 128 | |
940227cb MT |
129 | @property |
130 | def accounts(self): | |
a6dc0bad | 131 | return self.backend.accounts |
940227cb MT |
132 | |
133 | @property | |
9068dba1 MT |
134 | def downloads(self): |
135 | return self.backend.downloads | |
136 | ||
137 | @property | |
138 | def iuse(self): | |
139 | return self.backend.iuse | |
940227cb | 140 | |
b3250465 MT |
141 | @property |
142 | def memcached(self): | |
9068dba1 | 143 | return self.backend.memcache |
b3250465 | 144 | |
940227cb MT |
145 | @property |
146 | def mirrors(self): | |
9068dba1 MT |
147 | return self.backend.mirrors |
148 | ||
149 | @property | |
150 | def netboot(self): | |
151 | return self.backend.netboot | |
940227cb MT |
152 | |
153 | @property | |
154 | def news(self): | |
9068dba1 | 155 | return self.backend.news |
940227cb MT |
156 | |
157 | @property | |
158 | def config(self): | |
9068dba1 | 159 | return self.backend.settings |
940227cb MT |
160 | |
161 | @property | |
162 | def releases(self): | |
9068dba1 | 163 | return self.backend.releases |
940227cb MT |
164 | |
165 | @property | |
9068dba1 MT |
166 | def geoip(self): |
167 | return self.backend.geoip | |
940227cb MT |
168 | |
169 | @property | |
9068dba1 MT |
170 | def stasy(self): |
171 | return self.backend.stasy | |
940227cb MT |
172 | |
173 | @property | |
174 | def tracker(self): | |
9068dba1 | 175 | return self.backend.tracker |
bcc3ed4d MT |
176 | |
177 | @property | |
178 | def planet(self): | |
a6dc0bad | 179 | return self.backend.planet |
7771acea MT |
180 | |
181 | @property | |
182 | def wishlist(self): | |
9068dba1 | 183 | return self.backend.wishlist |