]> git.ipfire.org Git - people/shoehn/ipfire.org.git/blame - webapp/ui_modules.py
nopaste: Fix uploading content with backslashes
[people/shoehn/ipfire.org.git] / webapp / ui_modules.py
CommitLineData
81675874 1#!/usr/bin/python
2
91a446f0
MT
3from __future__ import division
4
de683d7c 5import hashlib
940227cb 6import logging
91a446f0 7import operator
9068dba1 8import re
940227cb
MT
9import socket
10import textile
11import tornado.escape
6af40477 12import tornado.locale
feb02477 13import tornado.web
9068dba1 14import unicodedata
81675874 15
494d80e6
MT
16import backend
17
81675874 18class UIModule(tornado.web.UIModule):
940227cb
MT
19 @property
20 def accounts(self):
21 return self.handler.accounts
81675874 22
a0048e66
MT
23 @property
24 def advertisements(self):
25 return self.handler.advertisements
26
d0d074e0 27 @property
940227cb
MT
28 def banners(self):
29 return self.handler.banners
d0d074e0 30
de683d7c
MT
31 @property
32 def memcached(self):
33 return self.handler.memcached
34
940227cb
MT
35 @property
36 def releases(self):
37 return self.handler.releases
81675874 38
638e9782
MT
39 @property
40 def geoip(self):
41 return self.handler.geoip
42
7771acea
MT
43 @property
44 def news(self):
45 return self.handler.news
46
fa7e1a0a
MT
47 @property
48 def planet(self):
49 return self.handler.planet
50
e64ce07e
MT
51 @property
52 def wishlist(self):
53 return self.handler.wishlist
54
5a1018ab 55
a0048e66
MT
56class AdvertisementModule(UIModule):
57 def render(self, where):
58 assert where in ("download-splash",), where
59
60 ad = self.advertisements.get(where)
61 if not ad:
62 return ""
63
64 # Mark that advert has been shown.
65 ad.update_impressions()
66
67 return self.render_string("modules/ads/%s.html" % where, ad=ad)
68
69
66862195
MT
70class FireinfoDeviceTableModule(UIModule):
71 def render(self, devices):
72 return self.render_string("fireinfo/modules/table-devices.html",
73 devices=devices)
74
75
76class FireinfoDeviceAndGroupsTableModule(UIModule):
77 def render(self, devices):
78 _ = self.locale.translate
79
80 groups = {}
81
82 for device in devices:
83 if not groups.has_key(device.cls):
84 groups[device.cls] = []
85
86 groups[device.cls].append(device)
87
88 # Sort all devices
89 for key in groups.keys():
90 groups[key].sort()
91
92 # Order the groups by their name
93 groups = groups.items()
94 groups.sort()
95
96 return self.render_string("fireinfo/modules/table-devices-and-groups.html",
97 groups=groups)
98
99
100class FireinfoGeoTableModule(UIModule):
101 def render(self, items):
102 countries = []
103 other_countries = []
104 for code, value in items:
105 # Skip the satellite providers in this ranking
106 if code in (None, "A1", "A2"):
107 continue
108
109 name = self.geoip.get_country_name(code)
110
111 # Don't add countries with a small share on the list
112 if value < 0.01:
113 other_countries.append(name)
114 continue
115
494d80e6 116 country = backend.database.Row({
66862195
MT
117 "code" : code,
118 "name" : name,
119 "value" : value,
120 })
121 countries.append(country)
122
123 # Sort the list of small countries by alphabet
124 other_countries.sort()
125
126 return self.render_string("fireinfo/modules/table-geo.html",
127 countries=countries, other_countries=other_countries)
128
129
130class LanguageNameModule(UIModule):
131 def render(self, language):
132 _ = self.locale.translate
133
134 if language == "de":
135 return _("German")
136 elif language == "en":
137 return _("English")
138 elif language == "es":
139 return _("Spanish")
140 elif language == "fr":
141 return _("French")
142 elif language == "it":
143 return _("Italian")
144 elif language == "nl":
145 return _("Dutch")
146 elif language == "pl":
147 return _("Polish")
148 elif language == "pt":
149 return _("Portuguese")
150 elif language == "ru":
151 return _("Russian")
152 elif language == "tr":
153 return _("Turkish")
154
155 return language
156
157
9068dba1
MT
158class MapModule(UIModule):
159 def render(self, latitude, longitude):
160 return self.render_string("modules/map.html", latitude=latitude, longitude=longitude)
161
162
940227cb
MT
163class MenuModule(UIModule):
164 def render(self):
60024cc8 165 return self.render_string("modules/menu.html")
81675874 166
167
9068dba1
MT
168class MirrorItemModule(UIModule):
169 def render(self, item):
170 return self.render_string("modules/mirror-item.html", item=item)
171
172
173class MirrorsTableModule(UIModule):
174 def render(self, mirrors, preferred_mirrors=[]):
175 return self.render_string("modules/mirrors-table.html",
176 mirrors=mirrors, preferred_mirrors=preferred_mirrors)
177
178
179class NetBootMenuConfigModule(UIModule):
180 def render(self, release):
181 return self.render_string("netboot/menu-config.cfg", release=release)
182
183
184class NetBootMenuHeaderModule(UIModule):
185 def render(self, title, releases):
186 id = unicodedata.normalize("NFKD", unicode(title)).encode("ascii", "ignore")
187 id = re.sub(r"[^\w]+", " ", id)
188 id = "-".join(id.lower().strip().split())
189
190 return self.render_string("netboot/menu-header.cfg", id=id,
191 title=title, releases=releases)
192
193
194class NetBootMenuSeparatorModule(UIModule):
195 def render(self):
196 return self.render_string("netboot/menu-separator.cfg")
197
198
81675874 199class NewsItemModule(UIModule):
940227cb
MT
200 def get_author(self, author):
201 # Get name of author
202 author = self.accounts.find(author)
203 if author:
2fed2438 204 return author.name
940227cb
MT
205 else:
206 _ = self.locale.translate
207 return _("Unknown author")
208
60024cc8 209 def render(self, item, uncut=True, announcement=False, show_heading=True):
940227cb
MT
210 # Get author
211 item.author = self.get_author(item.author_id)
81675874 212
940227cb
MT
213 if not uncut and len(item.text) >= 400:
214 item.text = item.text[:400] + "..."
81675874 215
940227cb 216 # Render text
e46e8df8 217 item.text = textile.textile(item.text.decode("utf8"))
81675874 218
60024cc8
MT
219 return self.render_string("modules/news-item.html", item=item,
220 uncut=uncut, announcement=announcement, show_heading=show_heading)
940227cb
MT
221
222
7771acea 223class NewsLineModule(UIModule):
940227cb
MT
224 def render(self, item):
225 return self.render_string("modules/news-line.html", item=item)
226
227
7771acea
MT
228class NewsTableModule(UIModule):
229 def render(self, news):
230 return self.render_string("modules/news-table.html", news=news)
231
232
233class NewsYearNavigationModule(UIModule):
234 def render(self, active=None):
235 try:
236 active = int(active)
237 except:
238 active = None
239
240 return self.render_string("modules/news-year-nav.html",
241 active=active, years=self.news.years)
242
243
fa7e1a0a
MT
244class PlanetSearchBoxModule(UIModule):
245 def render(self, query=None):
246 years = self.planet.get_years()
247
248 return self.render_string("modules/planet/search-box.html",
249 query=query, years=years)
250
251
81675874 252class SidebarItemModule(UIModule):
253 def render(self):
254 return self.render_string("modules/sidebar-item.html")
255
256
257class SidebarReleaseModule(UIModule):
81675874 258 def render(self):
259 return self.render_string("modules/sidebar-release.html",
940227cb 260 latest=self.releases.get_latest())
81675874 261
262
263class ReleaseItemModule(UIModule):
60024cc8 264 def render(self, release, latest=False):
110e8687 265 arches = ("i586", "arm")
60024cc8 266
110e8687
MT
267 downloads = []
268 for arch in ("i586", "arm"):
269 files = []
270
271 for file in release.files:
272 if not file.arch == arch:
273 continue
274
275 files.append(file)
276
277 if files:
278 downloads.append((arch, files))
60024cc8
MT
279
280 return self.render_string("modules/release-item.html",
110e8687 281 release=release, latest=latest, downloads=downloads)
81675874 282
283
284class SidebarBannerModule(UIModule):
940227cb
MT
285 def render(self, item=None):
286 if not item:
287 item = self.banners.get_random()
288
81675874 289 return self.render_string("modules/sidebar-banner.html", item=item)
290
291
60024cc8
MT
292class DownloadButtonModule(UIModule):
293 def render(self, release, text="Download now!"):
294 best_image = None
295
296 for file in release.files:
297 if file.type == "iso":
298 best_image = file
299 break
300
301 # Show nothing when there was no image found.
302 if not best_image:
303 return ""
304
305 return self.render_string("modules/download-button.html",
306 release=release, image=best_image)
307
308
940227cb 309class PlanetEntryModule(UIModule):
60024cc8 310 def render(self, entry, show_avatar=True):
940227cb 311 return self.render_string("modules/planet-entry.html",
60024cc8 312 entry=entry, show_avatar=show_avatar)
d0d074e0
MT
313
314
66862195
MT
315class ProgressBarModule(UIModule):
316 def render(self, value, colour=None):
317 value *= 100
318
319 return self.render_string("modules/progress-bar.html",
320 colour=colour, value=value)
321
322
323class TalkCallLogModule(UIModule):
324 def render(self, calls):
325 return self.render_string("talk/modules/call-log.html", calls=calls)
326
327
328class TalkOngoingCallsModule(UIModule):
329 def render(self, calls):
330 return self.render_string("talk/modules/ongoing-calls.html", calls=calls)
331
332
940227cb 333class TrackerPeerListModule(UIModule):
6d524cba 334 def render(self, peers):
940227cb
MT
335 # Guess country code and hostname of the host
336 for peer in peers:
6d524cba
MT
337 country_code = self.geoip.get_country(peer["ip"])
338 if country_code:
66862195
MT
339 peer["country_code"] = country_code.lower()
340 else:
341 peer["country_code"] = "unknown"
d0d074e0 342
940227cb
MT
343 try:
344 peer["hostname"] = socket.gethostbyaddr(peer["ip"])[0]
345 except:
346 peer["hostname"] = ""
d0d074e0 347
940227cb 348 return self.render_string("modules/tracker-peerlist.html",
e46e8df8 349 peers=[backend.database.Row(p) for p in peers])
372efc19
MT
350
351
7771acea
MT
352class WishlistModule(UIModule):
353 def render(self, wishes, short=False):
354 return self.render_string("wishlist/modules/wishlist.html",
355 wishes=wishes, short=short)
356
357
358class WishModule(UIModule):
359 def render(self, wish, short=False):
3907b320 360 progress_bar = "progress-bar-warning"
7771acea 361
f60b79ce 362 if wish.percentage >= 100:
3907b320 363 progress_bar = "progress-bar-success"
7771acea
MT
364
365 return self.render_string("wishlist/modules/wish.html",
366 wish=wish, short=short, progress_bar=progress_bar)
367
368
e64ce07e
MT
369class WishlistItemsModule(UIModule):
370 def render(self, wishlist_items):
371 return self.render_string("modules/wishlist-items.html",
372 wishlist_items=wishlist_items)
373
374
7771acea 375class DonationBoxModule(UIModule):
e64ce07e 376 def render(self, reason_for_transfer=None, show_wishlist_items=False):
353880e5
MT
377 if reason_for_transfer:
378 reason_for_transfer = "IPFire.org - %s" % reason_for_transfer
379
e64ce07e
MT
380 # Interesting items from the wishlist.
381 wishlist_items = []
382 if show_wishlist_items:
383 wishlist_items = self.wishlist.get_hot_wishes()
384
353880e5 385 return self.render_string("modules/donation-box.html",
e64ce07e 386 reason_for_transfer=reason_for_transfer, wishlist_items=wishlist_items)