]> git.ipfire.org Git - ipfire.org.git/blame - www/webapp/ui_modules.py
Add some extra space under a list.
[ipfire.org.git] / www / webapp / ui_modules.py
CommitLineData
81675874 1#!/usr/bin/python
2
91a446f0
MT
3from __future__ import division
4
940227cb 5import logging
91a446f0 6import operator
940227cb
MT
7import socket
8import textile
9import tornado.escape
feb02477 10import tornado.web
81675874 11
feb02477 12from tornado.database import Row
2c055a8e 13
940227cb 14import backend
91a446f0 15import backend.stasy
940227cb 16
81675874 17class UIModule(tornado.web.UIModule):
940227cb
MT
18 @property
19 def accounts(self):
20 return self.handler.accounts
81675874 21
d0d074e0 22 @property
940227cb
MT
23 def banners(self):
24 return self.handler.banners
d0d074e0 25
940227cb
MT
26 @property
27 def releases(self):
28 return self.handler.releases
81675874 29
5a1018ab 30
940227cb
MT
31class MenuModule(UIModule):
32 def render(self):
33 hostname = self.request.host.lower().split(':')[0]
5a1018ab 34
940227cb
MT
35 menuitems = []
36 for m in backend.Menu().get(hostname):
37 m.active = False
5a1018ab 38
940227cb
MT
39 if m.uri and self.request.uri.endswith(m.uri):
40 m.active = True
81675874 41
940227cb
MT
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)
81675874 46
940227cb 47 menuitems.append(m)
d0d074e0 48
940227cb 49 return self.render_string("modules/menu.html", menuitems=menuitems)
81675874 50
51
52class NewsItemModule(UIModule):
940227cb
MT
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)
81675874 65
940227cb
MT
66 if not uncut and len(item.text) >= 400:
67 item.text = item.text[:400] + "..."
81675874 68
940227cb
MT
69 # Render text
70 item.text = textile.textile(item.text)
81675874 71
940227cb
MT
72 return self.render_string("modules/news-item.html", item=item, uncut=uncut)
73
74
75class NewsLineModule(NewsItemModule):
76 def render(self, item):
77 return self.render_string("modules/news-line.html", item=item)
78
79
80class MirrorItemModule(UIModule):
81 def render(self, item):
82 return self.render_string("modules/mirror-item.html", item=item)
81675874 83
84
85class SidebarItemModule(UIModule):
86 def render(self):
87 return self.render_string("modules/sidebar-item.html")
88
89
90class SidebarReleaseModule(UIModule):
81675874 91 def render(self):
92 return self.render_string("modules/sidebar-release.html",
940227cb 93 latest=self.releases.get_latest())
81675874 94
95
96class ReleaseItemModule(UIModule):
97 def render(self, item):
940227cb 98 return self.render_string("modules/release-item.html", release=item)
81675874 99
100
101class SidebarBannerModule(UIModule):
940227cb
MT
102 def render(self, item=None):
103 if not item:
104 item = self.banners.get_random()
105
81675874 106 return self.render_string("modules/sidebar-banner.html", item=item)
107
108
940227cb
MT
109class PlanetEntryModule(UIModule):
110 def render(self, entry, short=False):
111 return self.render_string("modules/planet-entry.html",
112 entry=entry, short=short)
d0d074e0
MT
113
114
940227cb
MT
115class 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"
d0d074e0 121
940227cb
MT
122 try:
123 peer["hostname"] = socket.gethostbyaddr(peer["ip"])[0]
124 except:
125 peer["hostname"] = ""
d0d074e0 126
940227cb
MT
127 return self.render_string("modules/tracker-peerlist.html",
128 peers=[Row(p) for p in peers], percentages=percentages)
372efc19
MT
129
130
131class StasyTableModule(UIModule):
91a446f0 132 def render(self, items, sortby="key", reverse=False):
372efc19
MT
133 hundred_percent = 0
134 for v in items.values():
135 hundred_percent += v
136
91a446f0
MT
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
372efc19
MT
147 if hundred_percent:
148 _items = []
91a446f0
MT
149 for k in keys:
150 v = items[k] * 100 / hundred_percent
372efc19
MT
151 _items.append((k, v))
152 items = _items
153
372efc19 154 return self.render_string("modules/stasy-table.html", items=items)
91a446f0
MT
155
156
157class 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())