]>
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
):
232 # Guess country code and hostname of the host
234 country_code
= self
.geoip
.get_country(peer
["ip"])
236 country_code
= country_code
.lower()
237 peer
["country_code"] = country_code
or "unknown"
240 peer
["hostname"] = socket
.gethostbyaddr(peer
["ip"])[0]
242 peer
["hostname"] = ""
244 return self
.render_string("modules/tracker-peerlist.html",
245 peers
=[Row(p
) for p
in peers
])
248 class StasyTableModule(UIModule
):
249 def _make_percentages(self
, items
):
250 total
= sum(items
.values())
252 for k
in items
.keys():
258 def render(self
, items
, sortby
="key", reverse
=False, percentage
=False, flags
=False, locale
=False):
260 for v
in items
.values():
265 keys
= sorted(items
.keys(), reverse
=reverse
)
266 elif sortby
== "percentage":
267 keys
= [k
for k
,v
in sorted(items
.items(), key
=operator
.itemgetter(1))]
269 keys
= reversed(keys
)
271 raise Exception, "Unknown sortby parameter was provided"
277 v
= items
[k
] * 100 / hundred_percent
280 _items
.append((k
, v
))
283 if items
and type(items
[0][0]) == type(()) :
284 _
= self
.locale
.translate
287 k
= _("%s to %s") % k
288 _items
.append((k
, v
))
293 locales
= tornado
.locale
.LOCALE_NAMES
297 for code
, locale
in locales
.items():
298 if code
.startswith(k
):
299 k
= locale
["name"].split()[0]
300 _items
.append((k
, v
))
303 return self
.render_string("modules/stasy-table.html", items
=items
, flags
=flags
)
306 class StasyCPUCoreTableModule(StasyTableModule
):
307 def render(self
, items
):
308 items
= self
._make
_percentages
(items
)
310 items
= items
.items()
313 return self
.render_string("modules/stasy-table.html", items
=items
,
318 class StasyDeviceTableModule(UIModule
):
319 def render(self
, devices
):
322 for device
in devices
:
323 if not groups
.has_key(device
.cls
):
324 groups
[device
.cls
] = []
326 groups
[device
.cls
].append(device
)
328 return self
.render_string("modules/stasy-table-devices.html",
329 groups
=groups
.items())
332 class StasyGeoTableModule(UIModule
):
333 def render(self
, items
):
334 _
= self
.locale
.translate
336 # Sort all items by value
337 items
= sorted(items
.items(), key
=operator
.itemgetter(1), reverse
=True)
340 for code
, value
in items
:
341 country
= tornado
.database
.Row({
342 "code" : code
.lower(),
343 "name" : _(self
.geoip
.get_country_name(code
)),
344 "value" : value
* 100,
346 countries
.append(country
)
348 return self
.render_string("modules/stasy-table-geo.html", countries
=countries
)
351 class WishlistModule(UIModule
):
352 def render(self
, wishes
, short
=False):
353 return self
.render_string("wishlist/modules/wishlist.html",
354 wishes
=wishes
, short
=short
)
357 class WishModule(UIModule
):
358 def render(self
, wish
, short
=False):
359 progress_bar
= "progress-bar-warning"
361 if wish
.percentage
>= 100:
362 progress_bar
= "progress-bar-success"
364 return self
.render_string("wishlist/modules/wish.html",
365 wish
=wish
, short
=short
, progress_bar
=progress_bar
)
368 class WishlistItemsModule(UIModule
):
369 def render(self
, wishlist_items
):
370 return self
.render_string("modules/wishlist-items.html",
371 wishlist_items
=wishlist_items
)
374 class DonationBoxModule(UIModule
):
375 def render(self
, reason_for_transfer
=None, show_wishlist_items
=False):
376 if reason_for_transfer
:
377 reason_for_transfer
= "IPFire.org - %s" % reason_for_transfer
379 # Interesting items from the wishlist.
381 if show_wishlist_items
:
382 wishlist_items
= self
.wishlist
.get_hot_wishes()
384 return self
.render_string("modules/donation-box.html",
385 reason_for_transfer
=reason_for_transfer
, wishlist_items
=wishlist_items
)