]>
git.ipfire.org Git - people/shoehn/ipfire.org.git/blob - webapp/ui_modules.py
3 from __future__
import division
16 class UIModule(tornado
.web
.UIModule
):
19 return self
.handler
.accounts
22 def advertisements(self
):
23 return self
.handler
.advertisements
27 return self
.handler
.banners
31 return self
.handler
.memcached
35 return self
.handler
.releases
39 return self
.handler
.geoip
43 return self
.handler
.news
47 return self
.handler
.planet
51 return self
.handler
.wishlist
54 class AdvertisementModule(UIModule
):
55 def render(self
, where
):
56 assert where
in ("download-splash",), where
58 ad
= self
.advertisements
.get(where
)
62 # Mark that advert has been shown.
63 ad
.update_impressions()
65 return self
.render_string("modules/ads/%s.html" % where
, ad
=ad
)
68 class FireinfoDeviceTableModule(UIModule
):
69 def render(self
, devices
):
70 return self
.render_string("fireinfo/modules/table-devices.html",
74 class FireinfoDeviceAndGroupsTableModule(UIModule
):
75 def render(self
, devices
):
76 _
= self
.locale
.translate
80 for device
in devices
:
81 if not groups
.has_key(device
.cls
):
82 groups
[device
.cls
] = []
84 groups
[device
.cls
].append(device
)
87 for key
in groups
.keys():
90 # Order the groups by their name
91 groups
= groups
.items()
94 return self
.render_string("fireinfo/modules/table-devices-and-groups.html",
98 class FireinfoGeoTableModule(UIModule
):
99 def render(self
, items
):
102 for code
, value
in items
:
103 # Skip the satellite providers in this ranking
104 if code
in (None, "A1", "A2"):
107 name
= self
.geoip
.get_country_name(code
)
109 # Don't add countries with a small share on the list
111 other_countries
.append(name
)
114 country
= tornado
.database
.Row({
119 countries
.append(country
)
121 # Sort the list of small countries by alphabet
122 other_countries
.sort()
124 return self
.render_string("fireinfo/modules/table-geo.html",
125 countries
=countries
, other_countries
=other_countries
)
128 class LanguageNameModule(UIModule
):
129 def render(self
, language
):
130 _
= self
.locale
.translate
134 elif language
== "en":
136 elif language
== "es":
138 elif language
== "fr":
140 elif language
== "it":
142 elif language
== "nl":
144 elif language
== "pl":
146 elif language
== "pt":
147 return _("Portuguese")
148 elif language
== "ru":
150 elif language
== "tr":
156 class MapModule(UIModule
):
157 def render(self
, latitude
, longitude
):
158 return self
.render_string("modules/map.html", latitude
=latitude
, longitude
=longitude
)
161 class MenuModule(UIModule
):
163 return self
.render_string("modules/menu.html")
166 class MirrorItemModule(UIModule
):
167 def render(self
, item
):
168 return self
.render_string("modules/mirror-item.html", item
=item
)
171 class MirrorsTableModule(UIModule
):
172 def render(self
, mirrors
, preferred_mirrors
=[]):
173 return self
.render_string("modules/mirrors-table.html",
174 mirrors
=mirrors
, preferred_mirrors
=preferred_mirrors
)
177 class NetBootMenuConfigModule(UIModule
):
178 def render(self
, release
):
179 return self
.render_string("netboot/menu-config.cfg", release
=release
)
182 class NetBootMenuHeaderModule(UIModule
):
183 def render(self
, title
, releases
):
184 id = unicodedata
.normalize("NFKD", unicode(title
)).encode("ascii", "ignore")
185 id = re
.sub(r
"[^\w]+", " ", id)
186 id = "-".join(id.lower().strip().split())
188 return self
.render_string("netboot/menu-header.cfg", id=id,
189 title
=title
, releases
=releases
)
192 class NetBootMenuSeparatorModule(UIModule
):
194 return self
.render_string("netboot/menu-separator.cfg")
197 class NewsItemModule(UIModule
):
198 def get_author(self
, author
):
200 author
= self
.accounts
.find(author
)
204 _
= self
.locale
.translate
205 return _("Unknown author")
207 def render(self
, item
, uncut
=True, announcement
=False, show_heading
=True):
209 item
.author
= self
.get_author(item
.author_id
)
211 if not uncut
and len(item
.text
) >= 400:
212 item
.text
= item
.text
[:400] + "..."
215 item
.text
= textile
.textile(item
.text
.decode("utf8"))
217 return self
.render_string("modules/news-item.html", item
=item
,
218 uncut
=uncut
, announcement
=announcement
, show_heading
=show_heading
)
221 class NewsLineModule(UIModule
):
222 def render(self
, item
):
223 return self
.render_string("modules/news-line.html", item
=item
)
226 class NewsTableModule(UIModule
):
227 def render(self
, news
):
228 return self
.render_string("modules/news-table.html", news
=news
)
231 class NewsYearNavigationModule(UIModule
):
232 def render(self
, active
=None):
238 return self
.render_string("modules/news-year-nav.html",
239 active
=active
, years
=self
.news
.years
)
242 class PlanetSearchBoxModule(UIModule
):
243 def render(self
, query
=None):
244 years
= self
.planet
.get_years()
246 return self
.render_string("modules/planet/search-box.html",
247 query
=query
, years
=years
)
250 class SidebarItemModule(UIModule
):
252 return self
.render_string("modules/sidebar-item.html")
255 class SidebarReleaseModule(UIModule
):
257 return self
.render_string("modules/sidebar-release.html",
258 latest
=self
.releases
.get_latest())
261 class ReleaseItemModule(UIModule
):
262 def render(self
, release
, latest
=False):
263 arches
= ("i586", "arm")
266 for arch
in ("i586", "arm"):
269 for file in release
.files
:
270 if not file.arch
== arch
:
276 downloads
.append((arch
, files
))
278 return self
.render_string("modules/release-item.html",
279 release
=release
, latest
=latest
, downloads
=downloads
)
282 class SidebarBannerModule(UIModule
):
283 def render(self
, item
=None):
285 item
= self
.banners
.get_random()
287 return self
.render_string("modules/sidebar-banner.html", item
=item
)
290 class DownloadButtonModule(UIModule
):
291 def render(self
, release
, text
="Download now!"):
294 for file in release
.files
:
295 if file.type == "iso":
299 # Show nothing when there was no image found.
303 return self
.render_string("modules/download-button.html",
304 release
=release
, image
=best_image
)
307 class PlanetEntryModule(UIModule
):
308 def render(self
, entry
, show_avatar
=True):
309 return self
.render_string("modules/planet-entry.html",
310 entry
=entry
, show_avatar
=show_avatar
)
313 class ProgressBarModule(UIModule
):
314 def render(self
, value
, colour
=None):
317 return self
.render_string("modules/progress-bar.html",
318 colour
=colour
, value
=value
)
321 class TalkCallLogModule(UIModule
):
322 def render(self
, calls
):
323 return self
.render_string("talk/modules/call-log.html", calls
=calls
)
326 class TalkOngoingCallsModule(UIModule
):
327 def render(self
, calls
):
328 return self
.render_string("talk/modules/ongoing-calls.html", calls
=calls
)
331 class TrackerPeerListModule(UIModule
):
332 def render(self
, peers
):
333 # Guess country code and hostname of the host
335 country_code
= self
.geoip
.get_country(peer
["ip"])
337 peer
["country_code"] = country_code
.lower()
339 peer
["country_code"] = "unknown"
342 peer
["hostname"] = socket
.gethostbyaddr(peer
["ip"])[0]
344 peer
["hostname"] = ""
346 return self
.render_string("modules/tracker-peerlist.html",
347 peers
=[backend
.database
.Row(p
) for p
in peers
])
350 class WishlistModule(UIModule
):
351 def render(self
, wishes
, short
=False):
352 return self
.render_string("wishlist/modules/wishlist.html",
353 wishes
=wishes
, short
=short
)
356 class WishModule(UIModule
):
357 def render(self
, wish
, short
=False):
358 progress_bar
= "progress-bar-warning"
360 if wish
.percentage
>= 100:
361 progress_bar
= "progress-bar-success"
363 return self
.render_string("wishlist/modules/wish.html",
364 wish
=wish
, short
=short
, progress_bar
=progress_bar
)
367 class WishlistItemsModule(UIModule
):
368 def render(self
, wishlist_items
):
369 return self
.render_string("modules/wishlist-items.html",
370 wishlist_items
=wishlist_items
)
373 class DonationBoxModule(UIModule
):
374 def render(self
, reason_for_transfer
=None, show_wishlist_items
=False):
375 if reason_for_transfer
:
376 reason_for_transfer
= "IPFire.org - %s" % reason_for_transfer
378 # Interesting items from the wishlist.
380 if show_wishlist_items
:
381 wishlist_items
= self
.wishlist
.get_hot_wishes()
383 return self
.render_string("modules/donation-box.html",
384 reason_for_transfer
=reason_for_transfer
, wishlist_items
=wishlist_items
)