From 7d1981a574afda712e4beb98cdb1f93a5af69a08 Mon Sep 17 00:00:00 2001 From: Santos Gallegos Date: Wed, 11 Sep 2019 18:01:31 -0500 Subject: [PATCH 1/3] View function to class --- readthedocs/projects/urls/private.py | 4 ++- readthedocs/projects/views/private.py | 39 ++++++++++++--------------- 2 files changed, 20 insertions(+), 23 deletions(-) diff --git a/readthedocs/projects/urls/private.py b/readthedocs/projects/urls/private.py index 267a0b78ac4..f62e1f60419 100644 --- a/readthedocs/projects/urls/private.py +++ b/readthedocs/projects/urls/private.py @@ -25,6 +25,7 @@ ProjectAdvancedUpdate, ProjectAdvertisingUpdate, ProjectDashboard, + ProjectDelete, ProjectUpdate, ) @@ -65,7 +66,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 2b699c9e971..a337fb99667 100644 --- a/readthedocs/projects/views/private.py +++ b/readthedocs/projects/views/private.py @@ -183,32 +183,27 @@ def project_version_detail(request, project_slug, version_slug): ) -@login_required -def project_delete(request, project_slug): - """ - Project delete confirmation view. +class ProjectDelete(ProjectAdminMixin, PrivateViewMixin, DeleteView): - 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, - ) + model = Project + lookup_url_kwarg = 'project_slug' + lookup_field = 'slug' + success_message = _('Project deleted') + template_name = 'projects/project_delete.html' - context = { - 'project': project, - 'is_superproject': project.subprojects.all().exists() - } + def get_queryset(self): + return self.model.objects.for_admin_user(self.request.user) - 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) + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + + project = self.get_object() + context['is_superproject'] = project.subprojects.all().exists() - return render(request, 'projects/project_delete.html', context) + return context + + def get_success_url(self): + return reverse('projects_dashboard') class ImportWizardView( From 3674a881733c37aca624beb1c013fbc3001b395f Mon Sep 17 00:00:00 2001 From: Santos Gallegos Date: Wed, 11 Sep 2019 18:47:10 -0500 Subject: [PATCH 2/3] DRY --- readthedocs/projects/views/private.py | 60 ++++++++++++--------------- 1 file changed, 26 insertions(+), 34 deletions(-) diff --git a/readthedocs/projects/views/private.py b/readthedocs/projects/views/private.py index a337fb99667..57b1d3cc599 100644 --- a/readthedocs/projects/views/private.py +++ b/readthedocs/projects/views/private.py @@ -111,38 +111,53 @@ def get_context_data(self, **kwargs): return context -class ProjectUpdate(ProjectSpamMixin, PrivateViewMixin, UpdateView): +class ProjectMixin(PrivateViewMixin): - 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.""" @@ -183,29 +198,6 @@ def project_version_detail(request, project_slug, version_slug): ) -class ProjectDelete(ProjectAdminMixin, PrivateViewMixin, DeleteView): - - model = Project - lookup_url_kwarg = 'project_slug' - lookup_field = 'slug' - success_message = _('Project deleted') - template_name = 'projects/project_delete.html' - - def get_queryset(self): - return self.model.objects.for_admin_user(self.request.user) - - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - - project = self.get_object() - context['is_superproject'] = project.subprojects.all().exists() - - return context - - def get_success_url(self): - return reverse('projects_dashboard') - - class ImportWizardView( ProjectImportMixin, ProjectSpamMixin, PrivateViewMixin, SessionWizardView, From 284957e8d461bc246f8db292cce9f71d838fb6d4 Mon Sep 17 00:00:00 2001 From: Santos Gallegos Date: Mon, 30 Sep 2019 10:50:47 -0500 Subject: [PATCH 3/3] Update docstring --- readthedocs/projects/views/private.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/readthedocs/projects/views/private.py b/readthedocs/projects/views/private.py index 57b1d3cc599..6b68188d4ee 100644 --- a/readthedocs/projects/views/private.py +++ b/readthedocs/projects/views/private.py @@ -113,6 +113,8 @@ def get_context_data(self, **kwargs): class ProjectMixin(PrivateViewMixin): + """Common pieces for model views of Project.""" + model = Project lookup_url_kwarg = 'project_slug' lookup_field = 'slug'