Total Complexity | 21 |
Total Lines | 162 |
Duplicated Lines | 47.53 % |
Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.
Common duplication problems, and corresponding solutions are:
1 | from django.core.urlresolvers import reverse_lazy |
||
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): |
|
|
|||
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): |
|
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): |
|
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): |
|
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 |