]>
git.ipfire.org Git - people/shoehn/ipfire.org.git/blob - www/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
26 return self
.handler
.banners
30 return self
.handler
.memcached
34 return self
.handler
.releases
38 return self
.handler
.geoip
42 return self
.handler
.news
45 class MenuModule(UIModule
):
47 return self
.render_string("modules/menu.html")
50 class NewsItemModule(UIModule
):
51 def get_author(self
, author
):
53 author
= self
.accounts
.find(author
)
57 _
= self
.locale
.translate
58 return _("Unknown author")
60 def render(self
, item
, uncut
=True, announcement
=False, show_heading
=True):
62 item
.author
= self
.get_author(item
.author_id
)
64 if not uncut
and len(item
.text
) >= 400:
65 item
.text
= item
.text
[:400] + "..."
68 text_id
= "news-%s" % hashlib
.md5(item
.text
.encode("utf-8")).hexdigest()
70 text
= self
.memcached
.get(text_id
)
72 text
= textile
.textile(item
.text
)
73 self
.memcached
.set(text_id
, text
, 60)
77 return self
.render_string("modules/news-item.html", item
=item
,
78 uncut
=uncut
, announcement
=announcement
, show_heading
=show_heading
)
81 class NewsLineModule(UIModule
):
82 def render(self
, item
):
83 return self
.render_string("modules/news-line.html", item
=item
)
86 class NewsTableModule(UIModule
):
87 def render(self
, news
):
88 return self
.render_string("modules/news-table.html", news
=news
)
91 class NewsYearNavigationModule(UIModule
):
92 def render(self
, active
=None):
98 return self
.render_string("modules/news-year-nav.html",
99 active
=active
, years
=self
.news
.years
)
102 class MirrorItemModule(UIModule
):
103 def render(self
, item
):
104 return self
.render_string("modules/mirror-item.html", item
=item
)
107 class SidebarItemModule(UIModule
):
109 return self
.render_string("modules/sidebar-item.html")
112 class SidebarReleaseModule(UIModule
):
114 return self
.render_string("modules/sidebar-release.html",
115 latest
=self
.releases
.get_latest())
118 class ReleaseItemModule(UIModule
):
119 def render(self
, release
, latest
=False):
125 for file in release
.files
:
127 files
[file.arch
].append(file)
131 return self
.render_string("modules/release-item.html",
132 release
=release
, latest
=latest
, files
=files
)
135 class SidebarBannerModule(UIModule
):
136 def render(self
, item
=None):
138 item
= self
.banners
.get_random()
140 return self
.render_string("modules/sidebar-banner.html", item
=item
)
143 class DownloadButtonModule(UIModule
):
144 def render(self
, release
, text
="Download now!"):
147 for file in release
.files
:
148 if file.type == "iso":
152 # Show nothing when there was no image found.
156 return self
.render_string("modules/download-button.html",
157 release
=release
, image
=best_image
)
160 class PlanetEntryModule(UIModule
):
161 def render(self
, entry
, show_avatar
=True):
162 return self
.render_string("modules/planet-entry.html",
163 entry
=entry
, show_avatar
=show_avatar
)
166 class TrackerPeerListModule(UIModule
):
167 def render(self
, peers
, percentages
=False):
168 # Guess country code and hostname of the host
170 country_code
= backend
.GeoIP().get_country(peer
["ip"])
171 peer
["country_code"] = country_code
or "unknown"
174 peer
["hostname"] = socket
.gethostbyaddr(peer
["ip"])[0]
176 peer
["hostname"] = ""
178 return self
.render_string("modules/tracker-peerlist.html",
179 peers
=[Row(p
) for p
in peers
], percentages
=percentages
)
182 class StasyTableModule(UIModule
):
183 def _make_percentages(self
, items
):
184 total
= sum(items
.values())
186 for k
in items
.keys():
192 def render(self
, items
, sortby
="key", reverse
=False, percentage
=False, flags
=False, locale
=False):
194 for v
in items
.values():
199 keys
= sorted(items
.keys(), reverse
=reverse
)
200 elif sortby
== "percentage":
201 keys
= [k
for k
,v
in sorted(items
.items(), key
=operator
.itemgetter(1))]
203 keys
= reversed(keys
)
205 raise Exception, "Unknown sortby parameter was provided"
211 v
= items
[k
] * 100 / hundred_percent
214 _items
.append((k
, v
))
217 if items
and type(items
[0][0]) == type(()) :
218 _
= self
.locale
.translate
221 k
= _("%s to %s") % k
222 _items
.append((k
, v
))
227 locales
= tornado
.locale
.LOCALE_NAMES
231 for code
, locale
in locales
.items():
232 if code
.startswith(k
):
233 k
= locale
["name"].split()[0]
234 _items
.append((k
, v
))
237 return self
.render_string("modules/stasy-table.html", items
=items
, flags
=flags
)
240 class StasyCPUCoreTableModule(StasyTableModule
):
241 def render(self
, items
):
242 items
= self
._make
_percentages
(items
)
244 items
= items
.items()
247 return self
.render_string("modules/stasy-table.html", items
=items
,
252 class StasyDeviceTableModule(UIModule
):
253 def render(self
, devices
):
256 for device
in devices
:
257 if not groups
.has_key(device
.cls
):
258 groups
[device
.cls
] = []
260 groups
[device
.cls
].append(device
)
262 return self
.render_string("modules/stasy-table-devices.html",
263 groups
=groups
.items())
266 class StasyGeoTableModule(UIModule
):
267 def render(self
, items
):
268 _
= self
.locale
.translate
270 # Sort all items by value
271 items
= sorted(items
.items(), key
=operator
.itemgetter(1), reverse
=True)
274 for code
, value
in items
:
275 country
= tornado
.database
.Row({
276 "code" : code
.lower(),
277 "name" : _(self
.geoip
.get_country_name(code
)),
278 "value" : value
* 100,
280 countries
.append(country
)
282 return self
.render_string("modules/stasy-table-geo.html", countries
=countries
)
285 class MirrorsTableModule(UIModule
):
286 def render(self
, mirrors
):
287 return self
.render_string("modules/mirrors-table.html", mirrors
=mirrors
)
290 class WishlistModule(UIModule
):
291 def render(self
, wishes
, short
=False):
292 return self
.render_string("wishlist/modules/wishlist.html",
293 wishes
=wishes
, short
=short
)
296 class WishModule(UIModule
):
297 def render(self
, wish
, short
=False):
298 progress_bar
= "progress-success"
300 if wish
.percentage
>= 90:
301 progress_bar
= "progress-danger"
302 elif wish
.percentage
>= 50:
303 progress_bar
= "progress-warning"
305 return self
.render_string("wishlist/modules/wish.html",
306 wish
=wish
, short
=short
, progress_bar
=progress_bar
)
309 class DonationBoxModule(UIModule
):
310 def render(self
, reason_for_transfer
=None):
311 if reason_for_transfer
:
312 reason_for_transfer
= "IPFire.org - %s" % reason_for_transfer
314 return self
.render_string("modules/donation-box.html",
315 reason_for_transfer
=reason_for_transfer
)