]> git.ipfire.org Git - people/shoehn/ipfire.org.git/blame_incremental - www/webapp/ui_modules.py
Fix typo.
[people/shoehn/ipfire.org.git] / www / webapp / ui_modules.py
... / ...
CommitLineData
1#!/usr/bin/python
2
3from __future__ import division
4
5import hashlib
6import logging
7import operator
8import socket
9import textile
10import tornado.escape
11import tornado.locale
12import tornado.web
13
14from tornado.database import Row
15
16import backend
17import backend.stasy
18
19class UIModule(tornado.web.UIModule):
20 @property
21 def accounts(self):
22 return self.handler.accounts
23
24 @property
25 def banners(self):
26 return self.handler.banners
27
28 @property
29 def memcached(self):
30 return self.handler.memcached
31
32 @property
33 def releases(self):
34 return self.handler.releases
35
36 @property
37 def geoip(self):
38 return self.handler.geoip
39
40 @property
41 def news(self):
42 return self.handler.news
43
44
45class MenuModule(UIModule):
46 def render(self):
47 return self.render_string("modules/menu.html")
48
49
50class NewsItemModule(UIModule):
51 def get_author(self, author):
52 # Get name of author
53 author = self.accounts.find(author)
54 if author:
55 return author.cn
56 else:
57 _ = self.locale.translate
58 return _("Unknown author")
59
60 def render(self, item, uncut=True, announcement=False, show_heading=True):
61 # Get author
62 item.author = self.get_author(item.author_id)
63
64 if not uncut and len(item.text) >= 400:
65 item.text = item.text[:400] + "..."
66
67 # Render text
68 text_id = "news-%s" % hashlib.md5(item.text.encode("utf-8")).hexdigest()
69
70 text = self.memcached.get(text_id)
71 if not text:
72 text = textile.textile(item.text)
73 self.memcached.set(text_id, text, 60)
74
75 item.text = text
76
77 return self.render_string("modules/news-item.html", item=item,
78 uncut=uncut, announcement=announcement, show_heading=show_heading)
79
80
81class NewsLineModule(UIModule):
82 def render(self, item):
83 return self.render_string("modules/news-line.html", item=item)
84
85
86class NewsTableModule(UIModule):
87 def render(self, news):
88 return self.render_string("modules/news-table.html", news=news)
89
90
91class NewsYearNavigationModule(UIModule):
92 def render(self, active=None):
93 try:
94 active = int(active)
95 except:
96 active = None
97
98 return self.render_string("modules/news-year-nav.html",
99 active=active, years=self.news.years)
100
101
102class MirrorItemModule(UIModule):
103 def render(self, item):
104 return self.render_string("modules/mirror-item.html", item=item)
105
106
107class SidebarItemModule(UIModule):
108 def render(self):
109 return self.render_string("modules/sidebar-item.html")
110
111
112class SidebarReleaseModule(UIModule):
113 def render(self):
114 return self.render_string("modules/sidebar-release.html",
115 latest=self.releases.get_latest())
116
117
118class ReleaseItemModule(UIModule):
119 def render(self, release, latest=False):
120 files = {
121 "i586" : [],
122 "arm" : [],
123 }
124
125 for file in release.files:
126 try:
127 files[file.arch].append(file)
128 except KeyError:
129 pass
130
131 return self.render_string("modules/release-item.html",
132 release=release, latest=latest, files=files)
133
134
135class SidebarBannerModule(UIModule):
136 def render(self, item=None):
137 if not item:
138 item = self.banners.get_random()
139
140 return self.render_string("modules/sidebar-banner.html", item=item)
141
142
143class DownloadButtonModule(UIModule):
144 def render(self, release, text="Download now!"):
145 best_image = None
146
147 for file in release.files:
148 if file.type == "iso":
149 best_image = file
150 break
151
152 # Show nothing when there was no image found.
153 if not best_image:
154 return ""
155
156 return self.render_string("modules/download-button.html",
157 release=release, image=best_image)
158
159
160class PlanetEntryModule(UIModule):
161 def render(self, entry, show_avatar=True):
162 return self.render_string("modules/planet-entry.html",
163 entry=entry, show_avatar=show_avatar)
164
165
166class TrackerPeerListModule(UIModule):
167 def render(self, peers, percentages=False):
168 # Guess country code and hostname of the host
169 for peer in peers:
170 country_code = backend.GeoIP().get_country(peer["ip"])
171 peer["country_code"] = country_code or "unknown"
172
173 try:
174 peer["hostname"] = socket.gethostbyaddr(peer["ip"])[0]
175 except:
176 peer["hostname"] = ""
177
178 return self.render_string("modules/tracker-peerlist.html",
179 peers=[Row(p) for p in peers], percentages=percentages)
180
181
182class StasyTableModule(UIModule):
183 def _make_percentages(self, items):
184 total = sum(items.values())
185
186 for k in items.keys():
187 items[k] *= 100
188 items[k] /= total
189
190 return items
191
192 def render(self, items, sortby="key", reverse=False, percentage=False, flags=False, locale=False):
193 hundred_percent = 0
194 for v in items.values():
195 hundred_percent += v
196
197 keys = []
198 if sortby == "key":
199 keys = sorted(items.keys(), reverse=reverse)
200 elif sortby == "percentage":
201 keys = [k for k,v in sorted(items.items(), key=operator.itemgetter(1))]
202 if not reverse:
203 keys = reversed(keys)
204 else:
205 raise Exception, "Unknown sortby parameter was provided"
206
207 if hundred_percent:
208 _items = []
209 for k in keys:
210 if not percentage:
211 v = items[k] * 100 / hundred_percent
212 else:
213 v = items[k] * 100
214 _items.append((k, v))
215 items = _items
216
217 if items and type(items[0][0]) == type(()) :
218 _ = self.locale.translate
219 _items = []
220 for k, v in items:
221 k = _("%s to %s") % k
222 _items.append((k, v))
223 items = _items
224
225 if locale:
226 flags = False
227 locales = tornado.locale.LOCALE_NAMES
228 _items = []
229 for k, v in items:
230 if k:
231 for code, locale in locales.items():
232 if code.startswith(k):
233 k = locale["name"].split()[0]
234 _items.append((k, v))
235 items = _items
236
237 return self.render_string("modules/stasy-table.html", items=items, flags=flags)
238
239
240class StasyCPUCoreTableModule(StasyTableModule):
241 def render(self, items):
242 items = self._make_percentages(items)
243
244 items = items.items()
245 items.sort()
246
247 return self.render_string("modules/stasy-table.html", items=items,
248 flags=None #XXX
249 )
250
251
252class StasyDeviceTableModule(UIModule):
253 def render(self, devices):
254 groups = {}
255
256 for device in devices:
257 if not groups.has_key(device.cls):
258 groups[device.cls] = []
259
260 groups[device.cls].append(device)
261
262 return self.render_string("modules/stasy-table-devices.html",
263 groups=groups.items())
264
265
266class StasyGeoTableModule(UIModule):
267 def render(self, items):
268 _ = self.locale.translate
269
270 # Sort all items by value
271 items = sorted(items.items(), key=operator.itemgetter(1), reverse=True)
272
273 countries = []
274 for code, value in items:
275 country = tornado.database.Row({
276 "code" : code.lower(),
277 "name" : _(self.geoip.get_country_name(code)),
278 "value" : value * 100,
279 })
280 countries.append(country)
281
282 return self.render_string("modules/stasy-table-geo.html", countries=countries)
283
284
285class MirrorsTableModule(UIModule):
286 def render(self, mirrors):
287 return self.render_string("modules/mirrors-table.html", mirrors=mirrors)
288
289
290class WishlistModule(UIModule):
291 def render(self, wishes, short=False):
292 return self.render_string("wishlist/modules/wishlist.html",
293 wishes=wishes, short=short)
294
295
296class WishModule(UIModule):
297 def render(self, wish, short=False):
298 progress_bar = "progress-success"
299
300 if wish.percentage >= 90:
301 progress_bar = "progress-danger"
302 elif wish.percentage >= 50:
303 progress_bar = "progress-warning"
304
305 return self.render_string("wishlist/modules/wish.html",
306 wish=wish, short=short, progress_bar=progress_bar)
307
308
309class DonationBoxModule(UIModule):
310 def render(self, reason_for_transfer=None):
311 if reason_for_transfer:
312 reason_for_transfer = "IPFire.org - %s" % reason_for_transfer
313
314 return self.render_string("modules/donation-box.html",
315 reason_for_transfer=reason_for_transfer)