Beispiel #1
0
class CourseSerializer(CourseBriefSerializer):
    """
    ...
    """
    exercises = NestedHyperlinkedIdentityField(
        view_name='api:course-exercises-list', format='html')
    points = NestedHyperlinkedIdentityField(view_name='api:course-points-list',
                                            format='html')
    students = NestedHyperlinkedIdentityField(
        view_name='api:course-students-list', format='html')
    taggings = NestedHyperlinkedIdentityField(
        view_name='api:course-taggings-list', format='html')
    usertags = NestedHyperlinkedIdentityField(
        view_name='api:course-usertags-list', format='html')
    my_points = NestedHyperlinkedIdentityField(
        view_name='api:course-points-detail',
        lookup_map={
            'course_id': 'id',
            'user_id': lambda o=None: 'me',
        },
    )
    my_data = NestedHyperlinkedIdentityField(
        view_name='api:course-submissiondata-detail',
        lookup_map={
            'course_id': 'id',
            'user_id': lambda o=None: 'me',
        },
    )
    data = NestedHyperlinkedIdentityField(
        view_name='api:course-submissiondata-list')
    aggregate_data = NestedHyperlinkedIdentityField(
        view_name='api:course-aggregatedata-list')

    class Meta(CourseBriefSerializer.Meta):
        fields = (
            'language',
            'starting_time',
            'ending_time',
            'visible_to_students',
            # links
            'exercises',
            'points',
            'students',
            'taggings',
            'usertags',
            'my_points',
            'my_data',
            'data',
            'aggregate_data',
        )
class ExerciseSerializer(ExerciseBriefSerializer):
    course = CourseBriefSerializer(source='course_instance')
    post_url = serializers.SerializerMethodField()
    exercise_info = serializers.JSONField()
    submissions = NestedHyperlinkedIdentityField(
        view_name='api:exercise-submissions-list',
        lookup_map='exercise.api.views.ExerciseViewSet',
    )
    my_submissions = NestedHyperlinkedIdentityField(
        view_name='api:exercise-submissions-detail',
        lookup_map={
            'exercise_id': 'id',
            'user_id': lambda o=None: 'me',
        },
    )
    my_stats = NestedHyperlinkedIdentityField(
        view_name='api:exercise-submitter_stats-detail',
        lookup_map={
            'exercise_id': 'id',
            'user_id': lambda o=None: 'me',
        },
    )

    def get_post_url(self, obj):
        # FIXME: obj should implement .get_post_url() and that should be used here
        if obj.is_submittable:
            request = self.context['request']
            url = obj.get_url("exercise")
            return request.build_absolute_uri(url)
        return None

    class Meta(ExerciseBriefSerializer.Meta):
        fields = (
            'name',
            'course',
            'is_submittable',
            'post_url',
            'max_points',
            'max_submissions',
            'exercise_info',
            'templates',
            'submissions',
            'my_submissions',
            'my_stats',
        )
Beispiel #3
0
class ExerciseGraderSerializer(AplusModelSerializerBase):
    url = NestedHyperlinkedIdentityField(
        view_name='api:exercise-grader',
        lookup_map='exercise.api.views.ExerciseViewSet',
    )
    exercise = ExerciseBriefSerializer(source='*')

    class Meta(AplusSerializerMeta):
        model = Submission
        fields = (
            'url',
            'exercise',
        )
Beispiel #4
0
class SubmittedFileBriefSerializer(AplusModelSerializer):
    #url = HtmlViewField()
    url = NestedHyperlinkedIdentityField(
        view_name='api:submission-files-detail',
        lookup_map='exercise.api.views.SubmissionFileViewSet',
    )

    class Meta(AplusModelSerializer.Meta):
        model = SubmittedFile
        fields = (
            'url',
            'filename',
            'param_name',
        )
