serializers.py 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. from rest_framework import serializers
  2. from .models import DutyRoster, Meeting
  3. from userprofile.models import Users
  4. from userprofile.serializers import UsersGetSerializer
  5. class DutyRosterSerializer(serializers.ModelSerializer):
  6. """轮值信息序列化器"""
  7. user = UsersGetSerializer(read_only=True)
  8. user_id = serializers.PrimaryKeyRelatedField(
  9. source='user',
  10. queryset=Users.objects.all(),
  11. write_only=True
  12. )
  13. user_token = serializers.CharField(source='user.openid', read_only=True)
  14. class Meta:
  15. model = DutyRoster
  16. fields = [
  17. 'duty_id', 'user', 'user_id', 'user_token','start_date', 'end_date',
  18. 'status', 'todo_items', 'notes', 'cleaning_schedule',
  19. 'create_time', 'update_time'
  20. ]
  21. read_only_fields = ['status', 'create_time', 'update_time']
  22. def create(self, validated_data):
  23. # 自动设置状态为即将开始
  24. validated_data['status'] = DutyRoster.Status.UPCOMING
  25. return super().create(validated_data)
  26. def update(self, instance, validated_data):
  27. # 自动更新状态
  28. if 'start_date' in validated_data or 'end_date' in validated_data:
  29. # 这里应添加状态更新逻辑
  30. pass
  31. return super().update(instance, validated_data)
  32. class MeetingSerializer(serializers.ModelSerializer):
  33. """组会基础序列化器"""
  34. class Meta:
  35. model = Meeting
  36. fields = [
  37. 'meeting_id', 'title', 'meeting_type', 'location',
  38. 'online_link', 'meeting_time', 'published', 'duty_roster',
  39. 'create_time', 'update_time'
  40. ]
  41. read_only_fields = ['published', 'create_time', 'update_time']
  42. class MeetingDetailSerializer(serializers.ModelSerializer):
  43. """组会详细序列化器(含会议纪要)"""
  44. summary = serializers.CharField(
  45. required=False,
  46. allow_null=True,
  47. allow_blank=True
  48. )
  49. class Meta:
  50. model = Meeting
  51. fields = [
  52. 'meeting_id', 'title', 'meeting_type', 'location',
  53. 'online_link', 'meeting_time', 'summary', 'duty_roster',
  54. 'published', 'create_time', 'update_time'
  55. ]
  56. read_only_fields = ['summary_doc_id', 'published', 'create_time', 'update_time']
  57. def create(self, validated_data):
  58. # 创建OnlyOffice文档ID
  59. validated_data['summary_doc_id'] = self.generate_doc_id()
  60. return super().create(validated_data)
  61. def generate_doc_id(self):
  62. """生成唯一的文档ID"""
  63. import uuid
  64. return f"meeting_{uuid.uuid4().hex[:12]}"
  65. # 权限控制
  66. from rest_framework.permissions import BasePermission
  67. class IsDutyPersonOrAdmin(BasePermission):
  68. """检查用户是否为当前轮值同学或管理员"""
  69. def has_object_permission(self, request, view, obj):
  70. # 管理员有所有权限
  71. if request.user.roles in [Users.UserRole.ADMIN, Users.UserRole.DEVELOPER]:
  72. return True
  73. # 对于会议操作,检查是否是会议关联轮值的同学
  74. if isinstance(obj, Meeting):
  75. return obj.duty_roster.user == request.user
  76. # 对于轮值操作,检查是否是轮值本人
  77. if isinstance(obj, DutyRoster):
  78. return obj.user == request.user
  79. return False