123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- 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)
|