from rest_framework import serializers from baquara.users.serializers import SimpleUserSerializer, TimtecUserAdminCertificateSerializer from courses.models import CourseStudent from courses.serializers import BasicCourseSerializer from courses.workspaces.serializers import WorkspaceBaseSerializerMixin from courses.certification.serializers import ( CourseCertificationSerializer, CertificationProcessSerializer, EvaluationSerializer, ) from .models import Class class BasicClassSerializer(serializers.ModelSerializer): assistants = SimpleUserSerializer(read_only=True, many=True) class Meta: model = Class fields = ('id', 'name', 'assistants', 'students') class CourseStudentClassSerializer(serializers.ModelSerializer): user = TimtecUserAdminCertificateSerializer(read_only=True) class Meta: model = CourseStudent fields = ('id', 'user', 'course_finished', 'certificate', 'can_emmit_receipt', 'percent_progress',) class ClassSerializer(WorkspaceBaseSerializerMixin, serializers.ModelSerializer): enrolled_students = CourseStudentClassSerializer(source='get_students', many=True, read_only=True) students_details = SimpleUserSerializer(source='students', many=True, read_only=True) processes = CertificationProcessSerializer(read_only=True, many=True) evaluations = EvaluationSerializer(read_only=True, many=True) course = BasicCourseSerializer(read_only=True) assistants = SimpleUserSerializer(read_only=True, many=True) class Meta: model = Class fields = "__all__" def update(self, instance, validated_data, **kwargs): assistants = self.context['request'].data.get('assistants', None) updated_class = super(ClassSerializer, self).update(instance, validated_data) # If there are assistans to be associated with the class, do it now updated_class.assistants.clear() for assistant in assistants: updated_class.assistants.add(assistant['id']) contract = self.context['request'].data.get('contract', None) if contract: current = updated_class.contract.first() if not current or (contract['id'] != current.id): c = Workspace.objects.get(pk=contract['id']) updated_class.contract.clear() updated_class.contract.add(c) else: updated_class.contract.clear() updated_class.save() return updated_class