Files
training-software/training/serializers.py
Paperclip CTO 5ed7cf2225 fix(api): close contract gaps identified in TRA-398 API review
- EmployeeAttendanceSerializer: add meeting_title (source: meeting.title)
  fixes attendance.js rendering r.meeting_title as undefined
- MeetingParticipantSerializer: add user_email and user_display_name
  so meeting detail participant list shows human-readable identity
- OrganizationProfileListCreateView: add GET handler to list org profiles
  (previously POST-only, returning 405 on GET)
- UserProfileSerializer: add org_ids derived from role_bindings
  so frontend can resolve which org profile to load for branding

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-19 08:57:59 +02:00

105 lines
4.0 KiB
Python

from rest_framework import serializers
from .models import (
AttendanceStatus,
CallEvent,
CallParticipant,
CallSession,
EmployeeAttendance,
Meeting,
MeetingParticipant,
SignoffDecision,
TrainerSignoff,
TrainingRecord,
)
class TrainingRecordSerializer(serializers.ModelSerializer):
class Meta:
model = TrainingRecord
fields = ["id", "enrollment", "completion_mode", "status", "online_passed_at", "completed_at", "created_at", "updated_at"]
read_only_fields = fields
class TrainerSignoffSerializer(serializers.ModelSerializer):
class Meta:
model = TrainerSignoff
fields = ["id", "training_record", "trainer", "decision", "notes", "signed_off_at"]
read_only_fields = ["id", "trainer", "signed_off_at"]
class SignoffRequestSerializer(serializers.Serializer):
decision = serializers.ChoiceField(choices=SignoffDecision.choices)
notes = serializers.CharField(allow_blank=True, default="")
class MeetingSerializer(serializers.ModelSerializer):
class Meta:
model = Meeting
fields = ["id", "title", "starts_at", "created_at", "updated_at"]
read_only_fields = ["id", "created_at", "updated_at"]
class MeetingParticipantSerializer(serializers.ModelSerializer):
attendance_session_id = serializers.UUIDField(source="attendance_session.id", read_only=True)
user_email = serializers.EmailField(source="user.email", read_only=True)
user_display_name = serializers.CharField(source="user.display_name", read_only=True, allow_blank=True)
class Meta:
model = MeetingParticipant
fields = ["id", "meeting", "user", "user_email", "user_display_name", "attendance_status", "attendance_recorded_at", "attendance_recorded_by", "attendance_session_id", "created_at"]
read_only_fields = ["id", "user_email", "user_display_name", "attendance_status", "attendance_recorded_at", "attendance_recorded_by", "attendance_session_id", "created_at"]
class EmployeeAttendanceSerializer(serializers.ModelSerializer):
meeting_title = serializers.CharField(source="meeting.title", read_only=True, allow_null=True)
class Meta:
model = EmployeeAttendance
fields = ["id", "user", "attendance_date", "status", "meeting", "meeting_title", "source", "updated_by", "updated_at", "created_at"]
read_only_fields = ["id", "meeting_title", "updated_at", "created_at"]
class MeetingAttendanceRequestSerializer(serializers.Serializer):
user_id = serializers.UUIDField()
status = serializers.ChoiceField(choices=AttendanceStatus.choices)
class CallParticipantSerializer(serializers.ModelSerializer):
user_id = serializers.UUIDField(source="user.id", read_only=True)
user_name = serializers.SerializerMethodField()
class Meta:
model = CallParticipant
fields = ["id", "user_id", "user_name", "status", "is_muted", "screen_share_active", "joined_at", "left_at"]
read_only_fields = fields
def get_user_name(self, obj):
return obj.user.get_full_name() or str(obj.user)
class CallSessionSerializer(serializers.ModelSerializer):
active_participants = serializers.SerializerMethodField()
class Meta:
model = CallSession
fields = ["id", "meeting", "status", "started_by", "started_at", "ended_at", "active_participants"]
read_only_fields = fields
def get_active_participants(self, obj):
from .models import CallParticipantStatus
qs = obj.call_participants.filter(status=CallParticipantStatus.JOINED).select_related("user")
return CallParticipantSerializer(qs, many=True).data
class CallEventSerializer(serializers.ModelSerializer):
class Meta:
model = CallEvent
fields = ["id", "event_type", "actor", "target_user", "metadata", "occurred_at"]
read_only_fields = fields
class CallModerationRequestSerializer(serializers.Serializer):
action = serializers.ChoiceField(choices=["mute", "unmute", "kick"])
user_id = serializers.UUIDField()