]>
git.ipfire.org Git - people/shoehn/ipfire.org.git/blob - webapp/ui_modules.py
3 from __future__
import division
18 class UIModule(tornado
.web
.UIModule
):
21 return self
.handler
.accounts
24 def advertisements(self
):
25 return self
.handler
.advertisements
29 return self
.handler
.banners
33 return self
.handler
.memcached
37 return self
.handler
.releases
41 return self
.handler
.geoip
45 return self
.handler
.news
49 return self
.handler
.planet
53 return self
.handler
.talk
57 return self
.handler
.wishlist
60 class AdvertisementModule(UIModule
):
61 def render(self
, where
):
62 assert where
in ("download-splash",), where
64 ad
= self
.advertisements
.get(where
)
68 # Mark that advert has been shown.
69 ad
.update_impressions()
71 return self
.render_string("modules/ads/%s.html" % where
, ad
=ad
)
74 class FireinfoDeviceTableModule(UIModule
):
75 def render(self
, devices
):
76 return self
.render_string("fireinfo/modules/table-devices.html",
80 class FireinfoDeviceAndGroupsTableModule(UIModule
):
81 def render(self
, devices
):
82 _
= self
.locale
.translate
86 for device
in devices
:
87 if not groups
.has_key(device
.cls
):
88 groups
[device
.cls
] = []
90 groups
[device
.cls
].append(device
)
93 for key
in groups
.keys():
96 # Order the groups by their name
97 groups
= groups
.items()
100 return self
.render_string("fireinfo/modules/table-devices-and-groups.html",
104 class FireinfoGeoTableModule(UIModule
):
105 def render(self
, items
):
108 for code
, value
in items
:
109 # Skip the satellite providers in this ranking
110 if code
in (None, "A1", "A2"):
113 name
= self
.geoip
.get_country_name(code
)
115 # Don't add countries with a small share on the list
117 other_countries
.append(name
)
120 country
= backend
.database
.Row({
125 countries
.append(country
)
127 return self
.render_string("fireinfo/modules/table-geo.html",
128 countries
=countries
, other_countries
=other_countries
)
131 class LanguageNameModule(UIModule
):
132 def render(self
, language
):
133 _
= self
.locale
.translate
137 elif language
== "en":
139 elif language
== "es":
141 elif language
== "fr":
143 elif language
== "it":
145 elif language
== "nl":
147 elif language
== "pl":
149 elif language
== "pt":
150 return _("Portuguese")
151 elif language
== "ru":
153 elif language
== "tr":
159 class MapModule(UIModule
):
160 def render(self
, latitude
, longitude
):
161 return self
.render_string("modules/map.html", latitude
=latitude
, longitude
=longitude
)
164 class MenuModule(UIModule
):
166 return self
.render_string("modules/menu.html")
169 class MirrorItemModule(UIModule
):
170 def render(self
, item
):
171 return self
.render_string("modules/mirror-item.html", item
=item
)
174 class MirrorsTableModule(UIModule
):
175 def render(self
, mirrors
, preferred_mirrors
=[]):
176 return self
.render_string("modules/mirrors-table.html",
177 mirrors
=mirrors
, preferred_mirrors
=preferred_mirrors
)
180 class NetBootMenuConfigModule(UIModule
):
181 def render(self
, release
):
182 return self
.render_string("netboot/menu-config.cfg", release
=release
)
185 class NetBootMenuHeaderModule(UIModule
):
186 def render(self
, title
, releases
):
187 id = unicodedata
.normalize("NFKD", unicode(title
)).encode("ascii", "ignore")
188 id = re
.sub(r
"[^\w]+", " ", id)
189 id = "-".join(id.lower().strip().split())
191 return self
.render_string("netboot/menu-header.cfg", id=id,
192 title
=title
, releases
=releases
)
195 class NetBootMenuSeparatorModule(UIModule
):
197 return self
.render_string("netboot/menu-separator.cfg")
200 class NewsItemModule(UIModule
):
201 def get_author(self
, author
):
203 author
= self
.accounts
.find(author
)
207 _
= self
.locale
.translate
208 return _("Unknown author")
210 def render(self
, item
, uncut
=True, announcement
=False, show_heading
=True):
212 item
.author
= self
.get_author(item
.author_id
)
214 if not uncut
and len(item
.text
) >= 400:
215 item
.text
= item
.text
[:400] + "..."
218 item
.text
= textile
.textile(item
.text
.decode("utf8"))
220 return self
.render_string("modules/news-item.html", item
=item
,
221 uncut
=uncut
, announcement
=announcement
, show_heading
=show_heading
)
224 class NewsLineModule(UIModule
):
225 def render(self
, item
):
226 return self
.render_string("modules/news-line.html", item
=item
)
229 class NewsTableModule(UIModule
):
230 def render(self
, news
):
231 return self
.render_string("modules/news-table.html", news
=news
)
234 class NewsYearNavigationModule(UIModule
):
235 def render(self
, active
=None):
241 return self
.render_string("modules/news-year-nav.html",
242 active
=active
, years
=self
.news
.years
)
245 class PlanetSearchBoxModule(UIModule
):
246 def render(self
, query
=None):
247 return self
.render_string("modules/planet/search-box.html", query
=query
)
250 class SidebarItemModule(UIModule
):
252 return self
.render_string("modules/sidebar-item.html")
255 class SidebarReleaseModule(UIModule
):
257 return self
.render_string("modules/sidebar-release.html",
258 latest
=self
.releases
.get_latest())
261 class ReleaseItemModule(UIModule
):
262 def render(self
, release
, latest
=False):
263 arches
= ("i586", "arm")
266 for arch
in ("i586", "arm"):
269 for file in release
.files
:
270 if not file.arch
== arch
:
276 downloads
.append((arch
, files
))
278 return self
.render_string("modules/release-item.html",
279 release
=release
, latest
=latest
, downloads
=downloads
)
282 class SidebarBannerModule(UIModule
):
283 def render(self
, item
=None):
285 item
= self
.banners
.get_random()
287 return self
.render_string("modules/sidebar-banner.html", item
=item
)
290 class DownloadButtonModule(UIModule
):
291 def render(self
, release
, text
="Download now!"):
294 for file in release
.files
:
295 if file.type == "iso":
299 # Show nothing when there was no image found.
303 return self
.render_string("modules/download-button.html",
304 release
=release
, image
=best_image
)
307 class PlanetAuthorBoxModule(UIModule
):
308 def render(self
, author
):
309 return self
.render_string("planet/modules/author-box.html", author
=author
)
312 class PlanetEntryModule(UIModule
):
313 def render(self
, entry
, show_avatar
=True):
314 return self
.render_string("modules/planet-entry.html",
315 entry
=entry
, show_avatar
=show_avatar
)
318 class ProgressBarModule(UIModule
):
319 def render(self
, value
, colour
=None):
322 return self
.render_string("modules/progress-bar.html",
323 colour
=colour
, value
=value
)
326 class TalkCallLogModule(UIModule
):
327 def render(self
, account
=None, viewer
=None):
328 if (account
is None or not self
.current_user
== account
) \
329 and not self
.current_user
.is_admin():
330 raise RuntimeException("Insufficient permissions")
333 viewer
= self
.current_user
335 calls
= self
.talk
.get_call_log(account
)
337 return self
.render_string("talk/modules/call-log.html",
338 calls
=calls
, viewer
=viewer
)
341 class TalkLinesModule(UIModule
):
342 def render(self
, account
=None, show_account
=False):
343 if (account
is None or not self
.current_user
== account
) \
344 and not self
.current_user
.is_admin():
345 raise RuntimeException("Insufficient permissions")
347 lines
= self
.talk
.get_lines(account
)
349 return self
.render_string("talk/modules/lines.html",
350 show_account
=show_account
, lines
=lines
)
353 class TalkOngoingCallsModule(UIModule
):
354 def render(self
, account
=None):
355 if (account
is None or not self
.current_user
== account
) \
356 and not self
.current_user
.is_admin():
357 raise RuntimeException("Insufficient permissions")
359 calls
= self
.talk
.get_ongoing_calls(account
)
362 return self
.render_string("talk/modules/ongoing-calls.html",
368 class TrackerPeerListModule(UIModule
):
369 def render(self
, peers
):
370 # Guess country code and hostname of the host
372 country_code
= self
.geoip
.get_country(peer
["ip"])
374 peer
["country_code"] = country_code
.lower()
376 peer
["country_code"] = "unknown"
379 peer
["hostname"] = socket
.gethostbyaddr(peer
["ip"])[0]
381 peer
["hostname"] = ""
383 return self
.render_string("modules/tracker-peerlist.html",
384 peers
=[backend
.database
.Row(p
) for p
in peers
])
387 class WishlistModule(UIModule
):
388 def render(self
, wishes
, short
=False):
389 return self
.render_string("wishlist/modules/wishlist.html",
390 wishes
=wishes
, short
=short
)
393 class WishModule(UIModule
):
394 def render(self
, wish
, short
=False):
395 progress_bar
= "progress-bar-warning"
397 if wish
.percentage
>= 100:
398 progress_bar
= "progress-bar-success"
400 return self
.render_string("wishlist/modules/wish.html",
401 wish
=wish
, short
=short
, progress_bar
=progress_bar
)
404 class WishlistItemsModule(UIModule
):
405 def render(self
, wishlist_items
):
406 return self
.render_string("modules/wishlist-items.html",
407 wishlist_items
=wishlist_items
)
410 class DonationBoxModule(UIModule
):
411 def render(self
, reason_for_transfer
=None):
412 if reason_for_transfer
:
413 reason_for_transfer
= "IPFire.org - %s" % reason_for_transfer
415 return self
.render_string("modules/donation-box.html",
416 reason_for_transfer
=reason_for_transfer
)
419 class DonationButtonModule(UIModule
):
420 # https://developer.paypal.com/docs/classic/paypal-payments-standard/integration-guide/Appx_websitestandard_htmlvariables/
456 def render(self
, reason_for_transfer
=None, currency
="EUR"):
457 if not reason_for_transfer
:
458 reason_for_transfer
= "IPFire.org"
460 primary
= (currency
== "EUR")
462 return self
.render_string("modules/donation-button.html", primary
=primary
,
463 reason_for_transfer
=reason_for_transfer
, currency
=currency
, lc
=self
.lc
)
468 Returns the locale of the user
471 locale
, delimiter
, encoding
= self
.locale
.code
.partition(".")
473 # Break for languages in specific countries
474 if locale
in self
.LOCALES
:
477 lang
, delimiter
, country_code
= locale
.partition("_")
479 if country_code
and country_code
in self
.COUNTRIES
:
483 if lang
in self
.COUNTRIES
:
488 # If anything goes wrong, fall back to GB
492 class DonationInputBoxModule(DonationButtonModule
):
494 currencies
= ("EUR", "USD", "GBP", "CHF", "AUD", "NZD", "CAD")
496 return self
.render_string("modules/donation-input-box.html",
497 currencies
=currencies
, lc
=self
.lc
)