Source code for boardinghouse.apps

from __future__ import unicode_literals

from django.apps import AppConfig
from django.core.checks import register, Error


[docs]class BoardingHouseConfig(AppConfig): """ Default AppConfig for django-boardinghouse. """ name = 'boardinghouse' def ready(self): load_app_settings() inject_required_settings() monkey_patch_user() register_signals()
DB_ENGINES = ['boardinghouse.backends.postgres'] @register('settings')
[docs]def check_db_backend(app_configs=None, **kwargs): "Ensure all database backends are using a backend that we work with." from django.conf import settings errors = [] for name, data in settings.DATABASES.items(): if data['ENGINE'] not in DB_ENGINES: errors.append(Error( 'DATABASES[%s][ENGINE] of %s is not a known backend.' % ( name, data['ENGINE'] ), hint="Try boardinghouse.backends.postgres", id='boardinghouse.E001', )) return errors
@register('settings')
[docs]def check_session_middleware_installed(app_configs=None, **kwargs): """Ensure that SessionMiddleware is installed. Without it, we would be unable to store which schema should be active for a given request. """ from django.conf import settings for middleware in settings.MIDDLEWARE_CLASSES: if middleware.endswith('.SessionMiddleware'): return [] return [Error( 'It appears that no session middleware is installed.', hint="Add 'django.contrib.sessions.middleware.SessionMiddleware' to your MIDDLEWARE_CLASSES", id='boardinghouse.E002', )]
[docs]def monkey_patch_user(): """ Add a property to the defined user model that gives us the visible schemata. Add properties to :class:`django.contrib.auth.models.AnonymousUser` that return empty querysets for visible and all schemata. """ from django.contrib.auth import get_user_model, models from .schema import get_schema_model from .models import visible_schemata Schema = get_schema_model() User = get_user_model() if not getattr(User, 'visible_schemata', None): User.visible_schemata = property(visible_schemata) models.AnonymousUser.schemata = Schema.objects.none() models.AnonymousUser.visible_schemata = Schema.objects.none()
[docs]def load_app_settings(): """ Load up the app settings defaults. See :mod:`boardinghouse.settings` """ from boardinghouse import settings as app_settings from django.conf import settings, global_settings for key in dir(app_settings): if key.isupper(): value = getattr(app_settings, key) setattr(global_settings, key, value) if not hasattr(settings, key): setattr(settings, key, value)
[docs]def inject_required_settings(): """Inject our middleware and context processor. :class:`boardinghouse.middleware.SchemaMiddleware` :class:`boardinghouse.context_processors.schemata` """ from django.conf import settings MIDDLEWARE = 'boardinghouse.middleware.SchemaMiddleware' CONTEXT = 'boardinghouse.context_processors.schemata' if MIDDLEWARE not in settings.MIDDLEWARE_CLASSES: settings.MIDDLEWARE_CLASSES += type(settings.MIDDLEWARE_CLASSES)([MIDDLEWARE]) if hasattr(settings, 'TEMPLATES'): for engine in settings.TEMPLATES: if 'OPTIONS' not in engine: engine['OPTIONS'] = {} engine['OPTIONS']['context_processors'] = [CONTEXT] if hasattr(settings, 'TEMPLATE_CONTEXT_PROCESSORS'): if CONTEXT not in settings.TEMPLATE_CONTEXT_PROCESSORS: settings.TEMPLATE_CONTEXT_PROCESSORS += type(settings.TEMPLATE_CONTEXT_PROCESSORS)([CONTEXT])
def register_signals(): from django.db import models from boardinghouse import signals from .schema import get_schema_model Schema = get_schema_model() models.signals.post_save.connect(signals.create_schema, sender=Schema, weak=True, dispatch_uid='create-schema') models.signals.post_init.connect(signals.inject_schema_attribute, sender=None, weak=True) models.signals.m2m_changed.connect(signals.invalidate_cache, sender=Schema.users.through, weak=True) models.signals.post_save.connect(signals.invalidate_all_user_caches, sender=Schema, weak=True) models.signals.pre_migrate.connect(signals.invalidate_all_caches, weak=True)