Beispiel #5
0
class ExerciseBriefSerializer(AplusModelSerializer):
    url = NestedHyperlinkedIdentityField(
        view_name='api:exercise-detail',
        lookup_map='exercise.api.views.ExerciseViewSet',
    )
    display_name = serializers.CharField(source='__str__')

    class Meta(AplusModelSerializer.Meta):
        model = BaseExercise
        fields = (
            'url',
            'html_url',
            'display_name',
        )
Beispiel #6
0
class SubmissionGraderSerializer(AplusModelSerializerBase):
    url = NestedHyperlinkedIdentityField(
        view_name='api:submission-grader',
        lookup_map='exercise.api.views.SubmissionViewSet',
    )
    submission = SubmissionInGraderSerializer(source='*')
    exercise = ExerciseBriefSerializer()

    class Meta(AplusSerializerMeta):
        model = Submission
        fields = (
            'url',
            'submission',
            'exercise',
            'grading_data',
            'is_graded',
        )
Beispiel #7
0
class CourseBriefSerializer(AplusModelSerializer):
    """
    BriefSerializer for course models
    """
    # course model has url var, so we need to redifen the type here
    url = NestedHyperlinkedIdentityField(
        view_name='api:course-detail',
        lookup_map='course.api.views.CourseViewSet')
    code = serializers.CharField(source='course.code')
    name = serializers.CharField(source='course.name')

    class Meta(AplusModelSerializer.Meta):
        model = CourseInstance
        fields = (
            'url',
            'html_url',
            'code',
            'name',
            'instance_name',
        )
Beispiel #8
0
class TreeExerciseSerializer(serializers.Serializer):
    """
    Serializes items in the `children` lists found in the `CachedContent.data`
    data structure. Does not derive from `AplusModelSerializer` because the
    items are `dict`s instead of model objects.
    """
    id = serializers.IntegerField()
    name = serializers.CharField()
    type = serializers.SerializerMethodField()
    url = NestedHyperlinkedIdentityField(
        view_name='api:exercise-detail',
        lookup_map={'exercise_id': 'id'},
    )
    children = serializers.SerializerMethodField()

    def get_type(self, obj):
        return 'exercise' if obj['submittable'] else 'chapter'

    def get_children(self, obj):
        serializer = TreeExerciseSerializer(instance=obj['children'],
                                            many=True,
                                            context=self.context)
        return serializer.data
Beispiel #9
0
class CourseModuleSerializer(AplusModelSerializer):
    url = NestedHyperlinkedIdentityField(
        view_name='api:course-exercises-detail')
    exercises = serializers.SerializerMethodField()
    display_name = serializers.CharField(source='__str__')

    class Meta(AplusModelSerializer.Meta):
        model = CourseModule
        fields = (
            'url',
            'html_url',
            'display_name',
            'is_open',
            'exercises',
        )

    def get_exercises(self, obj):
        # List only exercises derived from BaseExercise, thus no Chapter texts (/exercise/<id> returns 404 for those)
        exercises = BaseExercise.objects.filter(course_module=obj).all()
        # FIXME: populating learning_object.parent_list() creates subqueries -> get exercise list and data from cache
        serializer = ExerciseBriefSerializer(instance=exercises,
                                             many=True,
                                             context=self.context)
        return serializer.data
Beispiel #10
0
class CourseModuleSerializer(AplusModelSerializer):
    url = NestedHyperlinkedIdentityField(
        view_name='api:course-exercises-detail')
    exercises = serializers.SerializerMethodField()
    display_name = serializers.CharField(source='__str__')

    class Meta(AplusModelSerializer.Meta):
        model = CourseModule
        fields = (
            'url',
            'html_url',
            'display_name',
            'is_open',
            'exercises',
        )

    def get_exercises(self, obj):
        # this needs to be method so .as_leaf_class() can be called
        exercises = obj.learning_objects.all()
        exercises = (e.as_leaf_class() for e in exercises)
        serializer = ExerciseBriefSerializer(instance=exercises,
                                             many=True,
                                             context=self.context)
        return serializer.data