]>
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 PlanetAuthorBoxModule(UIModule
):
307 def render(self
, author
):
308 return self
.render_string("planet/modules/author-box.html", author
=author
)
311 class PlanetEntryModule(UIModule
):
312 def render(self
, entry
, show_avatar
=True):
313 return self
.render_string("modules/planet-entry.html",
314 entry
=entry
, show_avatar
=show_avatar
)
317 class ProgressBarModule(UIModule
):
318 def render(self
, value
, colour
=None):
321 return self
.render_string("modules/progress-bar.html",
322 colour
=colour
, value
=value
)
325 class TalkCallLogModule(UIModule
):
326 def render(self
, calls
):
327 return self
.render_string("talk/modules/call-log.html", calls
=calls
)
330 class TalkOngoingCallsModule(UIModule
):
331 def render(self
, calls
):
332 return self
.render_string("talk/modules/ongoing-calls.html", calls
=calls
)
335 class TrackerPeerListModule(UIModule
):
336 def render(self
, peers
):
337 # Guess country code and hostname of the host
339 country_code
= self
.geoip
.get_country(peer
["ip"])
341 peer
["country_code"] = country_code
.lower()
343 peer
["country_code"] = "unknown"
346 peer
["hostname"] = socket
.gethostbyaddr(peer
["ip"])[0]
348 peer
["hostname"] = ""
350 return self
.render_string("modules/tracker-peerlist.html",
351 peers
=[backend
.database
.Row(p
) for p
in peers
])
354 class WishlistModule(UIModule
):
355 def render(self
, wishes
, short
=False):
356 return self
.render_string("wishlist/modules/wishlist.html",
357 wishes
=wishes
, short
=short
)
360 class WishModule(UIModule
):
361 def render(self
, wish
, short
=False):
362 progress_bar
= "progress-bar-warning"
364 if wish
.percentage
>= 100:
365 progress_bar
= "progress-bar-success"
367 return self
.render_string("wishlist/modules/wish.html",
368 wish
=wish
, short
=short
, progress_bar
=progress_bar
)
371 class WishlistItemsModule(UIModule
):
372 def render(self
, wishlist_items
):
373 return self
.render_string("modules/wishlist-items.html",
374 wishlist_items
=wishlist_items
)
377 class DonationBoxModule(UIModule
):
378 def render(self
, reason_for_transfer
=None):
379 if reason_for_transfer
:
380 reason_for_transfer
= "IPFire.org - %s" % reason_for_transfer
382 return self
.render_string("modules/donation-box.html",
383 reason_for_transfer
=reason_for_transfer
)
386 class DonationButtonModule(UIModule
):
387 def render(self
, reason_for_transfer
=None, currency
="EUR"):
388 if not reason_for_transfer
:
389 reason_for_transfer
= "IPFire.org"
391 primary
= (currency
== "EUR")
393 return self
.render_string("modules/donation-button.html", primary
=primary
,
394 reason_for_transfer
=reason_for_transfer
, currency
=currency
)