]> git.ipfire.org Git - people/shoehn/ipfire.org.git/blame - www/webapp/ui_modules.py
Update to bootstrap 2.1.
[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
5a1018ab 40
940227cb
MT
41class MenuModule(UIModule):
42 def render(self):
60024cc8 43 return self.render_string("modules/menu.html")
81675874 44
45
46class NewsItemModule(UIModule):
940227cb
MT
47 def get_author(self, author):
48 # Get name of author
49 author = self.accounts.find(author)
50 if author:
51 return author.cn
52 else:
53 _ = self.locale.translate
54 return _("Unknown author")
55
60024cc8 56 def render(self, item, uncut=True, announcement=False, show_heading=True):
940227cb
MT
57 # Get author
58 item.author = self.get_author(item.author_id)
81675874 59
940227cb
MT
60 if not uncut and len(item.text) >= 400:
61 item.text = item.text[:400] + "..."
81675874 62
940227cb 63 # Render text
de683d7c
MT
64 text_id = "news-%s" % hashlib.md5(item.text.encode("utf-8")).hexdigest()
65
66 text = self.memcached.get(text_id)
67 if not text:
68 text = textile.textile(item.text)
69 self.memcached.set(text_id, text, 60)
70
71 item.text = text
81675874 72
60024cc8
MT
73 return self.render_string("modules/news-item.html", item=item,
74 uncut=uncut, announcement=announcement, show_heading=show_heading)
940227cb
MT
75
76
77class NewsLineModule(NewsItemModule):
78 def render(self, item):
79 return self.render_string("modules/news-line.html", item=item)
80
81
82class MirrorItemModule(UIModule):
83 def render(self, item):
84 return self.render_string("modules/mirror-item.html", item=item)
81675874 85
86
87class SidebarItemModule(UIModule):
88 def render(self):
89 return self.render_string("modules/sidebar-item.html")
90
91
92class SidebarReleaseModule(UIModule):
81675874 93 def render(self):
94 return self.render_string("modules/sidebar-release.html",
940227cb 95 latest=self.releases.get_latest())
81675874 96
97
98class ReleaseItemModule(UIModule):
60024cc8
MT
99 def render(self, release, latest=False):
100 files = {
101 "i586" : [],
102 "arm" : [],
103 }
104
105 for file in release.files:
106 try:
107 files[file.arch].append(file)
108 except KeyError:
109 pass
110
111 return self.render_string("modules/release-item.html",
112 release=release, latest=latest, files=files)
81675874 113
114
115class SidebarBannerModule(UIModule):
940227cb
MT
116 def render(self, item=None):
117 if not item:
118 item = self.banners.get_random()
119
81675874 120 return self.render_string("modules/sidebar-banner.html", item=item)
121
122
60024cc8
MT
123class DownloadButtonModule(UIModule):
124 def render(self, release, text="Download now!"):
125 best_image = None
126
127 for file in release.files:
128 if file.type == "iso":
129 best_image = file
130 break
131
132 # Show nothing when there was no image found.
133 if not best_image:
134 return ""
135
136 return self.render_string("modules/download-button.html",
137 release=release, image=best_image)
138
139
940227cb 140class PlanetEntryModule(UIModule):
60024cc8 141 def render(self, entry, show_avatar=True):
940227cb 142 return self.render_string("modules/planet-entry.html",
60024cc8 143 entry=entry, show_avatar=show_avatar)
d0d074e0
MT
144
145
940227cb
MT
146class TrackerPeerListModule(UIModule):
147 def render(self, peers, percentages=False):
148 # Guess country code and hostname of the host
149 for peer in peers:
150 country_code = backend.GeoIP().get_country(peer["ip"])
151 peer["country_code"] = country_code or "unknown"
d0d074e0 152
940227cb
MT
153 try:
154 peer["hostname"] = socket.gethostbyaddr(peer["ip"])[0]
155 except:
156 peer["hostname"] = ""
d0d074e0 157
940227cb
MT
158 return self.render_string("modules/tracker-peerlist.html",
159 peers=[Row(p) for p in peers], percentages=percentages)
372efc19
MT
160
161
162class StasyTableModule(UIModule):
62c3fa48
MT
163 def _make_percentages(self, items):
164 total = sum(items.values())
165
166 for k in items.keys():
167 items[k] *= 100
168 items[k] /= total
169
170 return items
171
6af40477 172 def render(self, items, sortby="key", reverse=False, percentage=False, flags=False, locale=False):
372efc19
MT
173 hundred_percent = 0
174 for v in items.values():
175 hundred_percent += v
176
91a446f0
MT
177 keys = []
178 if sortby == "key":
179 keys = sorted(items.keys(), reverse=reverse)
180 elif sortby == "percentage":
181 keys = [k for k,v in sorted(items.items(), key=operator.itemgetter(1))]
182 if not reverse:
183 keys = reversed(keys)
184 else:
185 raise Exception, "Unknown sortby parameter was provided"
186
372efc19
MT
187 if hundred_percent:
188 _items = []
91a446f0 189 for k in keys:
e6cff1b1
MT
190 if not percentage:
191 v = items[k] * 100 / hundred_percent
192 else:
193 v = items[k] * 100
372efc19
MT
194 _items.append((k, v))
195 items = _items
196
0d01fda0
MT
197 if items and type(items[0][0]) == type(()) :
198 _ = self.locale.translate
199 _items = []
200 for k, v in items:
201 k = _("%s to %s") % k
202 _items.append((k, v))
203 items = _items
204
6af40477
MT
205 if locale:
206 flags = False
207 locales = tornado.locale.LOCALE_NAMES
208 _items = []
209 for k, v in items:
02888488
MT
210 if k:
211 for code, locale in locales.items():
212 if code.startswith(k):
213 k = locale["name"].split()[0]
6af40477
MT
214 _items.append((k, v))
215 items = _items
216
665ef07e 217 return self.render_string("modules/stasy-table.html", items=items, flags=flags)
91a446f0
MT
218
219
62c3fa48
MT
220class StasyCPUCoreTableModule(StasyTableModule):
221 def render(self, items):
222 items = self._make_percentages(items)
223
224 items = items.items()
225 items.sort()
226
227 return self.render_string("modules/stasy-table.html", items=items,
228 flags=None #XXX
229 )
230
231
91a446f0
MT
232class StasyDeviceTableModule(UIModule):
233 def render(self, devices):
234 groups = {}
235
236 for device in devices:
237 if not groups.has_key(device.cls):
238 groups[device.cls] = []
239
240 groups[device.cls].append(device)
241
242 return self.render_string("modules/stasy-table-devices.html",
243 groups=groups.items())
638e9782
MT
244
245
246class StasyGeoTableModule(UIModule):
247 def render(self, items):
248 _ = self.locale.translate
249
250 # Sort all items by value
251 items = sorted(items.items(), key=operator.itemgetter(1), reverse=True)
252
253 countries = []
254 for code, value in items:
255 country = tornado.database.Row({
256 "code" : code.lower(),
257 "name" : _(self.geoip.get_country_name(code)),
258 "value" : value * 100,
259 })
260 countries.append(country)
261
262 return self.render_string("modules/stasy-table-geo.html", countries=countries)
0673d1b0
MT
263
264
265class MirrorsTableModule(UIModule):
266 def render(self, mirrors):
267 return self.render_string("modules/mirrors-table.html", mirrors=mirrors)