49 lines
1.9 KiB
Python
49 lines
1.9 KiB
Python
from rest_framework import viewsets, permissions
|
|
from rest_framework.filters import SearchFilter
|
|
from django_filters.rest_framework import DjangoFilterBackend
|
|
from .models import Job
|
|
from .serializers import JobListSerializer, JobDetailSerializer
|
|
from .filters import JobFilter
|
|
from apps.accounts.permissions import IsAdminOrSuperAdmin
|
|
|
|
|
|
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
|
|
|
|
|
|
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()
|