import unicodedata
import backend
-import backend.stasy
class UIModule(tornado.web.UIModule):
@property
def planet(self):
return self.handler.planet
+ @property
+ def talk(self):
+ return self.handler.talk
+
@property
def wishlist(self):
return self.handler.wishlist
return self.render_string("modules/ads/%s.html" % where, ad=ad)
+class FireinfoDeviceTableModule(UIModule):
+ def render(self, devices):
+ return self.render_string("fireinfo/modules/table-devices.html",
+ devices=devices)
+
+
+class FireinfoDeviceAndGroupsTableModule(UIModule):
+ def render(self, devices):
+ _ = self.locale.translate
+
+ groups = {}
+
+ for device in devices:
+ if not groups.has_key(device.cls):
+ groups[device.cls] = []
+
+ groups[device.cls].append(device)
+
+ # Sort all devices
+ for key in groups.keys():
+ groups[key].sort()
+
+ # Order the groups by their name
+ groups = groups.items()
+ groups.sort()
+
+ return self.render_string("fireinfo/modules/table-devices-and-groups.html",
+ groups=groups)
+
+
+class FireinfoGeoTableModule(UIModule):
+ def render(self, items):
+ countries = []
+ other_countries = []
+ for code, value in items:
+ # Skip the satellite providers in this ranking
+ if code in (None, "A1", "A2"):
+ continue
+
+ name = self.geoip.get_country_name(code)
+
+ # Don't add countries with a small share on the list
+ if value < 0.01:
+ other_countries.append(name)
+ continue
+
+ country = backend.database.Row({
+ "code" : code,
+ "name" : name,
+ "value" : value,
+ })
+ countries.append(country)
+
+ return self.render_string("fireinfo/modules/table-geo.html",
+ countries=countries, other_countries=other_countries)
+
+
+class LanguageNameModule(UIModule):
+ def render(self, language):
+ _ = self.locale.translate
+
+ if language == "de":
+ return _("German")
+ elif language == "en":
+ return _("English")
+ elif language == "es":
+ return _("Spanish")
+ elif language == "fr":
+ return _("French")
+ elif language == "it":
+ return _("Italian")
+ elif language == "nl":
+ return _("Dutch")
+ elif language == "pl":
+ return _("Polish")
+ elif language == "pt":
+ return _("Portuguese")
+ elif language == "ru":
+ return _("Russian")
+ elif language == "tr":
+ return _("Turkish")
+
+ return language
+
+
class MapModule(UIModule):
def render(self, latitude, longitude):
return self.render_string("modules/map.html", latitude=latitude, longitude=longitude)
class NetBootMenuConfigModule(UIModule):
- def render(self, release):
- return self.render_string("netboot/menu-config.cfg", release=release)
+ def render(self, release, arch=None, platform=None):
+ return self.render_string("netboot/menu-config.cfg", release=release,
+ arch=arch, platform=platform)
class NetBootMenuHeaderModule(UIModule):
- def render(self, title, releases):
+ def render(self, title, releases, arch=None, platform=None):
id = unicodedata.normalize("NFKD", unicode(title)).encode("ascii", "ignore")
id = re.sub(r"[^\w]+", " ", id)
id = "-".join(id.lower().strip().split())
return self.render_string("netboot/menu-header.cfg", id=id,
- title=title, releases=releases)
+ title=title, releases=releases, arch=arch, platform=platform)
class NetBootMenuSeparatorModule(UIModule):
# Get name of author
author = self.accounts.find(author)
if author:
- return author.cn
+ return author.name
else:
_ = self.locale.translate
return _("Unknown author")
# Render text
item.text = textile.textile(item.text.decode("utf8"))
- return self.render_string("modules/news-item.html", item=item,
+ # Find a release if one exists
+ release = self.releases.get_by_news_id(item.uuid)
+
+ return self.render_string("modules/news-item.html", item=item, release=release,
uncut=uncut, announcement=announcement, show_heading=show_heading)
class PlanetSearchBoxModule(UIModule):
def render(self, query=None):
- years = self.planet.get_years()
-
- return self.render_string("modules/planet/search-box.html",
- query=query, years=years)
+ return self.render_string("modules/planet/search-box.html", query=query)
class SidebarItemModule(UIModule):
release=release, image=best_image)
+class PlanetAuthorBoxModule(UIModule):
+ def render(self, author):
+ return self.render_string("planet/modules/author-box.html", author=author)
+
+
class PlanetEntryModule(UIModule):
def render(self, entry, show_avatar=True):
return self.render_string("modules/planet-entry.html",
entry=entry, show_avatar=show_avatar)
-class TrackerPeerListModule(UIModule):
- def render(self, peers):
- # Guess country code and hostname of the host
- for peer in peers:
- country_code = self.geoip.get_country(peer["ip"])
- if country_code:
- country_code = country_code.lower()
- peer["country_code"] = country_code or "unknown"
+class ProgressBarModule(UIModule):
+ def render(self, value, colour=None):
+ value *= 100
- try:
- peer["hostname"] = socket.gethostbyaddr(peer["ip"])[0]
- except:
- peer["hostname"] = ""
+ return self.render_string("modules/progress-bar.html",
+ colour=colour, value=value)
- return self.render_string("modules/tracker-peerlist.html",
- peers=[backend.database.Row(p) for p in peers])
+class TalkCallLogModule(UIModule):
+ def render(self, account=None, viewer=None):
+ if (account is None or not self.current_user == account) \
+ and not self.current_user.is_admin():
+ raise RuntimeException("Insufficient permissions")
-class StasyTableModule(UIModule):
- def _make_percentages(self, items):
- total = sum(items.values())
+ if viewer is None:
+ viewer = self.current_user
- for k in items.keys():
- items[k] *= 100
- items[k] /= total
+ calls = self.talk.get_call_log(account)
- return items
+ return self.render_string("talk/modules/call-log.html",
+ calls=calls, viewer=viewer)
- def render(self, items, sortby="key", reverse=False, percentage=False, flags=False, locale=False):
- hundred_percent = 0
- for v in items.values():
- hundred_percent += v
- keys = []
- if sortby == "key":
- keys = sorted(items.keys(), reverse=reverse)
- elif sortby == "percentage":
- keys = [k for k,v in sorted(items.items(), key=operator.itemgetter(1))]
- if not reverse:
- keys = reversed(keys)
- else:
- raise Exception, "Unknown sortby parameter was provided"
-
- if hundred_percent:
- _items = []
- for k in keys:
- if not percentage:
- v = items[k] * 100 / hundred_percent
- else:
- v = items[k] * 100
- _items.append((k, v))
- items = _items
-
- if items and type(items[0][0]) == type(()) :
- _ = self.locale.translate
- _items = []
- for k, v in items:
- k = _("%s to %s") % k
- _items.append((k, v))
- items = _items
-
- if locale:
- flags = False
- locales = tornado.locale.LOCALE_NAMES
- _items = []
- for k, v in items:
- if k:
- for code, locale in locales.items():
- if code.startswith(k):
- k = locale["name"].split()[0]
- _items.append((k, v))
- items = _items
-
- return self.render_string("modules/stasy-table.html", items=items, flags=flags)
-
-
-class StasyCPUCoreTableModule(StasyTableModule):
- def render(self, items):
- items = self._make_percentages(items)
+class TalkLinesModule(UIModule):
+ def render(self, account=None, show_account=False):
+ if (account is None or not self.current_user == account) \
+ and not self.current_user.is_admin():
+ raise RuntimeException("Insufficient permissions")
- items = items.items()
- items.sort()
+ lines = self.talk.get_lines(account)
- return self.render_string("modules/stasy-table.html", items=items,
- flags=None #XXX
- )
+ return self.render_string("talk/modules/lines.html",
+ show_account=show_account, lines=lines)
-class StasyDeviceTableModule(UIModule):
- def render(self, devices):
- groups = {}
+class TalkOngoingCallsModule(UIModule):
+ def render(self, account=None):
+ if (account is None or not self.current_user == account) \
+ and not self.current_user.is_admin():
+ raise RuntimeException("Insufficient permissions")
- for device in devices:
- if not groups.has_key(device.cls):
- groups[device.cls] = []
+ calls = self.talk.get_ongoing_calls(account)
- groups[device.cls].append(device)
-
- return self.render_string("modules/stasy-table-devices.html",
- groups=groups.items())
+ if calls:
+ return self.render_string("talk/modules/ongoing-calls.html",
+ calls=calls)
+ return ""
-class StasyGeoTableModule(UIModule):
- def render(self, items):
- _ = self.locale.translate
- # Sort all items by value
- items = sorted(items.items(), key=operator.itemgetter(1), reverse=True)
+class TrackerPeerListModule(UIModule):
+ def render(self, peers):
+ # Guess country code and hostname of the host
+ for peer in peers:
+ country_code = self.geoip.get_country(peer["ip"])
+ if country_code:
+ peer["country_code"] = country_code.lower()
+ else:
+ peer["country_code"] = "unknown"
- countries = []
- for code, value in items:
- country = backend.database.Row({
- "code" : code.lower(),
- "name" : _(self.geoip.get_country_name(code)),
- "value" : value * 100,
- })
- countries.append(country)
+ try:
+ peer["hostname"] = socket.gethostbyaddr(peer["ip"])[0]
+ except:
+ peer["hostname"] = ""
- return self.render_string("modules/stasy-table-geo.html", countries=countries)
+ return self.render_string("modules/tracker-peerlist.html",
+ peers=[backend.database.Row(p) for p in peers])
class WishlistModule(UIModule):
class DonationBoxModule(UIModule):
- def render(self, reason_for_transfer=None, show_wishlist_items=False):
+ def render(self, reason_for_transfer=None):
if reason_for_transfer:
reason_for_transfer = "IPFire.org - %s" % reason_for_transfer
- # Interesting items from the wishlist.
- wishlist_items = []
- if show_wishlist_items:
- wishlist_items = self.wishlist.get_hot_wishes()
-
return self.render_string("modules/donation-box.html",
- reason_for_transfer=reason_for_transfer, wishlist_items=wishlist_items)
+ reason_for_transfer=reason_for_transfer)
+
+
+class DonationButtonModule(UIModule):
+ # https://developer.paypal.com/docs/classic/paypal-payments-standard/integration-guide/Appx_websitestandard_htmlvariables/
+ COUNTRIES = (
+ "AU",
+ "AT",
+ "BE",
+ "BR",
+ "CA",
+ "CH",
+ "CN",
+ "DE",
+ "ES",
+ "GB",
+ "FR",
+ "IT",
+ "NL",
+ "PL",
+ "PT",
+ "RU",
+ "US",
+ )
+
+ LOCALES = (
+ "da_DK",
+ "he_IL",
+ "id_ID",
+ "ja_JP",
+ "no_NO",
+ "pt_BR",
+ "ru_RU",
+ "sv_SE",
+ "th_TH",
+ "zh_CN",
+ "zh_HK",
+ "zh_TW",
+ )
+
+ def render(self, reason_for_transfer=None, currency="EUR"):
+ if not reason_for_transfer:
+ reason_for_transfer = "IPFire.org"
+
+ primary = (currency == "EUR")
+
+ return self.render_string("modules/donation-button.html", primary=primary,
+ reason_for_transfer=reason_for_transfer, currency=currency, lc=self.lc)
+
+ @property
+ def lc(self):
+ """
+ Returns the locale of the user
+ """
+ try:
+ locale, delimiter, encoding = self.locale.code.partition(".")
+
+ # Break for languages in specific countries
+ if locale in self.LOCALES:
+ return locale
+
+ lang, delimiter, country_code = locale.partition("_")
+
+ if country_code and country_code in self.COUNTRIES:
+ return country_code
+
+ lang = lang.upper()
+ if lang in self.COUNTRIES:
+ return lang
+ except:
+ pass
+
+ # If anything goes wrong, fall back to GB
+ return "GB"
+
+
+class DonationInputBoxModule(DonationButtonModule):
+ def render(self):
+ currencies = ("EUR", "USD", "GBP", "CHF", "AUD", "NZD", "CAD")
+
+ return self.render_string("modules/donation-input-box.html",
+ currencies=currencies, lc=self.lc)