diff --git a/functions/forms.py b/functions/forms.py index bf185a04..e011dda3 100644 --- a/functions/forms.py +++ b/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: {_: 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 \ No newline at end of file