]>
git.ipfire.org Git - people/shoehn/ipfire.org.git/blob - webapp/ui_modules.py
41d681d687ba18a0288514f368ebdc69d398fd25
3 from __future__
import division
16 from tornado
.database
import Row
21 class UIModule(tornado
.web
.UIModule
):
24 return self
.handler
.accounts
27 def advertisements(self
):
28 return self
.handler
.advertisements
32 return self
.handler
.banners
36 return self
.handler
.memcached
40 return self
.handler
.releases
44 return self
.handler
.geoip
48 return self
.handler
.news
51 class AdvertisementModule(UIModule
):
52 def render(self
, where
):
53 assert where
in ("download-splash",), where
55 ad
= self
.advertisements
.get(where
)
59 # Mark that advert has been shown.
60 ad
.update_impressions()
62 return self
.render_string("modules/ads/%s.html" % where
, ad
=ad
)
65 class MapModule(UIModule
):
66 def render(self
, latitude
, longitude
):
67 return self
.render_string("modules/map.html", latitude
=latitude
, longitude
=longitude
)
70 class MenuModule(UIModule
):
72 return self
.render_string("modules/menu.html")
75 class MirrorItemModule(UIModule
):
76 def render(self
, item
):
77 return self
.render_string("modules/mirror-item.html", item
=item
)
80 class MirrorsTableModule(UIModule
):
81 def render(self
, mirrors
, preferred_mirrors
=[]):
82 return self
.render_string("modules/mirrors-table.html",
83 mirrors
=mirrors
, preferred_mirrors
=preferred_mirrors
)
86 class NetBootMenuConfigModule(UIModule
):
87 def render(self
, release
):
88 return self
.render_string("netboot/menu-config.cfg", release
=release
)
91 class NetBootMenuHeaderModule(UIModule
):
92 def render(self
, title
, releases
):
93 id = unicodedata
.normalize("NFKD", unicode(title
)).encode("ascii", "ignore")
94 id = re
.sub(r
"[^\w]+", " ", id)
95 id = "-".join(id.lower().strip().split())
97 return self
.render_string("netboot/menu-header.cfg", id=id,
98 title
=title
, releases
=releases
)
101 class NetBootMenuSeparatorModule(UIModule
):
103 return self
.render_string("netboot/menu-separator.cfg")
106 class NewsItemModule(UIModule
):
107 def get_author(self
, author
):
109 author
= self
.accounts
.find(author
)
113 _
= self
.locale
.translate
114 return _("Unknown author")
116 def render(self
, item
, uncut
=True, announcement
=False, show_heading
=True):
118 item
.author
= self
.get_author(item
.author_id
)
120 if not uncut
and len(item
.text
) >= 400:
121 item
.text
= item
.text
[:400] + "..."
124 item
.text
= textile
.textile(item
.text
)
126 return self
.render_string("modules/news-item.html", item
=item
,
127 uncut
=uncut
, announcement
=announcement
, show_heading
=show_heading
)
130 class NewsLineModule(UIModule
):
131 def render(self
, item
):
132 return self
.render_string("modules/news-line.html", item
=item
)
135 class NewsTableModule(UIModule
):
136 def render(self
, news
):
137 return self
.render_string("modules/news-table.html", news
=news
)
140 class NewsYearNavigationModule(UIModule
):
141 def render(self
, active
=None):
147 return self
.render_string("modules/news-year-nav.html",
148 active
=active
, years
=self
.news
.years
)
151 class SidebarItemModule(UIModule
):
153 return self
.render_string("modules/sidebar-item.html")
156 class SidebarReleaseModule(UIModule
):
158 return self
.render_string("modules/sidebar-release.html",
159 latest
=self
.releases
.get_latest())
162 class ReleaseItemModule(UIModule
):
163 def render(self
, release
, latest
=False):
169 for file in release
.files
:
171 files
[file.arch
].append(file)
175 return self
.render_string("modules/release-item.html",
176 release
=release
, latest
=latest
, files
=files
)
179 class SidebarBannerModule(UIModule
):
180 def render(self
, item
=None):
182 item
= self
.banners
.get_random()
184 return self
.render_string("modules/sidebar-banner.html", item
=item
)
187 class DownloadButtonModule(UIModule
):
188 def render(self
, release
, text
="Download now!"):
191 for file in release
.files
:
192 if file.type == "iso":
196 # Show nothing when there was no image found.
200 return self
.render_string("modules/download-button.html",
201 release
=release
, image
=best_image
)
204 class PlanetEntryModule(UIModule
):
205 def render(self
, entry
, show_avatar
=True):
206 return self
.render_string("modules/planet-entry.html",
207 entry
=entry
, show_avatar
=show_avatar
)
210 class TrackerPeerListModule(UIModule
):
211 def render(self
, peers
, percentages
=False):
212 # Guess country code and hostname of the host
214 country_code
= backend
.GeoIP().get_country(peer
["ip"])
215 peer
["country_code"] = country_code
or "unknown"
218 peer
["hostname"] = socket
.gethostbyaddr(peer
["ip"])[0]
220 peer
["hostname"] = ""
222 return self
.render_string("modules/tracker-peerlist.html",
223 peers
=[Row(p
) for p
in peers
], percentages
=percentages
)
226 class StasyTableModule(UIModule
):
227 def _make_percentages(self
, items
):
228 total
= sum(items
.values())
230 for k
in items
.keys():
236 def render(self
, items
, sortby
="key", reverse
=False, percentage
=False, flags
=False, locale
=False):
238 for v
in items
.values():
243 keys
= sorted(items
.keys(), reverse
=reverse
)
244 elif sortby
== "percentage":
245 keys
= [k
for k
,v
in sorted(items
.items(), key
=operator
.itemgetter(1))]
247 keys
= reversed(keys
)
249 raise Exception, "Unknown sortby parameter was provided"
255 v
= items
[k
] * 100 / hundred_percent
258 _items
.append((k
, v
))
261 if items
and type(items
[0][0]) == type(()) :
262 _
= self
.locale
.translate
265 k
= _("%s to %s") % k
266 _items
.append((k
, v
))
271 locales
= tornado
.locale
.LOCALE_NAMES
275 for code
, locale
in locales
.items():
276 if code
.startswith(k
):
277 k
= locale
["name"].split()[0]
278 _items
.append((k
, v
))
281 return self
.render_string("modules/stasy-table.html", items
=items
, flags
=flags
)
284 class StasyCPUCoreTableModule(StasyTableModule
):
285 def render(self
, items
):
286 items
= self
._make
_percentages
(items
)
288 items
= items
.items()
291 return self
.render_string("modules/stasy-table.html", items
=items
,
296 class StasyDeviceTableModule(UIModule
):
297 def render(self
, devices
):
300 for device
in devices
:
301 if not groups
.has_key(device
.cls
):
302 groups
[device
.cls
] = []
304 groups
[device
.cls
].append(device
)
306 return self
.render_string("modules/stasy-table-devices.html",
307 groups
=groups
.items())
310 class StasyGeoTableModule(UIModule
):
311 def render(self
, items
):
312 _
= self
.locale
.translate
314 # Sort all items by value
315 items
= sorted(items
.items(), key
=operator
.itemgetter(1), reverse
=True)
318 for code
, value
in items
:
319 country
= tornado
.database
.Row({
320 "code" : code
.lower(),
321 "name" : _(self
.geoip
.get_country_name(code
)),
322 "value" : value
* 100,
324 countries
.append(country
)
326 return self
.render_string("modules/stasy-table-geo.html", countries
=countries
)
329 class WishlistModule(UIModule
):
330 def render(self
, wishes
, short
=False):
331 return self
.render_string("wishlist/modules/wishlist.html",
332 wishes
=wishes
, short
=short
)
335 class WishModule(UIModule
):
336 def render(self
, wish
, short
=False):
337 progress_bar
= "progress-bar-warning"
339 if wish
.percentage
>= 100:
340 progress_bar
= "progress-bar-success"
342 return self
.render_string("wishlist/modules/wish.html",
343 wish
=wish
, short
=short
, progress_bar
=progress_bar
)
346 class DonationBoxModule(UIModule
):
347 def render(self
, reason_for_transfer
=None):
348 if reason_for_transfer
:
349 reason_for_transfer
= "IPFire.org - %s" % reason_for_transfer
351 return self
.render_string("modules/donation-box.html",
352 reason_for_transfer
=reason_for_transfer
)