Add grammar to tags. Also: respect custom tag slugs on publishing.
[wolnelektury.git] / src / wolnelektury / management / commands / localepack.py
index bd63192..9f2b424 100644 (file)
@@ -1,21 +1,18 @@
-# -*- coding: utf-8 -*-
 # This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later.
 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
 #
-from optparse import make_option
+import os
+import shutil
+import sys
+import tempfile
 from django.conf import settings
 from django.core.management.base import BaseCommand
 from django.core.management import call_command
+from wolnelektury.utils import makedirs
 from .translation2po import get_languages
 
-import os
-import shutil
-import tempfile
-import sys
-
-import allauth
 
-ROOT = os.path.dirname(settings.PROJECT_DIR)
+ROOT = settings.ROOT_DIR
 
 
 def is_our_app(mod):
@@ -26,15 +23,18 @@ class Locale(object):
     def save(self, output_directory, languages):
         pass
 
+    def compile(self):
+        pass
+
     def generate(self, languages):
         pass
 
+
 def copy_f(frm, to):
-    "I can create a necessary dest directiories, yey!"
-    if not os.path.exists(os.path.dirname(to)):
-        os.makedirs(os.path.dirname(to))
+    makedirs(os.path.dirname(to))
     shutil.copyfile(frm, to)
 
+
 class AppLocale(Locale):
     def __init__(self, appmod):
         self.app = appmod
@@ -54,28 +54,26 @@ class AppLocale(Locale):
             lc = lc[0]
             if os.path.exists(os.path.join(self.path, 'locale', lc)):
                 copy_f(os.path.join(self.path, 'locale', lc, 'LC_MESSAGES', 'django.po'),
-                          os.path.join(output_directory, lc, self.name + '.po'))
-
+                       os.path.join(output_directory, lc, self.name + '.po'))
 
     def load(self, input_directory, languages):
         for lc in zip(*languages)[0]:
             if os.path.exists(os.path.join(input_directory, lc, self.name + '.po')):
                 out = os.path.join(self.path, 'locale', lc, 'LC_MESSAGES', 'django.po')
-                if not os.path.exists(os.path.dirname(out)):
-                    os.makedirs(os.path.dirname(out))
-                copy_f(os.path.join(input_directory, lc, self.name + '.po'),
-                             out)
+                makedirs(os.path.dirname(out))
+                copy_f(os.path.join(input_directory, lc, self.name + '.po'), out)
+        self.compile()
 
+    def compile(self):
         wd = os.getcwd()
         os.chdir(self.path)
         try:
-            call_command('compilemessages', settings='wolnelektury.settings')
+            call_command('compilemessages', verbosity=0, settings='wolnelektury.settings')
         except:
             pass
         finally:
             os.chdir(wd)
 
-
     def generate(self, languages):
         wd = os.getcwd()
         os.chdir(self.path)
@@ -100,38 +98,6 @@ class ModelTranslation(Locale):
                      load=True, lang=','.join(zip(*languages)[0]), poname=self.poname, keep_running=True)
 
 
-class CustomLocale(Locale):
-    def __init__(self, app_dir,
-                 config=os.path.join(ROOT, "babel.cfg"),
-                 out_file=os.path.join(ROOT, 'wolnelektury/locale-contrib/django.pot'),
-                 name=None):
-        self.app_dir = app_dir
-        self.config = config
-        self.out_file = out_file
-        self.name = name
-
-    def generate(self, languages):
-        os.system('pybabel extract -F "%s" -o "%s" "%s"' % (self.config, self.out_file, self.app_dir))
-        os.system('pybabel update -D django -i %s -d %s' % (self.out_file, os.path.dirname(self.out_file)))
-
-    def po_file(self, language):
-        d = os.path.dirname(self.out_file)
-        n = os.path.basename(self.out_file).split('.')[0]
-        return os.path.join(d, language, 'LC_MESSAGES', n + '.po')
-
-    def save(self, output_directory, languages):
-        for lc in zip(*languages)[0]:
-            if os.path.exists(self.po_file(lc)):
-                copy_f(self.po_file(lc),
-                             os.path.join(output_directory, lc, self.name + '.po'))
-
-    def load(self, input_directory, languages):
-        for lc in zip(*languages)[0]:
-            copy_f(os.path.join(input_directory, lc, self.name + '.po'),
-                         self.po_file(lc))
-        os.system('pybabel compile -D django -d %s' % os.path.dirname(self.out_file))
-
-
 SOURCES = []
 
 for appn in settings.INSTALLED_APPS:
