diff --git a/readthedocs/projects/urls/private.py b/readthedocs/projects/urls/private.py index c4fedb4d381..a7b8ff0020e 100644 --- a/readthedocs/projects/urls/private.py +++ b/readthedocs/projects/urls/private.py @@ -26,6 +26,7 @@ ProjectAdvancedUpdate, ProjectAdvertisingUpdate, ProjectDashboard, + ProjectDelete, ProjectUpdate, ) @@ -68,7 +69,8 @@ private.project_version_detail, name='project_version_detail', ), url( - r'^(?P[-\w]+)/delete/$', private.project_delete, + r'^(?P[-\w]+)/delete/$', + ProjectDelete.as_view(), name='projects_delete', ), url( diff --git a/readthedocs/projects/views/private.py b/readthedocs/projects/views/private.py index b7ca9373ff9..240da63d378 100644 --- a/readthedocs/projects/views/private.py +++ b/readthedocs/projects/views/private.py @@ -112,38 +112,55 @@ def get_context_data(self, **kwargs): return context -class ProjectUpdate(ProjectSpamMixin, PrivateViewMixin, UpdateView): +class ProjectMixin(PrivateViewMixin): + + """Common pieces for model views of Project.""" - form_class = UpdateProjectForm model = Project - success_message = _('Project settings updated') - template_name = 'projects/project_edit.html' lookup_url_kwarg = 'project_slug' lookup_field = 'slug' + context_object_name = 'project' def get_queryset(self): return self.model.objects.for_admin_user(self.request.user) + +class ProjectUpdate(ProjectSpamMixin, ProjectMixin, UpdateView): + + form_class = UpdateProjectForm + success_message = _('Project settings updated') + template_name = 'projects/project_edit.html' + def get_success_url(self): return reverse('projects_detail', args=[self.object.slug]) -class ProjectAdvancedUpdate(ProjectSpamMixin, PrivateViewMixin, UpdateView): +class ProjectAdvancedUpdate(ProjectSpamMixin, ProjectMixin, UpdateView): form_class = ProjectAdvancedForm - model = Project success_message = _('Project settings updated') template_name = 'projects/project_advanced.html' - lookup_url_kwarg = 'project_slug' - lookup_field = 'slug' - - def get_queryset(self): - return self.model.objects.for_admin_user(self.request.user) def get_success_url(self): return reverse('projects_detail', args=[self.object.slug]) +class ProjectDelete(ProjectMixin, DeleteView): + + success_message = _('Project deleted') + template_name = 'projects/project_delete.html' + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context['is_superproject'] = ( + self.object.subprojects.all().exists() + ) + return context + + def get_success_url(self): + return reverse('projects_dashboard') + + @login_required def project_version_detail(request, project_slug, version_slug): """Project version detail page.""" @@ -184,34 +201,6 @@ def project_version_detail(request, project_slug, version_slug): ) -@login_required -def project_delete(request, project_slug): - """ - Project delete confirmation view. - - Make a project as deleted on POST, otherwise show a form asking for - confirmation of delete. - """ - project = get_object_or_404( - Project.objects.for_admin_user(request.user), - slug=project_slug, - ) - - context = { - 'project': project, - 'is_superproject': project.subprojects.all().exists() - } - - if request.method == 'POST': - # Delete the project and all related files - project.delete() - messages.success(request, _('Project deleted')) - project_dashboard = reverse('projects_dashboard') - return HttpResponseRedirect(project_dashboard) - - return render(request, 'projects/project_delete.html', context) - - class ImportWizardView( ProjectImportMixin, ProjectSpamMixin, PrivateViewMixin, SessionWizardView,