]>
git.ipfire.org Git - ipfire.org.git/blob - webapp/ui_modules.py
945af36eba9bb80a62c7167686460ec09184f9db
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
.talk
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
, arch
=None, platform
=None):
178 return self
.render_string("netboot/menu-config.cfg", release
=release
,
179 arch
=arch
, platform
=platform
)
182 class NetBootMenuHeaderModule(UIModule
):
183 def render(self
, title
, releases
, arch
=None, platform
=None):
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
, arch
=arch
, platform
=platform
)
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 # Find a release if one exists
218 release
= self
.releases
.get_by_news_id(item
.uuid
)
220 return self
.render_string("modules/news-item.html", item
=item
, release
=release
,
221 uncut
=uncut
, announcement
=announcement
, show_heading
=show_heading
)
224 class NewsLineModule(UIModule
):
225 def render(self
, item
):
226 return self
.render_string("modules/news-line.html", item
=item
)
229 class NewsTableModule(UIModule
):
230 def render(self
, news
):
231 return self
.render_string("modules/news-table.html", news
=news
)
234 class NewsYearNavigationModule(UIModule
):
235 def render(self
, active
=None):
241 return self
.render_string("modules/news-year-nav.html",
242 active
=active
, years
=self
.news
.years
)
245 class PlanetSearchBoxModule(UIModule
):
246 def render(self
, query
=None):
247 return self
.render_string("modules/planet/search-box.html", query
=query
)
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
= ("x86_64", "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 (release
.sname
< "ipfire-2.19-core100" or file.arch
== "x86_64") \
296 and file.type == "iso":
300 # Show nothing when there was no image found.
304 return self
.render_string("modules/download-button.html",
305 release
=release
, image
=best_image
)
308 class PlanetAuthorBoxModule(UIModule
):
309 def render(self
, author
):
310 return self
.render_string("planet/modules/author-box.html", author
=author
)
313 class PlanetEntryModule(UIModule
):
314 def render(self
, entry
, show_avatar
=True):
315 return self
.render_string("modules/planet-entry.html",
316 entry
=entry
, show_avatar
=show_avatar
)
319 class ProgressBarModule(UIModule
):
320 def render(self
, value
, colour
=None):
323 return self
.render_string("modules/progress-bar.html",
324 colour
=colour
, value
=value
)
327 class TalkContactModule(UIModule
):
328 def render(self
, number
, name
=None, application
=None):
329 account
= self
.accounts
.get_by_sip_id(number
)
331 return self
.render_string("talk/modules/contact.html",
332 account
=account
, number
=number
, name
=name
, application
=application
)
335 class TalkCallLogModule(UIModule
):
336 def render(self
, account
=None, viewer
=None):
337 if (account
is None or not self
.current_user
== account
) \
338 and not self
.current_user
.is_admin():
339 raise RuntimeException("Insufficient permissions")
342 viewer
= self
.current_user
344 calls
= self
.talk
.get_call_log(account
)
346 return self
.render_string("talk/modules/call-log.html",
347 calls
=calls
, viewer
=viewer
)
350 class TalkLinesModule(UIModule
):
351 def render(self
, account
=None, show_account
=False):
352 if (account
is None or not self
.current_user
== account
) \
353 and not self
.current_user
.is_admin():
354 raise RuntimeException("Insufficient permissions")
356 lines
= self
.talk
.get_lines(account
)
358 return self
.render_string("talk/modules/lines.html",
359 show_account
=show_account
, lines
=lines
)
362 class TalkOngoingCallsModule(UIModule
):
363 def render(self
, account
=None, debug
=False):
364 if (account
is None or not self
.current_user
== account
) \
365 and not self
.current_user
.is_admin():
366 raise RuntimeException("Insufficient permissions")
368 channels
= self
.talk
.get_channels()
370 return self
.render_string("talk/modules/ongoing-calls.html",
371 account
=account
, channels
=channels
, debug
=debug
)
374 class DonationBoxModule(UIModule
):
375 def render(self
, reason_for_transfer
=None):
376 if reason_for_transfer
:
377 reason_for_transfer
= "IPFire.org - %s" % reason_for_transfer
379 return self
.render_string("modules/donation-box.html",
380 reason_for_transfer
=reason_for_transfer
)
383 class DonationButtonModule(UIModule
):
384 # https://developer.paypal.com/docs/classic/paypal-payments-standard/integration-guide/Appx_websitestandard_htmlvariables/
420 def render(self
, reason_for_transfer
=None, currency
="EUR"):
421 if not reason_for_transfer
:
422 reason_for_transfer
= "IPFire.org"
424 primary
= (currency
== "EUR")
426 return self
.render_string("modules/donation-button.html", primary
=primary
,
427 reason_for_transfer
=reason_for_transfer
, currency
=currency
, lc
=self
.lc
)
432 Returns the locale of the user
435 locale
, delimiter
, encoding
= self
.locale
.code
.partition(".")
437 # Break for languages in specific countries
438 if locale
in self
.LOCALES
:
441 lang
, delimiter
, country_code
= locale
.partition("_")
443 if country_code
and country_code
in self
.COUNTRIES
:
447 if lang
in self
.COUNTRIES
:
452 # If anything goes wrong, fall back to GB
456 class DonationInputBoxModule(DonationButtonModule
):
458 currencies
= ("EUR", "USD", "GBP", "CHF", "AUD", "NZD", "CAD")
460 return self
.render_string("modules/donation-input-box.html",
461 currencies
=currencies
, lc
=self
.lc
)