@@ -139,25 +105,41 @@ for appn in settings.INSTALLED_APPS:
     if is_our_app(app):
         try:
             SOURCES.append(AppLocale(app))
-        except LookupError, e:
-            print "no locales in %s" % app.__name__
+        except LookupError as e:
+            print("no locales in %s" % app.__name__)
 
 SOURCES.append(ModelTranslation('infopages', 'infopages_db'))
-SOURCES.append(CustomLocale(os.path.dirname(allauth.__file__), name='contrib'))
 
 
 class Command(BaseCommand):
-    option_list = BaseCommand.option_list + (
-        make_option('-l', '--load', help='load locales back to source', action='store_true', dest='load', default=False),
-        make_option('-L', '--lang', help='load just one language', dest='lang', default=None),
-        make_option('-d', '--directory', help='load from this directory', dest='directory', default=None),
-        make_option('-o', '--outfile', help='Resulting zip file', dest='outfile', default='./wl-locale.zip'),
-        make_option('-m', '--merge', help='Use git to merge. Please use with clean working directory.', action='store_true', dest='merge', default=False),
-        make_option('-M', '--message', help='commit message', dest='message', default='New locale'),
-
-        )
     help = 'Make a locale pack'
-    args = ''
+
+    def add_arguments(self, parser):
+        parser.add_argument(
+                '-l', '--load', help='load locales back to source',
+                action='store_true', dest='load', default=False)
+        parser.add_argument(
+                '-c', '--compile', help='compile messages',
+                action='store_true', dest='compile', default=False)
+        parser.add_argument(
+                '-g', '--generate', help='generate messages',
+                action='store_true', dest='generate', default=False)
+        parser.add_argument(
+                '-L', '--lang', help='load just one language',
+                dest='lang', default=None)
+        parser.add_argument(
+                '-d', '--directory', help='load from this directory',
+                dest='directory', default=None)
+        parser.add_argument(
+                '-o', '--outfile', help='Resulting zip file',
+                dest='outfile', default='./wl-locale.zip')
+        parser.add_argument(
+                '-m', '--merge', action='store_true',
+                dest='merge', default=False,
+                help='Use git to merge. Please use with clean working directory.')
+        parser.add_argument(
+                '-M', '--message', help='commit message',
+                dest='message', default='New locale')
 
     def current_rev(self):
         return os.popen('git rev-parse HEAD').read()
@@ -192,32 +174,46 @@ class Command(BaseCommand):
             rf.write(rev)
             rf.close()
 
-
             cwd = os.getcwd()
             try:
                 os.chdir(os.path.dirname(out_dir))
                 self.system('zip -r %s %s' % (os.path.join(cwd, packname_b+'.zip'), os.path.basename(out_dir)))
             finally:
                 os.chdir(cwd)
-                #            shutil.make_archive(packname_b, fmt, root_dir=os.path.dirname(out_dir), base_dir=os.path.basename(out_dir))
+                # shutil.make_archive(packname_b, fmt, root_dir=os.path.dirname(out_dir),
+                #                     base_dir=os.path.basename(out_dir))
         finally:
             shutil.rmtree(tmp_dir, ignore_errors=True)
 
+    def generate(self):
+        for src in SOURCES:
+            src.generate(settings.LANGUAGES)
+
     def load(self, options):
         langs = get_languages(options['lang'])
 
         for src in SOURCES:
             src.load(options['directory'], langs)
 
-    def handle(self, *a, **options):
+    def compile(self):
+        for src in SOURCES:
+            src.compile()
+
+    def handle(self, **options):
         if options['load']:
             if not options['directory'] or not os.path.exists(options['directory']):
-                print "Directory not provided or does not exist, please use -d"
+                print("Directory not provided or does not exist, please use -d")
                 sys.exit(1)
 
-            if options['merge']: self.merge_setup(options['directory'])
+            if options['merge']:
+                self.merge_setup(options['directory'])
             self.load(options)
-            if options['merge']: self.merge_finish(options['message'])
+            if options['merge']:
+                self.merge_finish(options['message'])
+        elif options['generate']:
+            self.generate()
+        elif options['compile']:
+            self.compile()
         else:
             self.save(options)