Completed
Push — master ( aa0d85...69736b )
by Asif
01:01
created

crudbuilder.ViewBuilder.generate_modelform()   A

Complexity

Conditions 2

Size

Total Lines 7

Duplication

Lines 0
Ratio 0 %
Metric Value
cc 2
dl 0
loc 7
rs 9.4285
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
)
17
from crudbuilder.abstract import BaseBuilder
18
from crudbuilder.tables import TableBuilder
19
from crudbuilder.helpers import model_class_form, plural
20
21
22
class ViewBuilder(BaseBuilder):
23
    """View builder which returns all the CRUD class based views"""
24
25
    def __init__(self, *args, **kwargs):
26
        super(ViewBuilder, self).__init__(*args, **kwargs)
27
        self.classes = {}
28
29
    def generate_crud(self):
30
        self.generate_list_view()
31
        self.generate_create_view()
32
        self.generate_detail_view()
33
        self.generate_update_view()
34
        self.generate_delete_view()
35
36
    def get_actual_form(self, view):
37
        if self.createupdate_forms and self.createupdate_forms.get(view, None):
38
            return self.createupdate_forms.get(view)
39
        elif self.custom_modelform:
40
            return self.custom_modelform
41
        else:
42
            return self.generate_modelform()
43
44
    def get_actual_table(self):
45
        if self.custom_table2:
46
            return self.custom_table2
47
        else:
48
            table_builder = TableBuilder(self.app, self.model, self.crud)
49
            return table_builder.generate_table()
50
51
    def generate_modelform(self):
52
        """Generate modelform from Django modelform_factory"""
53
54
        model_class = self.get_model_class
55
        excludes = self.modelform_excludes if self.modelform_excludes else []
56
        _ObjectForm = modelform_factory(model_class, exclude=excludes)
57
        return _ObjectForm
58
59
    def get_template(self, tname):
60
        """
61
        - Get custom template from CRUD class, if it is defined in it
62
        - No custom template in CRUD class, then use the default template
63
        """
64
        if self.inlineformset:
65
            tname = 'inline_{}'.format(tname)
66
67
        if self.custom_templates and self.custom_templates.get(tname, None):
68
            return self.custom_templates.get(tname)
69
        else:
70
            return 'object_{}.html'.format(tname)
71
72
    def get_createupdate_mixin(self):
73
        if self.inlineformset:
74
            return InlineFormsetViewMixin
75
        else:
76
            return CreateUpdateViewMixin
77
78
    def generate_list_view(self):
79
        """Generate class based view for ListView"""
80
81
        name = model_class_form(self.model + 'ListView')
82
        list_args = dict(
83
            model=self.get_model_class,
84
            context_object_name=plural(self.model),
85
            template_name=self.get_template('list'),
86
            table_class=self.get_actual_table(),
87
            context_table_name='table_objects',
88
            crud=self.crud,
89
            permissions=self.view_permission('list'),
90
            permission_required=self.check_permission_required,
91
            login_required=self.check_login_required,
92
            table_pagination={'per_page': self.tables2_pagination or 10},
93
            custom_queryset=self.custom_queryset
94
            )
95
96
        list_class = type(
97
            name,
98
            (BaseListViewMixin, SingleTableView),
99
            list_args
100
            )
101
        self.classes[name] = list_class
102
        return list_class
103
104
    def generate_create_view(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
105
        """Generate class based view for CreateView"""
106
107
        name = model_class_form(self.model + 'CreateView')
108
        create_args = dict(
109
            form_class=self.get_actual_form('create'),
110
            model=self.get_model_class,
111
            template_name=self.get_template('create'),
112
            permissions=self.view_permission('create'),
113
            permission_required=self.check_permission_required,
114
            login_required=self.check_login_required,
115
            inlineformset=self.inlineformset,
116
            success_url=reverse_lazy('{}-{}-list'.format(self.app, self.model))
117
            )
118
119
        create_class = type(
120
            name,
121
            (self.get_createupdate_mixin(), CreateView),
122
            create_args
123
            )
124
125
        self.classes[name] = create_class
126
        return create_class
127
128
    def generate_detail_view(self):
129
        """Generate class based view for DetailView"""
130
131
        name = model_class_form(self.model + 'DetailView')
132
        detail_args = dict(
133
            model=self.get_model_class,
134
            template_name=self.get_template('detail'),
135
            login_required=self.check_login_required,
136
            permissions=self.view_permission('detail'),
137
            permission_required=self.check_permission_required,
138
            )
139
140
        detail_class = type(name, (CrudBuilderMixin, DetailView), detail_args)
141
        self.classes[name] = detail_class
142
        return detail_class
143
144
    def generate_update_view(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
145
        """Generate class based view for UpdateView"""
146
147
        name = model_class_form(self.model + 'UpdateView')
148
        update_args = dict(
149
            form_class=self.get_actual_form('update'),
150
            model=self.get_model_class,
151
            template_name=self.get_template('update'),
152
            permissions=self.view_permission('update'),
153
            permission_required=self.check_permission_required,
154
            login_required=self.check_login_required,
155
            inlineformset=self.inlineformset,
156
            success_url=reverse_lazy('{}-{}-list'.format(self.app, self.model))
157
            )
158
159
        update_class = type(
160
                name,
161
                (self.get_createupdate_mixin(), UpdateView),
162
                update_args
163
                )
164
        self.classes[name] = update_class
165
        return update_class
166
167
    def generate_delete_view(self):
168
        """Generate class based view for DeleteView"""
169
170
        name = model_class_form(self.model + 'DeleteView')
171
        delete_args = dict(
172
            model=self.get_model_class,
173
            template_name=self.get_template('delete'),
174
            permissions=self.view_permission('delete'),
175
            permission_required=self.check_permission_required,
176
            login_required=self.check_login_required,
177
            success_url=reverse_lazy('{}-{}-list'.format(self.app, self.model))
178
            )
179
180
        delete_class = type(name, (CrudBuilderMixin, DeleteView), delete_args)
181
        self.classes[name] = delete_class
182
        return delete_class
183