|
4 | 4 | import warnings |
5 | 5 | from collections.abc import Iterable |
6 | 6 | from contextlib import contextmanager |
| 7 | +from functools import cache |
7 | 8 |
|
8 | 9 | from cms.models import Page, PageContent, Placeholder |
9 | 10 | from cms.toolbar.utils import get_object_edit_url, get_object_preview_url |
|
17 | 18 | from django.db import models |
18 | 19 | from django.http import HttpRequest |
19 | 20 | from django.template.loader import render_to_string |
| 21 | +from django.urls import URLResolver, get_resolver |
20 | 22 | from django.utils.encoding import force_str |
21 | 23 | from django.utils.translation import get_language, override as force_language |
22 | 24 |
|
@@ -54,6 +56,21 @@ def is_editable(content_obj: models.Model, request: HttpRequest) -> bool: |
54 | 56 | ) |
55 | 57 |
|
56 | 58 |
|
| 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 | + |
57 | 74 | def versioning_admin_factory(admin_class: type[admin.ModelAdmin], mixin: type) -> type[admin.ModelAdmin]: |
58 | 75 | """A class factory returning admin class with overriden |
59 | 76 | versioning functionality. |
@@ -93,13 +110,17 @@ def replace_admin_for_models(pairs: tuple[type[models.Model], type], admin_site: |
93 | 110 | :param admin_site: AdminSite instance |
94 | 111 | """ |
95 | 112 | 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) |
103 | 124 |
|
104 | 125 |
|
105 | 126 | def register_versionadmin_proxy(versionable, admin_site: admin.AdminSite | None = None): |
|
0 commit comments