Skip to content

Commit f10607f

Browse files
committed
Refactor ProjectRedirects views
ref readthedocs#5856
1 parent 044f200 commit f10607f

File tree

2 files changed

+50
-39
lines changed

2 files changed

+50
-39
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
ProjectAdvancedUpdate,
2727
ProjectAdvertisingUpdate,
2828
ProjectDashboard,
29+
ProjectRedirects,
30+
ProjectRedirectsDelete,
2931
ProjectUpdate,
3032
)
3133

@@ -97,12 +99,14 @@
9799
name='projects_translations_delete',
98100
),
99101
url(
100-
r'^(?P<project_slug>[-\w]+)/redirects/$', private.project_redirects,
102+
r'^(?P<project_slug>[-\w]+)/redirects/$',
103+
ProjectRedirects.as_view(),
101104
name='projects_redirects',
102105
),
103106
url(
104107
r'^(?P<project_slug>[-\w]+)/redirects/delete/$',
105-
private.project_redirects_delete, name='projects_redirects_delete',
108+
ProjectRedirectsDelete.as_view(),
109+
name='projects_redirects_delete',
106110
),
107111
url(
108112
r'^(?P<project_slug>[-\w]+)/advertising/$',

readthedocs/projects/views/private.py

Lines changed: 44 additions & 37 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+
FormView,
32+
GenericView,
33+
UpdateView,
34+
)
2835

2936
from readthedocs.builds.forms import VersionForm
3037
from readthedocs.builds.models import Version
@@ -608,50 +615,50 @@ def project_translations_delete(request, project_slug, child_slug):
608615
return HttpResponseRedirect(project_dashboard)
609616

610617

611-
@login_required
612-
def project_redirects(request, project_slug):
618+
class ProjectRedirectsMixin(ProjectAdminMixin, PrivateViewMixin):
619+
613620
"""Project redirects view and form view."""
614-
project = get_object_or_404(
615-
Project.objects.for_admin_user(request.user),
616-
slug=project_slug,
617-
)
618621

619-
form = RedirectForm(data=request.POST or None, project=project)
622+
model = EnvironmentVariable
623+
form_class = RedirectForm
620624

621-
if request.method == 'POST' and form.is_valid():
625+
def get_success_url(self):
626+
return reverse(
627+
'projects_redirects',
628+
args=[self.get_project().slug],
629+
)
630+
631+
632+
class ProjectRedirects(ProjectRedirectsMixin, FormView):
633+
634+
template_name = 'projects/project_redirects.html'
635+
636+
def form_valid(self, form):
622637
form.save()
623-
project_dashboard = reverse('projects_redirects', args=[project.slug])
624-
return HttpResponseRedirect(project_dashboard)
638+
return HttpResponseRedirect(self.get_success_url())
625639

626-
redirects = project.redirects.all()
640+
def get_context_data(self, **kwargs):
641+
context = super().get_context_data(**kwargs)
642+
project = self.get_project()
643+
context['redirects'] = project.redirects.all()
644+
return context
627645

628-
return render(
629-
request,
630-
'projects/project_redirects.html',
631-
{'form': form, 'project': project, 'redirects': redirects},
632-
)
633646

647+
class ProjectRedirectsDelete(ProjectRedirectsMixin, GenericView):
634648

635-
@login_required
636-
def project_redirects_delete(request, project_slug):
637-
"""Project redirect delete view."""
638-
if request.method != 'POST':
639-
return HttpResponseNotAllowed('Only POST is allowed')
640-
project = get_object_or_404(
641-
Project.objects.for_admin_user(request.user),
642-
slug=project_slug,
643-
)
644-
redirect = get_object_or_404(
645-
project.redirects,
646-
pk=request.POST.get('id_pk'),
647-
)
648-
if redirect.project == project:
649-
redirect.delete()
650-
else:
651-
raise Http404
652-
return HttpResponseRedirect(
653-
reverse('projects_redirects', args=[project.slug]),
654-
)
649+
http_method_names = ['post']
650+
651+
def post(self, request, *args, **kwargs):
652+
project = self.get_project()
653+
redirect = get_object_or_404(
654+
project.redirects,
655+
pk=request.POST.get('id_pk'),
656+
)
657+
if redirect.project == project:
658+
redirect.delete()
659+
else:
660+
raise Http404
661+
return HttpResponseRedirect(self.get_success_url())
655662

656663

657664
@login_required

0 commit comments

Comments
 (0)