| from rest_framework import viewsets, permissions, status |
| from rest_framework.response import Response |
| from django.views.decorators.csrf import csrf_exempt |
| from django.utils.decorators import method_decorator |
| from api.models import Project |
| from api.serializers import ProjectSerializer, ProjectDetailSerializer |
| import os |
| import shutil |
| from django.conf import settings |
|
|
| @method_decorator(csrf_exempt, name='dispatch') |
| class ProjectViewSet(viewsets.ModelViewSet): |
| """项目视图集""" |
| |
| queryset = Project.objects.none() |
| |
| queryset = Project.objects.all() |
| permission_classes = [permissions.IsAuthenticated] |
| |
| def get_serializer_class(self): |
| if self.action == 'retrieve': |
| return ProjectDetailSerializer |
| return ProjectSerializer |
| |
| |
| |
| |
|
|
| def get_queryset(self): |
| |
| if getattr(self, 'swagger_fake_view', False): |
| return Project.objects.none() |
|
|
| user = self.request.user |
| if not user or not user.is_authenticated: |
| return Project.objects.none() |
|
|
| return Project.objects.filter(user=user) |
| |
| def perform_create(self, serializer): |
| """创建项目时,设置用户为当前用户""" |
| serializer.save(user=self.request.user) |
| |
| def create(self, request, *args, **kwargs): |
| serializer = self.get_serializer(data=request.data) |
| serializer.is_valid(raise_exception=True) |
| self.perform_create(serializer) |
| headers = self.get_success_headers(serializer.data) |
| |
| |
| response_data = serializer.data |
| response_data['next_steps'] = [ |
| { |
| "step": "data_upload", |
| "url": f"/api/projects/{response_data['id']}/data/upload/", |
| "description": "上传数据" |
| } |
| ] |
| |
| return Response(response_data, status=status.HTTP_201_CREATED, headers=headers) |
| |
| def destroy(self, request, *args, **kwargs): |
| """删除项目,包括其关联的所有文件和数据""" |
| instance = self.get_object() |
| |
| |
| user_id = request.user.id |
| project_id = str(instance.id) |
| project_dir = os.path.join(settings.MEDIA_ROOT, f'users/{user_id}/projects/{project_id}') |
| |
| if os.path.exists(project_dir): |
| try: |
| shutil.rmtree(project_dir) |
| except Exception as e: |
| return Response( |
| {"error": {"code": "delete_files_error", "message": f"删除项目文件时出错: {str(e)}"}}, |
| status=status.HTTP_500_INTERNAL_SERVER_ERROR |
| ) |
| |
| |
| instance.delete() |
| |
| return Response( |
| {"status": "success", "message": "项目已成功删除"}, |
| status=status.HTTP_204_NO_CONTENT |
| ) |