54 lines
2.0 KiB
Python
54 lines
2.0 KiB
Python
|
import os
|
||
|
|
||
|
from django.core.management.commands import makemessages
|
||
|
|
||
|
from orchestra.core.translations import ModelTranslation
|
||
|
from orchestra.utils.paths import get_site_root
|
||
|
|
||
|
|
||
|
class Command(makemessages.Command):
|
||
|
""" Provides database translations support """
|
||
|
|
||
|
def handle(self, *args, **options):
|
||
|
do_database = os.getcwd() == get_site_root()
|
||
|
self.generated_database_files = []
|
||
|
if do_database:
|
||
|
self.project_locale_path = get_site_root()
|
||
|
self.generate_database_files()
|
||
|
super(Command, self).handle(*args, **options)
|
||
|
self.remove_database_files()
|
||
|
|
||
|
def get_contents(self):
|
||
|
for model, fields in ModelTranslation._registry.iteritems():
|
||
|
contents = []
|
||
|
for field in fields:
|
||
|
for content in model.objects.values_list('id', field):
|
||
|
pk, value = content
|
||
|
contents.append(
|
||
|
(pk, u"_(u'%s')" % value)
|
||
|
)
|
||
|
yield ('_'.join((model._meta.db_table, field)), contents)
|
||
|
|
||
|
def generate_database_files(self):
|
||
|
""" tmp files are generated because of having a nice gettext location """
|
||
|
for name, contents in self.get_contents():
|
||
|
name = unicode(name)
|
||
|
maximum = None
|
||
|
content = {}
|
||
|
for pk, value in contents:
|
||
|
if not maximum or pk > maximum:
|
||
|
maximum = pk
|
||
|
content[pk] = value
|
||
|
tmpcontent = []
|
||
|
for ix in xrange(maximum+1):
|
||
|
tmpcontent.append(content.get(ix, ''))
|
||
|
tmpcontent = u'\n'.join(tmpcontent) + '\n'
|
||
|
filepath = os.path.join(self.project_locale_path, 'database_%s.sql.py' % name)
|
||
|
self.generated_database_files.append(filepath)
|
||
|
with open(filepath, 'w') as tmpfile:
|
||
|
tmpfile.write(tmpcontent.encode('utf-8'))
|
||
|
|
||
|
def remove_database_files(self):
|
||
|
for path in self.generated_database_files:
|
||
|
os.unlink(path)
|