]>
git.ipfire.org Git - people/shoehn/ipfire.org.git/blob - webapp/ui_modules.py
da69711c11013b866eb3b6a3f07d44c1ce7c68ed
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
55 class AdvertisementModule(UIModule
):
56 def render(self
, where
):
57 assert where
in ("download-splash",), where
59 ad
= self
.advertisements
.get(where
)
63 # Mark that advert has been shown.
64 ad
.update_impressions()
66 return self
.render_string("modules/ads/%s.html" % where
, ad
=ad
)
69 class MapModule(UIModule
):
70 def render(self
, latitude
, longitude
):
71 return self
.render_string("modules/map.html", latitude
=latitude
, longitude
=longitude
)
74 class MenuModule(UIModule
):
76 return self
.render_string("modules/menu.html")
79 class MirrorItemModule(UIModule
):
80 def render(self
, item
):
81 return self
.render_string("modules/mirror-item.html", item
=item
)
84 class MirrorsTableModule(UIModule
):
85 def render(self
, mirrors
, preferred_mirrors
=[]):
86 return self
.render_string("modules/mirrors-table.html",
87 mirrors
=mirrors
, preferred_mirrors
=preferred_mirrors
)
90 class NetBootMenuConfigModule(UIModule
):
91 def render(self
, release
):
92 return self
.render_string("netboot/menu-config.cfg", release
=release
)
95 class NetBootMenuHeaderModule(UIModule
):
96 def render(self
, title
, releases
):
97 id = unicodedata
.normalize("NFKD", unicode(title
)).encode("ascii", "ignore")
98 id = re
.sub(r
"[^\w]+", " ", id)
99 id = "-".join(id.lower().strip().split())
101 return self
.render_string("netboot/menu-header.cfg", id=id,
102 title
=title
, releases
=releases
)
105 class NetBootMenuSeparatorModule(UIModule
):
107 return self
.render_string("netboot/menu-separator.cfg")
110 class NewsItemModule(UIModule
):
111 def get_author(self
, author
):
113 author
= self
.accounts
.find(author
)
117 _
= self
.locale
.translate
118 return _("Unknown author")
120 def render(self
, item
, uncut
=True, announcement
=False, show_heading
=True):
122 item
.author
= self
.get_author(item
.author_id
)
124 if not uncut
and len(item
.text
) >= 400:
125 item
.text
= item
.text
[:400] + "..."
128 item
.text
= textile
.textile(item
.text
)
130 return self
.render_string("modules/news-item.html", item
=item
,
131 uncut
=uncut
, announcement
=announcement
, show_heading
=show_heading
)
134 class NewsLineModule(UIModule
):
135 def render(self
, item
):
136 return self
.render_string("modules/news-line.html", item
=item
)
139 class NewsTableModule(UIModule
):
140 def render(self
, news
):
141 return self
.render_string("modules/news-table.html", news
=news
)
144 class NewsYearNavigationModule(UIModule
):
145 def render(self
, active
=None):
151 return self
.render_string("modules/news-year-nav.html",
152 active
=active
, years
=self
.news
.years
)
155 class PlanetSearchBoxModule(UIModule
):
156 def render(self
, query
=None):
157 years
= self
.planet
.get_years()
159 return self
.render_string("modules/planet/search-box.html",
160 query
=query
, years
=years
)
163 class SidebarItemModule(UIModule
):
165 return self
.render_string("modules/sidebar-item.html")
168 class SidebarReleaseModule(UIModule
):
170 return self
.render_string("modules/sidebar-release.html",
171 latest
=self
.releases
.get_latest())
174 class ReleaseItemModule(UIModule
):
175 def render(self
, release
, latest
=False):
176 arches
= ("i586", "arm")
179 for arch
in ("i586", "arm"):
182 for file in release
.files
:
183 if not file.arch
== arch
:
189 downloads
.append((arch
, files
))
191 return self
.render_string("modules/release-item.html",
192 release
=release
, latest
=latest
, downloads
=downloads
)
195 class SidebarBannerModule(UIModule
):
196 def render(self
, item
=None):
198 item
= self
.banners
.get_random()
200 return self
.render_string("modules/sidebar-banner.html", item
=item
)
203 class DownloadButtonModule(UIModule
):
204 def render(self
, release
, text
="Download now!"):
207 for file in release
.files
:
208 if file.type == "iso":
212 # Show nothing when there was no image found.
216 return self
.render_string("modules/download-button.html",
217 release
=release
, image
=best_image
)
220 class PlanetEntryModule(UIModule
):
221 def render(self
, entry
, show_avatar
=True):
222 return self
.render_string("modules/planet-entry.html",
223 entry
=entry
, show_avatar
=show_avatar
)
226 class TrackerPeerListModule(UIModule
):
227 def render(self
, peers
, percentages
=False):
228 # Guess country code and hostname of the host
230 country_code
= backend
.GeoIP().get_country(peer
["ip"])
231 peer
["country_code"] = country_code
or "unknown"
234 peer
["hostname"] = socket
.gethostbyaddr(peer
["ip"])[0]
236 peer
["hostname"] = ""
238 return self
.render_string("modules/tracker-peerlist.html",
239 peers
=[Row(p
) for p
in peers
], percentages
=percentages
)
242 class StasyTableModule(UIModule
):
243 def _make_percentages(self
, items
):
244 total
= sum(items
.values())
246 for k
in items
.keys():
252 def render(self
, items
, sortby
="key", reverse
=False, percentage
=False, flags
=False, locale
=False):
254 for v
in items
.values():
259 keys
= sorted(items
.keys(), reverse
=reverse
)
260 elif sortby
== "percentage":
261 keys
= [k
for k
,v
in sorted(items
.items(), key
=operator
.itemgetter(1))]
263 keys
= reversed(keys
)
265 raise Exception, "Unknown sortby parameter was provided"
271 v
= items
[k
] * 100 / hundred_percent
274 _items
.append((k
, v
))
277 if items
and type(items
[0][0]) == type(()) :
278 _
= self
.locale
.translate
281 k
= _("%s to %s") % k
282 _items
.append((k
, v
))
287 locales
= tornado
.locale
.LOCALE_NAMES
291 for code
, locale
in locales
.items():
292 if code
.startswith(k
):
293 k
= locale
["name"].split()[0]
294 _items
.append((k
, v
))
297 return self
.render_string("modules/stasy-table.html", items
=items
, flags
=flags
)
300 class StasyCPUCoreTableModule(StasyTableModule
):
301 def render(self
, items
):
302 items
= self
._make
_percentages
(items
)
304 items
= items
.items()
307 return self
.render_string("modules/stasy-table.html", items
=items
,
312 class StasyDeviceTableModule(UIModule
):
313 def render(self
, devices
):
316 for device
in devices
:
317 if not groups
.has_key(device
.cls
):
318 groups
[device
.cls
] = []
320 groups
[device
.cls
].append(device
)
322 return self
.render_string("modules/stasy-table-devices.html",
323 groups
=groups
.items())
326 class StasyGeoTableModule(UIModule
):
327 def render(self
, items
):
328 _
= self
.locale
.translate
330 # Sort all items by value
331 items
= sorted(items
.items(), key
=operator
.itemgetter(1), reverse
=True)
334 for code
, value
in items
:
335 country
= tornado
.database
.Row({
336 "code" : code
.lower(),
337 "name" : _(self
.geoip
.get_country_name(code
)),
338 "value" : value
* 100,
340 countries
.append(country
)
342 return self
.render_string("modules/stasy-table-geo.html", countries
=countries
)
345 class WishlistModule(UIModule
):
346 def render(self
, wishes
, short
=False):
347 return self
.render_string("wishlist/modules/wishlist.html",
348 wishes
=wishes
, short
=short
)
351 class WishModule(UIModule
):
352 def render(self
, wish
, short
=False):
353 progress_bar
= "progress-bar-warning"
355 if wish
.percentage
>= 100:
356 progress_bar
= "progress-bar-success"
358 return self
.render_string("wishlist/modules/wish.html",
359 wish
=wish
, short
=short
, progress_bar
=progress_bar
)
362 class DonationBoxModule(UIModule
):
363 def render(self
, reason_for_transfer
=None):
364 if reason_for_transfer
:
365 reason_for_transfer
= "IPFire.org - %s" % reason_for_transfer
367 return self
.render_string("modules/donation-box.html",
368 reason_for_transfer
=reason_for_transfer
)