Completed
Push — master ( 9b088f...73be1b )
by Asif
01:05
created

ViewBuilder.generate_modelform()   A

Complexity

Conditions 2

Size

Total Lines 7

Duplication

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