]>
git.ipfire.org Git - people/shoehn/ipfire.org.git/blob - webapp/ui_modules.py
3 from __future__
import division
14 from tornado
.database
import Row
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
49 class AdvertisementModule(UIModule
):
50 def render(self
, where
):
51 assert where
in ("download-splash",), where
53 ad
= self
.advertisements
.get(where
)
57 # Mark that advert has been shown.
58 ad
.update_impressions()
60 return self
.render_string("modules/ads/%s.html" % where
, ad
=ad
)
63 class MenuModule(UIModule
):
65 return self
.render_string("modules/menu.html")
68 class NewsItemModule(UIModule
):
69 def get_author(self
, author
):
71 author
= self
.accounts
.find(author
)
75 _
= self
.locale
.translate
76 return _("Unknown author")
78 def render(self
, item
, uncut
=True, announcement
=False, show_heading
=True):
80 item
.author
= self
.get_author(item
.author_id
)
82 if not uncut
and len(item
.text
) >= 400:
83 item
.text
= item
.text
[:400] + "..."
86 text_id
= "news-%s" % hashlib
.md5(item
.text
.encode("utf-8")).hexdigest()
88 text
= self
.memcached
.get(text_id
)
90 text
= textile
.textile(item
.text
)
91 self
.memcached
.set(text_id
, text
, 60)
95 return self
.render_string("modules/news-item.html", item
=item
,
96 uncut
=uncut
, announcement
=announcement
, show_heading
=show_heading
)
99 class NewsLineModule(UIModule
):
100 def render(self
, item
):
101 return self
.render_string("modules/news-line.html", item
=item
)
104 class NewsTableModule(UIModule
):
105 def render(self
, news
):
106 return self
.render_string("modules/news-table.html", news
=news
)
109 class NewsYearNavigationModule(UIModule
):
110 def render(self
, active
=None):
116 return self
.render_string("modules/news-year-nav.html",
117 active
=active
, years
=self
.news
.years
)
120 class MirrorItemModule(UIModule
):
121 def render(self
, item
):
122 return self
.render_string("modules/mirror-item.html", item
=item
)
125 class SidebarItemModule(UIModule
):
127 return self
.render_string("modules/sidebar-item.html")
130 class SidebarReleaseModule(UIModule
):
132 return self
.render_string("modules/sidebar-release.html",
133 latest
=self
.releases
.get_latest())
136 class ReleaseItemModule(UIModule
):
137 def render(self
, release
, latest
=False):
143 for file in release
.files
:
145 files
[file.arch
].append(file)
149 return self
.render_string("modules/release-item.html",
150 release
=release
, latest
=latest
, files
=files
)
153 class SidebarBannerModule(UIModule
):
154 def render(self
, item
=None):
156 item
= self
.banners
.get_random()
158 return self
.render_string("modules/sidebar-banner.html", item
=item
)
161 class DownloadButtonModule(UIModule
):
162 def render(self
, release
, text
="Download now!"):
165 for file in release
.files
:
166 if file.type == "iso":
170 # Show nothing when there was no image found.
174 return self
.render_string("modules/download-button.html",
175 release
=release
, image
=best_image
)
178 class PlanetEntryModule(UIModule
):
179 def render(self
, entry
, show_avatar
=True):
180 return self
.render_string("modules/planet-entry.html",
181 entry
=entry
, show_avatar
=show_avatar
)
184 class TrackerPeerListModule(UIModule
):
185 def render(self
, peers
, percentages
=False):
186 # Guess country code and hostname of the host
188 country_code
= backend
.GeoIP().get_country(peer
["ip"])
189 peer
["country_code"] = country_code
or "unknown"
192 peer
["hostname"] = socket
.gethostbyaddr(peer
["ip"])[0]
194 peer
["hostname"] = ""
196 return self
.render_string("modules/tracker-peerlist.html",
197 peers
=[Row(p
) for p
in peers
], percentages
=percentages
)
200 class StasyTableModule(UIModule
):
201 def _make_percentages(self
, items
):
202 total
= sum(items
.values())
204 for k
in items
.keys():
210 def render(self
, items
, sortby
="key", reverse
=False, percentage
=False, flags
=False, locale
=False):
212 for v
in items
.values():
217 keys
= sorted(items
.keys(), reverse
=reverse
)
218 elif sortby
== "percentage":
219 keys
= [k
for k
,v
in sorted(items
.items(), key
=operator
.itemgetter(1))]
221 keys
= reversed(keys
)
223 raise Exception, "Unknown sortby parameter was provided"
229 v
= items
[k
] * 100 / hundred_percent
232 _items
.append((k
, v
))
235 if items
and type(items
[0][0]) == type(()) :
236 _
= self
.locale
.translate
239 k
= _("%s to %s") % k
240 _items
.append((k
, v
))
245 locales
= tornado
.locale
.LOCALE_NAMES
249 for code
, locale
in locales
.items():
250 if code
.startswith(k
):
251 k
= locale
["name"].split()[0]
252 _items
.append((k
, v
))
255 return self
.render_string("modules/stasy-table.html", items
=items
, flags
=flags
)
258 class StasyCPUCoreTableModule(StasyTableModule
):
259 def render(self
, items
):
260 items
= self
._make
_percentages
(items
)
262 items
= items
.items()
265 return self
.render_string("modules/stasy-table.html", items
=items
,
270 class StasyDeviceTableModule(UIModule
):
271 def render(self
, devices
):
274 for device
in devices
:
275 if not groups
.has_key(device
.cls
):
276 groups
[device
.cls
] = []
278 groups
[device
.cls
].append(device
)
280 return self
.render_string("modules/stasy-table-devices.html",
281 groups
=groups
.items())
284 class StasyGeoTableModule(UIModule
):
285 def render(self
, items
):
286 _
= self
.locale
.translate
288 # Sort all items by value
289 items
= sorted(items
.items(), key
=operator
.itemgetter(1), reverse
=True)
292 for code
, value
in items
:
293 country
= tornado
.database
.Row({
294 "code" : code
.lower(),
295 "name" : _(self
.geoip
.get_country_name(code
)),
296 "value" : value
* 100,
298 countries
.append(country
)
300 return self
.render_string("modules/stasy-table-geo.html", countries
=countries
)
303 class MirrorsTableModule(UIModule
):
304 def render(self
, mirrors
):
305 return self
.render_string("modules/mirrors-table.html", mirrors
=mirrors
)
308 class WishlistModule(UIModule
):
309 def render(self
, wishes
, short
=False):
310 return self
.render_string("wishlist/modules/wishlist.html",
311 wishes
=wishes
, short
=short
)
314 class WishModule(UIModule
):
315 def render(self
, wish
, short
=False):
316 progress_bar
= "progress-warning"
318 if wish
.percentage
>= 100:
319 progress_bar
= "progress-success"
321 return self
.render_string("wishlist/modules/wish.html",
322 wish
=wish
, short
=short
, progress_bar
=progress_bar
)
325 class DonationBoxModule(UIModule
):
326 def render(self
, reason_for_transfer
=None):
327 if reason_for_transfer
:
328 reason_for_transfer
= "IPFire.org - %s" % reason_for_transfer
330 return self
.render_string("modules/donation-box.html",
331 reason_for_transfer
=reason_for_transfer
)