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 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='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')
def post(self, request, course_id): """ 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. """ course_key = get_course_key(request, course_id) 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_with_access(request.user, 'staff', 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: 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: result.append(GradebookUpdateResponseItem( user_id=requested_user_id, usage_id=requested_usage_id, success=False, reason='usage_key {} does not exist in this course.'.format(usage_key) )) continue if subsection_grade_model: self._create_override(request.user, subsection_grade_model, **user_data['grade']) 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' )