Skip to content

Commit d9ab73f

Browse files
committed
Refactor views ProjectVersion
Ref #5856
1 parent e50345c commit d9ab73f

File tree

2 files changed

+62
-63
lines changed

2 files changed

+62
-63
lines changed

readthedocs/projects/urls/private.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
ProjectAdvertisingUpdate,
2727
ProjectDashboard,
2828
ProjectUpdate,
29+
ProjectVersionDeleteHTML,
30+
ProjectVersionDetail,
2931
)
3032

3133

@@ -58,11 +60,13 @@
5860
),
5961
url(
6062
r'^(?P<project_slug>[-\w]+)/version/(?P<version_slug>[^/]+)/delete_html/$',
61-
private.project_version_delete_html, name='project_version_delete_html',
63+
ProjectVersionDeleteHTML.as_view(),
64+
name='project_version_delete_html',
6265
),
6366
url(
6467
r'^(?P<project_slug>[-\w]+)/version/(?P<version_slug>[^/]+)/$',
65-
private.project_version_detail, name='project_version_detail',
68+
ProjectVersionDetail.as_view(),
69+
name='project_version_detail',
6670
),
6771
url(
6872
r'^(?P<project_slug>[-\w]+)/delete/$', private.project_delete,

readthedocs/projects/views/private.py

Lines changed: 56 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,14 @@
2424
from django.utils.translation import ugettext_lazy as _
2525
from django.views.generic import ListView, TemplateView, View
2626
from formtools.wizard.views import SessionWizardView
27-
from vanilla import CreateView, DeleteView, DetailView, GenericView, UpdateView
27+
from vanilla import (
28+
CreateView,
29+
DeleteView,
30+
DetailView,
31+
GenericModelView,
32+
GenericView,
33+
UpdateView,
34+
)
2835

2936
from readthedocs.builds.forms import VersionForm
3037
from readthedocs.builds.models import Version
@@ -143,25 +150,36 @@ def get_success_url(self):
143150
return reverse('projects_detail', args=[self.object.slug])
144151

145152

146-
@login_required
147-
def project_version_detail(request, project_slug, version_slug):
148-
"""Project version detail page."""
149-
project = get_object_or_404(
150-
Project.objects.for_admin_user(request.user),
151-
slug=project_slug,
152-
)
153-
version = get_object_or_404(
154-
Version.internal.public(
155-
user=request.user,
156-
project=project,
153+
class ProjectVersionMixin(ProjectAdminMixin, PrivateViewMixin):
154+
155+
model = Version
156+
context_object_name = 'version'
157+
form_class = VersionForm
158+
lookup_url_kwarg = 'version_slug'
159+
lookup_field = 'slug'
160+
161+
def get_success_url(self):
162+
return reverse(
163+
'project_version_list',
164+
kwargs={'project_slug': self.get_project().slug},
165+
)
166+
167+
168+
class ProjectVersionDetail(ProjectVersionMixin, UpdateView):
169+
170+
template_name = 'projects/project_version_detail.html'
171+
172+
def get_queryset(self):
173+
return Version.internal.public(
174+
user=self.request.user,
175+
project=self.get_project(),
157176
only_active=False,
158-
),
159-
slug=version_slug,
160-
)
177+
)
161178

162-
form = VersionForm(request.POST or None, instance=version)
179+
def get_form(self, data=None, files=None, **kwargs):
180+
return self.get_form_class()(data, files, **kwargs)
163181

164-
if request.method == 'POST' and form.is_valid():
182+
def form_valid(self, form):
165183
version = form.save()
166184
if form.has_changed():
167185
if 'active' in form.changed_data and version.active is False:
@@ -173,14 +191,28 @@ def project_version_detail(request, project_slug, version_slug):
173191
)
174192
version.built = False
175193
version.save()
176-
url = reverse('project_version_list', args=[project.slug])
177-
return HttpResponseRedirect(url)
194+
return HttpResponseRedirect(self.get_success_url())
178195

179-
return render(
180-
request,
181-
'projects/project_version_detail.html',
182-
{'form': form, 'project': project, 'version': version},
183-
)
196+
197+
class ProjectVersionDeleteHTML(ProjectVersionMixin, GenericModelView):
198+
199+
http_method_names = ['get']
200+
201+
def get(self, request, *args, **kwargs):
202+
version = self.get_object()
203+
if not version.active:
204+
version.built = False
205+
version.save()
206+
broadcast(
207+
type='app',
208+
task=tasks.remove_dirs,
209+
args=[version.get_artifact_paths()],
210+
)
211+
else:
212+
return HttpResponseBadRequest(
213+
"Can't delete HTML for an active version.",
214+
)
215+
return HttpResponseRedirect(self.get_success_url())
184216

185217

186218
@login_required
@@ -654,43 +686,6 @@ def project_redirects_delete(request, project_slug):
654686
)
655687

656688

657-
@login_required
658-
def project_version_delete_html(request, project_slug, version_slug):
659-
"""
660-
Project version 'delete' HTML.
661-
662-
This marks a version as not built
663-
"""
664-
project = get_object_or_404(
665-
Project.objects.for_admin_user(request.user),
666-
slug=project_slug,
667-
)
668-
version = get_object_or_404(
669-
Version.internal.public(
670-
user=request.user,
671-
project=project,
672-
only_active=False,
673-
),
674-
slug=version_slug,
675-
)
676-
677-
if not version.active:
678-
version.built = False
679-
version.save()
680-
broadcast(
681-
type='app',
682-
task=tasks.remove_dirs,
683-
args=[version.get_artifact_paths()],
684-
)
685-
else:
686-
return HttpResponseBadRequest(
687-
"Can't delete HTML for an active version.",
688-
)
689-
return HttpResponseRedirect(
690-
reverse('project_version_list', kwargs={'project_slug': project_slug}),
691-
)
692-
693-
694689
class DomainMixin(ProjectAdminMixin, PrivateViewMixin):
695690
model = Domain
696691
form_class = DomainForm

0 commit comments

Comments
 (0)