Completed
Pull Request — master (#27)
by
unknown
01:14
created

BaseCrudBuilder.get_class_name()   A

Complexity

Conditions 1

Size

Total Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

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