def releases(self):
return self.handler.releases
+ @property
+ def geoip(self):
+ return self.handler.geoip
+
class MenuModule(UIModule):
def render(self):
- hostname = self.request.host.lower().split(':')[0]
-
- menuitems = []
- for m in backend.Menu().get(hostname):
- m.active = False
-
- if m.uri and self.request.uri.endswith(m.uri):
- m.active = True
-
- # Translate the description of the link
- m.description = \
- self.locale.translate(m.description)
- m.description = tornado.escape.xhtml_escape(m.description)
-
- menuitems.append(m)
-
- return self.render_string("modules/menu.html", menuitems=menuitems)
+ return self.render_string("modules/menu.html")
class NewsItemModule(UIModule):
_ = self.locale.translate
return _("Unknown author")
- def render(self, item, uncut=False):
+ def render(self, item, uncut=True, announcement=False, show_heading=True):
# Get author
item.author = self.get_author(item.author_id)
item.text = text
- return self.render_string("modules/news-item.html", item=item, uncut=uncut)
+ return self.render_string("modules/news-item.html", item=item,
+ uncut=uncut, announcement=announcement, show_heading=show_heading)
class NewsLineModule(NewsItemModule):
class ReleaseItemModule(UIModule):
- def render(self, item):
- return self.render_string("modules/release-item.html", release=item)
+ def render(self, release, latest=False):
+ files = {
+ "i586" : [],
+ "arm" : [],
+ }
+
+ for file in release.files:
+ try:
+ files[file.arch].append(file)
+ except KeyError:
+ pass
+
+ return self.render_string("modules/release-item.html",
+ release=release, latest=latest, files=files)
class SidebarBannerModule(UIModule):
return self.render_string("modules/sidebar-banner.html", item=item)
+class DownloadButtonModule(UIModule):
+ def render(self, release, text="Download now!"):
+ best_image = None
+
+ for file in release.files:
+ if file.type == "iso":
+ best_image = file
+ break
+
+ # Show nothing when there was no image found.
+ if not best_image:
+ return ""
+
+ return self.render_string("modules/download-button.html",
+ release=release, image=best_image)
+
+
class PlanetEntryModule(UIModule):
- def render(self, entry, short=False):
+ def render(self, entry, show_avatar=True):
return self.render_string("modules/planet-entry.html",
- entry=entry, short=short)
+ entry=entry, show_avatar=show_avatar)
class TrackerPeerListModule(UIModule):
class StasyTableModule(UIModule):
+ def _make_percentages(self, items):
+ total = sum(items.values())
+
+ for k in items.keys():
+ items[k] *= 100
+ items[k] /= total
+
+ return items
+
def render(self, items, sortby="key", reverse=False, percentage=False, flags=False, locale=False):
hundred_percent = 0
for v in items.values():
for k, v in items:
for code, locale in locales.items():
if code.startswith(k):
- k = locale["name"]
+ 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)
+
+ items = items.items()
+ items.sort()
+
+ return self.render_string("modules/stasy-table.html", items=items,
+ flags=None #XXX
+ )
+
+
class StasyDeviceTableModule(UIModule):
def render(self, devices):
groups = {}
return self.render_string("modules/stasy-table-devices.html",
groups=groups.items())
+
+
+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)
+
+ 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)
+
+ return self.render_string("modules/stasy-table-geo.html", countries=countries)
+
+
+class MirrorsTableModule(UIModule):
+ def render(self, mirrors):
+ return self.render_string("modules/mirrors-table.html", mirrors=mirrors)