]>
git.ipfire.org Git - people/shoehn/ipfire.org.git/blob - webapp/ui_modules.py
4b4e9c9c86504aff4b91ab11ac5506c78f2eae77
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 years
= self
.planet
.get_years()
249 return self
.render_string("modules/planet/search-box.html",
250 query
=query
, years
=years
)
253 class SidebarItemModule(UIModule
):
255 return self
.render_string("modules/sidebar-item.html")
258 class SidebarReleaseModule(UIModule
):
260 return self
.render_string("modules/sidebar-release.html",
261 latest
=self
.releases
.get_latest())
264 class ReleaseItemModule(UIModule
):
265 def render(self
, release
, latest
=False):
266 arches
= ("i586", "arm")
269 for arch
in ("i586", "arm"):
272 for file in release
.files
:
273 if not file.arch
== arch
:
279 downloads
.append((arch
, files
))
281 return self
.render_string("modules/release-item.html",
282 release
=release
, latest
=latest
, downloads
=downloads
)
285 class SidebarBannerModule(UIModule
):
286 def render(self
, item
=None):
288 item
= self
.banners
.get_random()
290 return self
.render_string("modules/sidebar-banner.html", item
=item
)
293 class DownloadButtonModule(UIModule
):
294 def render(self
, release
, text
="Download now!"):
297 for file in release
.files
:
298 if file.type == "iso":
302 # Show nothing when there was no image found.
306 return self
.render_string("modules/download-button.html",
307 release
=release
, image
=best_image
)
310 class PlanetAuthorBoxModule(UIModule
):
311 def render(self
, author
):
312 return self
.render_string("planet/modules/author-box.html", author
=author
)
315 class PlanetEntryModule(UIModule
):
316 def render(self
, entry
, show_avatar
=True):
317 return self
.render_string("modules/planet-entry.html",
318 entry
=entry
, show_avatar
=show_avatar
)
321 class ProgressBarModule(UIModule
):
322 def render(self
, value
, colour
=None):
325 return self
.render_string("modules/progress-bar.html",
326 colour
=colour
, value
=value
)
329 class TalkCallLogModule(UIModule
):
330 def render(self
, account
=None, viewer
=None):
331 if (account
is None or not self
.current_user
== account
) \
332 and not self
.current_user
.is_admin():
333 raise RuntimeException("Insufficient permissions")
336 viewer
= self
.current_user
338 calls
= self
.talk
.get_call_log(account
)
340 return self
.render_string("talk/modules/call-log.html",
341 calls
=calls
, viewer
=viewer
)
344 class TalkLinesModule(UIModule
):
345 def render(self
, account
=None, show_account
=False):
346 if (account
is None or not self
.current_user
== account
) \
347 and not self
.current_user
.is_admin():
348 raise RuntimeException("Insufficient permissions")
350 lines
= self
.talk
.get_lines(account
)
352 return self
.render_string("talk/modules/lines.html",
353 show_account
=show_account
, lines
=lines
)
356 class TalkOngoingCallsModule(UIModule
):
357 def render(self
, account
=None):
358 if (account
is None or not self
.current_user
== account
) \
359 and not self
.current_user
.is_admin():
360 raise RuntimeException("Insufficient permissions")
362 calls
= self
.talk
.get_ongoing_calls(account
)
365 return self
.render_string("talk/modules/ongoing-calls.html",
371 class TrackerPeerListModule(UIModule
):
372 def render(self
, peers
):
373 # Guess country code and hostname of the host
375 country_code
= self
.geoip
.get_country(peer
["ip"])
377 peer
["country_code"] = country_code
.lower()
379 peer
["country_code"] = "unknown"
382 peer
["hostname"] = socket
.gethostbyaddr(peer
["ip"])[0]
384 peer
["hostname"] = ""
386 return self
.render_string("modules/tracker-peerlist.html",
387 peers
=[backend
.database
.Row(p
) for p
in peers
])
390 class WishlistModule(UIModule
):
391 def render(self
, wishes
, short
=False):
392 return self
.render_string("wishlist/modules/wishlist.html",
393 wishes
=wishes
, short
=short
)
396 class WishModule(UIModule
):
397 def render(self
, wish
, short
=False):
398 progress_bar
= "progress-bar-warning"
400 if wish
.percentage
>= 100:
401 progress_bar
= "progress-bar-success"
403 return self
.render_string("wishlist/modules/wish.html",
404 wish
=wish
, short
=short
, progress_bar
=progress_bar
)
407 class WishlistItemsModule(UIModule
):
408 def render(self
, wishlist_items
):
409 return self
.render_string("modules/wishlist-items.html",
410 wishlist_items
=wishlist_items
)
413 class DonationBoxModule(UIModule
):
414 def render(self
, reason_for_transfer
=None):
415 if reason_for_transfer
:
416 reason_for_transfer
= "IPFire.org - %s" % reason_for_transfer
418 return self
.render_string("modules/donation-box.html",
419 reason_for_transfer
=reason_for_transfer
)
422 class DonationButtonModule(UIModule
):
423 # https://developer.paypal.com/docs/classic/paypal-payments-standard/integration-guide/Appx_websitestandard_htmlvariables/
459 def render(self
, reason_for_transfer
=None, currency
="EUR"):
460 if not reason_for_transfer
:
461 reason_for_transfer
= "IPFire.org"
463 primary
= (currency
== "EUR")
465 return self
.render_string("modules/donation-button.html", primary
=primary
,
466 reason_for_transfer
=reason_for_transfer
, currency
=currency
, lc
=self
.lc
)
471 Returns the locale of the user
474 locale
, delimiter
, encoding
= self
.locale
.code
.partition(".")
476 # Break for languages in specific countries
477 if locale
in self
.LOCALES
:
480 lang
, delimiter
, country_code
= locale
.partition("_")
481 print locale
, "TEST", country_code
483 if country_code
and country_code
in self
.COUNTRIES
:
487 if lang
in self
.COUNTRIES
:
492 # If anything goes wrong, fall back to GB