Use a context manager for temporary locale switches

This commit is contained in:
Raphael Michel
2016-03-15 17:59:32 +01:00
parent 1d8f2034de
commit 1f665e6f48
5 changed files with 119 additions and 115 deletions

View File

@@ -1,5 +1,6 @@
import copy
import json
from contextlib import contextmanager
from django import forms
from django.conf import settings
@@ -75,11 +76,8 @@ class LazyI18nString:
self.lazygettext = lazygettext
def __getitem__(self, item):
lng = translation.get_language()
translation.activate(item)
s = str(ugettext(self.lazygettext))
translation.activate(lng)
return s
with language(item):
return str(ugettext(self.lazygettext))
def __contains__(self, item):
return True
@@ -334,3 +332,13 @@ class LazyNumber:
def __str__(self):
return number_format(self.value, decimal_pos=self.decimal_pos)
@contextmanager
def language(lng):
_lng = translation.get_language()
translation.activate(lng or settings.LANGUAGE_CODE)
try:
yield
finally:
translation.activate(_lng)

View File

@@ -22,6 +22,7 @@ from reportlab.platypus import (
Table, TableStyle,
)
from pretix.base.i18n import language
from pretix.base.models import Invoice, InvoiceAddress, InvoiceLine, Order
from pretix.base.signals import register_payment_providers
@@ -47,12 +48,11 @@ def generate_cancellation(invoice: Invoice):
@transaction.atomic
def generate_invoice(order: Order):
locale = order.event.settings.get('invoice_language')
_lng = translation.get_language()
if locale:
if locale == '__user__':
locale = order.locale
translation.activate(locale or settings.LANGUAGE_CODE)
with language(locale):
i = Invoice(order=order, event=order.event)
i.invoice_from = order.event.settings.get('invoice_address_from')
i.additional_text = order.event.settings.get('invoice_additional_text')
@@ -97,7 +97,6 @@ def generate_invoice(order: Order):
tax_rate=order.payment_fee_tax_rate
)
translation.activate(_lng)
invoice_pdf(i.pk)
@@ -316,16 +315,12 @@ def _invoice_generate_german(invoice, f):
def invoice_pdf(invoice: int):
i = Invoice.objects.get(pk=invoice)
_lng = translation.get_language()
translation.activate(i.locale)
with language(i.locale):
with tempfile.NamedTemporaryFile(suffix=".pdf") as f:
_invoice_generate_german(i, f)
f.seek(0)
i.file.save('invoice.pdf', ContentFile(f.read()))
i.save()
translation.activate(_lng)
return i.file.name

View File

@@ -7,7 +7,7 @@ from django.utils import translation
from django.utils.translation import ugettext as _
from typing import Any, Dict
from pretix.base.i18n import LazyI18nString
from pretix.base.i18n import LazyI18nString, language
from pretix.base.models import Event
logger = logging.getLogger('pretix.base.mail')
@@ -39,10 +39,7 @@ def mail(email: str, subject: str, template: str,
the email has been sent, just that it has been queued by the e-mail
backend.
"""
_lng = translation.get_language()
if locale:
translation.activate(locale or settings.LANGUAGE_CODE)
with language(locale):
if isinstance(template, LazyI18nString):
body = str(template)
if context:
@@ -64,10 +61,7 @@ def mail(email: str, subject: str, template: str,
"You are receiving this e-mail because you placed an order for {event}."
).format(event=event.name)
body += "\r\n"
try:
return mail_send([email], subject, body, sender, event.id if event else None)
finally:
translation.activate(_lng)
def mail_send(to: str, subject: str, body: str, sender: str, event: int=None) -> bool:

View File

@@ -2,11 +2,12 @@ from datetime import datetime, timedelta
from django.conf import settings
from django.db import transaction
from django.utils import translation
from django.utils.timezone import now
from django.utils.translation import ugettext_lazy as _
from typing import List
from pretix.base.i18n import LazyDate, LazyNumber
from pretix.base.i18n import LazyDate, LazyNumber, language
from pretix.base.models import (
CartPosition, Event, EventLock, Order, OrderPosition, Quota, User,
)
@@ -231,6 +232,7 @@ def _create_order(event: Event, email: str, positions: List[CartPosition], dt: d
def _perform_order(event: str, payment_provider: str, position_ids: List[str],
email: str, locale: str, address: int):
event = Event.objects.get(id=event)
responses = register_payment_providers.send(event)
pprov = None
@@ -266,6 +268,7 @@ def _perform_order(event: str, payment_provider: str, position_ids: List[str],
if event.settings.get('invoice_generate'):
generate_invoice(order)
with language(order.locale):
mail(
order.email, _('Your order: %(code)s') % {'code': order.code},
event.settings.mail_text_order_placed,
@@ -282,6 +285,7 @@ def _perform_order(event: str, payment_provider: str, position_ids: List[str],
},
event, locale=order.locale
)
return order.id

View File

@@ -7,11 +7,12 @@ from django.core.urlresolvers import reverse
from django.db.models import Q
from django.http import Http404, HttpResponseNotAllowed
from django.shortcuts import redirect, render
from django.utils.functional import cached_property
from django.utils.functional import cached_property, lazy
from django.utils.timezone import now
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import gettext, ugettext_lazy as _
from django.views.generic import DetailView, ListView, TemplateView, View
from pretix.base.i18n import language
from pretix.base.models import (
CachedFile, CachedTicket, EventLock, Invoice, Item, Order, Quota,
)
@@ -206,8 +207,10 @@ class OrderResendLink(OrderView):
permission = 'can_change_orders'
def post(self, *args, **kwargs):
with language(self.order.locale):
mail(
self.order.email, _('Your order: %(code)s') % {'code': self.order.code},
self.order.email,
_('Your order: %(code)s') % {'code': self.order.code},
self.order.event.settings.mail_text_resend_link,
{
'event': self.order.event.name,