Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix translation of WTForms strings - SUPERSEDED (by #13) #10

Closed
wants to merge 16 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
9 changes: 8 additions & 1 deletion CHANGESET.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,15 @@
Version 0.9.0 - 2013-10-20
Version 0.9.0 - tbd
--------------------------
- Updated Flask-WTF to 0.9.3
- Introduced `auth_ids` in the `User` model instead of separete auth ids per provider
- To upgrade the existing user data deploy the `gae-init-migrate` to your GAE app and run the upgrade task

### Upgrading from older versions to 0.9.0:

You need to import fields/validators from `wtforms` and `wtforms.validators`
directly as they are no longer part of the Flask-WTF package since v0.9.0:
https://flask-wtf.readthedocs.org/en/latest/upgrade.html#version-0-9-0

Version 0.8.4 - 2013-10-19
--------------------------
- Added `rel='nofollow'` wherever applicable
Expand Down
32 changes: 17 additions & 15 deletions main/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@

from google.appengine.api import app_identity
import flask
from flaskext import wtf
from flaskext.babel import lazy_gettext as _
from flaskext.babel import gettext as __
from i18n import Form
import wtforms
import wtforms.validators
from flask.ext.babel import lazy_gettext as _
from flask.ext.babel import gettext as __

import auth
import util
Expand All @@ -14,18 +16,18 @@
from main import app


class ConfigUpdateForm(wtf.Form):
analytics_id = wtf.TextField('Analytics ID', filters=[util.strip_filter])
announcement_html = wtf.TextAreaField('Announcement HTML', filters=[util.strip_filter])
announcement_type = wtf.SelectField('Announcement Type', choices=[(t, t.title()) for t in model.Config.announcement_type._choices])
brand_name = wtf.TextField('Brand Name', [wtf.validators.required()], filters=[util.strip_filter])
facebook_app_id = wtf.TextField('Facebook App ID', filters=[util.strip_filter])
facebook_app_secret = wtf.TextField('Facebook App Secret', filters=[util.strip_filter])
feedback_email = wtf.TextField('Feedback Email', [wtf.validators.optional(), wtf.validators.email()], filters=[util.email_filter])
flask_secret_key = wtf.TextField('Flask Secret Key', [wtf.validators.required()], filters=[util.strip_filter])
locale = wtf.SelectField('Default Locale', choices=config.LOCALE_SORTED)
twitter_consumer_key = wtf.TextField('Twitter Consumer Key', filters=[util.strip_filter])
twitter_consumer_secret = wtf.TextField('Twitter Consumer Secret', filters=[util.strip_filter])
class ConfigUpdateForm(Form):
analytics_id = wtforms.TextField('Analytics ID', filters=[util.strip_filter])
announcement_html = wtforms.TextAreaField('Announcement HTML', filters=[util.strip_filter])
announcement_type = wtforms.SelectField('Announcement Type', choices=[(t, t.title()) for t in model.Config.announcement_type._choices])
brand_name = wtforms.TextField('Brand Name', [wtforms.validators.required()], filters=[util.strip_filter])
facebook_app_id = wtforms.TextField('Facebook App ID', filters=[util.strip_filter])
facebook_app_secret = wtforms.TextField('Facebook App Secret', filters=[util.strip_filter])
feedback_email = wtforms.TextField('Feedback Email', [wtforms.validators.optional(), wtforms.validators.email()], filters=[util.email_filter])
flask_secret_key = wtforms.TextField('Flask Secret Key', [wtforms.validators.required()], filters=[util.strip_filter])
locale = wtforms.SelectField('Default Locale', choices=config.LOCALE_SORTED)
twitter_consumer_key = wtforms.TextField('Twitter Consumer Key', filters=[util.strip_filter])
twitter_consumer_secret = wtforms.TextField('Twitter Consumer Secret', filters=[util.strip_filter])


@app.route('/_s/admin/config/', endpoint='admin_config_update_service')
Expand Down
8 changes: 4 additions & 4 deletions main/auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@
import re

import flask
from flaskext import login
from flaskext import oauth
from flaskext.babel import lazy_gettext as _
from flaskext.babel import gettext as __
from flask.ext import login
from flask.ext import oauth
from flask.ext.babel import lazy_gettext as _
from flask.ext.babel import gettext as __
from babel import localedata

import util
Expand Down
50 changes: 50 additions & 0 deletions main/i18n.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
from flask.ext import wtf
from flask import _request_ctx_stack
from flask.ext.babel import get_locale
from babel import support
import os


def _get_translations():
"""Returns the correct gettext translations.
Copy from flask-babel with some modifications.
"""
ctx = _request_ctx_stack.top
if ctx is None:
return None
# babel should be in extensions for get_locale
if 'babel' not in ctx.app.extensions:
return None
translations = getattr(ctx, 'wtforms_translations', None)
if translations is None:
module_path = os.path.abspath(__file__)
dirname = os.path.join(os.path.dirname(module_path), 'translations')
translations = support.Translations.load(
dirname, [get_locale()], domain='messages'
)
ctx.wtforms_translations = translations
return translations


class Translations(object):
def gettext(self, string):
t = _get_translations()
if t is None:
return string
return t.ugettext(string)

def ngettext(self, singular, plural, n):
t = _get_translations()
if t is None:
if n == 1:
return singular
return plural
return t.ungettext(singular, plural, n)


translations = Translations()


class Form(wtf.Form):
def _get_translations(self):
return translations
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

Implements i18n/l10n support for Flask applications based on Babel.

:copyright: (c) 2010 by Armin Ronacher.
:copyright: (c) 2013 by Armin Ronacher, Daniel Neuhäuser.
:license: BSD, see LICENSE for more details.
"""
from __future__ import absolute_import
Expand All @@ -28,6 +28,8 @@
timezone = pytz.timezone
UTC = pytz.UTC

from flask_babel._compat import string_types


class Babel(object):
"""Central controller class that can be used to configure how
Expand Down Expand Up @@ -235,7 +237,7 @@ def get_timezone():
if rv is None:
tzinfo = babel.default_timezone
else:
if isinstance(rv, basestring):
if isinstance(rv, string_types):
tzinfo = timezone(rv)
else:
tzinfo = rv
Expand Down
20 changes: 20 additions & 0 deletions main/lib/flask_babel/_compat.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
"""
flask.ext.babel._compat
~~~~~~~~~~~~~~~~~~~~~~~

:copyright: (c) 2013 by Armin Ronacher, Daniel Neuhäuser.
:license: BSD, see LICENSE for more details.
"""
import sys


PY2 = sys.version_info[0] == 2


if PY2:
text_type = unicode
string_types = (str, unicode)
else:
text_type = str
string_types = (str, )
18 changes: 18 additions & 0 deletions main/lib/flask_wtf/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# -*- coding: utf-8 -*-
"""
flask_wtf
~~~~~~~~~

Flask-WTF extension

:copyright: (c) 2010 by Dan Jacob.
:license: BSD, see LICENSE for more details.
"""
# flake8: noqa
from __future__ import absolute_import

from .form import Form
from .csrf import CsrfProtect
from .recaptcha import *

__version__ = '0.9.3'
14 changes: 14 additions & 0 deletions main/lib/flask_wtf/_compat.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import sys
if sys.version_info[0] == 3:
text_type = str
string_types = (str,)
else:
text_type = unicode
string_types = (str, unicode)


def to_bytes(text):
"""Transform string to bytes."""
if isinstance(text, text_type):
text = text.encode('utf-8')
return text