Add grammar to tags. Also: respect custom tag slugs on publishing.
[wolnelektury.git] / src / wolnelektury / management / commands / localepack.py
index 5458904..9f2b424 100644 (file)
@@ -1,22 +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 .translation2po import get_languages
 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):
@@ -27,6 +23,9 @@ class Locale(object):
     def save(self, output_directory, languages):
         pass
 
+    def compile(self):
+        pass
+
     def generate(self, languages):
         pass
 
@@ -63,11 +62,13 @@ class AppLocale(Locale):
                 out = os.path.join(self.path, 'locale', lc, 'LC_MESSAGES', 'django.po')
                 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:
@@ -97,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:
@@ -136,26 +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()
@@ -201,16 +185,24 @@ class Command(BaseCommand):
         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']:
@@ -218,6 +210,10 @@ class Command(BaseCommand):
             self.load(options)
             if options['merge']:
                 self.merge_finish(options['message'])
+        elif options['generate']:
+            self.generate()
+        elif options['compile']:
+            self.compile()
         else:
             self.save(options)