Source code for thorn.environment.django
"""Django web framework environment."""
from __future__ import absolute_import, unicode_literals
import importlib
import os
from functools import partial
from celery.utils import cached_property
from celery.utils.imports import symbol_by_name
try:
from django.db.transaction import TransactionManagementError, on_commit
except ImportError: # pragma: no cover
# django < 1.9
TransactionManagementError = on_commit = None # nqoa
__all__ = ['DjangoEnv']
[docs]class DjangoEnv(object):
"""Thorn Django environment."""
settings_cls = 'django.conf:settings'
subscriber_cls = 'thorn.django.models:Subscriber'
signals_cls = 'thorn.django.signals'
reverse_cls = 'django.core.urlresolvers:reverse'
[docs] def on_commit(self, fun, *args, **kwargs):
if args or kwargs:
fun = partial(fun, *args, **kwargs)
if on_commit is not None:
try:
return on_commit(fun)
except TransactionManagementError:
pass # not in transaction management, execute now.
return fun()
@staticmethod
[docs] def autodetect(env='DJANGO_SETTINGS_MODULE'):
return os.environ.get(env)
@cached_property
[docs] def config(self):
return symbol_by_name(self.settings_cls)
@cached_property
[docs] def Subscriber(self):
return symbol_by_name(
getattr(self.config, 'THORN_SUBSCRIBER_MODEL', None) or
self.subscriber_cls)
@cached_property
[docs] def Subscribers(self):
return self.Subscriber.objects
@cached_property
[docs] def signals(self):
return importlib.import_module(self.signals_cls)
@cached_property
[docs] def reverse(self):
return symbol_by_name(self.reverse_cls)