Completed
Push — master ( 0e6eac...543ed2 )
by Asif
01:14
created

ViewBuilder.get_actual_form()   A

Complexity

Conditions 4

Size

Total Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 7
rs 9.2
cc 4
1
from django.core.urlresolvers import reverse_lazy
2
from django.forms.models import modelform_factory
3
from django.views.generic import(
4
    DetailView,
5
    CreateView,
6
    UpdateView,
7
    DeleteView
8
)
9
from django_tables2 import SingleTableView
10
11
from crudbuilder.mixins import(
12
    CrudBuilderMixin,
13
    BaseListViewMixin,
14
    CreateUpdateViewMixin,
15
    InlineFormsetViewMixin,
16
    BaseDetailViewMixin
17
)
18
from crudbuilder.abstract import BaseBuilder
19
from crudbuilder.tables import TableBuilder
20
from crudbuilder.helpers import model_class_form, plural
21
22
23
class ViewBuilder(BaseBuilder):
24
    """View builder which returns all the CRUD class based views"""
25
26
    def __init__(self, *args, **kwargs):
27
        super(ViewBuilder, self).__init__(*args, **kwargs)
28
        self.classes = {}
29
30
    def generate_crud(self):
31
        self.generate_list_view()
32
        self.generate_create_view()
33
        self.generate_detail_view()
34
        self.generate_update_view()
35
        self.generate_delete_view()
36
37
    def get_actual_form(self, view):
38
        if self.createupdate_forms and self.createupdate_forms.get(view, None):
39
            return self.createupdate_forms.get(view)
40
        elif self.custom_modelform:
41
            return self.custom_modelform
42
        else:
43
            return self.generate_modelform()
44
45
    def get_actual_table(self):
46
        if self.custom_table2:
47
            return self.custom_table2
48
        else:
49
            table_builder = TableBuilder(self.app, self.model, self.crud)
50
            return table_builder.generate_table()
51
52
    def generate_modelform(self):
53
        """Generate modelform from Django modelform_factory"""
54
55
        model_class = self.get_model_class
56
        excludes = self.modelform_excludes if self.modelform_excludes else []
57
        _ObjectForm = modelform_factory(model_class, exclude=excludes)
58
        return _ObjectForm
59
60
    def get_template(self, tname):
61
        """
62
        - Get custom template from CRUD class, if it is defined in it
63
        - No custom template in CRUD class, then use the default template
64
        """
65
66
        if self.custom_templates and self.custom_templates.get(tname, None):
67
            return self.custom_templates.get(tname)
68
        elif self.inlineformset:
69
            return 'inline/{}.html'.format(tname)
70
        else:
71
            return 'instance/{}.html'.format(tname)
72
73
    def get_createupdate_mixin(self):
74
        if self.inlineformset:
75
            return InlineFormsetViewMixin
76
        else:
77
            return CreateUpdateViewMixin
78
79
    def generate_list_view(self):
80
        """Generate class based view for ListView"""
81
82
        name = model_class_form(self.model + 'ListView')
83
        list_args = dict(
84
            model=self.get_model_class,
85
            context_object_name=plural(self.model),
86
            template_name=self.get_template('list'),
87
            table_class=self.get_actual_table(),
88
            context_table_name='table_objects',
89
            crud=self.crud,
90
            permissions=self.view_permission('list'),
91
            permission_required=self.check_permission_required,
92
            login_required=self.check_login_required,
93
            table_pagination={'per_page': self.tables2_pagination or 10},
94
            custom_queryset=self.custom_queryset,
95
            custom_context=self.custom_context
96
        )
97
98
        list_class = type(
99
            name,
100
            (BaseListViewMixin, SingleTableView),
101
            list_args
102
        )
103
        self.classes[name] = list_class
104
        return list_class
105
106 View Code Duplication
    def generate_create_view(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
107
        """Generate class based view for CreateView"""
108
109
        name = model_class_form(self.model + 'CreateView')
110
        create_args = dict(
111
            form_class=self.get_actual_form('create'),
112
            model=self.get_model_class,
113
            template_name=self.get_template('create'),
114
            permissions=self.view_permission('create'),
115
            permission_required=self.check_permission_required,
116
            login_required=self.check_login_required,
117
            inlineformset=self.inlineformset,
118
            success_url=reverse_lazy('{}-{}-list'.format(self.app, self.model)),
119
            custom_form=self.createupdate_forms or self.custom_modelform
120
        )
121
122
        create_class = type(
123
            name,
124
            (self.get_createupdate_mixin(), CreateView),
125
            create_args
126
        )
127
128
        self.classes[name] = create_class
129
        return create_class
130
131
    def generate_detail_view(self):
132
        """Generate class based view for DetailView"""
133
134
        name = model_class_form(self.model + 'DetailView')
135
        detail_args = dict(
136
            model=self.get_model_class,
137
            template_name=self.get_template('detail'),
138
            login_required=self.check_login_required,
139
            permissions=self.view_permission('detail'),
140
            inlineformset=self.inlineformset,
141
            permission_required=self.check_permission_required,
142
        )
143
144
        detail_class = type(name, (BaseDetailViewMixin, DetailView), detail_args)
145
        self.classes[name] = detail_class
146
        return detail_class
147
148 View Code Duplication
    def generate_update_view(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
149
        """Generate class based view for UpdateView"""
150
151
        name = model_class_form(self.model + 'UpdateView')
152
        update_args = dict(
153
            form_class=self.get_actual_form('update'),
154
            model=self.get_model_class,
155
            template_name=self.get_template('update'),
156
            permissions=self.view_permission('update'),
157
            permission_required=self.check_permission_required,
158
            login_required=self.check_login_required,
159
            inlineformset=self.inlineformset,
160
            custom_form=self.createupdate_forms or self.custom_modelform,
161
            success_url=reverse_lazy('{}-{}-list'.format(self.app, self.model))
162
        )
163
164
        update_class = type(
165
            name,
166
            (self.get_createupdate_mixin(), UpdateView),
167
            update_args
168
        )
169
        self.classes[name] = update_class
170
        return update_class
171
172
    def generate_delete_view(self):
173
        """Generate class based view for DeleteView"""
174
175
        name = model_class_form(self.model + 'DeleteView')
176
        delete_args = dict(
177
            model=self.get_model_class,
178
            template_name=self.get_template('delete'),
179
            permissions=self.view_permission('delete'),
180
            permission_required=self.check_permission_required,
181
            login_required=self.check_login_required,
182
            success_url=reverse_lazy('{}-{}-list'.format(self.app, self.model))
183
        )
184
185
        delete_class = type(name, (CrudBuilderMixin, DeleteView), delete_args)
186
        self.classes[name] = delete_class
187
        return delete_class
188