Skip to content

Commit 2e76781

Browse files
authored
Merge pull request #6175 from stsewd/refactor-views-project-versions
Refactor views ProjectVersion
2 parents 494abb3 + 33433a0 commit 2e76781

File tree

2 files changed

+60
-63
lines changed

2 files changed

+60
-63
lines changed

readthedocs/projects/urls/private.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@
3636
ProjectUpdate,
3737
ProjectUsersCreateList,
3838
ProjectUsersDelete,
39+
ProjectVersionDeleteHTML,
40+
ProjectVersionDetail,
3941
SearchAnalytics,
4042
)
4143

@@ -70,11 +72,13 @@
7072
),
7173
url(
7274
r'^(?P<project_slug>[-\w]+)/version/(?P<version_slug>[^/]+)/delete_html/$',
73-
private.project_version_delete_html, name='project_version_delete_html',
75+
ProjectVersionDeleteHTML.as_view(),
76+
name='project_version_delete_html',
7477
),
7578
url(
7679
r'^(?P<project_slug>[-\w]+)/version/(?P<version_slug>[^/]+)/$',
77-
private.project_version_detail, name='project_version_detail',
80+
ProjectVersionDetail.as_view(),
81+
name='project_version_detail',
7882
),
7983
url(
8084
r'^(?P<project_slug>[-\w]+)/delete/$',

readthedocs/projects/views/private.py

Lines changed: 54 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
DeleteView,
2929
DetailView,
3030
FormView,
31+
GenericModelView,
3132
GenericView,
3233
UpdateView,
3334
)
@@ -75,7 +76,6 @@
7576

7677
from ..tasks import retry_domain_verification
7778

78-
7979
log = logging.getLogger(__name__)
8080

8181

@@ -167,25 +167,38 @@ def get_success_url(self):
167167
return reverse('projects_dashboard')
168168

169169

170-
@login_required
171-
def project_version_detail(request, project_slug, version_slug):
172-
"""Project version detail page."""
173-
project = get_object_or_404(
174-
Project.objects.for_admin_user(request.user),
175-
slug=project_slug,
176-
)
177-
version = get_object_or_404(
178-
Version.internal.public(
179-
user=request.user,
180-
project=project,
170+
class ProjectVersionMixin(ProjectAdminMixin, PrivateViewMixin):
171+
172+
model = Version
173+
context_object_name = 'version'
174+
form_class = VersionForm
175+
lookup_url_kwarg = 'version_slug'
176+
lookup_field = 'slug'
177+
178+
def get_success_url(self):
179+
return reverse(
180+
'project_version_list',
181+
kwargs={'project_slug': self.get_project().slug},
182+
)
183+
184+
185+
class ProjectVersionDetail(ProjectVersionMixin, UpdateView):
186+
187+
template_name = 'projects/project_version_detail.html'
188+
189+
def get_queryset(self):
190+
return Version.internal.public(
191+
user=self.request.user,
192+
project=self.get_project(),
181193
only_active=False,
182-
),
183-
slug=version_slug,
184-
)
194+
)
185195

186-
form = VersionForm(request.POST or None, instance=version)
196+
def get_form(self, data=None, files=None, **kwargs):
197+
# This overrides the method from `ProjectAdminMixin`,
198+
# since we don't have a project.
199+
return self.get_form_class()(data, files, **kwargs)
187200

188-
if request.method == 'POST' and form.is_valid():
201+
def form_valid(self, form):
189202
version = form.save()
190203
if form.has_changed():
191204
if 'active' in form.changed_data and version.active is False:
@@ -197,14 +210,31 @@ def project_version_detail(request, project_slug, version_slug):
197210
)
198211
version.built = False
199212
version.save()
200-
url = reverse('project_version_list', args=[project.slug])
201-
return HttpResponseRedirect(url)
213+
return HttpResponseRedirect(self.get_success_url())
202214

203-
return render(
204-
request,
205-
'projects/project_version_detail.html',
206-
{'form': form, 'project': project, 'version': version},
207-
)
215+
216+
class ProjectVersionDeleteHTML(ProjectVersionMixin, GenericModelView):
217+
218+
http_method_names = ['get', 'post']
219+
220+
def get(self, request, *args, **kwargs):
221+
version = self.get_object()
222+
if not version.active:
223+
version.built = False
224+
version.save()
225+
broadcast(
226+
type='app',
227+
task=tasks.remove_dirs,
228+
args=[version.get_artifact_paths()],
229+
)
230+
else:
231+
return HttpResponseBadRequest(
232+
"Can't delete HTML for an active version.",
233+
)
234+
return HttpResponseRedirect(self.get_success_url())
235+
236+
def post(self, request, *args, **kwargs):
237+
return self.get(request, *args, **kwargs)
208238

209239

210240
class ImportWizardView(
@@ -674,43 +704,6 @@ def post(self, request, *args, **kwargs):
674704
return HttpResponseRedirect(self.get_success_url())
675705

676706

677-
@login_required
678-
def project_version_delete_html(request, project_slug, version_slug):
679-
"""
680-
Project version 'delete' HTML.
681-
682-
This marks a version as not built
683-
"""
684-
project = get_object_or_404(
685-
Project.objects.for_admin_user(request.user),
686-
slug=project_slug,
687-
)
688-
version = get_object_or_404(
689-
Version.internal.public(
690-
user=request.user,
691-
project=project,
692-
only_active=False,
693-
),
694-
slug=version_slug,
695-
)
696-
697-
if not version.active:
698-
version.built = False
699-
version.save()
700-
broadcast(
701-
type='app',
702-
task=tasks.remove_dirs,
703-
args=[version.get_artifact_paths()],
704-
)
705-
else:
706-
return HttpResponseBadRequest(
707-
"Can't delete HTML for an active version.",
708-
)
709-
return HttpResponseRedirect(
710-
reverse('project_version_list', kwargs={'project_slug': project_slug}),
711-
)
712-
713-
714707
class DomainMixin(ProjectAdminMixin, PrivateViewMixin):
715708
model = Domain
716709
form_class = DomainForm

0 commit comments

Comments
 (0)