]>
git.ipfire.org Git - people/shoehn/ipfire.org.git/blob - webapp/ui_modules.py
3 from __future__
import division
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
= backend
.database
.Row({
121 countries
.append(country
)
123 return self
.render_string("fireinfo/modules/table-geo.html",
124 countries
=countries
, other_countries
=other_countries
)
127 class LanguageNameModule(UIModule
):
128 def render(self
, language
):
129 _
= self
.locale
.translate
133 elif language
== "en":
135 elif language
== "es":
137 elif language
== "fr":
139 elif language
== "it":
141 elif language
== "nl":
143 elif language
== "pl":
145 elif language
== "pt":
146 return _("Portuguese")
147 elif language
== "ru":
149 elif language
== "tr":
155 class MapModule(UIModule
):
156 def render(self
, latitude
, longitude
):
157 return self
.render_string("modules/map.html", latitude
=latitude
, longitude
=longitude
)
160 class MenuModule(UIModule
):
162 return self
.render_string("modules/menu.html")
165 class MirrorItemModule(UIModule
):
166 def render(self
, item
):
167 return self
.render_string("modules/mirror-item.html", item
=item
)
170 class MirrorsTableModule(UIModule
):
171 def render(self
, mirrors
, preferred_mirrors
=[]):
172 return self
.render_string("modules/mirrors-table.html",
173 mirrors
=mirrors
, preferred_mirrors
=preferred_mirrors
)
176 class NetBootMenuConfigModule(UIModule
):
177 def render(self
, release
):
178 return self
.render_string("netboot/menu-config.cfg", release
=release
)
181 class NetBootMenuHeaderModule(UIModule
):
182 def render(self
, title
, releases
):
183 id = unicodedata
.normalize("NFKD", unicode(title
)).encode("ascii", "ignore")
184 id = re
.sub(r
"[^\w]+", " ", id)
185 id = "-".join(id.lower().strip().split())
187 return self
.render_string("netboot/menu-header.cfg", id=id,
188 title
=title
, releases
=releases
)
191 class NetBootMenuSeparatorModule(UIModule
):
193 return self
.render_string("netboot/menu-separator.cfg")
196 class NewsItemModule(UIModule
):
197 def get_author(self
, author
):
199 author
= self
.accounts
.find(author
)
203 _
= self
.locale
.translate
204 return _("Unknown author")
206 def render(self
, item
, uncut
=True, announcement
=False, show_heading
=True):
208 item
.author
= self
.get_author(item
.author_id
)
210 if not uncut
and len(item
.text
) >= 400:
211 item
.text
= item
.text
[:400] + "..."
214 item
.text
= textile
.textile(item
.text
.decode("utf8"))
216 return self
.render_string("modules/news-item.html", item
=item
,
217 uncut
=uncut
, announcement
=announcement
, show_heading
=show_heading
)
220 class NewsLineModule(UIModule
):
221 def render(self
, item
):
222 return self
.render_string("modules/news-line.html", item
=item
)
225 class NewsTableModule(UIModule
):
226 def render(self
, news
):
227 return self
.render_string("modules/news-table.html", news
=news
)
230 class NewsYearNavigationModule(UIModule
):
231 def render(self
, active
=None):
237 return self
.render_string("modules/news-year-nav.html",
238 active
=active
, years
=self
.news
.years
)
241 class PlanetSearchBoxModule(UIModule
):
242 def render(self
, query
=None):
243 years
= self
.planet
.get_years()
245 return self
.render_string("modules/planet/search-box.html",
246 query
=query
, years
=years
)
249 class SidebarItemModule(UIModule
):
251 return self
.render_string("modules/sidebar-item.html")
254 class SidebarReleaseModule(UIModule
):
256 return self
.render_string("modules/sidebar-release.html",
257 latest
=self
.releases
.get_latest())
260 class ReleaseItemModule(UIModule
):
261 def render(self
, release
, latest
=False):
262 arches
= ("i586", "arm")
265 for arch
in ("i586", "arm"):
268 for file in release
.files
:
269 if not file.arch
== arch
:
275 downloads
.append((arch
, files
))
277 return self
.render_string("modules/release-item.html",
278 release
=release
, latest
=latest
, downloads
=downloads
)
281 class SidebarBannerModule(UIModule
):
282 def render(self
, item
=None):
284 item
= self
.banners
.get_random()
286 return self
.render_string("modules/sidebar-banner.html", item
=item
)
289 class DownloadButtonModule(UIModule
):
290 def render(self
, release
, text
="Download now!"):
293 for file in release
.files
:
294 if file.type == "iso":
298 # Show nothing when there was no image found.
302 return self
.render_string("modules/download-button.html",
303 release
=release
, image
=best_image
)
306 class PlanetEntryModule(UIModule
):
307 def render(self
, entry
, show_avatar
=True):
308 return self
.render_string("modules/planet-entry.html",
309 entry
=entry
, show_avatar
=show_avatar
)
312 class ProgressBarModule(UIModule
):
313 def render(self
, value
, colour
=None):
316 return self
.render_string("modules/progress-bar.html",
317 colour
=colour
, value
=value
)
320 class TalkCallLogModule(UIModule
):
321 def render(self
, calls
):
322 return self
.render_string("talk/modules/call-log.html", calls
=calls
)
325 class TalkOngoingCallsModule(UIModule
):
326 def render(self
, calls
):
327 return self
.render_string("talk/modules/ongoing-calls.html", calls
=calls
)
330 class TrackerPeerListModule(UIModule
):
331 def render(self
, peers
):
332 # Guess country code and hostname of the host
334 country_code
= self
.geoip
.get_country(peer
["ip"])
336 peer
["country_code"] = country_code
.lower()
338 peer
["country_code"] = "unknown"
341 peer
["hostname"] = socket
.gethostbyaddr(peer
["ip"])[0]
343 peer
["hostname"] = ""
345 return self
.render_string("modules/tracker-peerlist.html",
346 peers
=[backend
.database
.Row(p
) for p
in peers
])
349 class WishlistModule(UIModule
):
350 def render(self
, wishes
, short
=False):
351 return self
.render_string("wishlist/modules/wishlist.html",
352 wishes
=wishes
, short
=short
)
355 class WishModule(UIModule
):
356 def render(self
, wish
, short
=False):
357 progress_bar
= "progress-bar-warning"
359 if wish
.percentage
>= 100:
360 progress_bar
= "progress-bar-success"
362 return self
.render_string("wishlist/modules/wish.html",
363 wish
=wish
, short
=short
, progress_bar
=progress_bar
)
366 class WishlistItemsModule(UIModule
):
367 def render(self
, wishlist_items
):
368 return self
.render_string("modules/wishlist-items.html",
369 wishlist_items
=wishlist_items
)
372 class DonationBoxModule(UIModule
):
373 def render(self
, reason_for_transfer
=None):
374 if reason_for_transfer
:
375 reason_for_transfer
= "IPFire.org - %s" % reason_for_transfer
377 return self
.render_string("modules/donation-box.html",
378 reason_for_transfer
=reason_for_transfer
)
381 class DonationButtonModule(UIModule
):
382 def render(self
, reason_for_transfer
=None, currency
="EUR"):
383 if not reason_for_transfer
:
384 reason_for_transfer
= "IPFire.org"
386 primary
= (currency
== "EUR")
388 return self
.render_string("modules/donation-button.html", primary
=primary
,
389 reason_for_transfer
=reason_for_transfer
, currency
=currency
)