This repository has been archived by the owner on Mar 15, 2018. It is now read-only.
/
widgets.py
78 lines (58 loc) · 2.49 KB
/
widgets.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
from django import forms
from django.conf import settings
from django.forms.util import flatatt
from django.utils import translation
from django.utils.translation.trans_real import to_language
import jinja2
import jingo
from .models import Translation
attrs = 'name="{name}_{locale}" data-locale="{locale}" {attrs}'
input = u'<input %s value="{value}">' % attrs
textarea = u'<textarea %s>{value}</textarea>' % attrs
class TranslationWidget(forms.widgets.Textarea):
# Django expects ForeignKey widgets to have a choices attribute.
choices = None
def render(self, name, value, attrs=None):
attrs = self.build_attrs(attrs)
widget = widget_builder(name, attrs)
id = attrs.pop('id')
lang = translation.get_language()
widgets = {}
widgets[lang] = widget(lang, value='')
try:
trans_id = int(value)
widgets.update(trans_widgets(trans_id, widget))
except (TypeError, ValueError), e:
pass
languages = dict((i.lower(), j) for i, j in settings.LANGUAGES.items())
template = jingo.env.get_template('translations/transbox.html')
return template.render(id=id, name=name, widgets=widgets,
languages=languages)
def value_from_datadict(self, data, files, name):
# All the translations for this field are called {name}_{locale}, so
# pull out everything that starts with name.
rv = {}
prefix = '%s_' % name
locale = lambda s: s[len(prefix):]
delete_locale = lambda s: s[len(prefix):-len('_delete')]
for key in data:
if key.startswith(prefix):
if key.endswith('_delete'):
rv[delete_locale(key)] = None
else:
rv[locale(key)] = data[key]
return rv
def trans_widgets(trans_id, widget):
translations = (Translation.objects.filter(id=trans_id)
.filter(localized_string__isnull=False)
.values_list('locale', 'localized_string'))
return [(to_language(locale), widget(locale, val))
for locale, val in translations if val is not None]
def widget_builder(name, attrs):
def widget(locale, value):
locale = to_language(locale)
value = jinja2.escape(value)
attrs_ = dict(id='trans_%s_%s' % (name, locale), **attrs)
return textarea.format(name=name, locale=locale,
attrs=flatatt(attrs_), value=value)
return widget