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

# -*- 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()