commit 0380ffe042a1e9490a151771403062867bf5929b Author: Isis Lovecruft isis@torproject.org Date: Mon May 5 18:58:25 2014 +0000
Rewrite HTML templates to pass template namespace parameters.
In order to use translated strings from the bridgedb.strings module, we need to pass the namespace parameters (i.e., the arguments in HTTPServer.py to `template.render()`) from the parent template (base.html) to the inheriting templates.
While we're at it, we should pass information on the requested lang, so that translations don't suddenly turn off if you go to a different page, and info on whether the page should be rendered RTL. This fixes a slight bug where the pages deriving from `bridgedb.HTTPServer.CaptchaProtectedResource` weren't being correctly translated or RTL-rendered when they should be.
And also while we're at it, we should probably not do *anything* inside of `bridgedb.HTTPServer.*Resource.render_*` methods outside of the try/except block, because any error will be rendered as a traceback to the client.
Additionally, we should set the content type and encoding in the headers of every response before returning it. --- lib/bridgedb/HTTPServer.py | 68 +++++++++++++++++++---------------- lib/bridgedb/templates/base.html | 8 +++-- lib/bridgedb/templates/bridges.html | 3 +- lib/bridgedb/templates/captcha.html | 2 ++ lib/bridgedb/templates/howto.html | 1 + lib/bridgedb/templates/index.html | 2 ++ lib/bridgedb/templates/options.html | 2 ++ 7 files changed, 52 insertions(+), 34 deletions(-)
diff --git a/lib/bridgedb/HTTPServer.py b/lib/bridgedb/HTTPServer.py index e11073e..7c4689a 100644 --- a/lib/bridgedb/HTTPServer.py +++ b/lib/bridgedb/HTTPServer.py @@ -206,17 +206,24 @@ class CaptchaProtectedResource(resource.Resource): :returns: A rendered HTML page containing a ReCaptcha challenge image for the client to solve. """ + rtl = False image, challenge = self.getCaptchaImage(request)
try: + langs = translations.getLocaleFromHTTPRequest(request) + rtl = translations.usingRTLLang(langs) # TODO: this does not work for versions of IE < 8.0 imgstr = 'data:image/jpeg;base64,%s' % base64.b64encode(image) template = lookup.get_template('captcha.html') - rendered = template.render(imgstr=imgstr, + rendered = template.render(strings, + rtl=rtl, + lang=langs[0], + imgstr=imgstr, challenge_field=challenge) except Exception as err: rendered = replaceErrorPage(err, 'captcha.html')
+ request.setHeader("Content-Type", "text/html; charset=utf-8") return rendered
def render_POST(self, request): @@ -236,6 +243,8 @@ class CaptchaProtectedResource(resource.Resource): :returns: A rendered HTML page containing a ReCaptcha challenge image for the client to solve. """ + request.setHeader("Content-Type", "text/html; charset=utf-8") + if self.checkSolution(request) is True: try: rendered = self.resource.render(request) @@ -559,15 +568,15 @@ class WebResourceOptions(resource.Resource):
def render_GET(self, request): rtl = False - langs = translations.getLocaleFromHTTPRequest(request) - try: + langs = translations.getLocaleFromHTTPRequest(request) rtl = translations.usingRTLLang(langs) + template = lookup.get_template('options.html') + rendered = template.render(strings, rtl=rtl, lang=langs[0]) except Exception as err: # pragma: no cover - logging.exception(err) - + rendered = replaceErrorPage(err) request.setHeader("Content-Type", "text/html; charset=utf-8") - return lookup.get_template('options.html').render(rtl=rtl) + return rendered
render_POST = render_GET
@@ -584,15 +593,15 @@ class WebResourceHowto(resource.Resource):
def render_GET(self, request): rtl = False - langs = translations.getLocaleFromHTTPRequest(request) - try: + langs = translations.getLocaleFromHTTPRequest(request) rtl = translations.usingRTLLang(langs) + template = lookup.get_template('howto.html') + rendered = template.render(strings, rtl=rtl, lang=langs[0]) except Exception as err: # pragma: no cover - logging.exception(err) - + rendered = replaceErrorPage(err) request.setHeader("Content-Type", "text/html; charset=utf-8") - return lookup.get_template('howto.html').render(rtl=rtl) + return rendered
render_POST = render_GET
@@ -683,11 +692,6 @@ class WebResourceBridges(resource.Resource): if countryCode: logging.debug("Client request from GeoIP CC: %s" % countryCode)
- langs = translations.getLocaleFromHTTPRequest(request) - rtl = translations.usingRTLLang(langs) - if rtl: - logging.debug("Rendering RTL response.") - # XXX separate function again format = request.args.get("format", None) if format and len(format): format = format[0] # choose the first arg @@ -749,10 +753,10 @@ class WebResourceBridges(resource.Resource): request=bridgedb.Dist.uniformMap(ip) ) for b in bridges)
- answer = self.renderAnswer(request, bridgeLines, rtl, format) + answer = self.renderAnswer(request, bridgeLines, format) return answer
- def renderAnswer(self, request, bridgeLines=None, rtl=False, format=None): + def renderAnswer(self, request, bridgeLines=None, format=None): """Generate a response for a client which includes **bridges**.
The generated response can be plaintext or HTML. @@ -763,8 +767,6 @@ class WebResourceBridges(resource.Resource): :type bridgeLines: list or None :param bridgeLines: A list of strings used to configure a Tor client to use a bridge. - :param bool rtl: If ``True``, the language used for the response to - the client should be rendered right-to-left. :type format: str or None :param format: If ``'plain'``, return a plaintext response. Otherwise, use the :file:`bridgedb/templates/bridges.html` template to render @@ -772,17 +774,21 @@ class WebResourceBridges(resource.Resource): :rtype: str :returns: A plaintext or HTML response to serve. """ + rtl = False + if format == 'plain': request.setHeader("Content-Type", "text/plain") rendered = bridgeLines else: request.setHeader("Content-Type", "text/html; charset=utf-8") try: - # XXX FIXME the returned page from - # ``WebResourceBridgesTests.test_render_GET_RTLlang`` - # is in Arabic and has `<html lang="en">`! Doh. + langs = translations.getLocaleFromHTTPRequest(request) + rtl = translations.usingRTLLang(langs) template = lookup.get_template('bridges.html') - rendered = template.render(answer=bridgeLines, rtl=rtl) + rendered = template.render(strings, + rtl=rtl, + lang=langs[0], + answer=bridgeLines) except Exception as err: rendered = replaceErrorPage(err)
@@ -804,17 +810,17 @@ class WebRoot(resource.Resource): :param request: An incoming request. """ rtl = False - langs = translations.getLocaleFromHTTPRequest(request) - try: + langs = translations.getLocaleFromHTTPRequest(request) rtl = translations.usingRTLLang(langs) + template = lookup.get_template('index.html') + rendered = template.render(strings, + rtl=rtl, + lang=langs[0]) except Exception as err: - logging.exception(err) - logging.error("The gettext files were not properly installed.") - logging.info("To install translations, try doing `python " \ - "setup.py compile_catalog`.") + rendered = replaceErrorPage(err)
- return lookup.get_template('index.html').render(rtl=rtl) + return rendered
def addWebServer(cfg, dist, sched): diff --git a/lib/bridgedb/templates/base.html b/lib/bridgedb/templates/base.html index 4228f9f..1ec49a3 100644 --- a/lib/bridgedb/templates/base.html +++ b/lib/bridgedb/templates/base.html @@ -1,6 +1,10 @@ ## -*- coding: utf-8 -*- + +<%namespace name="base" file="base.html" inheritable="True"/> +<%page args="strings, rtl=False, lang='en', **kwargs"/> + <!DOCTYPE html> -<html lang="en"> +<html lang="${lang}"> <head> <meta charset="utf-8"> <title>BridgeDB</title> @@ -50,7 +54,7 @@ span { </div>
-${self.body()} +${next.body(strings, rtl=rtl, lang=lang, **kwargs)}
<div class="faq"> diff --git a/lib/bridgedb/templates/bridges.html b/lib/bridgedb/templates/bridges.html index a118404..4058d54 100644 --- a/lib/bridgedb/templates/bridges.html +++ b/lib/bridgedb/templates/bridges.html @@ -1,5 +1,7 @@ ## -*- coding: utf-8 -*- + <%inherit file="base.html"/> +<%page args="strings, rtl=False, lang='en', answer=0, **kwargs"/>
<div class="container-fluid" style="width: 98%; align: center; margin: auto;"> @@ -78,7 +80,6 @@ ${_(""" Select "Yes" and click "Next" in order to configure your""" \ </div> </div> <br /> - % endif
<hr /> diff --git a/lib/bridgedb/templates/captcha.html b/lib/bridgedb/templates/captcha.html index 23b9772..9f62258 100644 --- a/lib/bridgedb/templates/captcha.html +++ b/lib/bridgedb/templates/captcha.html @@ -1,5 +1,7 @@ ## -*- coding: utf-8 -*- + <%inherit file="base.html"/> +<%page args="strings, rtl=False, lang='en', imgstr=0, captcha_challenge=0, **kwargs"/>
<div class="container-narrow" id="captchaSubmissionContainer" diff --git a/lib/bridgedb/templates/howto.html b/lib/bridgedb/templates/howto.html index 42e14ca..b143741 100644 --- a/lib/bridgedb/templates/howto.html +++ b/lib/bridgedb/templates/howto.html @@ -1,6 +1,7 @@ ## -*- coding: utf-8 -*-
<%inherit file="base.html"/> +<%page args="strings, rtl=False, lang='en', **kwargs"/>
<div class="container-fluid" style="width: 98%; align: center; margin: auto;"> diff --git a/lib/bridgedb/templates/index.html b/lib/bridgedb/templates/index.html index 243ba10..21a5281 100644 --- a/lib/bridgedb/templates/index.html +++ b/lib/bridgedb/templates/index.html @@ -1,5 +1,7 @@ ## -*- coding: utf-8 -*- + <%inherit file="base.html"/> +<%page args="strings, rtl=False, lang='en', **kwargs"/>
<div class="main-steps"> <div class="step row"> diff --git a/lib/bridgedb/templates/options.html b/lib/bridgedb/templates/options.html index d786ac1..c25e418 100644 --- a/lib/bridgedb/templates/options.html +++ b/lib/bridgedb/templates/options.html @@ -1,5 +1,7 @@ ## -*- coding: utf-8 -*- + <%inherit file="base.html"/> +<%page args="strings, rtl=False, lang='en', **kwargs"/>
<div class="container-fluid" style="width: 96%; align: center; margin: 2%">