]> git.ipfire.org Git - people/shoehn/ipfire.org.git/blobdiff - webapp/ui_modules.py
adjust touch target on mobile Feature page
[people/shoehn/ipfire.org.git] / webapp / ui_modules.py
index c1de1d0cd765c31f7aa8e9bfe167e05e42f55144..d70d1324cfba96ec65437d0cb631a7235e994032 100644 (file)
@@ -13,7 +13,7 @@ import tornado.locale
 import tornado.web
 import unicodedata
 
-from tornado.database import Row
+import backend
 
 class UIModule(tornado.web.UIModule):
        @property
@@ -48,6 +48,10 @@ class UIModule(tornado.web.UIModule):
        def planet(self):
                return self.handler.planet
 
+       @property
+       def talk(self):
+               return self.handler.talk
+
        @property
        def wishlist(self):
                return self.handler.wishlist
@@ -113,16 +117,13 @@ class FireinfoGeoTableModule(UIModule):
                                other_countries.append(name)
                                continue
 
-                       country = tornado.database.Row({
+                       country = backend.database.Row({
                                "code"  : code,
                                "name"  : name,
                                "value" : value,
                        })
                        countries.append(country)
 
-               # Sort the list of small countries by alphabet
-               other_countries.sort()
-
                return self.render_string("fireinfo/modules/table-geo.html",
                        countries=countries, other_countries=other_countries)
 
@@ -177,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):
@@ -214,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)
 
 
@@ -243,10 +248,7 @@ class NewsYearNavigationModule(UIModule):
 
 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):
@@ -262,10 +264,10 @@ class SidebarReleaseModule(UIModule):
 
 class ReleaseItemModule(UIModule):
        def render(self, release, latest=False):
-               arches = ("i586", "arm")
+               arches = ("x86_64", "i586", "arm")
 
                downloads = []
-               for arch in ("i586", "arm"):
+               for arch in arches:
                        files = []
 
                        for file in release.files:
@@ -294,7 +296,8 @@ class DownloadButtonModule(UIModule):
                best_image = None
 
                for file in release.files:
-                       if file.type == "iso":
+                       if (release.sname < "ipfire-2.19-core100" or file.arch == "x86_64") \
+                                       and file.type == "iso":
                                best_image = file
                                break
 
@@ -306,6 +309,11 @@ 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",
@@ -321,13 +329,45 @@ class ProgressBarModule(UIModule):
 
 
 class TalkCallLogModule(UIModule):
-       def render(self, calls):
-               return self.render_string("talk/modules/call-log.html", calls=calls)
+       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")
+
+               if viewer is None:
+                       viewer = self.current_user
+
+               calls = self.talk.get_call_log(account)
+
+               return self.render_string("talk/modules/call-log.html",
+                       calls=calls, viewer=viewer)
+
+
+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")
+
+               lines = self.talk.get_lines(account)
+
+               return self.render_string("talk/modules/lines.html",
+                       show_account=show_account, lines=lines)
 
 
 class TalkOngoingCallsModule(UIModule):
-       def render(self, calls):
-               return self.render_string("talk/modules/ongoing-calls.html", calls=calls)
+       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")
+
+               calls = self.talk.get_ongoing_calls(account)
+
+               if calls:
+                       return self.render_string("talk/modules/ongoing-calls.html",
+                               calls=calls)
+
+               return ""
 
 
 class TrackerPeerListModule(UIModule):
@@ -346,7 +386,7 @@ class TrackerPeerListModule(UIModule):
                                peer["hostname"] = ""
 
                return self.render_string("modules/tracker-peerlist.html",
-                       peers=[Row(p) for p in peers])
+                       peers=[backend.database.Row(p) for p in peers])
 
 
 class WishlistModule(UIModule):
@@ -373,14 +413,90 @@ class WishlistItemsModule(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)