• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

ionelmc / django-admin-utils / 21357491590

26 Jan 2026 12:22PM UTC coverage: 93.878% (+2.5%) from 91.379%
21357491590

push

github

ionelmc
Add django 6 in test grid.

8 of 8 branches covered (100.0%)

19 of 19 new or added lines in 2 files covered. (100.0%)

14 existing lines in 3 files now uncovered.

322 of 343 relevant lines covered (93.88%)

4.66 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

94.52
/src/admin_utils/mock.py
1
from functools import update_wrapper
8✔
2

3
from django.contrib import admin
8✔
4
from django.urls import path
8✔
5
from django.urls.resolvers import URLPattern
8✔
6

7

8
class InvalidAdmin(RuntimeError):
8✔
9
    pass
8✔
10

11

12
def fake_model_factory(**kwargs):
8✔
13
    type_name = f'Fake{kwargs["model_name"]}Model'
8✔
14

15
    class _meta:
8✔
16
        abstract = kwargs.pop('abstract')
8✔
17
        app_label = kwargs.pop('app_label')
8✔
18
        app_config = kwargs.pop('app_config')
8✔
19
        module_name = kwargs.pop('module_name')
8✔
20
        verbose_name_plural = kwargs.pop('verbose_name_plural')
8✔
21
        verbose_name = kwargs.pop('verbose_name')
8✔
22
        model_name = kwargs.pop('model_name')
8✔
23
        object_name = kwargs.pop('object_name')
8✔
24
        swapped = kwargs.pop('swapped')
8✔
25
        is_composite_pk = False
8✔
26

27
    if kwargs:
8✔
UNCOV
28
        raise InvalidAdmin(f'Unexpected arguments: {kwargs}')
×
29
    return type(type_name, (object,), {'_meta': _meta})
8✔
30

31

32
def register_view(app_label, model_name, **kwargs):
8✔
33
    def register_admin_decorator(view_func):
8✔
34
        urls = [
8✔
35
            path('', view_func, name=f'{app_label}_{model_name.lower()}_changelist'),
36
        ]
37
        return make_admin_class(app_label, model_name, urls, **kwargs)
8✔
38

39
    return register_admin_decorator
8✔
40

41

42
def make_admin_class(
8✔
43
    app_label,
44
    model_name,
45
    urls,
46
    register=True,
47
    site=admin.site,
48
    **kwargs,
49
):
50
    required_name = f'{app_label}_{model_name.lower()}_changelist'
8✔
51
    for url in urls:
8✔
52
        if getattr(url, 'name', None) == required_name:
8✔
53
            break
8✔
54
    else:
55
        raise InvalidAdmin(f'You must have an url with the name {required_name!r} otherwise the admin will fail to reverse it.')
8✔
56
    if 'app_label' in kwargs:
8✔
UNCOV
57
        raise InvalidAdmin(f'Got multiple values for app_label ({app_label}/{kwargs["app_label"]})')
×
58
    if 'model_name' in kwargs:
8✔
UNCOV
59
        raise InvalidAdmin(f'Got multiple values for model_name ({model_name}/{kwargs["model_name"]})')
×
60
    for url in urls:
8✔
61
        if not isinstance(url, URLPattern):
8✔
UNCOV
62
            raise InvalidAdmin(f'Unexpected url {url}')
×
63

64
    kwargs['model_name'] = model_name.lower()
8✔
65
    kwargs['app_label'] = app_label
8✔
66
    kwargs.setdefault('abstract', False)
8✔
67
    kwargs.setdefault('app_config', None)
8✔
68
    kwargs.setdefault('module_name', model_name.lower())
8✔
69
    kwargs.setdefault('verbose_name_plural', model_name)
8✔
70
    kwargs.setdefault('verbose_name', model_name)
8✔
71
    kwargs.setdefault('object_name', model_name)
8✔
72
    kwargs.setdefault('swapped', False)
8✔
73

74
    FakeModel = fake_model_factory(**kwargs)
8✔
75

76
    class FakeModelAdminClass(admin.ModelAdmin):
8✔
77
        fake_model = FakeModel
8✔
78

79
        def has_view_permission(*args, **kwargs):
8✔
80
            return True
8✔
81

82
        def has_add_permission(*args, **kwargs):
8✔
83
            return False
8✔
84

85
        def has_change_permission(*args, **kwargs):
8✔
86
            return False
8✔
87

88
        def has_delete_permission(*args, **kwargs):
8✔
89
            return False
8✔
90

91
        def get_urls(self):
8✔
92
            def wrap(view):
8✔
93
                def wrapper(*args, **kwargs):
8✔
94
                    return self.admin_site.admin_view(view)(*args, **kwargs)
8✔
95

96
                wrapper.model_admin = self
8✔
97
                return update_wrapper(wrapper, view)
8✔
98

99
            return [
8✔
100
                URLPattern(
101
                    pattern=url.pattern,
102
                    callback=wrap(url.callback),
103
                    default_args=url.default_args,
104
                    name=url.name,
105
                )
106
                for url in urls
107
            ]
108

109
        @classmethod
8✔
110
        def register(cls):
8✔
111
            site.register((FakeModel,), cls)
8✔
112

113
    if register:
8✔
114
        FakeModelAdminClass.register()
8✔
115
    return FakeModelAdminClass
8✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc