"""``RDFAdminSite`` — a parallel admin site for ``RDFModel`` classes.
Because ``RDFModel`` is not a ``django.db.models.Model``, registering
it through ``django.contrib.admin.site.register()`` is not possible.
This site keeps its own registry and URL conf; include
``rdf_admin_site.urls`` in your project's URL config to mount it.
"""
from typing import Dict, Optional, Type
from django.urls import path
from .options import RDFModelAdmin
[docs]
class RDFAdminSite:
"""Per-process registry plus URL conf for RDFModel admins."""
def __init__(self, name: str = "djangordf_admin"):
self.name = name
self._registry: Dict[str, RDFModelAdmin] = {}
# -- registration -------------------------------------------------------
[docs]
def register(
self,
model_class,
admin_class: Optional[Type[RDFModelAdmin]] = None,
):
"""Register a model class with an optional admin class.
Use the two-arg form for explicit registration::
rdf_admin_site.register(Term, TermAdmin)
or the decorator form, mirroring Django's
``@admin.register(Model)``::
@rdf_admin_site.register(Term)
class TermAdmin(RDFModelAdmin):
list_display = ("iri", "pref_label")
"""
if admin_class is not None:
self._do_register(model_class, admin_class)
return None
# Decorator form. Also register a default admin immediately so
# callers that forget the decorator still see the model in the
# admin index.
self._do_register(model_class, RDFModelAdmin)
def _decorator(cls):
self._do_register(model_class, cls)
return cls
return _decorator
def _do_register(self, model_class, admin_class):
instance = admin_class(model_class, self)
self._registry[model_class.__name__] = instance
[docs]
def unregister(self, model_class):
self._registry.pop(model_class.__name__, None)
[docs]
def is_registered(self, model_class) -> bool:
return model_class.__name__ in self._registry
[docs]
def get_admin(self, model_name: str) -> RDFModelAdmin:
return self._registry[model_name]
[docs]
def registered(self) -> Dict[str, RDFModelAdmin]:
return dict(self._registry)
# -- URLs ---------------------------------------------------------------
@property
def urls(self):
return self.get_urls(), "djangordf_admin", self.name
[docs]
def get_urls(self):
from . import views
return [
path(
"",
views.index,
{"site": self},
name="index",
),
path(
"<str:model_name>/",
views.changelist_view,
{"site": self},
name="changelist",
),
path(
"<str:model_name>/add/",
views.add_view,
{"site": self},
name="add",
),
path(
"<str:model_name>/<path:iri>/delete/",
views.delete_view,
{"site": self},
name="delete",
),
path(
"<str:model_name>/<path:iri>/",
views.change_view,
{"site": self},
name="change",
),
]
rdf_admin_site = RDFAdminSite()