HasRelatedFieldFilter   A
last analyzed

Complexity

Total Complexity 9

Size/Duplication

Total Lines 33
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 33
ccs 0
cts 25
cp 0
rs 10
wmc 9
1
# -*- coding: utf-8 -*-
2
3
__version__ = '0.1.0'
4
5
from django.contrib.admin import SimpleListFilter
6
from django.utils.translation import ugettext_lazy as _
7
8
9
def isnull_filter(field_name, filter_title=None):
10
    class HasRelatedFieldFilter(SimpleListFilter):
11
        parameter_name = '%s__isnull' % field_name
12
        related_field = field_name
13
14
        def __init__(self, request, field, model, model_admin):
15
            related_field = model._meta.get_field(field_name)
16
            if filter_title:
17
                self.title = filter_title
18
            else:
19
                if hasattr(related_field, 'related'):
20
                    related_title = related_field.related.model._meta.verbose_name_plural
21
                    self.title = _("Is related '%s' null?") % related_title
22
                elif hasattr(related_field, 'related_model') and hasattr(related_field.related_model, "_meta"):
23
                    related_title = related_field.related_model._meta.verbose_name_plural
24
                    self.title = _("Is related '%s' null?") % related_title
25
                else:
26
                    related_title = related_field.name
27
                    self.title = _("Is field '%s' null?") % related_title
28
            super(HasRelatedFieldFilter, self).__init__(request, field, model, model_admin)
29
30
        def lookups(self, request, model_admin):
31
            return [
32
                ('true', _('True')),
33
                ('false', _('False')),
34
            ]
35
36
        def queryset(self, request, queryset):
37
            kwargs = {}
38
            if self.value() in ('false', 'False'):
39
                kwargs["%s__isnull" % self.related_field] = False
40
            if self.value() in ('true', 'True'):
41
                kwargs["%s__isnull" % self.related_field] = True
42
            return queryset.filter(**kwargs).distinct()
43
44
    return HasRelatedFieldFilter
45