]>
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
18 class UIModule(tornado
.web
.UIModule
):
21 return self
.handler
.accounts
24 def advertisements(self
):
25 return self
.handler
.advertisements
29 return self
.handler
.banners
33 return self
.handler
.memcached
37 return self
.handler
.releases
41 return self
.handler
.geoip
45 return self
.handler
.news
49 return self
.handler
.planet
53 return self
.handler
.wishlist
56 class AdvertisementModule(UIModule
):
57 def render(self
, where
):
58 assert where
in ("download-splash",), where
60 ad
= self
.advertisements
.get(where
)
64 # Mark that advert has been shown.
65 ad
.update_impressions()
67 return self
.render_string("modules/ads/%s.html" % where
, ad
=ad
)
70 class FireinfoDeviceTableModule(UIModule
):
71 def render(self
, devices
):
72 return self
.render_string("fireinfo/modules/table-devices.html",
76 class FireinfoDeviceAndGroupsTableModule(UIModule
):
77 def render(self
, devices
):
78 _
= self
.locale
.translate
82 for device
in devices
:
83 if not groups
.has_key(device
.cls
):
84 groups
[device
.cls
] = []
86 groups
[device
.cls
].append(device
)
89 for key
in groups
.keys():
92 # Order the groups by their name
93 groups
= groups
.items()
96 return self
.render_string("fireinfo/modules/table-devices-and-groups.html",
100 class FireinfoGeoTableModule(UIModule
):
101 def render(self
, items
):
104 for code
, value
in items
:
105 # Skip the satellite providers in this ranking
106 if code
in (None, "A1", "A2"):
109 name
= self
.geoip
.get_country_name(code
)
111 # Don't add countries with a small share on the list
113 other_countries
.append(name
)
116 country
= tornado
.database
.Row({
121 countries
.append(country
)
123 # Sort the list of small countries by alphabet
124 other_countries
.sort()
126 return self
.render_string("fireinfo/modules/table-geo.html",
127 countries
=countries
, other_countries
=other_countries
)
130 class LanguageNameModule(UIModule
):
131 def render(self
, language
):
132 _
= self
.locale
.translate
136 elif language
== "en":
138 elif language
== "es":
140 elif language
== "fr":
142 elif language
== "it":
144 elif language
== "nl":
146 elif language
== "pl":
148 elif language
== "pt":
149 return _("Portuguese")
150 elif language
== "ru":
152 elif language
== "tr":
158 class MapModule(UIModule
):
159 def render(self
, latitude
, longitude
):
160 return self
.render_string("modules/map.html", latitude
=latitude
, longitude
=longitude
)
163 class MenuModule(UIModule
):
165 return self
.render_string("modules/menu.html")
168 class MirrorItemModule(UIModule
):
169 def render(self
, item
):
170 return self
.render_string("modules/mirror-item.html", item
=item
)
173 class MirrorsTableModule(UIModule
):
174 def render(self
, mirrors
, preferred_mirrors
=[]):
175 return self
.render_string("modules/mirrors-table.html",
176 mirrors
=mirrors
, preferred_mirrors
=preferred_mirrors
)
179 class NetBootMenuConfigModule(UIModule
):
180 def render(self
, release
):
181 return self
.render_string("netboot/menu-config.cfg", release
=release
)
184 class NetBootMenuHeaderModule(UIModule
):
185 def render(self
, title
, releases
):
186 id = unicodedata
.normalize("NFKD", unicode(title
)).encode("ascii", "ignore")
187 id = re
.sub(r
"[^\w]+", " ", id)
188 id = "-".join(id.lower().strip().split())
190 return self
.render_string("netboot/menu-header.cfg", id=id,
191 title
=title
, releases
=releases
)
194 class NetBootMenuSeparatorModule(UIModule
):
196 return self
.render_string("netboot/menu-separator.cfg")
199 class NewsItemModule(UIModule
):
200 def get_author(self
, author
):
202 author
= self
.accounts
.find(author
)
206 _
= self
.locale
.translate
207 return _("Unknown author")
209 def render(self
, item
, uncut
=True, announcement
=False, show_heading
=True):
211 item
.author
= self
.get_author(item
.author_id
)
213 if not uncut
and len(item
.text
) >= 400:
214 item
.text
= item
.text
[:400] + "..."
217 item
.text
= textile
.textile(item
.text
)
219 return self
.render_string("modules/news-item.html", item
=item
,
220 uncut
=uncut
, announcement
=announcement
, show_heading
=show_heading
)
223 class NewsLineModule(UIModule
):
224 def render(self
, item
):
225 return self
.render_string("modules/news-line.html", item
=item
)
228 class NewsTableModule(UIModule
):
229 def render(self
, news
):
230 return self
.render_string("modules/news-table.html", news
=news
)
233 class NewsYearNavigationModule(UIModule
):
234 def render(self
, active
=None):
240 return self
.render_string("modules/news-year-nav.html",
241 active
=active
, years
=self
.news
.years
)
244 class PlanetSearchBoxModule(UIModule
):
245 def render(self
, query
=None):
246 years
= self
.planet
.get_years()
248 return self
.render_string("modules/planet/search-box.html",
249 query
=query
, years
=years
)
252 class SidebarItemModule(UIModule
):
254 return self
.render_string("modules/sidebar-item.html")
257 class SidebarReleaseModule(UIModule
):
259 return self
.render_string("modules/sidebar-release.html",
260 latest
=self
.releases
.get_latest())
263 class ReleaseItemModule(UIModule
):
264 def render(self
, release
, latest
=False):
265 arches
= ("i586", "arm")
268 for arch
in ("i586", "arm"):
271 for file in release
.files
:
272 if not file.arch
== arch
:
278 downloads
.append((arch
, files
))
280 return self
.render_string("modules/release-item.html",
281 release
=release
, latest
=latest
, downloads
=downloads
)
284 class SidebarBannerModule(UIModule
):
285 def render(self
, item
=None):
287 item
= self
.banners
.get_random()
289 return self
.render_string("modules/sidebar-banner.html", item
=item
)
292 class DownloadButtonModule(UIModule
):
293 def render(self
, release
, text
="Download now!"):
296 for file in release
.files
:
297 if file.type == "iso":
301 # Show nothing when there was no image found.
305 return self
.render_string("modules/download-button.html",
306 release
=release
, image
=best_image
)
309 class PlanetEntryModule(UIModule
):
310 def render(self
, entry
, show_avatar
=True):
311 return self
.render_string("modules/planet-entry.html",
312 entry
=entry
, show_avatar
=show_avatar
)
315 class ProgressBarModule(UIModule
):
316 def render(self
, value
, colour
=None):
319 return self
.render_string("modules/progress-bar.html",
320 colour
=colour
, value
=value
)
323 class TalkCallLogModule(UIModule
):
324 def render(self
, calls
):
325 return self
.render_string("talk/modules/call-log.html", calls
=calls
)
328 class TalkOngoingCallsModule(UIModule
):
329 def render(self
, calls
):
330 return self
.render_string("talk/modules/ongoing-calls.html", calls
=calls
)
333 class TrackerPeerListModule(UIModule
):
334 def render(self
, peers
):
335 # Guess country code and hostname of the host
337 country_code
= self
.geoip
.get_country(peer
["ip"])
339 peer
["country_code"] = country_code
.lower()
341 peer
["country_code"] = "unknown"
344 peer
["hostname"] = socket
.gethostbyaddr(peer
["ip"])[0]
346 peer
["hostname"] = ""
348 return self
.render_string("modules/tracker-peerlist.html",
349 peers
=[Row(p
) for p
in peers
])
352 class WishlistModule(UIModule
):
353 def render(self
, wishes
, short
=False):
354 return self
.render_string("wishlist/modules/wishlist.html",
355 wishes
=wishes
, short
=short
)
358 class WishModule(UIModule
):
359 def render(self
, wish
, short
=False):
360 progress_bar
= "progress-bar-warning"
362 if wish
.percentage
>= 100:
363 progress_bar
= "progress-bar-success"
365 return self
.render_string("wishlist/modules/wish.html",
366 wish
=wish
, short
=short
, progress_bar
=progress_bar
)
369 class WishlistItemsModule(UIModule
):
370 def render(self
, wishlist_items
):
371 return self
.render_string("modules/wishlist-items.html",
372 wishlist_items
=wishlist_items
)
375 class DonationBoxModule(UIModule
):
376 def render(self
, reason_for_transfer
=None, show_wishlist_items
=False):
377 if reason_for_transfer
:
378 reason_for_transfer
= "IPFire.org - %s" % reason_for_transfer
380 # Interesting items from the wishlist.
382 if show_wishlist_items
:
383 wishlist_items
= self
.wishlist
.get_hot_wishes()
385 return self
.render_string("modules/donation-box.html",
386 reason_for_transfer
=reason_for_transfer
, wishlist_items
=wishlist_items
)