{"action":"created","comment":{"url":"https://api.github.com/repos/edx/edx-platform/pulls/comments/180918905","pull_request_review_id":111317533,"id":180918905,"diff_hunk":"@@ -0,0 +1,233 @@\n+\"\"\" API v0 views. \"\"\"\n+import logging\n+\n+from django.contrib.auth import get_user_model\n+from django.http import Http404\n+from opaque_keys import InvalidKeyError\n+from opaque_keys.edx.keys import CourseKey\n+from rest_framework import status\n+from rest_framework.exceptions import AuthenticationFailed\n+from rest_framework.generics import GenericAPIView\n+from rest_framework.response import Response\n+\n+from courseware.access import has_access\n+from enrollment import data as enrollment_data\n+from lms.djangoapps.courseware import courses\n+from lms.djangoapps.courseware.exceptions import CourseAccessRedirect\n+from lms.djangoapps.grades.course_grade_factory import CourseGradeFactory\n+from openedx.core.lib.api.view_utils import DeveloperErrorViewMixin, view_auth_classes\n+from student.roles import CourseStaffRole\n+from util.string_utils import str_to_bool\n+\n+log = logging.getLogger(__name__)\n+USER_MODEL = get_user_model()\n+\n+\n+@view_auth_classes()\n+class GradeViewMixin(DeveloperErrorViewMixin):\n+    \"\"\"\n+    Mixin class for Grades related views.\n+    \"\"\"\n+    def _get_course(self, course_key_string, user, access_action):\n+        \"\"\"\n+        Returns the course for the given course_key_string after\n+        verifying the requested access to the course by the given user.\n+        \"\"\"\n+        try:\n+            course_key = CourseKey.from_string(course_key_string)\n+        except InvalidKeyError:\n+            return self.make_error_response(\n+                status_code=status.HTTP_404_NOT_FOUND,\n+                developer_message='The provided course key cannot be parsed.',\n+                error_code='invalid_course_key'\n+            )\n+\n+        try:\n+            return courses.get_course_with_access(\n+                user,\n+                access_action,\n+                course_key,\n+                check_if_enrolled=True,\n+            )\n+        except Http404:\n+            log.info('Course with ID \"%s\" not found', course_key_string)\n+        except CourseAccessRedirect:\n+            log.info('User %s does not have access to course with ID \"%s\"', user.username, course_key_string)\n+        return self.make_error_response(\n+            status_code=status.HTTP_404_NOT_FOUND,\n+            developer_message='The user, the course or both do not exist.',\n+            error_code='user_or_course_does_not_exist',\n+        )\n+\n+    def _get_effective_user(self, request, course):\n+        \"\"\"\n+        Returns the user object corresponding to the request's 'username' parameter,\n+        or the current request.user if no 'username' was provided.\n+\n+        Verifies that the request.user has access to the requested users's grades.\n+        Returns a 403 error response if access is denied, or a 404 error response if the user does not exist.\n+        \"\"\"\n+\n+        # Use the request user's if none provided.\n+        if 'username' in request.GET:\n+            username = request.GET.get('username')\n+        else:\n+            username = request.user.username\n+\n+        if request.user.username == username:\n+            # Any user may request her own grades\n+            return request.user\n+\n+        # Only a user with staff access may request grades for a user other than herself.\n+        if not has_access(request.user, CourseStaffRole.ROLE, course):\n+            log.info(\n+                'User %s tried to access the grade for user %s.',\n+                request.user.username,\n+                username\n+            )\n+            return self.make_error_response(\n+                status_code=status.HTTP_403_FORBIDDEN,\n+                developer_message='The user requested does not match the logged in user.',\n+                error_code='user_mismatch'\n+            )\n+\n+        try:\n+            return USER_MODEL.objects.get(username=username)\n+\n+        except USER_MODEL.DoesNotExist:\n+            return self.make_error_response(\n+                status_code=status.HTTP_404_NOT_FOUND,\n+                developer_message='The user matching the requested username does not exist.',\n+                error_code='user_does_not_exist'\n+            )\n+\n+    def _make_grade_response(self, user, course, course_grade, use_email=False):\n+        \"\"\"\n+        Serialize a single grade to dict to use in Repsonses\n+        \"\"\"\n+        if use_email:\n+            user = user.email\n+        else:\n+            user = user.username\n+\n+        return {\n+            'user': user,\n+            'course_key': str(course.id),\n+            'passed': course_grade.passed,\n+            'percent': course_grade.percent,\n+            'letter_grade': course_grade.letter_grade,\n+        }\n+\n+    def perform_authentication(self, request):\n+        \"\"\"\n+        Ensures that the user is authenticated (e.g. not an AnonymousUser), unless DEBUG mode is enabled.\n+        \"\"\"\n+        super(GradeViewMixin, self).perform_authentication(request)\n+        if request.user.is_anonymous():\n+            raise AuthenticationFailed\n+\n+\n+class CourseGradesView(GradeViewMixin, GenericAPIView):\n+    \"\"\"\n+    **Use Case**\n+        * Get course grades if all user who are enrolled in a course.\n+        The currently logged-in user may request all enrolled user's grades information.\n+    **Example Request**\n+        GET /api/grades/v1/courses/{course_id}/   - Get grades for all users in course\n+    **GET Parameters**\n+        A GET request may include the following parameters.\n+        * course_id: (required) A string representation of a Course ID.\n+    **GET Response Values**\n+        If the request for information about the course grade\n+        is successful, an HTTP 200 \"OK\" response is returned.\n+        The HTTP 200 response has the following values.\n+        * username: A string representation of a user's username passed in the request.\n+        * course_id: A string representation of a Course ID.\n+        * passed: Boolean representing whether the course has been\n+                  passed according the course's grading policy.\n+        * percent: A float representing the overall grade for the course\n+        * letter_grade: A letter grade as defined in grading_policy (e.g. 'A' 'B' 'C' for 6.002x) or None\n+    **Example GET Response**\n+        [{\n+            \"username\": \"bob\",\n+            \"course_key\": \"course-v1:edX+DemoX+Demo_Course\",\n+            \"passed\": false,\n+            \"percent\": 0.03,\n+            \"letter_grade\": null,\n+        },\n+        {\n+            \"username\": \"fred\",\n+            \"course_key\": \"course-v1:edX+DemoX+Demo_Course\",\n+            \"passed\": true,\n+            \"percent\": 0.83,\n+            \"letter_grade\": \"B\",\n+        },\n+        {\n+            \"username\": \"kate\",\n+            \"course_key\": \"course-v1:edX+DemoX+Demo_Course\",\n+            \"passed\": false,\n+            \"percent\": 0.19,\n+            \"letter_grade\": null,\n+        }]\n+    \"\"\"\n+    def get(self, request, course_id=None):\n+        \"\"\"\n+        Gets a course progress status.\n+        Args:\n+            request (Request): Django request object.\n+            course_id (string): URI element specifying the course location.\n+        Return:\n+            A JSON serialized representation of the requesting user's current grade status.\n+        \"\"\"\n+        use_email = str_to_bool(request.GET.get('use_email'))\n+        username = request.GET.get('username')\n+\n+        if not course_id:\n+            course_id = request.GET.get('course_id')\n+\n+        if username:\n+            access_action = 'load'\n+        else:\n+            access_action = 'staff'\n+\n+        course = self._get_course(course_id, request.user, access_action)\n+        if isinstance(course, Response):\n+            # Returns a 404 if course_id is invalid, or request.user is not enrolled in the course\n+            return course\n+\n+        if username:\n+            grade_user = self._get_effective_user(request, course)\n+            if isinstance(grade_user, Response):\n+                # Returns a 403 if the request.user can't access grades for the requested user,\n+                # or a 404 if the requested user does not exist.\n+                return grade_user\n+\n+            course_grade = CourseGradeFactory().read(grade_user, course)\n+\n+            return Response([\n+                self._make_grade_response(grade_user, course, course_grade, use_email)\n+            ])\n+        else:\n+            enrollments_in_course = enrollment_data.get_user_enrollments(\n+                course.id, serialize=False\n+            )\n+\n+            if not enrollments_in_course:\n+                return self.make_error_response(","path":"lms/djangoapps/grades/api/v1/views.py","position":216,"original_position":216,"commit_id":"0062a85aea1fec4c079d87d65021eee1a74682b7","original_commit_id":"0062a85aea1fec4c079d87d65021eee1a74682b7","user":{"login":"nasthagiri","id":6772826,"avatar_url":"https://avatars1.githubusercontent.com/u/6772826?v=4","gravatar_id":"","url":"https://api.github.com/users/nasthagiri","html_url":"https://github.com/nasthagiri","followers_url":"https://api.github.com/users/nasthagiri/followers","following_url":"https://api.github.com/users/nasthagiri/following{/other_user}","gists_url":"https://api.github.com/users/nasthagiri/gists{/gist_id}","starred_url":"https://api.github.com/users/nasthagiri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nasthagiri/subscriptions","organizations_url":"https://api.github.com/users/nasthagiri/orgs","repos_url":"https://api.github.com/users/nasthagiri/repos","events_url":"https://api.github.com/users/nasthagiri/events{/privacy}","received_events_url":"https://api.github.com/users/nasthagiri/received_events","type":"User","site_admin":false},"body":"Why are no enrollments considered a `404`?  It should just be an empty list that's returned, right?","created_at":"2018-04-11T22:39:07Z","updated_at":"2018-04-11T22:44:11Z","html_url":"https://github.com/edx/edx-platform/pull/17602#discussion_r180918905","pull_request_url":"https://api.github.com/repos/edx/edx-platform/pulls/17602","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/edx/edx-platform/pulls/comments/180918905"},"html":{"href":"https://github.com/edx/edx-platform/pull/17602#discussion_r180918905"},"pull_request":{"href":"https://api.github.com/repos/edx/edx-platform/pulls/17602"}}},"pull_request":{"url":"https://api.github.com/repos/edx/edx-platform/pulls/17602","id":172375180,"html_url":"https://github.com/edx/edx-platform/pull/17602","diff_url":"https://github.com/edx/edx-platform/pull/17602.diff","patch_url":"https://github.com/edx/edx-platform/pull/17602.patch","issue_url":"https://api.github.com/repos/edx/edx-platform/issues/17602","number":17602,"state":"open","locked":false,"title":"Bulk Grades API (v1 grades api w/courses endpoint)","user":{"login":"kabirkhan","id":13891834,"avatar_url":"https://avatars2.githubusercontent.com/u/13891834?v=4","gravatar_id":"","url":"https://api.github.com/users/kabirkhan","html_url":"https://github.com/kabirkhan","followers_url":"https://api.github.com/users/kabirkhan/followers","following_url":"https://api.github.com/users/kabirkhan/following{/other_user}","gists_url":"https://api.github.com/users/kabirkhan/gists{/gist_id}","starred_url":"https://api.github.com/users/kabirkhan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kabirkhan/subscriptions","organizations_url":"https://api.github.com/users/kabirkhan/orgs","repos_url":"https://api.github.com/users/kabirkhan/repos","events_url":"https://api.github.com/users/kabirkhan/events{/privacy}","received_events_url":"https://api.github.com/users/kabirkhan/received_events","type":"User","site_admin":false},"body":"### Provides functionality for a course staff member to request grades for all students enrolled in a course, not just a single user. \r\n\r\nUses a 'v1' naming convention:\r\n\r\nPossible routes are:\r\n**anyone can get their own grade still (same as v0)**\r\n  GET /api/grades/v1/course_grade/{course_id}/users/?username={username}  \r\n\r\n**course staff member gets grades for specific student (same as v0)**\r\n  GET /api/grades/v1/course_grade/{course_id}/users/?username={username}  \r\n\r\n**course staff member gets grades for all students enrolled in course (new for v1)**\r\n  GET /api/grades/v1/course_grade/{course_id}/all_users/ ","created_at":"2018-03-01T22:42:51Z","updated_at":"2018-04-11T22:44:11Z","closed_at":null,"merged_at":null,"merge_commit_sha":"b44a0cb6302df11457b43094ea7f9a8dfe1dd039","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":128413102,"url":"https://api.github.com/repos/edx/edx-platform/labels/awaiting%20prioritization","name":"awaiting prioritization","color":"fad8c7","default":false},{"id":78051711,"url":"https://api.github.com/repos/edx/edx-platform/labels/open-source-contribution","name":"open-source-contribution","color":"bfe5bf","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/edx/edx-platform/pulls/17602/commits","review_comments_url":"https://api.github.com/repos/edx/edx-platform/pulls/17602/comments","review_comment_url":"https://api.github.com/repos/edx/edx-platform/pulls/comments{/number}","comments_url":"https://api.github.com/repos/edx/edx-platform/issues/17602/comments","statuses_url":"https://api.github.com/repos/edx/edx-platform/statuses/0062a85aea1fec4c079d87d65021eee1a74682b7","head":{"label":"Microsoft:edx_master","ref":"edx_master","sha":"0062a85aea1fec4c079d87d65021eee1a74682b7","user":{"login":"Microsoft","id":6154722,"avatar_url":"https://avatars2.githubusercontent.com/u/6154722?v=4","gravatar_id":"","url":"https://api.github.com/users/Microsoft","html_url":"https://github.com/Microsoft","followers_url":"https://api.github.com/users/Microsoft/followers","following_url":"https://api.github.com/users/Microsoft/following{/other_user}","gists_url":"https://api.github.com/users/Microsoft/gists{/gist_id}","starred_url":"https://api.github.com/users/Microsoft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Microsoft/subscriptions","organizations_url":"https://api.github.com/users/Microsoft/orgs","repos_url":"https://api.github.com/users/Microsoft/repos","events_url":"https://api.github.com/users/Microsoft/events{/privacy}","received_events_url":"https://api.github.com/users/Microsoft/received_events","type":"Organization","site_admin":false},"repo":{"id":65483935,"name":"edx-platform","full_name":"Microsoft/edx-platform","owner":{"login":"Microsoft","id":6154722,"avatar_url":"https://avatars2.githubusercontent.com/u/6154722?v=4","gravatar_id":"","url":"https://api.github.com/users/Microsoft","html_url":"https://github.com/Microsoft","followers_url":"https://api.github.com/users/Microsoft/followers","following_url":"https://api.github.com/users/Microsoft/following{/other_user}","gists_url":"https://api.github.com/users/Microsoft/gists{/gist_id}","starred_url":"https://api.github.com/users/Microsoft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Microsoft/subscriptions","organizations_url":"https://api.github.com/users/Microsoft/orgs","repos_url":"https://api.github.com/users/Microsoft/repos","events_url":"https://api.github.com/users/Microsoft/events{/privacy}","received_events_url":"https://api.github.com/users/Microsoft/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Microsoft/edx-platform","description":"The Open edX platform, the software that powers edX!","fork":true,"url":"https://api.github.com/repos/Microsoft/edx-platform","forks_url":"https://api.github.com/repos/Microsoft/edx-platform/forks","keys_url":"https://api.github.com/repos/Microsoft/edx-platform/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Microsoft/edx-platform/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Microsoft/edx-platform/teams","hooks_url":"https://api.github.com/repos/Microsoft/edx-platform/hooks","issue_events_url":"https://api.github.com/repos/Microsoft/edx-platform/issues/events{/number}","events_url":"https://api.github.com/repos/Microsoft/edx-platform/events","assignees_url":"https://api.github.com/repos/Microsoft/edx-platform/assignees{/user}","branches_url":"https://api.github.com/repos/Microsoft/edx-platform/branches{/branch}","tags_url":"https://api.github.com/repos/Microsoft/edx-platform/tags","blobs_url":"https://api.github.com/repos/Microsoft/edx-platform/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Microsoft/edx-platform/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Microsoft/edx-platform/git/refs{/sha}","trees_url":"https://api.github.com/repos/Microsoft/edx-platform/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Microsoft/edx-platform/statuses/{sha}","languages_url":"https://api.github.com/repos/Microsoft/edx-platform/languages","stargazers_url":"https://api.github.com/repos/Microsoft/edx-platform/stargazers","contributors_url":"https://api.github.com/repos/Microsoft/edx-platform/contributors","subscribers_url":"https://api.github.com/repos/Microsoft/edx-platform/subscribers","subscription_url":"https://api.github.com/repos/Microsoft/edx-platform/subscription","commits_url":"https://api.github.com/repos/Microsoft/edx-platform/commits{/sha}","git_commits_url":"https://api.github.com/repos/Microsoft/edx-platform/git/commits{/sha}","comments_url":"https://api.github.com/repos/Microsoft/edx-platform/comments{/number}","issue_comment_url":"https://api.github.com/repos/Microsoft/edx-platform/issues/comments{/number}","contents_url":"https://api.github.com/repos/Microsoft/edx-platform/contents/{+path}","compare_url":"https://api.github.com/repos/Microsoft/edx-platform/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Microsoft/edx-platform/merges","archive_url":"https://api.github.com/repos/Microsoft/edx-platform/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Microsoft/edx-platform/downloads","issues_url":"https://api.github.com/repos/Microsoft/edx-platform/issues{/number}","pulls_url":"https://api.github.com/repos/Microsoft/edx-platform/pulls{/number}","milestones_url":"https://api.github.com/repos/Microsoft/edx-platform/milestones{/number}","notifications_url":"https://api.github.com/repos/Microsoft/edx-platform/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Microsoft/edx-platform/labels{/name}","releases_url":"https://api.github.com/repos/Microsoft/edx-platform/releases{/id}","deployments_url":"https://api.github.com/repos/Microsoft/edx-platform/deployments","created_at":"2016-08-11T16:18:42Z","updated_at":"2018-04-11T03:52:02Z","pushed_at":"2018-04-11T02:33:58Z","git_url":"git://github.com/Microsoft/edx-platform.git","ssh_url":"git@github.com:Microsoft/edx-platform.git","clone_url":"https://github.com/Microsoft/edx-platform.git","svn_url":"https://github.com/Microsoft/edx-platform","homepage":"http://open.edx.org/","size":879246,"stargazers_count":10,"watchers_count":10,"language":"Python","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":20,"mirror_url":null,"archived":false,"open_issues_count":1,"license":{"key":"agpl-3.0","name":"GNU Affero General Public License v3.0","spdx_id":"AGPL-3.0","url":"https://api.github.com/licenses/agpl-3.0"},"forks":20,"open_issues":1,"watchers":10,"default_branch":"oxa/dev.fic"}},"base":{"label":"edx:master","ref":"master","sha":"cce91d6b34b3587f6c532705a327d1231171bb9a","user":{"login":"edx","id":3179841,"avatar_url":"https://avatars3.githubusercontent.com/u/3179841?v=4","gravatar_id":"","url":"https://api.github.com/users/edx","html_url":"https://github.com/edx","followers_url":"https://api.github.com/users/edx/followers","following_url":"https://api.github.com/users/edx/following{/other_user}","gists_url":"https://api.github.com/users/edx/gists{/gist_id}","starred_url":"https://api.github.com/users/edx/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/edx/subscriptions","organizations_url":"https://api.github.com/users/edx/orgs","repos_url":"https://api.github.com/users/edx/repos","events_url":"https://api.github.com/users/edx/events{/privacy}","received_events_url":"https://api.github.com/users/edx/received_events","type":"Organization","site_admin":false},"repo":{"id":10391073,"name":"edx-platform","full_name":"edx/edx-platform","owner":{"login":"edx","id":3179841,"avatar_url":"https://avatars3.githubusercontent.com/u/3179841?v=4","gravatar_id":"","url":"https://api.github.com/users/edx","html_url":"https://github.com/edx","followers_url":"https://api.github.com/users/edx/followers","following_url":"https://api.github.com/users/edx/following{/other_user}","gists_url":"https://api.github.com/users/edx/gists{/gist_id}","starred_url":"https://api.github.com/users/edx/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/edx/subscriptions","organizations_url":"https://api.github.com/users/edx/orgs","repos_url":"https://api.github.com/users/edx/repos","events_url":"https://api.github.com/users/edx/events{/privacy}","received_events_url":"https://api.github.com/users/edx/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/edx/edx-platform","description":"The Open edX platform, the software that powers edX!","fork":false,"url":"https://api.github.com/repos/edx/edx-platform","forks_url":"https://api.github.com/repos/edx/edx-platform/forks","keys_url":"https://api.github.com/repos/edx/edx-platform/keys{/key_id}","collaborators_url":"https://api.github.com/repos/edx/edx-platform/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/edx/edx-platform/teams","hooks_url":"https://api.github.com/repos/edx/edx-platform/hooks","issue_events_url":"https://api.github.com/repos/edx/edx-platform/issues/events{/number}","events_url":"https://api.github.com/repos/edx/edx-platform/events","assignees_url":"https://api.github.com/repos/edx/edx-platform/assignees{/user}","branches_url":"https://api.github.com/repos/edx/edx-platform/branches{/branch}","tags_url":"https://api.github.com/repos/edx/edx-platform/tags","blobs_url":"https://api.github.com/repos/edx/edx-platform/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/edx/edx-platform/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/edx/edx-platform/git/refs{/sha}","trees_url":"https://api.github.com/repos/edx/edx-platform/git/trees{/sha}","statuses_url":"https://api.github.com/repos/edx/edx-platform/statuses/{sha}","languages_url":"https://api.github.com/repos/edx/edx-platform/languages","stargazers_url":"https://api.github.com/repos/edx/edx-platform/stargazers","contributors_url":"https://api.github.com/repos/edx/edx-platform/contributors","subscribers_url":"https://api.github.com/repos/edx/edx-platform/subscribers","subscription_url":"https://api.github.com/repos/edx/edx-platform/subscription","commits_url":"https://api.github.com/repos/edx/edx-platform/commits{/sha}","git_commits_url":"https://api.github.com/repos/edx/edx-platform/git/commits{/sha}","comments_url":"https://api.github.com/repos/edx/edx-platform/comments{/number}","issue_comment_url":"https://api.github.com/repos/edx/edx-platform/issues/comments{/number}","contents_url":"https://api.github.com/repos/edx/edx-platform/contents/{+path}","compare_url":"https://api.github.com/repos/edx/edx-platform/compare/{base}...{head}","merges_url":"https://api.github.com/repos/edx/edx-platform/merges","archive_url":"https://api.github.com/repos/edx/edx-platform/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/edx/edx-platform/downloads","issues_url":"https://api.github.com/repos/edx/edx-platform/issues{/number}","pulls_url":"https://api.github.com/repos/edx/edx-platform/pulls{/number}","milestones_url":"https://api.github.com/repos/edx/edx-platform/milestones{/number}","notifications_url":"https://api.github.com/repos/edx/edx-platform/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/edx/edx-platform/labels{/name}","releases_url":"https://api.github.com/repos/edx/edx-platform/releases{/id}","deployments_url":"https://api.github.com/repos/edx/edx-platform/deployments","created_at":"2013-05-30T20:20:38Z","updated_at":"2018-04-11T18:17:06Z","pushed_at":"2018-04-11T21:42:17Z","git_url":"git://github.com/edx/edx-platform.git","ssh_url":"git@github.com:edx/edx-platform.git","clone_url":"https://github.com/edx/edx-platform.git","svn_url":"https://github.com/edx/edx-platform","homepage":"http://open.edx.org/","size":904755,"stargazers_count":3636,"watchers_count":3636,"language":"Python","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":2041,"mirror_url":null,"archived":false,"open_issues_count":244,"license":{"key":"agpl-3.0","name":"GNU Affero General Public License v3.0","spdx_id":"AGPL-3.0","url":"https://api.github.com/licenses/agpl-3.0"},"forks":2041,"open_issues":244,"watchers":3636,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/edx/edx-platform/pulls/17602"},"html":{"href":"https://github.com/edx/edx-platform/pull/17602"},"issue":{"href":"https://api.github.com/repos/edx/edx-platform/issues/17602"},"comments":{"href":"https://api.github.com/repos/edx/edx-platform/issues/17602/comments"},"review_comments":{"href":"https://api.github.com/repos/edx/edx-platform/pulls/17602/comments"},"review_comment":{"href":"https://api.github.com/repos/edx/edx-platform/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/edx/edx-platform/pulls/17602/commits"},"statuses":{"href":"https://api.github.com/repos/edx/edx-platform/statuses/0062a85aea1fec4c079d87d65021eee1a74682b7"}},"author_association":"NONE"}}
{"actor":{"display_login":"nasthagiri"}}