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