Skip to content

Commit

Permalink
Merge pull request #6175 from stsewd/refactor-views-project-versions
Browse files Browse the repository at this point in the history
Refactor views ProjectVersion
  • Loading branch information
stsewd authored Oct 2, 2019
2 parents 494abb3 + 33433a0 commit 2e76781
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 63 deletions.
8 changes: 6 additions & 2 deletions readthedocs/projects/urls/private.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@
ProjectUpdate,
ProjectUsersCreateList,
ProjectUsersDelete,
ProjectVersionDeleteHTML,
ProjectVersionDetail,
SearchAnalytics,
)

Expand Down Expand Up @@ -70,11 +72,13 @@
),
url(
r'^(?P<project_slug>[-\w]+)/version/(?P<version_slug>[^/]+)/delete_html/$',
private.project_version_delete_html, name='project_version_delete_html',
ProjectVersionDeleteHTML.as_view(),
name='project_version_delete_html',
),
url(
r'^(?P<project_slug>[-\w]+)/version/(?P<version_slug>[^/]+)/$',
private.project_version_detail, name='project_version_detail',
ProjectVersionDetail.as_view(),
name='project_version_detail',
),
url(
r'^(?P<project_slug>[-\w]+)/delete/$',
Expand Down
115 changes: 54 additions & 61 deletions readthedocs/projects/views/private.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
DeleteView,
DetailView,
FormView,
GenericModelView,
GenericView,
UpdateView,
)
Expand Down Expand Up @@ -75,7 +76,6 @@

from ..tasks import retry_domain_verification


log = logging.getLogger(__name__)


Expand Down Expand Up @@ -167,25 +167,38 @@ def get_success_url(self):
return reverse('projects_dashboard')


@login_required
def project_version_detail(request, project_slug, version_slug):
"""Project version detail page."""
project = get_object_or_404(
Project.objects.for_admin_user(request.user),
slug=project_slug,
)
version = get_object_or_404(
Version.internal.public(
user=request.user,
project=project,
class ProjectVersionMixin(ProjectAdminMixin, PrivateViewMixin):

model = Version
context_object_name = 'version'
form_class = VersionForm
lookup_url_kwarg = 'version_slug'
lookup_field = 'slug'

def get_success_url(self):
return reverse(
'project_version_list',
kwargs={'project_slug': self.get_project().slug},
)


class ProjectVersionDetail(ProjectVersionMixin, UpdateView):

template_name = 'projects/project_version_detail.html'

def get_queryset(self):
return Version.internal.public(
user=self.request.user,
project=self.get_project(),
only_active=False,
),
slug=version_slug,
)
)

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

if request.method == 'POST' and form.is_valid():
def form_valid(self, form):
version = form.save()
if form.has_changed():
if 'active' in form.changed_data and version.active is False:
Expand All @@ -197,14 +210,31 @@ def project_version_detail(request, project_slug, version_slug):
)
version.built = False
version.save()
url = reverse('project_version_list', args=[project.slug])
return HttpResponseRedirect(url)
return HttpResponseRedirect(self.get_success_url())

return render(
request,
'projects/project_version_detail.html',
{'form': form, 'project': project, 'version': version},
)

class ProjectVersionDeleteHTML(ProjectVersionMixin, GenericModelView):

http_method_names = ['get', 'post']

def get(self, request, *args, **kwargs):
version = self.get_object()
if not version.active:
version.built = False
version.save()
broadcast(
type='app',
task=tasks.remove_dirs,
args=[version.get_artifact_paths()],
)
else:
return HttpResponseBadRequest(
"Can't delete HTML for an active version.",
)
return HttpResponseRedirect(self.get_success_url())

def post(self, request, *args, **kwargs):
return self.get(request, *args, **kwargs)


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


@login_required
def project_version_delete_html(request, project_slug, version_slug):
"""
Project version 'delete' HTML.
This marks a version as not built
"""
project = get_object_or_404(
Project.objects.for_admin_user(request.user),
slug=project_slug,
)
version = get_object_or_404(
Version.internal.public(
user=request.user,
project=project,
only_active=False,
),
slug=version_slug,
)

if not version.active:
version.built = False
version.save()
broadcast(
type='app',
task=tasks.remove_dirs,
args=[version.get_artifact_paths()],
)
else:
return HttpResponseBadRequest(
"Can't delete HTML for an active version.",
)
return HttpResponseRedirect(
reverse('project_version_list', kwargs={'project_slug': project_slug}),
)


class DomainMixin(ProjectAdminMixin, PrivateViewMixin):
model = Domain
form_class = DomainForm
Expand Down

0 comments on commit 2e76781

Please sign in to comment.