]> git.ipfire.org Git - people/shoehn/ipfire.org.git/blame - www/webapp/ui_modules.py
Merge branch 'master' of ssh://git.ipfire.org/pub/git/ipfire.org
[people/shoehn/ipfire.org.git] / www / webapp / ui_modules.py
CommitLineData
81675874 1#!/usr/bin/python
2
91a446f0
MT
3from __future__ import division
4
de683d7c 5import hashlib
940227cb 6import logging
91a446f0 7import operator
940227cb
MT
8import socket
9import textile
10import tornado.escape
6af40477 11import tornado.locale
feb02477 12import tornado.web
81675874 13
feb02477 14from tornado.database import Row
2c055a8e 15
940227cb 16import backend
91a446f0 17import backend.stasy
940227cb 18
81675874 19class UIModule(tornado.web.UIModule):
940227cb
MT
20 @property
21 def accounts(self):
22 return self.handler.accounts
81675874 23
d0d074e0 24 @property
940227cb
MT
25 def banners(self):
26 return self.handler.banners
d0d074e0 27
de683d7c
MT
28 @property
29 def memcached(self):
30 return self.handler.memcached
31
940227cb
MT
32 @property
33 def releases(self):
34 return self.handler.releases
81675874 35
638e9782
MT
36 @property
37 def geoip(self):
38 return self.handler.geoip
39
7771acea
MT
40 @property
41 def news(self):
42 return self.handler.news
43
5a1018ab 44
940227cb
MT
45class MenuModule(UIModule):
46 def render(self):
60024cc8 47 return self.render_string("modules/menu.html")
81675874 48
49
50class NewsItemModule(UIModule):
940227cb
MT
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
60024cc8 60 def render(self, item, uncut=True, announcement=False, show_heading=True):
940227cb
MT
61 # Get author
62 item.author = self.get_author(item.author_id)
81675874 63
940227cb
MT
64 if not uncut and len(item.text) >= 400:
65 item.text = item.text[:400] + "..."
81675874 66
940227cb 67 # Render text
de683d7c
MT
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
81675874 76
60024cc8
MT
77 return self.render_string("modules/news-item.html", item=item,
78 uncut=uncut, announcement=announcement, show_heading=show_heading)
940227cb
MT
79
80
7771acea 81class NewsLineModule(UIModule):
940227cb
MT
82 def render(self, item):
83 return self.render_string("modules/news-line.html", item=item)
84
85
7771acea
MT
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
940227cb
MT
102class MirrorItemModule(UIModule):
103 def render(self, item):
104 return self.render_string("modules/mirror-item.html", item=item)
81675874 105
106
107class SidebarItemModule(UIModule):
108 def render(self):
109 return self.render_string("modules/sidebar-item.html")
110
111
112class SidebarReleaseModule(UIModule):
81675874 113 def render(self):
114 return self.render_string("modules/sidebar-release.html",
940227cb 115 latest=self.releases.get_latest())
81675874 116
117
118class ReleaseItemModule(UIModule):
60024cc8
MT
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)
81675874 133
134
135class SidebarBannerModule(UIModule):
940227cb
MT
136 def render(self, item=None):
137 if not item:
138 item = self.banners.get_random()
139
81675874 140 return self.render_string("modules/sidebar-banner.html", item=item)
141
142
60024cc8
MT
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
940227cb 160class PlanetEntryModule(UIModule):
60024cc8 161 def render(self, entry, show_avatar=True):
940227cb 162 return self.render_string("modules/planet-entry.html",
60024cc8 163 entry=entry, show_avatar=show_avatar)
d0d074e0
MT
164
165
940227cb
MT
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"
d0d074e0 172
940227cb
MT
173 try:
174 peer["hostname"] = socket.gethostbyaddr(peer["ip"])[0]
175 except:
176 peer["hostname"] = ""
d0d074e0 177
940227cb
MT
178 return self.render_string("modules/tracker-peerlist.html",
179 peers=[Row(p) for p in peers], percentages=percentages)
372efc19
MT
180
181
182class StasyTableModule(UIModule):
62c3fa48
MT
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
6af40477 192 def render(self, items, sortby="key", reverse=False, percentage=False, flags=False, locale=False):
372efc19
MT
193 hundred_percent = 0
194 for v in items.values():
195 hundred_percent += v
196
91a446f0
MT
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
372efc19
MT
207 if hundred_percent:
208 _items = []
91a446f0 209 for k in keys:
e6cff1b1
MT
210 if not percentage:
211 v = items[k] * 100 / hundred_percent
212 else:
213 v = items[k] * 100
372efc19
MT
214 _items.append((k, v))
215 items = _items
216
0d01fda0
MT
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
6af40477
MT
225 if locale:
226 flags = False
227 locales = tornado.locale.LOCALE_NAMES
228 _items = []
229 for k, v in items:
02888488
MT
230 if k:
231 for code, locale in locales.items():
232 if code.startswith(k):
233 k = locale["name"].split()[0]
6af40477
MT
234 _items.append((k, v))
235 items = _items
236
665ef07e 237 return self.render_string("modules/stasy-table.html", items=items, flags=flags)
91a446f0
MT
238
239
62c3fa48
MT
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
91a446f0
MT
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())
638e9782
MT
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)
0673d1b0
MT
283
284
285class MirrorsTableModule(UIModule):
286 def render(self, mirrors):
287 return self.render_string("modules/mirrors-table.html", mirrors=mirrors)
7771acea
MT
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):
311 return self.render_string("modules/donation-box.html")