|
7 | 7 | from django.conf import settings
|
8 | 8 | from django.contrib import messages
|
9 | 9 | from django.contrib.auth.decorators import login_required
|
10 |
| -from django.contrib.auth.models import User |
11 | 10 | from django.db.models import Count
|
12 | 11 | from django.http import (
|
13 | 12 | Http404,
|
|
24 | 23 | from django.utils.translation import ugettext_lazy as _
|
25 | 24 | from django.views.generic import ListView, TemplateView, View
|
26 | 25 | from formtools.wizard.views import SessionWizardView
|
27 |
| -from vanilla import CreateView, DeleteView, DetailView, GenericView, UpdateView |
| 26 | +from vanilla import ( |
| 27 | + CreateView, |
| 28 | + DeleteView, |
| 29 | + DetailView, |
| 30 | + FormView, |
| 31 | + GenericView, |
| 32 | + UpdateView, |
| 33 | +) |
28 | 34 |
|
29 | 35 | from readthedocs.builds.forms import VersionForm
|
30 | 36 | from readthedocs.builds.models import Version
|
@@ -445,47 +451,49 @@ class ProjectRelationshipDelete(ProjectRelationshipMixin, DeleteView):
|
445 | 451 | http_method_names = ['post']
|
446 | 452 |
|
447 | 453 |
|
448 |
| -@login_required |
449 |
| -def project_users(request, project_slug): |
450 |
| - """Project users view and form view.""" |
451 |
| - project = get_object_or_404( |
452 |
| - Project.objects.for_admin_user(request.user), |
453 |
| - slug=project_slug, |
454 |
| - ) |
| 454 | +class ProjectUsersMixin(ProjectAdminMixin, PrivateViewMixin): |
455 | 455 |
|
456 |
| - form = UserForm(data=request.POST or None, project=project) |
| 456 | + form_class = UserForm |
457 | 457 |
|
458 |
| - if request.method == 'POST' and form.is_valid(): |
| 458 | + def get_queryset(self): |
| 459 | + project = self.get_project() |
| 460 | + return project.users.all() |
| 461 | + |
| 462 | + def get_success_url(self): |
| 463 | + return reverse('projects_users', args=[self.get_project().slug]) |
| 464 | + |
| 465 | + |
| 466 | +class ProjectUsersCreateList(ProjectUsersMixin, FormView): |
| 467 | + |
| 468 | + template_name = 'projects/project_users.html' |
| 469 | + |
| 470 | + def form_valid(self, form): |
459 | 471 | form.save()
|
460 |
| - project_dashboard = reverse('projects_users', args=[project.slug]) |
461 |
| - return HttpResponseRedirect(project_dashboard) |
| 472 | + return HttpResponseRedirect(self.get_success_url()) |
462 | 473 |
|
463 |
| - users = project.users.all() |
| 474 | + def get_context_data(self, **kwargs): |
| 475 | + context = super().get_context_data(**kwargs) |
| 476 | + context['users'] = self.get_queryset() |
| 477 | + return context |
464 | 478 |
|
465 |
| - return render( |
466 |
| - request, |
467 |
| - 'projects/project_users.html', |
468 |
| - {'form': form, 'project': project, 'users': users}, |
469 |
| - ) |
470 | 479 |
|
| 480 | +class ProjectUsersDelete(ProjectUsersMixin, GenericView): |
471 | 481 |
|
472 |
| -@login_required |
473 |
| -def project_users_delete(request, project_slug): |
474 |
| - if request.method != 'POST': |
475 |
| - return HttpResponseNotAllowed('Only POST is allowed') |
476 |
| - project = get_object_or_404( |
477 |
| - Project.objects.for_admin_user(request.user), |
478 |
| - slug=project_slug, |
479 |
| - ) |
480 |
| - user = get_object_or_404( |
481 |
| - User.objects.all(), |
482 |
| - username=request.POST.get('username'), |
483 |
| - ) |
484 |
| - if user == request.user: |
485 |
| - raise Http404 |
486 |
| - project.users.remove(user) |
487 |
| - project_dashboard = reverse('projects_users', args=[project.slug]) |
488 |
| - return HttpResponseRedirect(project_dashboard) |
| 482 | + http_method_names = ['post'] |
| 483 | + |
| 484 | + def post(self, request, *args, **kwargs): |
| 485 | + username = self.request.POST.get('username') |
| 486 | + user = get_object_or_404( |
| 487 | + self.get_queryset(), |
| 488 | + username=username, |
| 489 | + ) |
| 490 | + if user == request.user: |
| 491 | + raise Http404 |
| 492 | + |
| 493 | + project = self.get_project() |
| 494 | + project.users.remove(user) |
| 495 | + |
| 496 | + return HttpResponseRedirect(self.get_success_url()) |
489 | 497 |
|
490 | 498 |
|
491 | 499 | @login_required
|
@@ -598,50 +606,48 @@ def project_translations_delete(request, project_slug, child_slug):
|
598 | 606 | return HttpResponseRedirect(project_dashboard)
|
599 | 607 |
|
600 | 608 |
|
601 |
| -@login_required |
602 |
| -def project_redirects(request, project_slug): |
| 609 | +class ProjectRedirectsMixin(ProjectAdminMixin, PrivateViewMixin): |
| 610 | + |
603 | 611 | """Project redirects view and form view."""
|
604 |
| - project = get_object_or_404( |
605 |
| - Project.objects.for_admin_user(request.user), |
606 |
| - slug=project_slug, |
607 |
| - ) |
608 | 612 |
|
609 |
| - form = RedirectForm(data=request.POST or None, project=project) |
| 613 | + def get_success_url(self): |
| 614 | + return reverse( |
| 615 | + 'projects_redirects', |
| 616 | + args=[self.get_project().slug], |
| 617 | + ) |
610 | 618 |
|
611 |
| - if request.method == 'POST' and form.is_valid(): |
| 619 | + |
| 620 | +class ProjectRedirects(ProjectRedirectsMixin, FormView): |
| 621 | + |
| 622 | + form_class = RedirectForm |
| 623 | + template_name = 'projects/project_redirects.html' |
| 624 | + |
| 625 | + def form_valid(self, form): |
612 | 626 | form.save()
|
613 |
| - project_dashboard = reverse('projects_redirects', args=[project.slug]) |
614 |
| - return HttpResponseRedirect(project_dashboard) |
| 627 | + return HttpResponseRedirect(self.get_success_url()) |
615 | 628 |
|
616 |
| - redirects = project.redirects.all() |
| 629 | + def get_context_data(self, **kwargs): |
| 630 | + context = super().get_context_data(**kwargs) |
| 631 | + project = self.get_project() |
| 632 | + context['redirects'] = project.redirects.all() |
| 633 | + return context |
617 | 634 |
|
618 |
| - return render( |
619 |
| - request, |
620 |
| - 'projects/project_redirects.html', |
621 |
| - {'form': form, 'project': project, 'redirects': redirects}, |
622 |
| - ) |
623 | 635 |
|
| 636 | +class ProjectRedirectsDelete(ProjectRedirectsMixin, GenericView): |
624 | 637 |
|
625 |
| -@login_required |
626 |
| -def project_redirects_delete(request, project_slug): |
627 |
| - """Project redirect delete view.""" |
628 |
| - if request.method != 'POST': |
629 |
| - return HttpResponseNotAllowed('Only POST is allowed') |
630 |
| - project = get_object_or_404( |
631 |
| - Project.objects.for_admin_user(request.user), |
632 |
| - slug=project_slug, |
633 |
| - ) |
634 |
| - redirect = get_object_or_404( |
635 |
| - project.redirects, |
636 |
| - pk=request.POST.get('id_pk'), |
637 |
| - ) |
638 |
| - if redirect.project == project: |
639 |
| - redirect.delete() |
640 |
| - else: |
641 |
| - raise Http404 |
642 |
| - return HttpResponseRedirect( |
643 |
| - reverse('projects_redirects', args=[project.slug]), |
644 |
| - ) |
| 638 | + http_method_names = ['post'] |
| 639 | + |
| 640 | + def post(self, request, *args, **kwargs): |
| 641 | + project = self.get_project() |
| 642 | + redirect = get_object_or_404( |
| 643 | + project.redirects, |
| 644 | + pk=request.POST.get('id_pk'), |
| 645 | + ) |
| 646 | + if redirect.project == project: |
| 647 | + redirect.delete() |
| 648 | + else: |
| 649 | + raise Http404 |
| 650 | + return HttpResponseRedirect(self.get_success_url()) |
645 | 651 |
|
646 | 652 |
|
647 | 653 | @login_required
|
|
0 commit comments