]>
git.ipfire.org Git - people/shoehn/ipfire.org.git/blob - webapp/ui_modules.py
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
52 return self
.handler
.planet
56 return self
.handler
.wishlist
59 class AdvertisementModule(UIModule
):
60 def render(self
, where
):
61 assert where
in ("download-splash",), where
63 ad
= self
.advertisements
.get(where
)
67 # Mark that advert has been shown.
68 ad
.update_impressions()
70 return self
.render_string("modules/ads/%s.html" % where
, ad
=ad
)
73 class MapModule(UIModule
):
74 def render(self
, latitude
, longitude
):
75 return self
.render_string("modules/map.html", latitude
=latitude
, longitude
=longitude
)
78 class MenuModule(UIModule
):
80 return self
.render_string("modules/menu.html")
83 class MirrorItemModule(UIModule
):
84 def render(self
, item
):
85 return self
.render_string("modules/mirror-item.html", item
=item
)
88 class MirrorsTableModule(UIModule
):
89 def render(self
, mirrors
, preferred_mirrors
=[]):
90 return self
.render_string("modules/mirrors-table.html",
91 mirrors
=mirrors
, preferred_mirrors
=preferred_mirrors
)
94 class NetBootMenuConfigModule(UIModule
):
95 def render(self
, release
):
96 return self
.render_string("netboot/menu-config.cfg", release
=release
)
99 class NetBootMenuHeaderModule(UIModule
):
100 def render(self
, title
, releases
):
101 id = unicodedata
.normalize("NFKD", unicode(title
)).encode("ascii", "ignore")
102 id = re
.sub(r
"[^\w]+", " ", id)
103 id = "-".join(id.lower().strip().split())
105 return self
.render_string("netboot/menu-header.cfg", id=id,
106 title
=title
, releases
=releases
)
109 class NetBootMenuSeparatorModule(UIModule
):
111 return self
.render_string("netboot/menu-separator.cfg")
114 class NewsItemModule(UIModule
):
115 def get_author(self
, author
):
117 author
= self
.accounts
.find(author
)
121 _
= self
.locale
.translate
122 return _("Unknown author")
124 def render(self
, item
, uncut
=True, announcement
=False, show_heading
=True):
126 item
.author
= self
.get_author(item
.author_id
)
128 if not uncut
and len(item
.text
) >= 400:
129 item
.text
= item
.text
[:400] + "..."
132 item
.text
= textile
.textile(item
.text
)
134 return self
.render_string("modules/news-item.html", item
=item
,
135 uncut
=uncut
, announcement
=announcement
, show_heading
=show_heading
)
138 class NewsLineModule(UIModule
):
139 def render(self
, item
):
140 return self
.render_string("modules/news-line.html", item
=item
)
143 class NewsTableModule(UIModule
):
144 def render(self
, news
):
145 return self
.render_string("modules/news-table.html", news
=news
)
148 class NewsYearNavigationModule(UIModule
):
149 def render(self
, active
=None):
155 return self
.render_string("modules/news-year-nav.html",
156 active
=active
, years
=self
.news
.years
)
159 class PlanetSearchBoxModule(UIModule
):
160 def render(self
, query
=None):
161 years
= self
.planet
.get_years()
163 return self
.render_string("modules/planet/search-box.html",
164 query
=query
, years
=years
)
167 class SidebarItemModule(UIModule
):
169 return self
.render_string("modules/sidebar-item.html")
172 class SidebarReleaseModule(UIModule
):
174 return self
.render_string("modules/sidebar-release.html",
175 latest
=self
.releases
.get_latest())
178 class ReleaseItemModule(UIModule
):
179 def render(self
, release
, latest
=False):
180 arches
= ("i586", "arm")
183 for arch
in ("i586", "arm"):
186 for file in release
.files
:
187 if not file.arch
== arch
:
193 downloads
.append((arch
, files
))
195 return self
.render_string("modules/release-item.html",
196 release
=release
, latest
=latest
, downloads
=downloads
)
199 class SidebarBannerModule(UIModule
):
200 def render(self
, item
=None):
202 item
= self
.banners
.get_random()
204 return self
.render_string("modules/sidebar-banner.html", item
=item
)
207 class DownloadButtonModule(UIModule
):
208 def render(self
, release
, text
="Download now!"):
211 for file in release
.files
:
212 if file.type == "iso":
216 # Show nothing when there was no image found.
220 return self
.render_string("modules/download-button.html",
221 release
=release
, image
=best_image
)
224 class PlanetEntryModule(UIModule
):
225 def render(self
, entry
, show_avatar
=True):
226 return self
.render_string("modules/planet-entry.html",
227 entry
=entry
, show_avatar
=show_avatar
)
230 class TrackerPeerListModule(UIModule
):
231 def render(self
, peers
, percentages
=False):
232 # Guess country code and hostname of the host
234 country_code
= backend
.GeoIP().get_country(peer
["ip"])
235 peer
["country_code"] = country_code
or "unknown"
238 peer
["hostname"] = socket
.gethostbyaddr(peer
["ip"])[0]
240 peer
["hostname"] = ""
242 return self
.render_string("modules/tracker-peerlist.html",
243 peers
=[Row(p
) for p
in peers
], percentages
=percentages
)
246 class StasyTableModule(UIModule
):
247 def _make_percentages(self
, items
):
248 total
= sum(items
.values())
250 for k
in items
.keys():
256 def render(self
, items
, sortby
="key", reverse
=False, percentage
=False, flags
=False, locale
=False):
258 for v
in items
.values():
263 keys
= sorted(items
.keys(), reverse
=reverse
)
264 elif sortby
== "percentage":
265 keys
= [k
for k
,v
in sorted(items
.items(), key
=operator
.itemgetter(1))]
267 keys
= reversed(keys
)
269 raise Exception, "Unknown sortby parameter was provided"
275 v
= items
[k
] * 100 / hundred_percent
278 _items
.append((k
, v
))
281 if items
and type(items
[0][0]) == type(()) :
282 _
= self
.locale
.translate
285 k
= _("%s to %s") % k
286 _items
.append((k
, v
))
291 locales
= tornado
.locale
.LOCALE_NAMES
295 for code
, locale
in locales
.items():
296 if code
.startswith(k
):
297 k
= locale
["name"].split()[0]
298 _items
.append((k
, v
))
301 return self
.render_string("modules/stasy-table.html", items
=items
, flags
=flags
)
304 class StasyCPUCoreTableModule(StasyTableModule
):
305 def render(self
, items
):
306 items
= self
._make
_percentages
(items
)
308 items
= items
.items()
311 return self
.render_string("modules/stasy-table.html", items
=items
,
316 class StasyDeviceTableModule(UIModule
):
317 def render(self
, devices
):
320 for device
in devices
:
321 if not groups
.has_key(device
.cls
):
322 groups
[device
.cls
] = []
324 groups
[device
.cls
].append(device
)
326 return self
.render_string("modules/stasy-table-devices.html",
327 groups
=groups
.items())
330 class StasyGeoTableModule(UIModule
):
331 def render(self
, items
):
332 _
= self
.locale
.translate
334 # Sort all items by value
335 items
= sorted(items
.items(), key
=operator
.itemgetter(1), reverse
=True)
338 for code
, value
in items
:
339 country
= tornado
.database
.Row({
340 "code" : code
.lower(),
341 "name" : _(self
.geoip
.get_country_name(code
)),
342 "value" : value
* 100,
344 countries
.append(country
)
346 return self
.render_string("modules/stasy-table-geo.html", countries
=countries
)
349 class WishlistModule(UIModule
):
350 def render(self
, wishes
, short
=False):
351 return self
.render_string("wishlist/modules/wishlist.html",
352 wishes
=wishes
, short
=short
)
355 class WishModule(UIModule
):
356 def render(self
, wish
, short
=False):
357 progress_bar
= "progress-bar-warning"
359 if wish
.percentage
>= 100:
360 progress_bar
= "progress-bar-success"
362 return self
.render_string("wishlist/modules/wish.html",
363 wish
=wish
, short
=short
, progress_bar
=progress_bar
)
366 class WishlistItemsModule(UIModule
):
367 def render(self
, wishlist_items
):
368 return self
.render_string("modules/wishlist-items.html",
369 wishlist_items
=wishlist_items
)
372 class DonationBoxModule(UIModule
):
373 def render(self
, reason_for_transfer
=None, show_wishlist_items
=False):
374 if reason_for_transfer
:
375 reason_for_transfer
= "IPFire.org - %s" % reason_for_transfer
377 # Interesting items from the wishlist.
379 if show_wishlist_items
:
380 wishlist_items
= self
.wishlist
.get_hot_wishes()
382 return self
.render_string("modules/donation-box.html",
383 reason_for_transfer
=reason_for_transfer
, wishlist_items
=wishlist_items
)