1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- from rest_framework import serializers
- from .models import DutyRoster, Meeting
- from userprofile.models import Users
- from userprofile.serializers import UsersGetSerializer
- class DutyRosterSerializer(serializers.ModelSerializer):
- """轮值信息序列化器"""
- user = UsersGetSerializer(read_only=True)
- user_id = serializers.PrimaryKeyRelatedField(
- source='user',
- queryset=Users.objects.all(),
- write_only=True
- )
- user_token = serializers.CharField(source='user.openid', read_only=True)
- class Meta:
- model = DutyRoster
- fields = [
- 'duty_id', 'user', 'user_id', 'user_token','start_date', 'end_date',
- 'status', 'todo_items', 'notes', 'cleaning_schedule',
- 'create_time', 'update_time'
- ]
- read_only_fields = ['status', 'create_time', 'update_time']
- def create(self, validated_data):
- # 自动设置状态为即将开始
- validated_data['status'] = DutyRoster.Status.UPCOMING
- return super().create(validated_data)
- def update(self, instance, validated_data):
- # 自动更新状态
- if 'start_date' in validated_data or 'end_date' in validated_data:
- # 这里应添加状态更新逻辑
- pass
- return super().update(instance, validated_data)
- class MeetingSerializer(serializers.ModelSerializer):
- """组会基础序列化器"""
- class Meta:
- model = Meeting
- fields = [
- 'meeting_id', 'title', 'meeting_type', 'location',
- 'online_link', 'meeting_time', 'published', 'duty_roster',
- 'create_time', 'update_time'
- ]
- read_only_fields = ['published', 'create_time', 'update_time']
- class MeetingDetailSerializer(serializers.ModelSerializer):
- """组会详细序列化器(含会议纪要)"""
- summary = serializers.CharField(
- required=False,
- allow_null=True,
- allow_blank=True
- )
-
- class Meta:
- model = Meeting
- fields = [
- 'meeting_id', 'title', 'meeting_type', 'location',
- 'online_link', 'meeting_time', 'summary', 'duty_roster',
- 'published', 'create_time', 'update_time'
- ]
- read_only_fields = ['summary_doc_id', 'published', 'create_time', 'update_time']
-
- def create(self, validated_data):
- # 创建OnlyOffice文档ID
- validated_data['summary_doc_id'] = self.generate_doc_id()
- return super().create(validated_data)
-
- def generate_doc_id(self):
- """生成唯一的文档ID"""
- import uuid
- return f"meeting_{uuid.uuid4().hex[:12]}"
- # 权限控制
- from rest_framework.permissions import BasePermission
- class IsDutyPersonOrAdmin(BasePermission):
- """检查用户是否为当前轮值同学或管理员"""
-
- def has_object_permission(self, request, view, obj):
- # 管理员有所有权限
- if request.user.roles in [Users.UserRole.ADMIN, Users.UserRole.DEVELOPER]:
- return True
-
- # 对于会议操作,检查是否是会议关联轮值的同学
- if isinstance(obj, Meeting):
- return obj.duty_roster.user == request.user
-
- # 对于轮值操作,检查是否是轮值本人
- if isinstance(obj, DutyRoster):
- return obj.user == request.user
-
- return False
|