{"action":"created","comment":{"url":"https://api.github.com/repos/edx/edx-platform/pulls/comments/31342877","id":31342877,"diff_hunk":"@@ -0,0 +1,449 @@\n+\"\"\"HTTP endpoints for the Teams API.\"\"\"\n+from rest_framework.generics import GenericAPIView\n+from rest_framework.response import Response\n+from rest_framework.views import APIView\n+from rest_framework.authentication import (\n+    SessionAuthentication,\n+    OAuth2Authentication\n+)\n+from rest_framework import status\n+from rest_framework import permissions\n+\n+from django.db.models import Count\n+from django.utils.translation import ugettext as _\n+\n+\n+from student.models import CourseEnrollment\n+\n+from openedx.core.lib.api.parsers import MergePatchParser\n+from openedx.core.lib.api.permissions import IsStaffOrReadOnly, IsActiveOrReadOnly\n+from openedx.core.lib.api.view_utils import RetrievePatchAPIView, add_serializer_errors\n+from openedx.core.lib.api.serializers import PaginationSerializer\n+\n+from xmodule.modulestore.django import modulestore\n+\n+from opaque_keys import InvalidKeyError\n+from opaque_keys.edx.keys import CourseKey\n+\n+from courseware.courses import get_course\n+\n+from .models import CourseTeam\n+from .serializers import CourseTeamSerializer, CourseTeamCreationSerializer, TopicSerializer\n+\n+\n+class TeamsListView(GenericAPIView):\n+    \"\"\"\n+        **Use Cases**\n+\n+            Get or create a course team.\n+\n+        **Example Requests**:\n+\n+            GET /api/team/v0/teams\n+\n+            POST /api/team/v0/teams\n+\n+        **Response Values for GET**\n+\n+            The following options can be specified as query parameters:\n+\n+            * course_id: Filters the result to teams belonging to the given course.\n+\n+            * topic_id: Filters the result to teams associated with the given topic.\n+\n+            * text_search: Currently not supported.\n+\n+            * order_by: Must be one of the following:\n+\n+                * name: Orders results by case insensitive team name (default).\n+\n+                * open_slots: Orders results by most open slots.\n+\n+                * last_activity: Currently not supported.\n+\n+            * page_size: Number of results to return per page.\n+\n+            * page: Page number to retrieve.\n+\n+            * include_inactive: If true, inactive teams will be returned. The default is to not include inactive teams.\n+\n+            If the user is logged in, the response contains:\n+\n+            * count: The total number of teams matching the request.\n+\n+            * next: The URL to the next page of results, or null if this is the last page.\n+\n+            * previous: The URL to the previous page of results, or null if this is the first page.\n+\n+            * num_pages: The total number of pages in the result.\n+\n+            * results: A list of the teams matching the request.\n+\n+                * id: The team's unique identifier.\n+\n+                * name: The name of the team.\n+\n+                * is_active: True if the team is currently active. If false, the team is considered \"soft deleted\" and\n+                  will not be included by default in results.\n+\n+                * course_id: The identifier for the course this team belongs to.\n+\n+                * topic_id: Optionally specifies which topic the team is associated with.\n+\n+                * date_created: Date and time when the team was created.\n+\n+                * description: A description of the team.\n+\n+                * country: Optionally specifies which country the team is associated with.\n+\n+                * language: Optionally specifies which language the team is associated with.\n+\n+                * membership: A list of the users that are members of the team. See membership endpoint for more detail.\n+\n+            For all text fields, clients rendering the values should take care\n+            to HTML escape them to avoid script injections, as the data is\n+            stored exactly as specified. The intention is that plain text is\n+            supported, not HTML.\n+\n+            If the user is not logged in, a 403 error is returned.\n+\n+            If the specified course_id is not valid or the user attempts to\n+            use an unsupported query parameter, a 400 error is returned.\n+\n+            If the response does not exist, a 404 error is returned. For\n+            example, the course_id may not reference a real course or the page\n+            number may be beyond the last page.\n+\n+        **Response Values for POST**\n+\n+            Any logged in user who has verified their email address can create\n+            a team. The format mirrors that of a GET for an individual team,\n+            but does not include the id, is_active, date_created, or membership\n+            fields. id is automatically computed based on name.\n+\n+            If the user is not logged in or has not verified their email, a\n+            403 error is returned.\n+\n+            If the course_id is not valid or extra fields are included in the\n+            request, a 400 error is returned.\n+\n+            If the specified course does not exist, a 404 error is returned.\n+    \"\"\"\n+\n+    # SessionAuthentication must come first to return a 403 for unauthenticated users\n+    authentication_classes = (SessionAuthentication, OAuth2Authentication)\n+    permission_classes = (permissions.IsAuthenticated, IsActiveOrReadOnly)\n+\n+    paginate_by = 10\n+    paginate_by_param = 'page_size'\n+    pagination_serializer_class = PaginationSerializer\n+    serializer_class = CourseTeamSerializer\n+\n+    def get_serializer_context(self):\n+        \"\"\"\n+        Adds expand information from query parameters to the serializer context to support expandable fields.\n+        \"\"\"\n+        result = super(TeamsListView, self).get_serializer_context()\n+        result['expand'] = [x for x in self.request.QUERY_PARAMS.get('expand', '').split(',') if x]\n+        return result\n+\n+    def get(self, request):\n+        \"\"\"\n+        GET /api/team/v0/teams/\n+        \"\"\"\n+        result_filter = {\n+            'is_active': True\n+        }\n+\n+        if 'course_id' in request.QUERY_PARAMS:\n+            try:\n+                course_key = CourseKey.from_string(request.QUERY_PARAMS['course_id'])\n+                result_filter.update({'course_id': course_key})\n+            except InvalidKeyError:\n+                return Response({'detail': \"course_id is not valid\"}, status=status.HTTP_400_BAD_REQUEST)\n+        if 'topic_id' in request.QUERY_PARAMS:\n+            result_filter.update({'topic_id': request.QUERY_PARAMS['topic_id']})\n+        if 'include_inactive' in request.QUERY_PARAMS and request.QUERY_PARAMS['include_inactive'].lower() == 'true':\n+            del result_filter['is_active']\n+        if 'text_search' in request.QUERY_PARAMS:\n+            return Response({'detail': \"text_search is not yet supported\"}, status=status.HTTP_400_BAD_REQUEST)\n+\n+        queryset = CourseTeam.objects.filter(**result_filter)\n+        queryset = queryset.extra(select={'lower_name': \"lower(name)\"})\n+\n+        order_by_field = 'lower_name'\n+        if 'order_by' in request.QUERY_PARAMS:\n+            order_by_input = request.QUERY_PARAMS['order_by']\n+            if order_by_input == 'name':\n+                order_by_field = 'lower_name'\n+            elif order_by_input == 'open_slots':\n+                queryset = queryset.annotate(team_size=Count('users'))\n+                order_by_field = 'team_size'\n+            elif order_by_input == 'last_activity':\n+                return Response({'detail': \"last_activity is not yet supported\"}, status=status.HTTP_400_BAD_REQUEST)\n+\n+        queryset = queryset.order_by(order_by_field)\n+\n+        if not queryset:\n+            return Response(status=status.HTTP_404_NOT_FOUND)\n+\n+        page = self.paginate_queryset(queryset)\n+        serializer = self.get_pagination_serializer(page)\n+        return Response(serializer.data)  # pylint: disable=maybe-no-member\n+\n+    def post(self, request):\n+        \"\"\"\n+        POST /api/team/v0/teams/\n+        \"\"\"\n+        field_errors = {}\n+        course_key = None\n+\n+        try:\n+            course_key = CourseKey.from_string(request.DATA.get('course_id'))\n+            get_course(course_key)\n+        except InvalidKeyError:\n+            field_errors['course_id'] = {\n+                'developer_message': \"course_id is not valid.\",\n+                'user_message': _(\"course_id is not valid\"),\n+            }\n+        except ValueError:\n+            return Response(status=status.HTTP_404_NOT_FOUND)\n+\n+        data = request.DATA\n+        data['course_id'] = course_key\n+\n+        serializer = CourseTeamCreationSerializer(data=data)\n+        add_serializer_errors(serializer, data, field_errors)\n+\n+        if field_errors:\n+            return Response({\n+                'field_errors': field_errors,\n+            }, status=status.HTTP_400_BAD_REQUEST)\n+        else:\n+            team = serializer.save()\n+            return Response(CourseTeamSerializer(team).data)\n+\n+\n+class TeamsDetailView(RetrievePatchAPIView):\n+    \"\"\"\n+        **Use Cases**\n+\n+            Get or update a course team's information. Updates are supported\n+            only through merge patch.\n+\n+        **Example Requests**:\n+\n+            GET /api/team/v0/teams/{team_id}}\n+\n+            PATCH /api/team/v0/teams/{team_id} \"application/merge-patch+json\"\n+\n+        **Response Values for GET**\n+\n+            If the user is logged in, the response contains the following fields:\n+\n+            * id: The team's unique identifier.\n+\n+            * name: The name of the team.\n+\n+            * is_active: True if the team is currently active. If false, the team is considered \"soft deleted\" and\n+              will not be included by default in results.\n+\n+            * course_id: The identifier for the course this team belongs to.\n+\n+            * topic_id: Optionally specifies which topic the team is associated with.\n+\n+            * date_created: Date and time when the team was created.\n+\n+            * description: A description of the team.\n+\n+            * country: Optionally specifies which country the team is associated with.\n+\n+            * language: Optionally specifies which language the team is associated with.\n+\n+            * membership: A list of the users that are members of the team. See membership endpoint for more detail.\n+\n+            For all text fields, clients rendering the values should take care\n+            to HTML escape them to avoid script injections, as the data is\n+            stored exactly as specified. The intention is that plain text is\n+            supported, not HTML.\n+\n+            If the user is not logged in, a 403 error is returned.\n+\n+            If the specified team does not exist, a 404 error is returned.\n+\n+        **Response Values for PATCH**\n+\n+            Only staff can patch teams. If the specified team does not exist, a\n+            404 error is returned.\n+\n+            If \"application/merge-patch+json\" is not the specified content type,\n+            a 415 error is returned.\n+\n+            If the update could not be completed due to validation errors, this\n+            method returns a 400 error with all error messages in the\n+            \"field_errors\" field of the returned JSON.\n+    \"\"\"\n+\n+    authentication_classes = (SessionAuthentication, OAuth2Authentication)\n+    permission_classes = (permissions.IsAuthenticated, IsStaffOrReadOnly)\n+    lookup_field = 'team_id'\n+    serializer_class = CourseTeamSerializer\n+    parser_classes = (MergePatchParser,)\n+\n+    def get_queryset(self):\n+        \"\"\"\n+        Returns the queryset used to access the given team.\n+        \"\"\"\n+        return CourseTeam.objects.all()\n+\n+\n+class TopicListView(GenericAPIView):\n+    \"\"\"\n+    **Use Cases**\n+\n+    Retrieve a list of topics associated with a single course.\n+\n+    **Example Requests**\n+\n+    GET /api/team/v0/topics/?course_id={course_id}\n+\n+    **Response Values for GET**\n+\n+    The following options can be specified as query parameters:\n+\n+    * course_id: Filters the result to topics belonging to the given course (required).\n+\n+    * order_by: Orders the results. Currently only 'name' is supported, and is also the default value.\n+\n+    * page_size: Number of results to return per page.\n+\n+    * page: Page number to retrieve.\n+\n+    If the course_id is not given or an unsupported value is passed for order_by, returns a 400 error.\n+\n+    If the user is not logged in or not enrolled in the course, returns a 403 error.\n+\n+    If the course does not exist, returns a 404 error.\n+\n+    Otherwise, a 200 response is returned containing the following fields:\n+\n+    * count: The total number of topics matching the request.\n+\n+    * next: The URL to the next page of results, or null if this is the last page.\n+\n+    * previous: The URL to the previous page of results, or null if this is the first page.\n+\n+    * num_pages: The total number of pages in the result.\n+\n+    * results: A list of the topics matching the request.\n+\n+        * id: The topic's unique identifier.\n+\n+        * name: The name of the topic.","path":"lms/djangoapps/teams/views.py","position":341,"original_position":342,"commit_id":"d3348196555d3c929f0d2917429811b453c3d25b","original_commit_id":"2055039dbe5291b452d720667ad385661792f952","user":{"login":"andy-armstrong","id":5985072,"avatar_url":"https://avatars.githubusercontent.com/u/5985072?v=3","gravatar_id":"","url":"https://api.github.com/users/andy-armstrong","html_url":"https://github.com/andy-armstrong","followers_url":"https://api.github.com/users/andy-armstrong/followers","following_url":"https://api.github.com/users/andy-armstrong/following{/other_user}","gists_url":"https://api.github.com/users/andy-armstrong/gists{/gist_id}","starred_url":"https://api.github.com/users/andy-armstrong/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/andy-armstrong/subscriptions","organizations_url":"https://api.github.com/users/andy-armstrong/orgs","repos_url":"https://api.github.com/users/andy-armstrong/repos","events_url":"https://api.github.com/users/andy-armstrong/events{/privacy}","received_events_url":"https://api.github.com/users/andy-armstrong/received_events","type":"User","site_admin":false},"body":"The User API uses just ``name`` for accounts, so that would be my preference here. IMO we only need ``display_name`` when there's already a low-level ``name`` field.","created_at":"2015-05-29T16:56:59Z","updated_at":"2015-05-29T16:56:59Z","html_url":"https://github.com/edx/edx-platform/pull/8243#discussion_r31342877","pull_request_url":"https://api.github.com/repos/edx/edx-platform/pulls/8243","_links":{"self":{"href":"https://api.github.com/repos/edx/edx-platform/pulls/comments/31342877"},"html":{"href":"https://github.com/edx/edx-platform/pull/8243#discussion_r31342877"},"pull_request":{"href":"https://api.github.com/repos/edx/edx-platform/pulls/8243"}}},"pull_request":{"url":"https://api.github.com/repos/edx/edx-platform/pulls/8243","id":36428559,"html_url":"https://github.com/edx/edx-platform/pull/8243","diff_url":"https://github.com/edx/edx-platform/pull/8243.diff","patch_url":"https://github.com/edx/edx-platform/pull/8243.patch","issue_url":"https://api.github.com/repos/edx/edx-platform/issues/8243","number":8243,"state":"open","locked":false,"title":"TNL-1897: Implement Course Team API, Part A","user":{"login":"benmcmorran","id":6981284,"avatar_url":"https://avatars.githubusercontent.com/u/6981284?v=3","gravatar_id":"","url":"https://api.github.com/users/benmcmorran","html_url":"https://github.com/benmcmorran","followers_url":"https://api.github.com/users/benmcmorran/followers","following_url":"https://api.github.com/users/benmcmorran/following{/other_user}","gists_url":"https://api.github.com/users/benmcmorran/gists{/gist_id}","starred_url":"https://api.github.com/users/benmcmorran/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/benmcmorran/subscriptions","organizations_url":"https://api.github.com/users/benmcmorran/orgs","repos_url":"https://api.github.com/users/benmcmorran/repos","events_url":"https://api.github.com/users/benmcmorran/events{/privacy}","received_events_url":"https://api.github.com/users/benmcmorran/received_events","type":"User","site_admin":false},"body":"Adds /topics and /teams endpoints for the Team API. Most features described in the spec are implemented, but text search, last activity, and membership will be handled in future stories. Please review @peter-fogg @cahrens\r\n\r\nhttps://openedx.atlassian.net/wiki/display/TNL/Team+API","created_at":"2015-05-28T17:01:14Z","updated_at":"2015-05-29T16:57:00Z","closed_at":null,"merged_at":null,"merge_commit_sha":"1cb8031101725642e9f2782f6cca6e3e6c421fb6","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/edx/edx-platform/pulls/8243/commits","review_comments_url":"https://api.github.com/repos/edx/edx-platform/pulls/8243/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/8243/comments","statuses_url":"https://api.github.com/repos/edx/edx-platform/statuses/d3348196555d3c929f0d2917429811b453c3d25b","head":{"label":"edx:benmcmorran/team-api-a","ref":"benmcmorran/team-api-a","sha":"d3348196555d3c929f0d2917429811b453c3d25b","user":{"login":"edx","id":3179841,"avatar_url":"https://avatars.githubusercontent.com/u/3179841?v=3","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://avatars.githubusercontent.com/u/3179841?v=3","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":"Open edX, the edX platform that powers http://edx.org","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}","created_at":"2013-05-30T20:20:38Z","updated_at":"2015-05-29T13:46:58Z","pushed_at":"2015-05-29T16:55:48Z","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://openedx.org/","size":1966570,"stargazers_count":1950,"watchers_count":1950,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":1118,"mirror_url":null,"open_issues_count":204,"forks":1118,"open_issues":204,"watchers":1950,"default_branch":"master"}},"base":{"label":"edx:master","ref":"master","sha":"81578791ed4d4764258a343c98147bc489a64298","user":{"login":"edx","id":3179841,"avatar_url":"https://avatars.githubusercontent.com/u/3179841?v=3","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://avatars.githubusercontent.com/u/3179841?v=3","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":"Open edX, the edX platform that powers http://edx.org","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}","created_at":"2013-05-30T20:20:38Z","updated_at":"2015-05-29T13:46:58Z","pushed_at":"2015-05-29T16:55:48Z","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://openedx.org/","size":1966570,"stargazers_count":1950,"watchers_count":1950,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":1118,"mirror_url":null,"open_issues_count":204,"forks":1118,"open_issues":204,"watchers":1950,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/edx/edx-platform/pulls/8243"},"html":{"href":"https://github.com/edx/edx-platform/pull/8243"},"issue":{"href":"https://api.github.com/repos/edx/edx-platform/issues/8243"},"comments":{"href":"https://api.github.com/repos/edx/edx-platform/issues/8243/comments"},"review_comments":{"href":"https://api.github.com/repos/edx/edx-platform/pulls/8243/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/8243/commits"},"statuses":{"href":"https://api.github.com/repos/edx/edx-platform/statuses/d3348196555d3c929f0d2917429811b453c3d25b"}}}}