60 lines
2.1 KiB
Python
60 lines
2.1 KiB
Python
import os
|
|
|
|
from django.core.management.commands import makemessages
|
|
|
|
from orchestra.core.translations import ModelTranslation
|
|
from orchestra.utils.paths import get_site_dir
|
|
|
|
|
|
class Command(makemessages.Command):
|
|
""" Provides database translations support """
|
|
def handle(self, *args, **options):
|
|
self.database_files = []
|
|
try:
|
|
if os.getcwd() == get_site_dir():
|
|
self.generate_database_files()
|
|
super(Command, self).handle(*args, **options)
|
|
finally:
|
|
self.remove_database_files()
|
|
|
|
def get_contents(self):
|
|
for model, fields in ModelTranslation._registry.items():
|
|
for field in fields:
|
|
contents = []
|
|
for content in model.objects.values_list('id', field):
|
|
pk, value = content
|
|
contents.append(
|
|
(pk, "_(u'%s')" % value)
|
|
)
|
|
if contents:
|
|
yield ('_'.join((model._meta.db_table, field)), contents)
|
|
|
|
def generate_database_files(self):
|
|
"""
|
|
Tmp files are generated because:
|
|
1) having a nice gettext location
|
|
# database_db_table_field.sql.py:id
|
|
|
|
2) Django's makemessages will work with no modifications
|
|
"""
|
|
for name, contents in self.get_contents():
|
|
name = str(name)
|
|
maximum = None
|
|
content = {}
|
|
for pk, value in contents:
|
|
if not maximum or pk > maximum:
|
|
maximum = pk
|
|
content[pk] = value
|
|
tmpcontent = []
|
|
for ix in range(maximum+1):
|
|
tmpcontent.append(content.get(ix, ''))
|
|
tmpcontent = '\n'.join(tmpcontent) + '\n'
|
|
filename = 'database_%s.sql.py' % name
|
|
self.database_files.append(filename)
|
|
with open(filename, 'wb') as tmpfile:
|
|
tmpfile.write(tmpcontent.encode('utf-8'))
|
|
|
|
def remove_database_files(self):
|
|
for path in self.database_files:
|
|
os.unlink(path)
|