from rest_framework import generics, viewsets from rest_framework.response import Response from rest_framework.decorators import action from django.http import FileResponse from .models import Application from .serializers import ApplicationCreateSerializer, ApplicationSerializer, ApplicationStatusSerializer from .emails import notify_status_change from apps.accounts.permissions import IsSeeker, IsAdminOrSuperAdmin class ApplyView(generics.CreateAPIView): serializer_class = ApplicationCreateSerializer permission_classes = [IsSeeker] class MyApplicationsView(generics.ListAPIView): serializer_class = ApplicationSerializer permission_classes = [IsSeeker] def get_queryset(self): return Application.objects.filter(applicant=self.request.user).select_related('job__organization') class ApplicationManageViewSet(viewsets.ReadOnlyModelViewSet): """HR 查看本公司投递""" serializer_class = ApplicationSerializer permission_classes = [IsAdminOrSuperAdmin] def get_queryset(self): user = self.request.user if user.is_superadmin: return Application.objects.all().select_related('job__organization', 'applicant') return Application.objects.filter( job__organization=user.organization ).select_related('job__organization', 'applicant') @action(detail=True, methods=['get']) def download_resume(self, request, pk=None): """下载求职者的简历附件""" application = self.get_object() attachment_url = application.resume_snapshot.get('attachment_url') if not attachment_url: return Response({'detail': '附件不可用'}, status=404) try: from django.core.files.storage import default_storage # 获取文件 file = default_storage.open(attachment_url.lstrip('/media/'), 'rb') response = FileResponse(file) response['Content-Type'] = 'application/octet-stream' response['Content-Disposition'] = f'attachment; filename="{application.resume_snapshot.get("name", "resume")}.pdf"' return response except Exception as e: return Response({'detail': f'下载失败: {str(e)}'}, status=400) class ApplicationStatusUpdateView(generics.UpdateAPIView): serializer_class = ApplicationStatusSerializer permission_classes = [IsAdminOrSuperAdmin] def get_queryset(self): user = self.request.user if user.is_superadmin: return Application.objects.all() return Application.objects.filter(job__organization=user.organization) def perform_update(self, serializer): instance = serializer.save() notify_status_change(instance)