Example #1
0
 def _wrapper_view(self, request, course_id, *args, **kwargs):
     """
     Checks for course author access for the given course by the requesting user.
     Calls the view function if has access, otherwise raises a 403.
     """
     course_key = CourseKey.from_string(course_id)
     if not has_course_author_access(request.user, course_key):
         raise DeveloperErrorViewMixin.api_error(
             status_code=status.HTTP_403_FORBIDDEN,
             developer_message='The requesting user does not have course author permissions.',
             error_code='user_permissions',
         )
     return view(self, request, course_key, *args, **kwargs)
Example #2
0
 def _wrapper_view(self, request, course_id, *args, **kwargs):
     """
     Checks for course author access for the given course by the requesting user.
     Calls the view function if has access, otherwise raises a 403.
     """
     course_key = CourseKey.from_string(course_id)
     if not has_course_author_access(request.user, course_key):
         raise DeveloperErrorViewMixin.api_error(
             status_code=status.HTTP_403_FORBIDDEN,
             developer_message='The requesting user does not have course author permissions.',
             error_code='user_permissions',
         )
     return view(self, request, course_key, *args, **kwargs)
Example #3
0
    def get(self, request, subsection_id):
        """
        Returns subection grade data, override grade data and a history of changes made to
        a specific users specific subsection grade.

        Args:
            subsection_id: String representation of a usage_key, which is an opaque key of
            a persistant subection grade.
            user_id: An integer represenation of a user

        """
        try:
            usage_key = UsageKey.from_string(subsection_id)
        except InvalidKeyError:
            raise self.api_error(
                status_code=status.HTTP_404_NOT_FOUND,
                developer_message='Invalid UsageKey',
                error_code='invalid_usage_key'
            )

        if not has_course_author_access(request.user, usage_key.course_key):
            raise DeveloperErrorViewMixin.api_error(
                status_code=status.HTTP_403_FORBIDDEN,
                developer_message='The requesting user does not have course author permissions.',
                error_code='user_permissions',
            )

        try:
            user_id = int(request.GET.get('user_id'))
        except ValueError:
            raise self.api_error(
                status_code=status.HTTP_404_NOT_FOUND,
                developer_message='Invalid UserID',
                error_code='invalid_user_id'
            )

        try:
            original_grade = PersistentSubsectionGrade.read_grade(user_id, usage_key)
        except PersistentSubsectionGrade.DoesNotExist:
            results = SubsectionGradeResponseSerializer({
                'original_grade': None,
                'override': None,
                'history': [],
                'subsection_id': usage_key,
                'user_id': user_id,
                'course_id': None,
            })

            return Response(results.data)

        try:
            override = original_grade.override
            history = PersistentSubsectionGradeOverrideHistory.objects.filter(override_id=override.id)
        except PersistentSubsectionGradeOverride.DoesNotExist:
            override = None
            history = []

        results = SubsectionGradeResponseSerializer({
            'original_grade': original_grade,
            'override': override,
            'history': history,
            'subsection_id': original_grade.usage_key,
            'user_id': original_grade.user_id,
            'course_id': original_grade.course_id,
        })

        return Response(results.data)
