Source code for boardinghouse.admin

"""

"""
from __future__ import unicode_literals

from django.conf import settings
from django.contrib import admin
from django.contrib.admin.models import LogEntry
from django.db import models
from django.dispatch import receiver

from .models import Schema
from .schema import get_active_schema, is_shared_model, get_schema_model


[docs]class SchemaAdmin(admin.ModelAdmin): """ The `ModelAdmin` for the schema class should protect the `schema` field, but only once the object has been saved. """
[docs] def get_readonly_fields(self, request, obj=None): """ Prevents `schema` from being editable once created. """ if obj is not None: return ('schema',) return ()
filter_horizontal = ('users',)
# We only want to install our SchemaAdmin if our schema model is the # one that is used: otherwise it's up to the project developer to # add it to the admin, if they want it. if get_schema_model() == Schema: admin.site.register(Schema, SchemaAdmin)
[docs]def schemata(obj): """ Useful function for adding schemata representation to admin list view. """ return '<br>'.join([s.name for s in obj.schemata.all()])
schemata.allow_tags = True
[docs]def get_inline_instances(self, request, obj=None): """ Prevent the display of non-shared inline objects associated with _every_ model if no schema is currently selected. If we don't patch this, then a ``DatabaseError`` will occur because the tables could not be found. """ schema = get_active_schema() return [ inline(self.model, self.admin_site) for inline in self.inlines if schema or is_shared_model(inline.model) ]
admin.ModelAdmin.get_inline_instances = get_inline_instances if not getattr(LogEntry, 'object_schema', None): LogEntry.add_to_class( 'object_schema', models.ForeignKey(settings.BOARDINGHOUSE_SCHEMA_MODEL, blank=True, null=True) ) @receiver(models.signals.pre_save, sender=LogEntry) def update_object_schema(sender, instance, **kwargs): obj = instance.get_edited_object() if not is_shared_model(obj): instance.object_schema_id = obj._schema get_admin_url = LogEntry.get_admin_url def get_admin_url_with_schema(self): url = get_admin_url(self) if self.object_schema_id and url: return '{}?__schema={}'.format(url, self.object_schema_id) return url LogEntry.get_admin_url = get_admin_url_with_schema