]>
git.ipfire.org Git - people/shoehn/ipfire.org.git/blob - webapp/ui_modules.py
3 from __future__
import division
19 class UIModule(tornado
.web
.UIModule
):
22 return self
.handler
.accounts
25 def advertisements(self
):
26 return self
.handler
.advertisements
30 return self
.handler
.banners
34 return self
.handler
.memcached
38 return self
.handler
.releases
42 return self
.handler
.geoip
46 return self
.handler
.news
50 return self
.handler
.planet
54 return self
.handler
.wishlist
57 class AdvertisementModule(UIModule
):
58 def render(self
, where
):
59 assert where
in ("download-splash",), where
61 ad
= self
.advertisements
.get(where
)
65 # Mark that advert has been shown.
66 ad
.update_impressions()
68 return self
.render_string("modules/ads/%s.html" % where
, ad
=ad
)
71 class MapModule(UIModule
):
72 def render(self
, latitude
, longitude
):
73 return self
.render_string("modules/map.html", latitude
=latitude
, longitude
=longitude
)
76 class MenuModule(UIModule
):
78 return self
.render_string("modules/menu.html")
81 class MirrorItemModule(UIModule
):
82 def render(self
, item
):
83 return self
.render_string("modules/mirror-item.html", item
=item
)
86 class MirrorsTableModule(UIModule
):
87 def render(self
, mirrors
, preferred_mirrors
=[]):
88 return self
.render_string("modules/mirrors-table.html",
89 mirrors
=mirrors
, preferred_mirrors
=preferred_mirrors
)
92 class NetBootMenuConfigModule(UIModule
):
93 def render(self
, release
):
94 return self
.render_string("netboot/menu-config.cfg", release
=release
)
97 class NetBootMenuHeaderModule(UIModule
):
98 def render(self
, title
, releases
):
99 id = unicodedata
.normalize("NFKD", unicode(title
)).encode("ascii", "ignore")
100 id = re
.sub(r
"[^\w]+", " ", id)
101 id = "-".join(id.lower().strip().split())
103 return self
.render_string("netboot/menu-header.cfg", id=id,
104 title
=title
, releases
=releases
)
107 class NetBootMenuSeparatorModule(UIModule
):
109 return self
.render_string("netboot/menu-separator.cfg")
112 class NewsItemModule(UIModule
):
113 def get_author(self
, author
):
115 author
= self
.accounts
.find(author
)
119 _
= self
.locale
.translate
120 return _("Unknown author")
122 def render(self
, item
, uncut
=True, announcement
=False, show_heading
=True):
124 item
.author
= self
.get_author(item
.author_id
)
126 if not uncut
and len(item
.text
) >= 400:
127 item
.text
= item
.text
[:400] + "..."
130 item
.text
= textile
.textile(item
.text
.decode("utf8"))
132 return self
.render_string("modules/news-item.html", item
=item
,
133 uncut
=uncut
, announcement
=announcement
, show_heading
=show_heading
)
136 class NewsLineModule(UIModule
):
137 def render(self
, item
):
138 return self
.render_string("modules/news-line.html", item
=item
)
141 class NewsTableModule(UIModule
):
142 def render(self
, news
):
143 return self
.render_string("modules/news-table.html", news
=news
)
146 class NewsYearNavigationModule(UIModule
):
147 def render(self
, active
=None):
153 return self
.render_string("modules/news-year-nav.html",
154 active
=active
, years
=self
.news
.years
)
157 class PlanetSearchBoxModule(UIModule
):
158 def render(self
, query
=None):
159 years
= self
.planet
.get_years()
161 return self
.render_string("modules/planet/search-box.html",
162 query
=query
, years
=years
)
165 class SidebarItemModule(UIModule
):
167 return self
.render_string("modules/sidebar-item.html")
170 class SidebarReleaseModule(UIModule
):
172 return self
.render_string("modules/sidebar-release.html",
173 latest
=self
.releases
.get_latest())
176 class ReleaseItemModule(UIModule
):
177 def render(self
, release
, latest
=False):
178 arches
= ("i586", "arm")
181 for arch
in ("i586", "arm"):
184 for file in release
.files
:
185 if not file.arch
== arch
:
191 downloads
.append((arch
, files
))
193 return self
.render_string("modules/release-item.html",
194 release
=release
, latest
=latest
, downloads
=downloads
)
197 class SidebarBannerModule(UIModule
):
198 def render(self
, item
=None):
200 item
= self
.banners
.get_random()
202 return self
.render_string("modules/sidebar-banner.html", item
=item
)
205 class DownloadButtonModule(UIModule
):
206 def render(self
, release
, text
="Download now!"):
209 for file in release
.files
:
210 if file.type == "iso":
214 # Show nothing when there was no image found.
218 return self
.render_string("modules/download-button.html",
219 release
=release
, image
=best_image
)
222 class PlanetEntryModule(UIModule
):
223 def render(self
, entry
, show_avatar
=True):
224 return self
.render_string("modules/planet-entry.html",
225 entry
=entry
, show_avatar
=show_avatar
)
228 class TrackerPeerListModule(UIModule
):
229 def render(self
, peers
):
230 # Guess country code and hostname of the host
232 country_code
= self
.geoip
.get_country(peer
["ip"])
234 country_code
= country_code
.lower()
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
=[backend
.database
.Row(p
) for p
in peers
])
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
= backend
.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
)