from rest_framework import viewsets, permissions, status from rest_framework.decorators import action from rest_framework.response import Response from django_filters.rest_framework import DjangoFilterBackend from .models import DutyRoster, Meeting from .serializers import ( DutyRosterSerializer, MeetingSerializer, MeetingDetailSerializer ) from utils.page import MyPageNumberPagination from .serializers import IsDutyPersonOrAdmin from datetime import date, timedelta # 文件顶部导入 class DutyRosterViewSet(viewsets.ModelViewSet): """轮值信息视图集""" queryset = DutyRoster.objects.all().order_by('-start_date') serializer_class = DutyRosterSerializer filter_backends = [DjangoFilterBackend] filterset_fields = ['status', 'user'] pagination_class = MyPageNumberPagination def get_serializer_context(self): """将当前用户添加到序列化器上下文中""" context = super().get_serializer_context() context.update({'request': self.request}) return context def current_duty(self, request): """获取当前轮值信息""" current_duty = DutyRoster.objects.filter( status=DutyRoster.Status.ACTIVE ).first() if not current_duty: from userprofile.models import Users # 从周一开始创建轮值信息 start_date = date.today() - timedelta(days=date.today().weekday()) end_date = start_date + timedelta(days=13) base_user = Users.objects.filter(roles=Users.UserRole.ADMIN).first() if not base_user: return Response({"detail": "系统尚未配置管理员账号"}, status=200) current_duty = DutyRoster.objects.create( user=base_user, start_date=start_date, end_date=end_date, status=DutyRoster.Status.ACTIVE ) serializer = self.get_serializer(current_duty) return Response(serializer.data) serializer = self.get_serializer(current_duty) return Response(serializer.data) class MeetingViewSet(viewsets.ModelViewSet): """组会视图集""" queryset = Meeting.objects.all().order_by('-meeting_time') serializer_class = MeetingSerializer filter_backends = [DjangoFilterBackend] filterset_fields = ['duty_roster', 'published', 'meeting_type'] pagination_class = MyPageNumberPagination def get_serializer_class(self): if self.action in ['retrieve', 'create', 'update']: return MeetingDetailSerializer return MeetingSerializer def publish_meeting(self, request, pk=None): """发布会议通知""" meeting = self.get_object() # 检查当前用户是否为轮值同学 if not meeting.duty_roster.user == request.user: return Response({"detail": "只有当前轮值同学可以发布会议通知"}, status=200) meeting.published = True meeting.save() # 在此处添加实际发布通知的逻辑 return Response({"status": "会议已发布"}, status=200) def get_document_url(self, request, pk=None): """获取OnlyOffice文档URL""" meeting = self.get_object() if not meeting.summary_doc_id: return Response({"detail": "文档尚未创建"}, status=200) # 实际系统中应根据配置生成OnlyOffice文档URL document_url = f"/onlyoffice/{meeting.summary_doc_id}" return Response({"document_url": document_url}) def update(self, request, *args, **kwargs): return super().update(request, *args, **kwargs) def destroy(self, request, *args, **kwargs): return super().destroy(request, *args, **kwargs)