]>
Commit | Line | Data |
---|---|---|
81675874 | 1 | #!/usr/bin/python |
2 | ||
940227cb MT |
3 | import logging |
4 | import socket | |
5 | import textile | |
6 | import tornado.escape | |
feb02477 | 7 | import tornado.web |
81675874 | 8 | |
feb02477 | 9 | from tornado.database import Row |
2c055a8e | 10 | |
940227cb MT |
11 | import backend |
12 | ||
81675874 | 13 | class UIModule(tornado.web.UIModule): |
940227cb MT |
14 | @property |
15 | def accounts(self): | |
16 | return self.handler.accounts | |
81675874 | 17 | |
d0d074e0 | 18 | @property |
940227cb MT |
19 | def banners(self): |
20 | return self.handler.banners | |
d0d074e0 | 21 | |
940227cb MT |
22 | @property |
23 | def releases(self): | |
24 | return self.handler.releases | |
81675874 | 25 | |
5a1018ab | 26 | |
940227cb MT |
27 | class MenuModule(UIModule): |
28 | def render(self): | |
29 | hostname = self.request.host.lower().split(':')[0] | |
5a1018ab | 30 | |
940227cb MT |
31 | menuitems = [] |
32 | for m in backend.Menu().get(hostname): | |
33 | m.active = False | |
5a1018ab | 34 | |
940227cb MT |
35 | if m.uri and self.request.uri.endswith(m.uri): |
36 | m.active = True | |
81675874 | 37 | |
940227cb MT |
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) | |
81675874 | 42 | |
940227cb | 43 | menuitems.append(m) |
d0d074e0 | 44 | |
940227cb | 45 | return self.render_string("modules/menu.html", menuitems=menuitems) |
81675874 | 46 | |
47 | ||
48 | class NewsItemModule(UIModule): | |
940227cb MT |
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) | |
81675874 | 61 | |
940227cb MT |
62 | if not uncut and len(item.text) >= 400: |
63 | item.text = item.text[:400] + "..." | |
81675874 | 64 | |
940227cb MT |
65 | # Render text |
66 | item.text = textile.textile(item.text) | |
81675874 | 67 | |
940227cb MT |
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) | |
81675874 | 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): | |
81675874 | 87 | def render(self): |
88 | return self.render_string("modules/sidebar-release.html", | |
940227cb | 89 | latest=self.releases.get_latest()) |
81675874 | 90 | |
91 | ||
92 | class ReleaseItemModule(UIModule): | |
93 | def render(self, item): | |
940227cb | 94 | return self.render_string("modules/release-item.html", release=item) |
81675874 | 95 | |
96 | ||
97 | class SidebarBannerModule(UIModule): | |
940227cb MT |
98 | def render(self, item=None): |
99 | if not item: | |
100 | item = self.banners.get_random() | |
101 | ||
81675874 | 102 | return self.render_string("modules/sidebar-banner.html", item=item) |
103 | ||
104 | ||
940227cb MT |
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) | |
d0d074e0 MT |
109 | |
110 | ||
940227cb MT |
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" | |
d0d074e0 | 117 | |
940227cb MT |
118 | try: |
119 | peer["hostname"] = socket.gethostbyaddr(peer["ip"])[0] | |
120 | except: | |
121 | peer["hostname"] = "" | |
d0d074e0 | 122 | |
940227cb MT |
123 | return self.render_string("modules/tracker-peerlist.html", |
124 | peers=[Row(p) for p in peers], percentages=percentages) | |
372efc19 MT |
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) |