| 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 |