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

ionelmc / django-admin-utils / 21357967928

26 Jan 2026 12:38PM UTC coverage: 94.068% (+0.2%) from 93.878%
21357967928

push

github

ionelmc
Bump version: 2.1.0 → 2.2.0

8 of 8 branches covered (100.0%)

1 of 1 new or added line in 1 file covered. (100.0%)

4 existing lines in 1 file now uncovered.

333 of 354 relevant lines covered (94.07%)

4.66 hits per line

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

94.59
/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
        label = f'{app_label}.{model_name}'
8✔
27

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

32

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

40
    return register_admin_decorator
8✔
41

42

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

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

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

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

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

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

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

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

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

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

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

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

114
    if register:
8✔
115
        FakeModelAdminClass.register()
8✔
116
    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