rTranslateble model review

remotes/origin/1203
Nazar Kotjuk 10 years ago
parent 1b6020132e
commit 19361011a6
  1. 45
      functions/forms.py

@ -75,22 +75,32 @@ class TranslatableModelForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
inst = kwargs.get('instance')
veto_fields= ['id', 'master', 'language_code']
self.all_tr_field_names = [field.name for field in self._meta.model.translations.related.editable_fields() if field.name not in veto_fields]
veto_fields = ['id', 'master', 'language_code']
# all translated fields of object
self._all_tr_field_names = [field.name for field in self._meta.model.translations.related.editable_fields()
if field.name not in veto_fields]
if inst:
# populate fields
init_tr_data = self.fill_init_field(inst)
if kwargs['initial']:
kwargs['initial'].update(init_tr_data)
else:
kwargs.update({'initial':init_tr_data})
kwargs.update({'initial': init_tr_data})
super(TranslatableModelForm, self).__init__(*args, **kwargs)
if not self.translatable_fields:
self.translatable_fields = self.all_tr_field_names
fkwargs = {field.name: field for field in self._meta.model.translations.related.editable_fields() if field.name not in veto_fields}
self.translatable_fields = self._all_tr_field_names
# generate Field objects by field name
fkwargs = {field.name: field for field in self._meta.model.translations.related.editable_fields()
if field.name not in veto_fields}
for code, name in settings.LANGUAGES:
# todo: fix requirements - where field is required default language must be required to)
for tr_field in self.translatable_fields:
field = fkwargs[tr_field].formfield()
field.required=False
field.required = False
self.fields[tr_field+"_"+code] = field
def clean(self):
@ -100,9 +110,8 @@ class TranslatableModelForm(forms.ModelForm):
return data
def save(self, commit=True):
# todo: fix commit False error
init_lang = get_language()[:2]
data = self.cleaned_data
langs = [code for code, _ in settings.LANGUAGES]
is_new = not self.instance.pk
inst = super(TranslatableModelForm, self).save()
@ -114,16 +123,18 @@ class TranslatableModelForm(forms.ModelForm):
setattr(inst, key, value)
inst.save_translations(inst)
else:
translations = {obj.language_code:obj for obj in list(inst.translations.all())}
translations = {obj.language_code: obj for obj in list(inst.translations.all())}
for lang in self.data_by_lang:
if lang is not init_lang:
try:
tr = translations[lang]
except KeyError: # there are no available translation in db
except KeyError:
# there are no available translation in db
tr = inst.translate(lang)
for key, value in self.data_by_lang[lang].iteritems(): #{en:{name:adf, descr:jkdl}, ru:{name:fjfj, descr:jfjf}}
for key, value in self.data_by_lang[lang].iteritems():
setattr(tr, key, value)
tr.save()
self.instance = inst.lazy_translation_getter(init_lang)
return self.instance
@ -131,14 +142,20 @@ class TranslatableModelForm(forms.ModelForm):
def data_by_lang(self):
res = {}
for lang in [code for code, _ in settings.LANGUAGES]:
res[lang] = {key[:-3]:self.cleaned_data[key] for key in self.cleaned_data if key.endswith("_%s"%lang)and self.cleaned_data[key]}
res[lang] = {key[:-3]: self.cleaned_data[key] for key in self.cleaned_data
if key.endswith("_%s" % lang) and self.cleaned_data[key]}
result = {k: v for k, v in res.iteritems() if v}
return result
def fill_init_field(self, inst):
"""
:param inst:
:return: dictionary with populated fields format: {<field>_<language_code>: value}
"""
init_tr_data = {}
for code in inst.get_available_languages():
translation = inst.translations.get(language_code=code)
for field in self.all_tr_field_names:
init_tr_data[field+"_%s" % code] = getattr(translation,field)
for field in self._all_tr_field_names:
init_tr_data[field+"_%s" % code] = getattr(translation, field)
return init_tr_data
Loading…
Cancel
Save