Completed
Push — master ( 52ba0e...237257 )
by Asif
51s
created

ViewBuilder.generate_create_view()   B

Complexity

Conditions 1

Size

Total Lines 25

Duplication

Lines 25
Ratio 100 %

Importance

Changes 4
Bugs 0 Features 1
Metric Value
c 4
b 0
f 1
dl 25
loc 25
rs 8.8571
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
)
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 'crudbuilder/inline/{}.html'.format(tname)
70
        else:
71
            return 'crudbuilder/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
            custom_postfix_url=self.custom_postfix_url
97
        )
98
99
        list_class = type(
100
            name,
101
            (BaseListViewMixin, SingleTableView),
102
            list_args
103
        )
104
        self.classes[name] = list_class
105
        return list_class
106
107 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...
108
        """Generate class based view for CreateView"""
109
110
        name = model_class_form(self.model + 'CreateView')
111
        create_args = dict(
112
            form_class=self.get_actual_form('create'),
113
            model=self.get_model_class,
114
            template_name=self.get_template('create'),
115
            permissions=self.view_permission('create'),
116
            permission_required=self.check_permission_required,
117
            login_required=self.check_login_required,
118
            inlineformset=self.inlineformset,
119
            success_url=reverse_lazy('{}-{}-list'.format(self.app, self.custom_postfix_url)),
120
            custom_form=self.createupdate_forms or self.custom_modelform,
121
            custom_postfix_url=self.custom_postfix_url
122
        )
123
124
        create_class = type(
125
            name,
126
            (self.get_createupdate_mixin(), CreateView),
127
            create_args
128
        )
129
130
        self.classes[name] = create_class
131
        return create_class
132
133 View Code Duplication
    def generate_detail_view(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
134
        """Generate class based view for DetailView"""
135
136
        name = model_class_form(self.model + 'DetailView')
137
        detail_args = dict(
138
            detailview_excludes=self.detailview_excludes,
139
            model=self.get_model_class,
140
            template_name=self.get_template('detail'),
141
            login_required=self.check_login_required,
142
            permissions=self.view_permission('detail'),
143
            inlineformset=self.inlineformset,
144
            permission_required=self.check_permission_required,
145
            custom_postfix_url=self.custom_postfix_url
146
        )
147
148
        detail_class = type(name, (BaseDetailViewMixin, DetailView), detail_args)
149
        self.classes[name] = detail_class
150
        return detail_class
151
152 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...
153
        """Generate class based view for UpdateView"""
154
155
        name = model_class_form(self.model + 'UpdateView')
156
        update_args = dict(
157
            form_class=self.get_actual_form('update'),
158
            model=self.get_model_class,
159
            template_name=self.get_template('update'),
160
            permissions=self.view_permission('update'),
161
            permission_required=self.check_permission_required,
162
            login_required=self.check_login_required,
163
            inlineformset=self.inlineformset,
164
            custom_form=self.createupdate_forms or self.custom_modelform,
165
            success_url=reverse_lazy('{}-{}-list'.format(self.app, self.custom_postfix_url)),
166
            custom_postfix_url=self.custom_postfix_url
167
        )
168
169
        update_class = type(
170
            name,
171
            (self.get_createupdate_mixin(), UpdateView),
172
            update_args
173
        )
174
        self.classes[name] = update_class
175
        return update_class
176
177
    def generate_delete_view(self):
178
        """Generate class based view for DeleteView"""
179
180
        name = model_class_form(self.model + 'DeleteView')
181
        delete_args = dict(
182
            model=self.get_model_class,
183
            template_name=self.get_template('delete'),
184
            permissions=self.view_permission('delete'),
185
            permission_required=self.check_permission_required,
186
            login_required=self.check_login_required,
187
            success_url=reverse_lazy('{}-{}-list'.format(self.app, self.custom_postfix_url)),
188
            custom_postfix_url=self.custom_postfix_url
189
        )
190
191
        delete_class = type(name, (CrudBuilderMixin, DeleteView), delete_args)
192
        self.classes[name] = delete_class
193
        return delete_class
194