]>
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 | ||
54b8df1a MT |
96 | if self.settings.get("debug", False): |
97 | return ret | |
98 | ||
6ec4605e MT |
99 | elif self.request.host == "admin.ipfire.org": |
100 | return ret | |
101 | ||
102 | elif static: | |
3d540c40 MT |
103 | return "http://static.ipfire.org%s" % ret |
104 | ||
105 | return ret | |
106 | ||
9068dba1 MT |
107 | def get_remote_ip(self): |
108 | # Fix for clients behind a proxy that sends "X-Forwarded-For". | |
109 | ip_addr = self.request.remote_ip.split(", ") | |
110 | ||
111 | if ip_addr: | |
112 | ip_addr = ip_addr[-1] | |
113 | ||
114 | return ip_addr | |
115 | ||
116 | def get_remote_location(self): | |
117 | if not hasattr(self, "__remote_location"): | |
118 | remote_ip = self.get_remote_ip() | |
119 | ||
120 | self.__remote_location = self.geoip.get_location(remote_ip) | |
121 | ||
122 | return self.__remote_location | |
123 | ||
a6dc0bad MT |
124 | @property |
125 | def backend(self): | |
126 | return self.application.backend | |
127 | ||
9068dba1 MT |
128 | @property |
129 | def db(self): | |
130 | return self.backend.db | |
131 | ||
a0048e66 MT |
132 | @property |
133 | def advertisements(self): | |
9068dba1 | 134 | return self.backend.advertisements |
a0048e66 | 135 | |
940227cb MT |
136 | @property |
137 | def accounts(self): | |
a6dc0bad | 138 | return self.backend.accounts |
940227cb MT |
139 | |
140 | @property | |
9068dba1 MT |
141 | def downloads(self): |
142 | return self.backend.downloads | |
143 | ||
144 | @property | |
145 | def iuse(self): | |
146 | return self.backend.iuse | |
940227cb | 147 | |
b3250465 MT |
148 | @property |
149 | def memcached(self): | |
9068dba1 | 150 | return self.backend.memcache |
b3250465 | 151 | |
940227cb MT |
152 | @property |
153 | def mirrors(self): | |
9068dba1 MT |
154 | return self.backend.mirrors |
155 | ||
156 | @property | |
157 | def netboot(self): | |
158 | return self.backend.netboot | |
940227cb MT |
159 | |
160 | @property | |
161 | def news(self): | |
9068dba1 | 162 | return self.backend.news |
940227cb MT |
163 | |
164 | @property | |
165 | def config(self): | |
9068dba1 | 166 | return self.backend.settings |
940227cb MT |
167 | |
168 | @property | |
169 | def releases(self): | |
9068dba1 | 170 | return self.backend.releases |
940227cb MT |
171 | |
172 | @property | |
9068dba1 MT |
173 | def geoip(self): |
174 | return self.backend.geoip | |
940227cb MT |
175 | |
176 | @property | |
9068dba1 MT |
177 | def stasy(self): |
178 | return self.backend.stasy | |
940227cb MT |
179 | |
180 | @property | |
181 | def tracker(self): | |
9068dba1 | 182 | return self.backend.tracker |
bcc3ed4d MT |
183 | |
184 | @property | |
185 | def planet(self): | |
a6dc0bad | 186 | return self.backend.planet |
7771acea MT |
187 | |
188 | @property | |
189 | def wishlist(self): | |
9068dba1 | 190 | return self.backend.wishlist |