Recruitment_site/offer_backend/apps/jobs/views.py

71 lines
2.7 KiB
Python

from rest_framework import viewsets, permissions, generics
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.filters import SearchFilter
from django_filters.rest_framework import DjangoFilterBackend
from .models import Job, JobFavorite
from .serializers import JobListSerializer, JobDetailSerializer, JobFavoriteSerializer
from .filters import JobFilter
from apps.accounts.permissions import IsAdminOrSuperAdmin, IsSeeker
class JobPublicViewSet(viewsets.ReadOnlyModelViewSet):
"""公开只读,仅返回已发布职位"""
queryset = Job.objects.filter(status='published').select_related('organization')
filterset_class = JobFilter
filter_backends = [DjangoFilterBackend, SearchFilter]
search_fields = ['title', 'description', 'location']
permission_classes = [permissions.AllowAny]
def get_serializer_class(self):
if self.action == 'retrieve':
return JobDetailSerializer
return JobListSerializer
@action(detail=True, methods=['post'], permission_classes=[IsSeeker])
def favorite(self, request, pk=None):
job = self.get_object()
fav, created = JobFavorite.objects.get_or_create(user=request.user, job=job)
if not created:
fav.delete()
return Response({'collected': False})
return Response({'collected': True})
class MyFavoritesView(generics.ListAPIView):
"""求职者的收藏列表"""
serializer_class = JobFavoriteSerializer
permission_classes = [IsSeeker]
def get_queryset(self):
return JobFavorite.objects.filter(user=self.request.user).select_related(
'job', 'job__organization'
)
class JobManageViewSet(viewsets.ModelViewSet):
"""管理端:公司管理员管理本公司职位"""
permission_classes = [IsAdminOrSuperAdmin]
def get_serializer_class(self):
if self.action in ['retrieve', 'create', 'update', 'partial_update']:
return JobDetailSerializer
return JobListSerializer
def get_queryset(self):
user = self.request.user
if user.is_superadmin:
return Job.objects.all().select_related('organization')
# 防御 organization 为空的情况
if not user.organization_id:
return Job.objects.none()
return Job.objects.filter(organization=user.organization).select_related('organization')
def perform_create(self, serializer):
if self.request.user.is_admin:
# Admin 强制使用自己公司,忽略请求体中的 organization_id
serializer.save(organization=self.request.user.organization)
else:
# 超管需要在请求体中提供 organization_id
serializer.save()