Skip to content

Commit 505585f

Browse files
committed
feat: Allow for multiple admin sites
1 parent 870b217 commit 505585f

File tree

1 file changed

+28
-7
lines changed

1 file changed

+28
-7
lines changed

djangocms_versioning/helpers.py

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import warnings
55
from collections.abc import Iterable
66
from contextlib import contextmanager
7+
from functools import cache
78

89
from cms.models import Page, PageContent, Placeholder
910
from cms.toolbar.utils import get_object_edit_url, get_object_preview_url
@@ -17,6 +18,7 @@
1718
from django.db import models
1819
from django.http import HttpRequest
1920
from django.template.loader import render_to_string
21+
from django.urls import URLResolver, get_resolver
2022
from django.utils.encoding import force_str
2123
from django.utils.translation import get_language, override as force_language
2224

@@ -54,6 +56,21 @@ def is_editable(content_obj: models.Model, request: HttpRequest) -> bool:
5456
)
5557

5658

59+
@cache
60+
def get_admin_sites():
61+
resolver = get_resolver()
62+
63+
def find_admin_sites(patterns):
64+
for pattern in patterns:
65+
if isinstance(pattern, URLResolver):
66+
yield from find_admin_sites(pattern.url_patterns)
67+
instance = getattr(pattern.callback, "__self__", None)
68+
if isinstance(instance, admin.AdminSite):
69+
yield instance
70+
71+
return list(find_admin_sites(resolver.url_patterns))
72+
73+
5774
def versioning_admin_factory(admin_class: type[admin.ModelAdmin], mixin: type) -> type[admin.ModelAdmin]:
5875
"""A class factory returning admin class with overriden
5976
versioning functionality.
@@ -93,13 +110,17 @@ def replace_admin_for_models(pairs: tuple[type[models.Model], type], admin_site:
93110
:param admin_site: AdminSite instance
94111
"""
95112
if admin_site is None:
96-
admin_site = admin.site
97-
for model, mixin in pairs:
98-
try:
99-
modeladmin = admin_site._registry[model]
100-
except KeyError:
101-
continue
102-
_replace_admin_for_model(modeladmin, mixin, admin_site)
113+
admin_sites = get_admin_sites() or [admin.site]
114+
else:
115+
admin_sites = [admin_site]
116+
117+
for _admin in admin_sites:
118+
for model, mixin in pairs:
119+
try:
120+
modeladmin = admin_site._registry[model]
121+
except KeyError:
122+
continue
123+
_replace_admin_for_model(modeladmin, mixin, _admin)
103124

104125

105126
def register_versionadmin_proxy(versionable, admin_site: admin.AdminSite | None = None):

0 commit comments

Comments
 (0)