BaseBuilder.get_model_class()   A
last analyzed

Complexity

Conditions 4

Size

Total Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 12
rs 9.2
cc 4
1
import django
2
3
try:
4
    from django.apps import apps
5
except ImportError:
6
    pass
7
8
from crudbuilder.registry import register
9
from six import with_metaclass
10
from django.contrib.contenttypes.models import ContentType
11
12
from crudbuilder.exceptions import NotModelException
13
from crudbuilder import helpers
14
15
16
class BaseBuilder(object):
17
    def __init__(
18
            self,
19
            app,
20
            model,
21
            crud
22
    ):
23
24
        self.model = model
25
        self.app = app
26
        self.crud = crud
27
28
        self.custom_modelform = self._has_crud_attr('custom_modelform')
29
        self.modelform_excludes = self._has_crud_attr('modelform_excludes')
30
        self.detailview_excludes = self._has_crud_attr('detailview_excludes')
31
        self.createupdate_forms = self._has_crud_attr('createupdate_forms')
32
33
        self.custom_update_view_mixin = self._has_crud_attr('custom_update_view_mixin')
34
        self.custom_create_view_mixin = self._has_crud_attr('custom_create_view_mixin')
35
36
        # django tables2
37
        self.custom_table2 = self._has_crud_attr('custom_table2')
38
        self.tables2_fields = self._has_crud_attr('tables2_fields')
39
        self.tables2_css_class = self._has_crud_attr('tables2_css_class')
40
        self.tables2_pagination = self._has_crud_attr('tables2_pagination')
41
42
        self.permission_required = self._has_crud_attr('permission_required')
43
        self.permissions = self._has_crud_attr('permissions')
44
        self.login_required = self._has_crud_attr('login_required')
45
46
        self.custom_templates = self._has_crud_attr('custom_templates')
47
        self.custom_queryset = self._has_crud_attr('custom_queryset')
48
        self.custom_context = self._has_crud_attr('custom_context')
49
        self.inlineformset = self.get_inlineformset
50
        self.custom_postfix_url = self.postfix_url
51
52
    @property
53
    def get_model_class(self):
54
        """Returns model class"""
55
        try:
56
            c = ContentType.objects.get(app_label=self.app, model=self.model)
57
        except ContentType.DoesNotExist:
58
            # try another kind of resolution
59
            # fixes a situation where a proxy model is defined in some external app.
60
            if django.VERSION >= (1, 7):
61
                return apps.get_model(self.app, self.model)
62
        else:
63
            return c.model_class()
64
65
    def _has_crud_attr(self, attr):
66
        return getattr(self.crud, attr, None)
67
68
    def view_permission(self, view_type):
69
        if self.permissions:
70
            return self.permissions.get(view_type, None)
71
        else:
72
            return '{}.{}_{}'.format(self.app, self.model, view_type)
73
74
    @property
75
    def check_login_required(self):
76
        return True if self.login_required else False
77
78
    @property
79
    def check_permission_required(self):
80
        return True if self.permission_required else False
81
82
    @property
83
    def get_inlineformset(self):
84
        if self.crud.inlineformset:
85
            return self.crud.inlineformset().construct_formset()
86
        else:
87
            return None
88
89
    @property
90
    def postfix_url(self):
91
        return helpers.custom_postfix_url(self.crud(), self.model)
92
93
94
class MetaCrudRegister(type):
95
    def __new__(cls, clsname, bases, attrs):
96
        newclass = super(
97
            MetaCrudRegister, cls
98
        ).__new__(cls, clsname, bases, attrs)
99
100
        if bases:
101
            if newclass.model:
102
                register(newclass.model, newclass)
103
            else:
104
                msg = "No model defined in {} class".format(newclass)
105
                raise NotModelException(msg)
106
        return newclass
107
108
109
class BaseCrudBuilder(with_metaclass(MetaCrudRegister)):
110
    model = None
111
    inlineformset = None
112