]> git.ipfire.org Git - people/shoehn/ipfire.org.git/blame - www/webapp/ui_modules.py
Change mirror priority.
[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):
6af40477 149 def render(self, items, sortby="key", reverse=False, percentage=False, flags=False, locale=False):
372efc19
MT
150 hundred_percent = 0
151 for v in items.values():
152 hundred_percent += v
153
91a446f0
MT
154 keys = []
155 if sortby == "key":
156 keys = sorted(items.keys(), reverse=reverse)
157 elif sortby == "percentage":
158 keys = [k for k,v in sorted(items.items(), key=operator.itemgetter(1))]
159 if not reverse:
160 keys = reversed(keys)
161 else:
162 raise Exception, "Unknown sortby parameter was provided"
163
372efc19
MT
164 if hundred_percent:
165 _items = []
91a446f0 166 for k in keys:
e6cff1b1
MT
167 if not percentage:
168 v = items[k] * 100 / hundred_percent
169 else:
170 v = items[k] * 100
372efc19
MT
171 _items.append((k, v))
172 items = _items
173
0d01fda0
MT
174 if items and type(items[0][0]) == type(()) :
175 _ = self.locale.translate
176 _items = []
177 for k, v in items:
178 k = _("%s to %s") % k
179 _items.append((k, v))
180 items = _items
181
6af40477
MT
182 if locale:
183 flags = False
184 locales = tornado.locale.LOCALE_NAMES
185 _items = []
186 for k, v in items:
187 for code, locale in locales.items():
188 if code.startswith(k):
57fcb182 189 k = locale["name"].split()[0]
6af40477
MT
190 _items.append((k, v))
191 items = _items
192
665ef07e 193 return self.render_string("modules/stasy-table.html", items=items, flags=flags)
91a446f0
MT
194
195
196class StasyDeviceTableModule(UIModule):
197 def render(self, devices):
198 groups = {}
199
200 for device in devices:
201 if not groups.has_key(device.cls):
202 groups[device.cls] = []
203
204 groups[device.cls].append(device)
205
206 return self.render_string("modules/stasy-table-devices.html",
207 groups=groups.items())
638e9782
MT
208
209
210class StasyGeoTableModule(UIModule):
211 def render(self, items):
212 _ = self.locale.translate
213
214 # Sort all items by value
215 items = sorted(items.items(), key=operator.itemgetter(1), reverse=True)
216
217 countries = []
218 for code, value in items:
219 country = tornado.database.Row({
220 "code" : code.lower(),
221 "name" : _(self.geoip.get_country_name(code)),
222 "value" : value * 100,
223 })
224 countries.append(country)
225
226 return self.render_string("modules/stasy-table-geo.html", countries=countries)
0673d1b0
MT
227
228
229class MirrorsTableModule(UIModule):
230 def render(self, mirrors):
231 return self.render_string("modules/mirrors-table.html", mirrors=mirrors)