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