views.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. from rest_framework import viewsets, permissions, status
  2. from rest_framework.decorators import action
  3. from rest_framework.response import Response
  4. from django_filters.rest_framework import DjangoFilterBackend
  5. from .models import DutyRoster, Meeting
  6. from .serializers import (
  7. DutyRosterSerializer,
  8. MeetingSerializer,
  9. MeetingDetailSerializer
  10. )
  11. from utils.page import MyPageNumberPagination
  12. from .serializers import IsDutyPersonOrAdmin
  13. from datetime import date, timedelta # 文件顶部导入
  14. class DutyRosterViewSet(viewsets.ModelViewSet):
  15. """轮值信息视图集"""
  16. queryset = DutyRoster.objects.all().order_by('-start_date')
  17. serializer_class = DutyRosterSerializer
  18. filter_backends = [DjangoFilterBackend]
  19. filterset_fields = ['status', 'user']
  20. pagination_class = MyPageNumberPagination
  21. def get_serializer_context(self):
  22. """将当前用户添加到序列化器上下文中"""
  23. context = super().get_serializer_context()
  24. context.update({'request': self.request})
  25. return context
  26. def current_duty(self, request):
  27. """获取当前轮值信息"""
  28. current_duty = DutyRoster.objects.filter(
  29. status=DutyRoster.Status.ACTIVE
  30. ).first()
  31. if not current_duty:
  32. from userprofile.models import Users
  33. # 从周一开始创建轮值信息
  34. start_date = date.today() - timedelta(days=date.today().weekday())
  35. end_date = start_date + timedelta(days=13)
  36. base_user = Users.objects.filter(roles=Users.UserRole.ADMIN).first()
  37. if not base_user:
  38. return Response({"detail": "系统尚未配置管理员账号"}, status=200)
  39. current_duty = DutyRoster.objects.create(
  40. user=base_user,
  41. start_date=start_date,
  42. end_date=end_date,
  43. status=DutyRoster.Status.ACTIVE
  44. )
  45. serializer = self.get_serializer(current_duty)
  46. return Response(serializer.data)
  47. serializer = self.get_serializer(current_duty)
  48. return Response(serializer.data)
  49. class MeetingViewSet(viewsets.ModelViewSet):
  50. """组会视图集"""
  51. queryset = Meeting.objects.all().order_by('-meeting_time')
  52. serializer_class = MeetingSerializer
  53. filter_backends = [DjangoFilterBackend]
  54. filterset_fields = ['duty_roster', 'published', 'meeting_type']
  55. pagination_class = MyPageNumberPagination
  56. def get_serializer_class(self):
  57. if self.action in ['retrieve', 'create', 'update']:
  58. return MeetingDetailSerializer
  59. return MeetingSerializer
  60. def publish_meeting(self, request, pk=None):
  61. """发布会议通知"""
  62. meeting = self.get_object()
  63. # 检查当前用户是否为轮值同学
  64. if not meeting.duty_roster.user == request.user:
  65. return Response({"detail": "只有当前轮值同学可以发布会议通知"}, status=200)
  66. meeting.published = True
  67. meeting.save()
  68. # 在此处添加实际发布通知的逻辑
  69. return Response({"status": "会议已发布"}, status=200)
  70. def get_document_url(self, request, pk=None):
  71. """获取OnlyOffice文档URL"""
  72. meeting = self.get_object()
  73. if not meeting.summary_doc_id:
  74. return Response({"detail": "文档尚未创建"}, status=200)
  75. # 实际系统中应根据配置生成OnlyOffice文档URL
  76. document_url = f"/onlyoffice/{meeting.summary_doc_id}"
  77. return Response({"document_url": document_url})
  78. def update(self, request, *args, **kwargs):
  79. return super().update(request, *args, **kwargs)
  80. def destroy(self, request, *args, **kwargs):
  81. return super().destroy(request, *args, **kwargs)