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

iplweb / bpp / 67f84fd3-e142-4d2b-aa7f-f040679bff5b

11 Aug 2025 01:15PM UTC coverage: 45.341% (+5.5%) from 39.858%
67f84fd3-e142-4d2b-aa7f-f040679bff5b

push

circleci

mpasternak
Merge branch 'release/v202508.1187'

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

1383 existing lines in 91 files now uncovered.

17229 of 37999 relevant lines covered (45.34%)

1.17 hits per line

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

45.76
src/dynamic_columns/admin.py
1
from builtins import callable
3✔
2

3
from adminsortable2.admin import SortableAdminMixin
3✔
4
from django.core.exceptions import FieldDoesNotExist
3✔
5

6
from dynamic_columns.models import ModelAdminColumn
3✔
7

8
from django.contrib import admin
3✔
9
from django.contrib.admin import ModelAdmin as DjangoModelAdmin
3✔
10
from django.contrib.admin.utils import NotRelationField, get_model_from_relation
3✔
11

12
from django.utils.translation import gettext_lazy as _
3✔
13

14

15
@admin.action(description=_("Enable selected columns"))
3✔
16
def make_enabled(modeladmin, request, queryset):
3✔
17
    queryset.update(enabled=True)
×
18

19

20
@admin.action(description=_("Disable selected columns"))
3✔
21
def make_disabled(modeladmin, request, queryset):
3✔
22
    queryset.update(enabled=False)
×
23

24

25
@admin.register(ModelAdminColumn)
3✔
26
class ModelAdminColumnAdmin(SortableAdminMixin, DjangoModelAdmin):
3✔
27

28
    ordering = ["ordering"]
3✔
29
    list_filter = ["parent", "enabled"]
3✔
30
    list_display = ["col_parent_name", "col_verbose_name", "enabled", "ordering"]
3✔
31
    readonly_fields = ["parent", "col_name", "ordering"]
3✔
32
    actions = [make_disabled, make_enabled]
3✔
33

34
    def has_delete_permission(self, request, obj=None):
3✔
35
        # By default ModelAdminColumns are managed automatically, so there is no
36
        # need to delete them
UNCOV
37
        return False
2✔
38

39
    def has_add_permission(self, request):
3✔
40
        # See ``self.has_delete_permission`` comment
UNCOV
41
        return False
2✔
42

43
    def col_parent_name(self, obj: ModelAdminColumn):
3✔
44
        """Verbose name of model in column's ModelAdmin"""
45
        class_ = obj.parent.model_ref.model_class()
×
46
        return class_._meta.verbose_name
×
47

48
    col_parent_name.short_description = _("Model admin name")
3✔
49

50
    def col_verbose_name(self, obj: ModelAdminColumn):
3✔
51
        """Get verbose name of ModelAdminColumn using various strategies"""
52
        model = obj.parent.model_ref.model_class()
×
53

54
        # If obj.col_name is a field, use its name later:
55
        try:
×
56
            field = model._meta.get_field(obj.col_name)
×
57
        except FieldDoesNotExist:
×
58
            # This is not a field. This could be Django's ModelAdmin callable
59
            model_admin_callable = None
×
60
            try:
×
61
                # Try getting that callable.
62
                model_admin_callable = getattr(obj.parent.class_ref, obj.col_name)
×
63
            except AttributeError:
×
64
                # If callable does not exists, return just the name of the column. There
65
                # is no such field and no such callable - maybe this is a problem with
66
                # non-existent column name?
67
                return obj.col_name
×
68

69
            if model_admin_callable and callable(model_admin_callable):
×
70
                # It is a function. Does it have a short_description?
71
                try:
×
72
                    return model_admin_callable.short_description
×
73
                except AttributeError:
×
74
                    # It is a function, but it does not have ``short_description``
75
                    # attribute. Let's return the col_name then:
76
                    return obj.col_name
×
77

78
        # It is a field!
79
        ret = obj.col_name
×
80

81
        if (
×
82
            hasattr(field, "verbose_name")
83
            and field.verbose_name
84
            and field.verbose_name != obj.col_name
85
        ):
86
            # Does it have a non-empty ``verbose_name`` attribute?
87
            ret = field.verbose_name
×
88
        else:
89
            # It does not have a ``verbose_name`` attribute.
90
            # Is it a ForeignKeyField?
91
            other_model = None
×
92
            try:
×
93
                other_model = get_model_from_relation(field)
×
94
            except NotRelationField:
×
95
                pass
×
96

97
            if other_model:
×
98
                # It is a ForeignKey! Does it have ``verbose_name``?
99
                try:
×
100
                    ret = other_model._meta.verbose_name
×
101
                except AttributeError:
×
102
                    pass
×
103

104
        return ret
×
105

106
    col_verbose_name.short_description = _("Column name")
3✔
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