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