]> git.ipfire.org Git - people/shoehn/ipfire.org.git/blame - www/webapp/ui_modules.py
Translate (and extend) some pages.
[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):
91a446f0 144 def render(self, items, sortby="key", reverse=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
MT
161 for k in keys:
162 v = items[k] * 100 / hundred_percent
372efc19
MT
163 _items.append((k, v))
164 items = _items
165
372efc19 166 return self.render_string("modules/stasy-table.html", items=items)
91a446f0
MT
167
168
169class StasyDeviceTableModule(UIModule):
170 def render(self, devices):
171 groups = {}
172
173 for device in devices:
174 if not groups.has_key(device.cls):
175 groups[device.cls] = []
176
177 groups[device.cls].append(device)
178
179 return self.render_string("modules/stasy-table-devices.html",
180 groups=groups.items())