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