You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
91 lines
3.4 KiB
91 lines
3.4 KiB
# -*- coding: utf-8 -*-
|
|
from django.conf import settings
|
|
#default language
|
|
|
|
#
|
|
ZERO_LANGUAGE = 'ru'
|
|
|
|
def fill_trans_fields(obj=None, data={}, lang=''):
|
|
"""
|
|
fills obj translated fields with data in data dictionary with one language
|
|
|
|
uses 2 types of objects, example: 1) object new - obj = Country.objects.get(id=1)
|
|
2) object exist - obj =Country._meta.translations_model.objects.get(language_code = 'ru',master__id=1)
|
|
list of fields in first object writes with _translated_field_names and return list of strings
|
|
in second object writes with _meta.fields and return list of object. field name we must call obj[0].name
|
|
"""
|
|
#fills new object
|
|
if '_translated_field_names' in dir(obj):
|
|
list = obj._translated_field_names
|
|
|
|
for field in list:
|
|
n = data.get('%s_%s'%(field, lang))
|
|
if n != None:
|
|
setattr(obj, str(field), n)
|
|
#fill existing object
|
|
else:
|
|
list = obj._meta.fields
|
|
for field in list:
|
|
n = data.get('%s_%s'%(field.name,lang))
|
|
if n != None:
|
|
setattr(obj,str(field.name), n)
|
|
|
|
def fill_trans_fields_all(Model, new_obj, data={}, id=None, zero_fields={}):
|
|
"""
|
|
Fills obj passing trough all languages
|
|
|
|
id - used for checking existing object
|
|
if id=None object doesn't exist and fills new_obj
|
|
else fills existing Model object
|
|
|
|
zero_fields used for generating dictionary which will be checking already populated fields
|
|
"""
|
|
|
|
for lid, (code, name) in enumerate(settings.LANGUAGES):
|
|
#fills new object
|
|
if not id:
|
|
new_obj.translate(code)
|
|
fill_trans_fields(new_obj, data,code)
|
|
new_obj.save()
|
|
#fills existing object
|
|
# and fills zero_fields dictionary with data of zero language
|
|
else:
|
|
existing_obj = Model._meta.translations_model.objects.get(language_code = code,master__id=id) #access to translated fields
|
|
if lid==0:
|
|
list = existing_obj._meta.fields
|
|
for field in list:
|
|
zero_fields[field.name] = getattr(existing_obj, field.name)###################
|
|
|
|
fill_trans_fields(existing_obj, data, code)
|
|
existing_obj.save()
|
|
|
|
|
|
def populate(obj=None, data={}, lang=ZERO_LANGUAGE, zero_fields={}):
|
|
"""
|
|
compare translated fields with empty values and values which was already populate(zero_language)
|
|
and populate obj fields if it is true zero_fields fields
|
|
|
|
block try for fields like id, Foreignkey...
|
|
"""
|
|
list = obj._meta.fields
|
|
for field in list:
|
|
#compare empty values
|
|
if getattr(obj,field.name) == '':
|
|
try: setattr(obj, field.name, data['%s_%s'%(field.name, ZERO_LANGUAGE)])
|
|
except: pass
|
|
##compare populated values
|
|
if field.name in zero_fields:
|
|
if getattr(obj,field.name) == zero_fields['%s'%field.name]:
|
|
try: setattr(obj, field.name, data['%s_%s'%(field.name, ZERO_LANGUAGE)])
|
|
except: pass
|
|
|
|
|
|
def populate_all(Model, data={}, id=None, zero_fields={}):
|
|
|
|
for lid, (code, name) in enumerate(settings.LANGUAGES):
|
|
if lid == 0:
|
|
pass
|
|
else:
|
|
obj = Model._meta.translations_model.objects.get(language_code = code,master__id=id)
|
|
populate(obj,data,code,zero_fields)
|
|
obj.save() |