]>
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
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):
164 arches
= ("i586", "arm")
167 for arch
in ("i586", "arm"):
170 for file in release
.files
:
171 if not file.arch
== arch
:
177 downloads
.append((arch
, files
))
179 return self
.render_string("modules/release-item.html",
180 release
=release
, latest
=latest
, downloads
=downloads
)
183 class SidebarBannerModule(UIModule
):
184 def render(self
, item
=None):
186 item
= self
.banners
.get_random()
188 return self
.render_string("modules/sidebar-banner.html", item
=item
)
191 class DownloadButtonModule(UIModule
):
192 def render(self
, release
, text
="Download now!"):
195 for file in release
.files
:
196 if file.type == "iso":
200 # Show nothing when there was no image found.
204 return self
.render_string("modules/download-button.html",
205 release
=release
, image
=best_image
)
208 class PlanetEntryModule(UIModule
):
209 def render(self
, entry
, show_avatar
=True):
210 return self
.render_string("modules/planet-entry.html",
211 entry
=entry
, show_avatar
=show_avatar
)
214 class TrackerPeerListModule(UIModule
):
215 def render(self
, peers
, percentages
=False):
216 # Guess country code and hostname of the host
218 country_code
= backend
.GeoIP().get_country(peer
["ip"])
219 peer
["country_code"] = country_code
or "unknown"
222 peer
["hostname"] = socket
.gethostbyaddr(peer
["ip"])[0]
224 peer
["hostname"] = ""
226 return self
.render_string("modules/tracker-peerlist.html",
227 peers
=[Row(p
) for p
in peers
], percentages
=percentages
)
230 class StasyTableModule(UIModule
):
231 def _make_percentages(self
, items
):
232 total
= sum(items
.values())
234 for k
in items
.keys():
240 def render(self
, items
, sortby
="key", reverse
=False, percentage
=False, flags
=False, locale
=False):
242 for v
in items
.values():
247 keys
= sorted(items
.keys(), reverse
=reverse
)
248 elif sortby
== "percentage":
249 keys
= [k
for k
,v
in sorted(items
.items(), key
=operator
.itemgetter(1))]
251 keys
= reversed(keys
)
253 raise Exception, "Unknown sortby parameter was provided"
259 v
= items
[k
] * 100 / hundred_percent
262 _items
.append((k
, v
))
265 if items
and type(items
[0][0]) == type(()) :
266 _
= self
.locale
.translate
269 k
= _("%s to %s") % k
270 _items
.append((k
, v
))
275 locales
= tornado
.locale
.LOCALE_NAMES
279 for code
, locale
in locales
.items():
280 if code
.startswith(k
):
281 k
= locale
["name"].split()[0]
282 _items
.append((k
, v
))
285 return self
.render_string("modules/stasy-table.html", items
=items
, flags
=flags
)
288 class StasyCPUCoreTableModule(StasyTableModule
):
289 def render(self
, items
):
290 items
= self
._make
_percentages
(items
)
292 items
= items
.items()
295 return self
.render_string("modules/stasy-table.html", items
=items
,
300 class StasyDeviceTableModule(UIModule
):
301 def render(self
, devices
):
304 for device
in devices
:
305 if not groups
.has_key(device
.cls
):
306 groups
[device
.cls
] = []
308 groups
[device
.cls
].append(device
)
310 return self
.render_string("modules/stasy-table-devices.html",
311 groups
=groups
.items())
314 class StasyGeoTableModule(UIModule
):
315 def render(self
, items
):
316 _
= self
.locale
.translate
318 # Sort all items by value
319 items
= sorted(items
.items(), key
=operator
.itemgetter(1), reverse
=True)
322 for code
, value
in items
:
323 country
= tornado
.database
.Row({
324 "code" : code
.lower(),
325 "name" : _(self
.geoip
.get_country_name(code
)),
326 "value" : value
* 100,
328 countries
.append(country
)
330 return self
.render_string("modules/stasy-table-geo.html", countries
=countries
)
333 class WishlistModule(UIModule
):
334 def render(self
, wishes
, short
=False):
335 return self
.render_string("wishlist/modules/wishlist.html",
336 wishes
=wishes
, short
=short
)
339 class WishModule(UIModule
):
340 def render(self
, wish
, short
=False):
341 progress_bar
= "progress-bar-warning"
343 if wish
.percentage
>= 100:
344 progress_bar
= "progress-bar-success"
346 return self
.render_string("wishlist/modules/wish.html",
347 wish
=wish
, short
=short
, progress_bar
=progress_bar
)
350 class DonationBoxModule(UIModule
):
351 def render(self
, reason_for_transfer
=None):
352 if reason_for_transfer
:
353 reason_for_transfer
= "IPFire.org - %s" % reason_for_transfer
355 return self
.render_string("modules/donation-box.html",
356 reason_for_transfer
=reason_for_transfer
)