]> git.ipfire.org Git - people/shoehn/ipfire.org.git/blame - www/webapp/ui_modules.py
fireinfo: Add flags to geo statistics.
[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
feb02477 11import tornado.web
81675874 12
feb02477 13from tornado.database import Row
2c055a8e 14
940227cb 15import backend
91a446f0 16import backend.stasy
940227cb 17
81675874 18class UIModule(tornado.web.UIModule):
940227cb
MT
19 @property
20 def accounts(self):
21 return self.handler.accounts
81675874 22
d0d074e0 23 @property
940227cb
MT
24 def banners(self):
25 return self.handler.banners
d0d074e0 26
de683d7c
MT
27 @property
28 def memcached(self):
29 return self.handler.memcached
30
940227cb
MT
31 @property
32 def releases(self):
33 return self.handler.releases
81675874 34
5a1018ab 35
940227cb
MT
36class MenuModule(UIModule):
37 def render(self):
38 hostname = self.request.host.lower().split(':')[0]
5a1018ab 39
940227cb
MT
40 menuitems = []
41 for m in backend.Menu().get(hostname):
42 m.active = False
5a1018ab 43
940227cb
MT
44 if m.uri and self.request.uri.endswith(m.uri):
45 m.active = True
81675874 46
940227cb
MT
47 # Translate the description of the link
48 m.description = \
49 self.locale.translate(m.description)
50 m.description = tornado.escape.xhtml_escape(m.description)
81675874 51
940227cb 52 menuitems.append(m)
d0d074e0 53
940227cb 54 return self.render_string("modules/menu.html", menuitems=menuitems)
81675874 55
56
57class NewsItemModule(UIModule):
940227cb
MT
58 def get_author(self, author):
59 # Get name of author
60 author = self.accounts.find(author)
61 if author:
62 return author.cn
63 else:
64 _ = self.locale.translate
65 return _("Unknown author")
66
67 def render(self, item, uncut=False):
68 # Get author
69 item.author = self.get_author(item.author_id)
81675874 70
940227cb
MT
71 if not uncut and len(item.text) >= 400:
72 item.text = item.text[:400] + "..."
81675874 73
940227cb 74 # Render text
de683d7c
MT
75 text_id = "news-%s" % hashlib.md5(item.text.encode("utf-8")).hexdigest()
76
77 text = self.memcached.get(text_id)
78 if not text:
79 text = textile.textile(item.text)
80 self.memcached.set(text_id, text, 60)
81
82 item.text = text
81675874 83
940227cb
MT
84 return self.render_string("modules/news-item.html", item=item, uncut=uncut)
85
86
87class NewsLineModule(NewsItemModule):
88 def render(self, item):
89 return self.render_string("modules/news-line.html", item=item)
90
91
92class MirrorItemModule(UIModule):
93 def render(self, item):
94 return self.render_string("modules/mirror-item.html", item=item)
81675874 95
96
97class SidebarItemModule(UIModule):
98 def render(self):
99 return self.render_string("modules/sidebar-item.html")
100
101
102class SidebarReleaseModule(UIModule):
81675874 103 def render(self):
104 return self.render_string("modules/sidebar-release.html",
940227cb 105 latest=self.releases.get_latest())
81675874 106
107
108class ReleaseItemModule(UIModule):
109 def render(self, item):
940227cb 110 return self.render_string("modules/release-item.html", release=item)
81675874 111
112
113class SidebarBannerModule(UIModule):
940227cb
MT
114 def render(self, item=None):
115 if not item:
116 item = self.banners.get_random()
117
81675874 118 return self.render_string("modules/sidebar-banner.html", item=item)
119
120
940227cb
MT
121class PlanetEntryModule(UIModule):
122 def render(self, entry, short=False):
123 return self.render_string("modules/planet-entry.html",
124 entry=entry, short=short)
d0d074e0
MT
125
126
940227cb
MT
127class TrackerPeerListModule(UIModule):
128 def render(self, peers, percentages=False):
129 # Guess country code and hostname of the host
130 for peer in peers:
131 country_code = backend.GeoIP().get_country(peer["ip"])
132 peer["country_code"] = country_code or "unknown"
d0d074e0 133
940227cb
MT
134 try:
135 peer["hostname"] = socket.gethostbyaddr(peer["ip"])[0]
136 except:
137 peer["hostname"] = ""
d0d074e0 138
940227cb
MT
139 return self.render_string("modules/tracker-peerlist.html",
140 peers=[Row(p) for p in peers], percentages=percentages)
372efc19
MT
141
142
143class StasyTableModule(UIModule):
665ef07e 144 def render(self, items, sortby="key", reverse=False, percentage=False, flags=False):
372efc19
MT
145 hundred_percent = 0
146 for v in items.values():
147 hundred_percent += v
148
91a446f0
MT
149 keys = []
150 if sortby == "key":
151 keys = sorted(items.keys(), reverse=reverse)
152 elif sortby == "percentage":
153 keys = [k for k,v in sorted(items.items(), key=operator.itemgetter(1))]
154 if not reverse:
155 keys = reversed(keys)
156 else:
157 raise Exception, "Unknown sortby parameter was provided"
158
372efc19
MT
159 if hundred_percent:
160 _items = []
91a446f0 161 for k in keys:
e6cff1b1
MT
162 if not percentage:
163 v = items[k] * 100 / hundred_percent
164 else:
165 v = items[k] * 100
372efc19
MT
166 _items.append((k, v))
167 items = _items
168
0d01fda0
MT
169 if items and type(items[0][0]) == type(()) :
170 _ = self.locale.translate
171 _items = []
172 for k, v in items:
173 k = _("%s to %s") % k
174 _items.append((k, v))
175 items = _items
176
665ef07e 177 return self.render_string("modules/stasy-table.html", items=items, flags=flags)
91a446f0
MT
178
179
180class StasyDeviceTableModule(UIModule):
181 def render(self, devices):
182 groups = {}
183
184 for device in devices:
185 if not groups.has_key(device.cls):
186 groups[device.cls] = []
187
188 groups[device.cls].append(device)
189
190 return self.render_string("modules/stasy-table-devices.html",
191 groups=groups.items())