Exemplo n.º 1
0
    def get(self, request, course_key):
        """
        Returns grading information (which subsections are graded, assignment types) for
        the requested course.
        """
        graded_only = get_bool_param(request, 'graded_only', False)

        with self.get_course(request, course_key) as course:
            results = {
                'assignment_types': self._get_assignment_types(course),
                'subsections': self._get_subsections(course, graded_only),
                'grades_frozen': are_grades_frozen(course_key),
            }
            return Response(results)
    def get(self, request, course_key):
        """
        Returns grading information (which subsections are graded, assignment types) for
        the requested course.
        """
        graded_only = get_bool_param(request, 'graded_only', False)

        with self.get_course(request, course_key) as course:
            results = {
                'assignment_types': self._get_assignment_types(course),
                'subsections': self._get_subsections(course, graded_only),
                'grades_frozen': are_grades_frozen(course_key),
            }
            return Response(results)
Exemplo n.º 3
0
    def post(self, request, course_key):
        """
        Creates or updates `PersistentSubsectionGradeOverrides` for the (user_id, usage_key)
        specified in the request data.  The `SUBSECTION_OVERRIDE_CHANGED` signal is invoked
        after the grade override is created, which triggers a celery task to update the
        course and subsection grades for the specified user.
        """
        if are_grades_frozen(course_key):
            raise self.api_error(
                status_code=status.HTTP_403_FORBIDDEN,
                developer_message='Grades are frozen for this course.',
                error_code='grades_frozen'
            )

        course = get_course_by_id(course_key, depth=None)

        result = []

        for user_data in request.data:
            requested_user_id = user_data['user_id']
            requested_usage_id = user_data['usage_id']
            try:
                user = self._get_single_user(request, course_key, requested_user_id)
                usage_key = UsageKey.from_string(requested_usage_id)
            except (USER_MODEL.DoesNotExist, InvalidKeyError, CourseEnrollment.DoesNotExist) as exc:
                self._log_update_result(request.user, requested_user_id, requested_usage_id, success=False)
                result.append(GradebookUpdateResponseItem(
                    user_id=requested_user_id,
                    usage_id=requested_usage_id,
                    success=False,
                    reason=text_type(exc)
                ))
                continue

            try:
                subsection_grade_model = PersistentSubsectionGrade.objects.get(
                    user_id=user.id,
                    course_id=course_key,
                    usage_key=usage_key
                )
            except PersistentSubsectionGrade.DoesNotExist:
                subsection = course.get_child(usage_key)
                if subsection:
                    subsection_grade_model = self._create_subsection_grade(user, course, subsection)
                else:
                    self._log_update_result(request.user, requested_user_id, requested_usage_id, success=False)
                    result.append(GradebookUpdateResponseItem(
                        user_id=requested_user_id,
                        usage_id=requested_usage_id,
                        success=False,
                        reason=u'usage_key {} does not exist in this course.'.format(usage_key)
                    ))
                    continue

            if subsection_grade_model:
                override = self._create_override(request.user, subsection_grade_model, **user_data['grade'])

                self._log_update_result(
                    request.user, requested_user_id, requested_usage_id, subsection_grade_model, override, True
                )
                result.append(GradebookUpdateResponseItem(
                    user_id=user.id,
                    usage_id=text_type(usage_key),
                    success=True,
                    reason=None
                ))

        status_code = status.HTTP_422_UNPROCESSABLE_ENTITY
        if all((item.success for item in result)):
            status_code = status.HTTP_202_ACCEPTED

        return Response(
            [item._asdict() for item in result],
            status=status_code,
            content_type='application/json'
        )
Exemplo n.º 4
0
    def post(self, request, course_key):
        """
        Creates or updates `PersistentSubsectionGradeOverrides` for the (user_id, usage_key)
        specified in the request data.  The `SUBSECTION_OVERRIDE_CHANGED` signal is invoked
        after the grade override is created, which triggers a celery task to update the
        course and subsection grades for the specified user.
        """
        if are_grades_frozen(course_key):
            raise self.api_error(
                status_code=status.HTTP_403_FORBIDDEN,
                developer_message='Grades are frozen for this course.',
                error_code='grades_frozen')

        course = get_course_by_id(course_key, depth=None)

        result = []

        for user_data in request.data:
            requested_user_id = user_data['user_id']
            requested_usage_id = user_data['usage_id']
            try:
                user = self._get_single_user(request, course_key,
                                             requested_user_id)
                usage_key = UsageKey.from_string(requested_usage_id)
            except (USER_MODEL.DoesNotExist, InvalidKeyError,
                    CourseEnrollment.DoesNotExist) as exc:
                self._log_update_result(request.user,
                                        requested_user_id,
                                        requested_usage_id,
                                        success=False)
                result.append(
                    GradebookUpdateResponseItem(user_id=requested_user_id,
                                                usage_id=requested_usage_id,
                                                success=False,
                                                reason=text_type(exc)))
                continue

            try:
                subsection_grade_model = PersistentSubsectionGrade.objects.get(
                    user_id=user.id, course_id=course_key, usage_key=usage_key)
            except PersistentSubsectionGrade.DoesNotExist:
                subsection = course.get_child(usage_key)
                if subsection:
                    subsection_grade_model = self._create_subsection_grade(
                        user, course, subsection)
                    # TODO: Remove as part of EDUCATOR-4602.
                    if str(course_key) == 'course-v1:UQx+BUSLEAD5x+2T2019':
                        log.info(
                            u'PersistentSubsectionGrade ***{}*** created for'
                            u' subsection ***{}*** in course ***{}*** for user ***{}***.'
                            .format(subsection_grade_model,
                                    subsection.location, course, user.id))
                else:
                    self._log_update_result(request.user,
                                            requested_user_id,
                                            requested_usage_id,
                                            success=False)
                    result.append(
                        GradebookUpdateResponseItem(
                            user_id=requested_user_id,
                            usage_id=requested_usage_id,
                            success=False,
                            reason=u'usage_key {} does not exist in this course.'
                            .format(usage_key)))
                    continue

            if subsection_grade_model:
                override = self._create_override(request.user,
                                                 subsection_grade_model,
                                                 **user_data['grade'])

                self._log_update_result(request.user, requested_user_id,
                                        requested_usage_id,
                                        subsection_grade_model, override, True)
                result.append(
                    GradebookUpdateResponseItem(user_id=user.id,
                                                usage_id=text_type(usage_key),
                                                success=True,
                                                reason=None))

        status_code = status.HTTP_422_UNPROCESSABLE_ENTITY
        if all((item.success for item in result)):
            status_code = status.HTTP_202_ACCEPTED

        return Response([item._asdict() for item in result],
                        status=status_code,
                        content_type='application/json')