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