Completed
Push — master ( 790cb0...7d18a2 )
by Asif
59s
created

crudbuilder.ViewBuilder   A

Complexity

Total Complexity 18

Size/Duplication

Total Lines 144
Duplicated Lines 0 %
Metric Value
dl 0
loc 144
rs 10
wmc 18

11 Methods

Rating   Name   Duplication   Size   Complexity  
A __init__() 0 3 1
A generate_crud() 0 6 1
A generate_modelform() 0 7 2
A get_actual_table() 0 6 2
A get_template() 0 9 3
A get_actual_form() 0 7 4
A generate_create_view() 0 17 1
A generate_delete_view() 0 16 1
B generate_list_view() 0 24 1
A generate_detail_view() 0 15 1
A generate_update_view() 0 21 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
)
16
from crudbuilder.abstract import BaseBuilder
17
from crudbuilder.tables import TableBuilder
18
from crudbuilder.helpers import model_class_form, plural
19
20
21
class ViewBuilder(BaseBuilder):
22
    """View builder which returns all the CRUD class based views"""
23
24
    def __init__(self, *args, **kwargs):
25
        super(ViewBuilder, self).__init__(*args, **kwargs)
26
        self.classes = {}
27
28
    def generate_crud(self):
29
        self.generate_list_view()
30
        self.generate_create_view()
31
        self.generate_detail_view()
32
        self.generate_update_view()
33
        self.generate_delete_view()
34
35
    def get_actual_form(self, view):
36
        if self.createupdate_forms and self.createupdate_forms.get(view, None):
37
            return self.createupdate_forms.get(view)
38
        elif self.custom_modelform:
39
            return self.custom_modelform
40
        else:
41
            return self.generate_modelform()
42
43
    def get_actual_table(self):
44
        if self.custom_table2:
45
            return self.custom_table2
46
        else:
47
            table_builder = TableBuilder(self.app, self.model, self.crud)
48
            return table_builder.generate_table()
49
50
    def generate_modelform(self):
51
        """Generate modelform from Django modelform_factory"""
52
53
        model_class = self.get_model_class
54
        excludes = self.modelform_excludes if self.modelform_excludes else []
55
        _ObjectForm = modelform_factory(model_class, exclude=excludes)
56
        return _ObjectForm
57
58
    def get_template(self, tname):
59
        """
60
        - Get custom template from CRUD class, if it is defined in it
61
        - No custom template in CRUD class, then use the default template
62
        """
63
        if self.custom_templates and self.custom_templates.get(tname, None):
64
            return self.custom_templates.get(tname)
65
        else:
66
            return 'object_{}.html'.format(tname)
67
68
    def generate_list_view(self):
69
        """Generate class based view for ListView"""
70
71
        name = model_class_form(self.model + 'ListView')
72
        list_args = dict(
73
            model=self.get_model_class,
74
            context_object_name=plural(self.model),
75
            template_name=self.get_template('list'),
76
            table_class=self.get_actual_table(),
77
            context_table_name='table_objects',
78
            crud=self.crud,
79
            permissions=self.view_permission('list'),
80
            permission_required=self.check_permission_required,
81
            login_required=self.check_login_required,
82
            table_pagination=self.tables2_pagination or 10
83
            )
84
85
        list_class = type(
86
            name,
87
            (BaseListViewMixin, SingleTableView),
88
            list_args
89
            )
90
        self.classes[name] = list_class
91
        return list_class
92
93
    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...
94
        """Generate class based view for CreateView"""
95
96
        name = model_class_form(self.model + 'CreateView')
97
        create_args = dict(
98
            form_class=self.get_actual_form('create'),
99
            model=self.get_model_class,
100
            template_name=self.get_template('create'),
101
            permissions=self.view_permission('create'),
102
            permission_required=self.check_permission_required,
103
            login_required=self.check_login_required,
104
            success_url=reverse_lazy('{}-{}-list'.format(self.app, self.model))
105
            )
106
107
        create_class = type(name, (CreateUpdateViewMixin, CreateView), create_args)
108
        self.classes[name] = create_class
109
        return create_class
110
111
    def generate_detail_view(self):
112
        """Generate class based view for DetailView"""
113
114
        name = model_class_form(self.model + 'DetailView')
115
        detail_args = dict(
116
            model=self.get_model_class,
117
            template_name=self.get_template('detail'),
118
            login_required=self.check_login_required,
119
            permissions=self.view_permission('detail'),
120
            permission_required=self.check_permission_required,
121
            )
122
123
        detail_class = type(name, (CrudBuilderMixin, DetailView), detail_args)
124
        self.classes[name] = detail_class
125
        return detail_class
126
127
    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...
128
        """Generate class based view for UpdateView"""
129
130
        name = model_class_form(self.model + 'UpdateView')
131
        update_args = dict(
132
            form_class=self.get_actual_form('update'),
133
            model=self.get_model_class,
134
            template_name=self.get_template('update'),
135
            permissions=self.view_permission('update'),
136
            permission_required=self.check_permission_required,
137
            login_required=self.check_login_required,
138
            success_url=reverse_lazy('{}-{}-list'.format(self.app, self.model))
139
            )
140
141
        update_class = type(
142
            name,
143
            (CreateUpdateViewMixin, UpdateView),
144
            update_args
145
            )
146
        self.classes[name] = update_class
147
        return update_class
148
149
    def generate_delete_view(self):
150
        """Generate class based view for DeleteView"""
151
152
        name = model_class_form(self.model + 'DeleteView')
153
        delete_args = dict(
154
            model=self.get_model_class,
155
            template_name=self.get_template('delete'),
156
            permissions=self.view_permission('delete'),
157
            permission_required=self.check_permission_required,
158
            login_required=self.check_login_required,
159
            success_url=reverse_lazy('{}-{}-list'.format(self.app, self.model))
160
            )
161
162
        delete_class = type(name, (CrudBuilderMixin, DeleteView), delete_args)
163
        self.classes[name] = delete_class
164
        return delete_class
165