]> git.ipfire.org Git - people/shoehn/ipfire.org.git/blame_incremental - www/webapp/ui_modules.py
Update to bootstrap 2.1.
[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
41class MenuModule(UIModule):
42 def render(self):
43 return self.render_string("modules/menu.html")
44
45
46class NewsItemModule(UIModule):
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
56 def render(self, item, uncut=True, announcement=False, show_heading=True):
57 # Get author
58 item.author = self.get_author(item.author_id)
59
60 if not uncut and len(item.text) >= 400:
61 item.text = item.text[:400] + "..."
62
63 # Render text
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
72
73 return self.render_string("modules/news-item.html", item=item,
74 uncut=uncut, announcement=announcement, show_heading=show_heading)
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)
85
86
87class SidebarItemModule(UIModule):
88 def render(self):
89 return self.render_string("modules/sidebar-item.html")
90
91
92class SidebarReleaseModule(UIModule):
93 def render(self):
94 return self.render_string("modules/sidebar-release.html",
95 latest=self.releases.get_latest())
96
97
98class ReleaseItemModule(UIModule):
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)
113
114
115class SidebarBannerModule(UIModule):
116 def render(self, item=None):
117 if not item:
118 item = self.banners.get_random()
119
120 return self.render_string("modules/sidebar-banner.html", item=item)
121
122
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
140class PlanetEntryModule(UIModule):
141 def render(self, entry, show_avatar=True):
142 return self.render_string("modules/planet-entry.html",
143 entry=entry, show_avatar=show_avatar)
144
145
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"
152
153 try:
154 peer["hostname"] = socket.gethostbyaddr(peer["ip"])[0]
155 except:
156 peer["hostname"] = ""
157
158 return self.render_string("modules/tracker-peerlist.html",
159 peers=[Row(p) for p in peers], percentages=percentages)
160
161
162class StasyTableModule(UIModule):
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
172 def render(self, items, sortby="key", reverse=False, percentage=False, flags=False, locale=False):
173 hundred_percent = 0
174 for v in items.values():
175 hundred_percent += v
176
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
187 if hundred_percent:
188 _items = []
189 for k in keys:
190 if not percentage:
191 v = items[k] * 100 / hundred_percent
192 else:
193 v = items[k] * 100
194 _items.append((k, v))
195 items = _items
196
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
205 if locale:
206 flags = False
207 locales = tornado.locale.LOCALE_NAMES
208 _items = []
209 for k, v in items:
210 if k:
211 for code, locale in locales.items():
212 if code.startswith(k):
213 k = locale["name"].split()[0]
214 _items.append((k, v))
215 items = _items
216
217 return self.render_string("modules/stasy-table.html", items=items, flags=flags)
218
219
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
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())
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)
263
264
265class MirrorsTableModule(UIModule):
266 def render(self, mirrors):
267 return self.render_string("modules/mirrors-table.html", mirrors=mirrors)