Example #4
0
    def get(self, request, subsection_id):
        """
        Returns subection grade data, override grade data and a history of changes made to
        a specific users specific subsection grade.

        Args:
            subsection_id: String representation of a usage_key, which is an opaque key of
            a persistant subection grade.
            user_id: An integer represenation of a user

        """
        try:
            usage_key = UsageKey.from_string(subsection_id)
        except InvalidKeyError:
            raise self.api_error(status_code=status.HTTP_404_NOT_FOUND,
                                 developer_message='Invalid UsageKey',
                                 error_code='invalid_usage_key')

        if not has_course_author_access(request.user, usage_key.course_key):
            raise DeveloperErrorViewMixin.api_error(
                status_code=status.HTTP_403_FORBIDDEN,
                developer_message=
                'The requesting user does not have course author permissions.',
                error_code='user_permissions',
            )

        try:
            user_id = int(request.GET.get('user_id'))
        except ValueError:
            raise self.api_error(status_code=status.HTTP_404_NOT_FOUND,
                                 developer_message='Invalid UserID',
                                 error_code='invalid_user_id')
        success = True
        err_msg = ""
        override = None
        history = []
        history_record_limit = request.GET.get('history_record_limit')
        if history_record_limit is not None:
            try:
                history_record_limit = int(history_record_limit)
            except ValueError:
                history_record_limit = 0

        try:
            original_grade = PersistentSubsectionGrade.read_grade(
                user_id, usage_key)
            if original_grade is not None and hasattr(original_grade,
                                                      'override'):
                override = original_grade.override
                # pylint: disable=no-member
                history = list(
                    PersistentSubsectionGradeOverride.history.filter(
                        grade_id=original_grade.id).order_by('history_date')
                    [:history_record_limit])
            grade_data = {
                'earned_all': original_grade.earned_all,
                'possible_all': original_grade.possible_all,
                'earned_graded': original_grade.earned_graded,
                'possible_graded': original_grade.possible_graded,
            }
        except PersistentSubsectionGrade.DoesNotExist:
            try:
                grade_data = self._get_grade_data_for_not_attempted_assignment(
                    user_id, usage_key)
            except SubsectionUnavailableToUserException as exc:
                success = False
                err_msg = str(exc)
                grade_data = {
                    'earned_all': 0,
                    'possible_all': 0,
                    'earned_graded': 0,
                    'possible_graded': 0,
                }

        response_data = {
            'success': success,
            'original_grade': grade_data,
            'override': override,
            'history': history,
            'subsection_id': usage_key,
            'user_id': user_id,
            'course_id': usage_key.course_key,
        }
        if not success:
            response_data['error_message'] = err_msg
        results = SubsectionGradeResponseSerializer(response_data)
        return Response(results.data)
    def get(self, request, subsection_id):
        """
        Returns subection grade data, override grade data and a history of changes made to
        a specific users specific subsection grade.

        Args:
            subsection_id: String representation of a usage_key, which is an opaque key of
            a persistant subection grade.
            user_id: An integer represenation of a user

        """
        try:
            usage_key = UsageKey.from_string(subsection_id)
        except InvalidKeyError:
            raise self.api_error(status_code=status.HTTP_404_NOT_FOUND,
                                 developer_message='Invalid UsageKey',
                                 error_code='invalid_usage_key')

        if not has_course_author_access(request.user, usage_key.course_key):
            raise DeveloperErrorViewMixin.api_error(
                status_code=status.HTTP_403_FORBIDDEN,
                developer_message=
                'The requesting user does not have course author permissions.',
                error_code='user_permissions',
            )

        try:
            user_id = int(request.GET.get('user_id'))
        except ValueError:
            raise self.api_error(status_code=status.HTTP_404_NOT_FOUND,
                                 developer_message='Invalid UserID',
                                 error_code='invalid_user_id')

        try:
            original_grade = PersistentSubsectionGrade.read_grade(
                user_id, usage_key)
        except PersistentSubsectionGrade.DoesNotExist:
            results = SubsectionGradeResponseSerializer({
                'original_grade': None,
                'override': None,
                'history': [],
                'subsection_id': usage_key,
                'user_id': user_id,
                'course_id': None,
            })

            return Response(results.data)

        try:
            override = original_grade.override
            history = PersistentSubsectionGradeOverrideHistory.objects.filter(
                override_id=override.id)
        except PersistentSubsectionGradeOverride.DoesNotExist:
            override = None
            history = []

        results = SubsectionGradeResponseSerializer({
            'original_grade':
            original_grade,
            'override':
            override,
            'history':
            history,
            'subsection_id':
            original_grade.usage_key,
            'user_id':
            original_grade.user_id,
            'course_id':
            original_grade.course_id,
        })

        return Response(results.data)