Browse Source

Add respect_language utility method to force language use when there is no contexts likes in shell commands

Fabs 10 years ago
parent
commit
66ca10be7f
3 changed files with 35 additions and 5 deletions
  1. 4 2
      coin/billing/management/commands/charge_subscriptions.py
  2. 0 3
      coin/html2pdf.py
  3. 31 0
      coin/utils.py

+ 4 - 2
coin/billing/management/commands/charge_subscriptions.py

@@ -1,7 +1,9 @@
 # -*- coding: utf-8 -*-
 import datetime
 from django.core.management.base import BaseCommand, CommandError
+from django.conf import settings
 
+from coin.utils import respect_language
 from coin.billing.create_subscriptions_invoices import create_all_members_invoices_for_a_period
 
 
@@ -20,8 +22,8 @@ class Command(BaseCommand):
 
         self.stdout.write(
             'Create invoices for all members for the date : %s' % date)
-
-        invoices = create_all_members_invoices_for_a_period(date)
+        with respect_language(settings.LANGUAGE_CODE):
+            invoices = create_all_members_invoices_for_a_period(date)
 
         self.stdout.write(
             u'%d invoices were created' % len(invoices))

+ 0 - 3
coin/html2pdf.py

@@ -9,7 +9,6 @@ from tempfile import NamedTemporaryFile
 from django.conf import settings
 from django.template import loader, Context
 from django.core.files import File
-from django.utils import translation
 
 
 def link_callback(uri, rel):
@@ -52,8 +51,6 @@ def render_as_pdf(template, context):
     converti en PDF via le module xhtml2pdf.
     Renvoi un objet de type File
     """
-    # Force locale, because isn't done when launched from managment command
-    translation.activate(settings.LANGUAGE_CODE)
     
     template = loader.get_template(template)
     html = template.render(Context(context))

+ 31 - 0
coin/utils.py

@@ -8,7 +8,9 @@ import base64
 import html2text
 import re
 from datetime import date, timedelta
+from contextlib import contextmanager
 
+from django.utils import translation
 from django.core.mail import EmailMultiAlternatives
 from django.core.files.storage import FileSystemStorage
 from django.conf import settings
@@ -112,5 +114,34 @@ def end_of_month():
     else:
         return date(today.year, today.month + 1, 1) - timedelta(days=1)
 
+@contextmanager
+def respect_language(language):
+    """Context manager that changes the current translation language for
+    all code inside the following block.
+    Can be used like this::
+        from amorce.utils import respect_language
+        def my_func(language='fr'):
+            with respect_language(language):
+                pass
+    """
+    if language:
+        prev = translation.get_language()
+        translation.activate(language)
+        try:
+            yield
+        finally:
+            translation.activate(prev)
+    else:
+        yield
+
+
+def respects_language(fun):
+    """Associated decorator"""
+    @wraps(fun)
+    def _inner(*args, **kwargs):
+        with respect_language(kwargs.pop('language', None)):
+            return fun(*args, **kwargs)
+    return _inner
+
 if __name__ == '__main__':
     print(ldap_hash('coin'))