]> git.ipfire.org Git - people/shoehn/ipfire.org.git/blobdiff - webapp/ui_modules.py
netboot: Allow booting multiple architectures
[people/shoehn/ipfire.org.git] / webapp / ui_modules.py
index 3cf68d85231f46107ca6b1cae8b5bead815c22ab..514688fa3e1a513a686b18fe46f8a8881615b523 100644 (file)
@@ -13,10 +13,7 @@ import tornado.locale
 import tornado.web
 import unicodedata
 
-from tornado.database import Row
-
 import backend
-import backend.stasy
 
 class UIModule(tornado.web.UIModule):
        @property
@@ -47,6 +44,18 @@ class UIModule(tornado.web.UIModule):
        def news(self):
                return self.handler.news
 
+       @property
+       def planet(self):
+               return self.handler.planet
+
+       @property
+       def talk(self):
+               return self.handler.talk
+
+       @property
+       def wishlist(self):
+               return self.handler.wishlist
+
 
 class AdvertisementModule(UIModule):
        def render(self, where):
@@ -62,6 +71,91 @@ class AdvertisementModule(UIModule):
                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)
@@ -84,18 +178,19 @@ class MirrorsTableModule(UIModule):
 
 
 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):
@@ -108,7 +203,7 @@ class NewsItemModule(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")
@@ -121,9 +216,12 @@ class NewsItemModule(UIModule):
                        item.text = item.text[:400] + "..."
 
                # Render text
-               item.text = textile.textile(item.text)
+               item.text = textile.textile(item.text.decode("utf8"))
+
+               # 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,
+               return self.render_string("modules/news-item.html", item=item, release=release,
                        uncut=uncut, announcement=announcement, show_heading=show_heading)
 
 
@@ -148,6 +246,11 @@ class NewsYearNavigationModule(UIModule):
                        active=active, years=self.news.years)
 
 
+class PlanetSearchBoxModule(UIModule):
+       def render(self, query=None):
+               return self.render_string("modules/planet/search-box.html", query=query)
+
+
 class SidebarItemModule(UIModule):
        def render(self):
                return self.render_string("modules/sidebar-item.html")
@@ -205,129 +308,84 @@ class DownloadButtonModule(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, percentages=False):
-               # Guess country code and hostname of the host
-               for peer in peers:
-                       country_code = backend.GeoIP().get_country(peer["ip"])
-                       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=[Row(p) for p in peers], percentages=percentages)
 
+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 = tornado.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):
@@ -347,6 +405,12 @@ class WishModule(UIModule):
                        wish=wish, short=short, progress_bar=progress_bar)
 
 
+class WishlistItemsModule(UIModule):
+       def render(self, wishlist_items):
+               return self.render_string("modules/wishlist-items.html",
+                       wishlist_items=wishlist_items)
+
+
 class DonationBoxModule(UIModule):
        def render(self, reason_for_transfer=None):
                if reason_for_transfer:
@@ -354,3 +418,84 @@ class DonationBoxModule(UIModule):
 
                return self.render_string("modules/donation-box.html",
                        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)