]> git.ipfire.org Git - people/shoehn/ipfire.org.git/blob - www/webapp/ui_modules.py
fireinfo: Display ranges in a more readable way.
[people/shoehn/ipfire.org.git] / www / webapp / ui_modules.py
1 #!/usr/bin/python
2
3 from __future__ import division
4
5 import hashlib
6 import logging
7 import operator
8 import socket
9 import textile
10 import tornado.escape
11 import tornado.web
12
13 from tornado.database import Row
14
15 import backend
16 import backend.stasy
17
18 class UIModule(tornado.web.UIModule):
19 @property
20 def accounts(self):
21 return self.handler.accounts
22
23 @property
24 def banners(self):
25 return self.handler.banners
26
27 @property
28 def memcached(self):
29 return self.handler.memcached
30
31 @property
32 def releases(self):
33 return self.handler.releases
34
35
36 class MenuModule(UIModule):
37 def render(self):
38 hostname = self.request.host.lower().split(':')[0]
39
40 menuitems = []
41 for m in backend.Menu().get(hostname):
42 m.active = False
43
44 if m.uri and self.request.uri.endswith(m.uri):
45 m.active = True
46
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)
51
52 menuitems.append(m)
53
54 return self.render_string("modules/menu.html", menuitems=menuitems)
55
56
57 class NewsItemModule(UIModule):
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)
70
71 if not uncut and len(item.text) >= 400:
72 item.text = item.text[:400] + "..."
73
74 # Render text
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
83
84 return self.render_string("modules/news-item.html", item=item, uncut=uncut)
85
86
87 class NewsLineModule(NewsItemModule):
88 def render(self, item):
89 return self.render_string("modules/news-line.html", item=item)
90
91
92 class MirrorItemModule(UIModule):
93 def render(self, item):
94 return self.render_string("modules/mirror-item.html", item=item)
95
96
97 class SidebarItemModule(UIModule):
98 def render(self):
99 return self.render_string("modules/sidebar-item.html")
100
101
102 class SidebarReleaseModule(UIModule):
103 def render(self):
104 return self.render_string("modules/sidebar-release.html",
105 latest=self.releases.get_latest())
106
107
108 class ReleaseItemModule(UIModule):
109 def render(self, item):
110 return self.render_string("modules/release-item.html", release=item)
111
112
113 class SidebarBannerModule(UIModule):
114 def render(self, item=None):
115 if not item:
116 item = self.banners.get_random()
117
118 return self.render_string("modules/sidebar-banner.html", item=item)
119
120
121 class PlanetEntryModule(UIModule):
122 def render(self, entry, short=False):
123 return self.render_string("modules/planet-entry.html",
124 entry=entry, short=short)
125
126
127 class 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"
133
134 try:
135 peer["hostname"] = socket.gethostbyaddr(peer["ip"])[0]
136 except:
137 peer["hostname"] = ""
138
139 return self.render_string("modules/tracker-peerlist.html",
140 peers=[Row(p) for p in peers], percentages=percentages)
141
142
143 class StasyTableModule(UIModule):
144 def render(self, items, sortby="key", reverse=False, percentage=False):
145 hundred_percent = 0
146 for v in items.values():
147 hundred_percent += v
148
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
159 if hundred_percent:
160 _items = []
161 for k in keys:
162 if not percentage:
163 v = items[k] * 100 / hundred_percent
164 else:
165 v = items[k] * 100
166 _items.append((k, v))
167 items = _items
168
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
177 return self.render_string("modules/stasy-table.html", items=items)
178
179
180 class 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())