Completed
Push — master ( efcb62...4ad93c )
by Asif
01:01
created

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