Source code for boardinghouse.contrib.template.apps

from importlib import import_module

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


class BoardingHouseTemplateConfig(AppConfig):
    name = 'boardinghouse.contrib.template'

    def ready(self):
        if not hasattr(settings, 'BOARDINGHOUSE_TEMPLATE_PREFIX'):
            settings.BOARDINGHOUSE_TEMPLATE_PREFIX = '__tmpl_'

        from boardinghouse.schema import get_schema_model

        from .models import SchemaTemplate
        from ..template import receivers  # NOQA

        if 'django.contrib.admin' in settings.INSTALLED_APPS:
            # We can't just add the action to the SchemaAdmin, because that may not be a subclass of ModelAdmin,
            # in which case the action would be applied to all models.
            from .admin import create_template_from_schema
            Schema = get_schema_model()
            module = import_module(Schema.__module__.rsplit('.', 1)[0] + '.admin')
            BaseSchemaAdmin = module.admin.site._registry[Schema].__class__

            from django.contrib import admin
            from django import forms

            admin.site.unregister(Schema)

            class SchemaAdmin(BaseSchemaAdmin):
                actions = list(BaseSchemaAdmin.actions or []) + [create_template_from_schema]

                def get_form(self, request, obj=None, **kwargs):
                    if not obj and 'boardinghouse.contrib.template' in settings.INSTALLED_APPS:
                        class SchemaAdminForm(BaseSchemaAdmin.form or forms.ModelForm):
                            clone_schema = forms.ModelChoiceField(required=False,
                                                                  queryset=SchemaTemplate.objects.all())
                        kwargs['form'] = SchemaAdminForm
                    return super(SchemaAdmin, self).get_form(request, obj, **kwargs)

                def get_fields(self, request, obj):
                    fields = super(SchemaAdmin, self).get_fields(request, obj)
                    if 'clone_schema' in fields:
                        fields.remove('clone_schema')
                        return ['clone_schema'] + fields
                    return fields

                def save_model(self, request, obj, form, change):
                    if not change and form.cleaned_data.get('clone_schema') is not None:
                        obj._clone = form.cleaned_data['clone_schema'].schema
                    return super(SchemaAdmin, self).save_model(request, obj, form, change)

            admin.site.register(Schema, SchemaAdmin)


@register('settings')
[docs]def check_template_prefix_stats_with_underscore(app_configs=None, **kwargs): """Ensure that the prefix for schema template internal names starts with underscore. This is required because a leading underscore is the trigger that the indicated schema is not a "regular" schema, and should not be activated according to the normal rules. """ from django.conf import settings if not settings.BOARDINGHOUSE_TEMPLATE_PREFIX.startswith('_'): return [Error('BOARDINGHOUSE_TEMPLATE_PREFIX must start with an underscore', id='boardinghouse.contrib.template.E001')] return []