You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

54 lines
2.1 KiB

4 years ago
3 years ago
4 years ago
3 years ago
3 years ago
4 years ago
4 years ago
4 years ago
3 years ago
3 years ago
4 years ago
3 years ago
  1. from django.conf import settings
  2. from django_filters.rest_framework import DjangoFilterBackend
  3. from rest_framework import filters, generics, status
  4. from rest_framework.permissions import IsAdminUser, IsAuthenticated
  5. from rest_framework.response import Response
  6. from projects.models import Project
  7. from projects.permissions import IsProjectAdmin, IsProjectStaffAndReadOnly
  8. from projects.serializers import ProjectPolymorphicSerializer
  9. class ProjectList(generics.ListCreateAPIView):
  10. serializer_class = ProjectPolymorphicSerializer
  11. filter_backends = (DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter)
  12. search_fields = ("name", "description")
  13. ordering_fields = ["name", "created_at", "created_by", "project_type"]
  14. ordering = ["-created_at"]
  15. def get_permissions(self):
  16. if self.request.method == "GET":
  17. self.permission_classes = [
  18. IsAuthenticated,
  19. ]
  20. else:
  21. self.permission_classes = [IsAuthenticated & IsAdminUser]
  22. return super().get_permissions()
  23. def get_queryset(self):
  24. return Project.objects.filter(role_mappings__user=self.request.user)
  25. def perform_create(self, serializer):
  26. project = serializer.save(created_by=self.request.user)
  27. project.add_admin()
  28. def delete(self, request, *args, **kwargs):
  29. delete_ids = request.data["ids"]
  30. projects = Project.objects.filter(
  31. role_mappings__user=self.request.user,
  32. role_mappings__role__name=settings.ROLE_PROJECT_ADMIN,
  33. pk__in=delete_ids,
  34. )
  35. # Todo: I want to use bulk delete.
  36. # But it causes the constraint error.
  37. # See https://github.com/django-polymorphic/django-polymorphic/issues/229
  38. for project in projects:
  39. project.delete()
  40. return Response(status=status.HTTP_204_NO_CONTENT)
  41. class ProjectDetail(generics.RetrieveUpdateDestroyAPIView):
  42. queryset = Project.objects.all()
  43. serializer_class = ProjectPolymorphicSerializer
  44. lookup_url_kwarg = "project_id"
  45. permission_classes = [IsAuthenticated & (IsProjectAdmin | IsProjectStaffAndReadOnly)]