{"action":"created","comment":{"url":"https://api.github.com/repos/edx/edx-platform/pulls/comments/83260651","pull_request_review_id":4116066,"id":83260651,"diff_hunk":"@@ -377,406 +441,461 @@\n             return flag;\n         };\n \n-        Problem.prototype.scroll_to_problem_meta = function () {\n+        // Scroll to problem metadata and next focus is problem input\n+        Problem.prototype.scroll_to_problem_meta = function() {\n             var questionTitle;\n-            questionTitle = this.$(\".problem-header\");\n+            questionTitle = this.$('.problem-header');\n             if (questionTitle.length > 0) {\n                 $('html, body').animate({\n                     scrollTop: questionTitle.offset().top\n                 }, 500);\n-                return questionTitle.focus();\n+                questionTitle.focus();\n             }\n         };\n \n-        Problem.prototype.focus_on_notification = function (type) {\n+        Problem.prototype.focus_on_notification = function(type) {\n             var notification;\n             notification = this.$('.notification-' + type);\n             if (notification.length > 0) {\n-                return notification.focus();\n+                notification.focus();\n             }\n         };\n \n-        Problem.prototype.focus_on_submit_notification = function () {\n-            return this.focus_on_notification('submit');\n+        Problem.prototype.focus_on_submit_notification = function() {\n+            this.focus_on_notification('submit');\n         };\n \n-        Problem.prototype.focus_on_hint_notification = function () {\n-            return this.focus_on_notification('hint');\n+        Problem.prototype.focus_on_hint_notification = function() {\n+            this.focus_on_notification('hint');\n         };\n \n-        Problem.prototype.focus_on_save_notification = function () {\n-            return this.focus_on_notification('save');\n+        Problem.prototype.focus_on_save_notification = function() {\n+            this.focus_on_notification('save');\n         };\n \n-        /*\n-         # 'submit_fd' uses FormData to allow file submissions in the 'problem_check' dispatch,\n-         #      in addition to simple querystring-based answers\n-         #\n-         # NOTE: The dispatch 'problem_check' is being singled out for the use of FormData;\n-         #       maybe preferable to consolidate all dispatches to use FormData\n-         */\n-\n+        Problem.prototype.submit_fd = function() {\n+            /**\n+             * 'submit_fd' uses FormData to allow file submissions in the 'problem_check' dispatch,\n+             *      in addition to simple querystring-based answers\n+             *\n+             * NOTE: The dispatch 'problem_check' is being singled out for the use of FormData;\n+             *       maybe preferable to consolidate all dispatches to use FormData\n+             */\n+            var abortSubmission, error, errorHtml, errors, fd, fileNotSelected, fileTooLarge, maxFileSize,\n+                requiredFilesNotSubmitted, settings, timeoutId, unallowedFileSubmitted, i, len,\n+                that = this;\n \n-        Problem.prototype.submit_fd = function () {\n-            var abort_submission, error, error_html, errors, fd, file_not_selected, file_too_large, max_filesize, required_files_not_submitted, settings, timeout_id, unallowed_file_submitted, _i, _len,\n-                _this = this;\n+            // If there are no file inputs in the problem, we can fall back on submit.\n             if (this.el.find('input:file').length === 0) {\n                 this.submit();\n                 return;\n             }\n             this.enableSubmitButton(false);\n             if (!window.FormData) {\n-                alert(\"Submission aborted! Sorry, your browser does not support file uploads. If you can, please use Chrome or Safari which have been verified to support file uploads.\");\n+                alert(gettext('Submission aborted! Sorry, your browser does not support file uploads. If you can, please use Chrome or Safari which have been verified to support file uploads.')); // eslint-disable-line max-len, no-alert\n                 this.enableSubmitButton(true);\n                 return;\n             }\n-            timeout_id = this.enableSubmitButtonAfterTimeout();\n+            timeoutId = this.enableSubmitButtonAfterTimeout();\n             fd = new FormData();\n-            max_filesize = 4 * 1000 * 1000;\n-            file_too_large = false;\n-            file_not_selected = false;\n-            required_files_not_submitted = false;\n-            unallowed_file_submitted = false;\n+\n+            // Sanity checks on submission\n+            maxFileSize = 4 * 1000 * 1000;\n+            fileTooLarge = false;\n+            fileNotSelected = false;\n+            requiredFilesNotSubmitted = false;\n+            unallowedFileSubmitted = false;\n+\n             errors = [];\n-            this.inputs.each(function (index, element) {\n-                var allowed_files, file, max_size, required_files, _i, _len, _ref, _ref1, _ref2;\n+            this.inputs.each(function(index, element) {\n+                var allowedFiles, file, maxSize, requiredFiles, loopI, loopLen, ref;\n                 if (element.type === 'file') {\n-                    required_files = $(element).data(\"required_files\");\n-                    allowed_files = $(element).data(\"allowed_files\");\n-                    _ref = element.files;\n-                    for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n-                        file = _ref[_i];\n-                        if (allowed_files.length !== 0 && (_ref1 = file.name, __indexOf.call(allowed_files, _ref1) < 0)) {\n-                            unallowed_file_submitted = true;\n-                            errors.push(\"You submitted \" + file.name + \"; only \" + allowed_files + \" are allowed.\");\n+                    requiredFiles = $(element).data('required_files');\n+                    allowedFiles = $(element).data('allowed_files');\n+                    ref = element.files;\n+                    for (loopI = 0, loopLen = ref.length; loopI < loopLen; loopI++) {\n+                        file = ref[loopI];\n+                        if (allowedFiles.length !== 0 && indexOfHelper.call(allowedFiles, file.name < 0)) {\n+                            unallowedFileSubmitted = true;\n+                            errors.push(edx.StringUtils.interpolate(\n+                                gettext('You submitted {filename}; only {allowedFiles} are allowed.'), {\n+                                    filename: file.name,\n+                                    allowedFiles: allowedFiles\n+                                }\n+                            ));\n                         }\n-                        if (_ref2 = file.name, __indexOf.call(required_files, _ref2) >= 0) {\n-                            required_files.splice(required_files.indexOf(file.name), 1);\n+                        if (indexOfHelper.call(requiredFiles, file.name) >= 0) {\n+                            requiredFiles.splice(requiredFiles.indexOf(file.name), 1);\n                         }\n-                        if (file.size > max_filesize) {\n-                            file_too_large = true;\n-                            max_size = max_filesize / (1000 * 1000);\n-                            errors.push(\"Your file \" + file.name + \" is too large (max size: {max_size}MB)\");\n+                        if (file.size > maxFileSize) {\n+                            fileTooLarge = true;\n+                            maxSize = maxFileSize / (1000 * 1000);\n+                            errors.push(edx.StringUtils.interpolate(\n+                                gettext('Your file {filename} is too large (max size: {maxSize}MB).'), {\n+                                    filename: file.name,\n+                                    maxSize: maxSize\n+                                }\n+                            ));\n                         }\n                         fd.append(element.id, file);\n                     }\n                     if (element.files.length === 0) {\n-                        file_not_selected = true;\n+                        fileNotSelected = true;\n                         fd.append(element.id, '');\n                     }\n-                    if (required_files.length !== 0) {\n-                        required_files_not_submitted = true;\n-                        return errors.push(\"You did not submit the required files: \" + required_files + \".\");\n+                    if (requiredFiles.length !== 0) {\n+                        requiredFilesNotSubmitted = true;\n+                        errors.push(edx.StringUtils.interpolate(\n+                            gettext('You did not submit the required files: {requiredFiles}.'), {\n+                                requiredFiles: requiredFiles\n+                            }\n+                        ));\n                     }\n                 } else {\n-                    return fd.append(element.id, element.value);\n+                    fd.append(element.id, element.value);\n                 }\n             });\n-            if (file_not_selected) {\n-                errors.push('You did not select any files to submit');\n+            if (fileNotSelected) {\n+                errors.push(gettext('You did not select any files to submit.'));\n             }\n-            error_html = '<ul>\\n';\n-            for (_i = 0, _len = errors.length; _i < _len; _i++) {\n-                error = errors[_i];\n-                error_html += '<li>' + error + '</li>\\n';\n+            errorHtml = '<ul>\\n';\n+            for (i = 0, len = errors.length; i < len; i++) {\n+                error = errors[i];\n+                errorHtml += '<li>' + error + '</li>\\n';\n             }\n-            error_html += '</ul>';\n-            this.gentle_alert(error_html);\n-            abort_submission = file_too_large || file_not_selected || unallowed_file_submitted || required_files_not_submitted;\n-            if (abort_submission) {\n-                window.clearTimeout(timeout_id);\n+            errorHtml += '</ul>';\n+            this.gentle_alert(errorHtml);\n+            abortSubmission = fileTooLarge || fileNotSelected || unallowedFileSubmitted || requiredFilesNotSubmitted;\n+            if (abortSubmission) {\n+                window.clearTimeout(timeoutId);\n                 this.enableSubmitButton(true);\n-                return;\n             }\n             settings = {\n-                type: \"POST\",\n+                type: 'POST',\n                 data: fd,\n                 processData: false,\n                 contentType: false,\n                 complete: this.enableSubmitButtonAfterResponse,\n-                success: function (response) {\n+                success: function(response) {\n                     switch (response.success) {\n-                        case 'incorrect':\n-                        case 'correct':\n-                            _this.render(response.contents);\n-                            _this.updateProgress(response);\n-                            break;\n-                        default:\n-                            _this.gentle_alert(response.success);\n+                    case 'incorrect':\n+                    case 'correct':\n+                        that.render(response.contents);\n+                        that.updateProgress(response);\n+                        break;\n+                    default:\n+                        that.gentle_alert(response.success);\n                     }\n-                    return Logger.log('problem_graded', [_this.answers, response.contents], _this.id);\n+                    return Logger.log('problem_graded', [that.answers, response.contents], that.id);\n                 }\n             };\n-            return $.ajaxWithPrefix(\"\" + this.url + \"/problem_check\", settings);\n+            $.ajaxWithPrefix('' + this.url + '/problem_check', settings);\n         };\n \n-        Problem.prototype.submit = function () {\n+        Problem.prototype.submit = function() {\n             if (!this.submit_save_waitfor(this.submit_internal)) {\n-                return this.disableAllButtonsWhileRunning(this.submit_internal, true);\n+                this.disableAllButtonsWhileRunning(this.submit_internal, true);\n             }\n         };\n \n-        Problem.prototype.submit_internal = function () {\n-            var _this = this;\n+        Problem.prototype.submit_internal = function() {\n+            var that = this;\n             Logger.log('problem_check', this.answers);\n-            return $.postWithPrefix(\"\" + this.url + \"/problem_check\", this.answers, function (response) {\n+            return $.postWithPrefix('' + this.url + '/problem_check', this.answers, function(response) {\n                 switch (response.success) {\n-                    case 'incorrect':\n-                    case 'correct':\n-                        window.SR.readTexts(_this.get_sr_status(response.contents));\n-                        _this.el.trigger('contentChanged', [_this.id, response.contents]);\n-                        _this.render(response.contents, _this.focus_on_submit_notification);\n-                        _this.updateProgress(response);\n-                        break;\n-                    default:\n-                        _this.saveNotification.hide();\n-                        _this.gentle_alert(response.success);\n+                case 'incorrect':\n+                case 'correct':\n+                    window.SR.readTexts(that.get_sr_status(response.contents));\n+                    that.el.trigger('contentChanged', [that.id, response.contents]);\n+                    that.render(response.contents, that.focus_on_submit_notification);\n+                    that.updateProgress(response);\n+                    break;\n+                default:\n+                    that.saveNotification.hide();\n+                    that.gentle_alert(response.success);\n                 }\n-                return Logger.log('problem_graded', [_this.answers, response.contents], _this.id);\n+                return Logger.log('problem_graded', [that.answers, response.contents], that.id);\n             });\n         };\n \n-        Problem.prototype.get_sr_status = function (contents) {\n-            var added_status, aria_label, element, labeled_status, parent_section, status_elements, template, _i, _len;\n-            status_elements = $(contents).find('.status');\n-            labeled_status = [];\n-            for (_i = 0, _len = status_elements.length; _i < _len; _i++) {\n-                element = status_elements[_i];\n-                parent_section = $(element).closest('section');\n-                added_status = false;\n-                if (parent_section) {\n-                    aria_label = parent_section.attr('aria-label');\n-                    if (aria_label) {\n-                        // Translators: This is only translated to allow for reording of label and associated status.;\n-                        template = gettext(\"{label}: {status}\");\n-                        labeled_status.push(edx.StringUtils.interpolate(template, {\n-                            label: aria_label,\n+        Problem.prototype.get_sr_status = function(contents) {\n+            /**\n+             * This method builds up an array of strings to send to the page screen-reader span.\n+             * It first gets all elements with class \"status\", and then looks to see if they are contained\n+             * in sections with aria-labels. If so, labels are prepended to the status element text.\n+             * If not, just the text of the status elements are returned.\n+             */\n+            var addedStatus, ariaLabel, element, labeledStatus, parentSection, statusElement, template, i, len;\n+            statusElement = $(contents).find('.status');\n+            labeledStatus = [];\n+            for (i = 0, len = statusElement.length; i < len; i++) {\n+                element = statusElement[i];\n+                parentSection = $(element).closest('section');\n+                addedStatus = false;\n+                if (parentSection) {\n+                    ariaLabel = parentSection.attr('aria-label');\n+                    if (ariaLabel) {\n+                        // Translators: This is only translated to allow for reordering of label and associated status.;\n+                        template = gettext('{label}: {status}');\n+                        labeledStatus.push(edx.StringUtils.interpolate(template, {\n+                            label: ariaLabel,\n                             status: $(element).text()\n                         }));\n-                        added_status = true;\n+                        addedStatus = true;\n                     }\n                 }\n-                if (!added_status) {\n-                    labeled_status.push($(element).text());\n+                if (!addedStatus) {\n+                    labeledStatus.push($(element).text());\n                 }\n             }\n-            return labeled_status;\n+            return labeledStatus;\n         };\n \n-        Problem.prototype.reset = function () {\n+        Problem.prototype.reset = function() {\n             return this.disableAllButtonsWhileRunning(this.reset_internal, false);\n         };\n \n-        Problem.prototype.reset_internal = function () {\n-            var _this = this;\n+        Problem.prototype.reset_internal = function() {\n+            var that = this;\n             Logger.log('problem_reset', this.answers);\n-            return $.postWithPrefix(\"\" + this.url + \"/problem_reset\", {\n+            return $.postWithPrefix('' + this.url + '/problem_reset', {\n                 id: this.id\n-            }, function (response) {\n+            }, function(response) {\n                 if (response.success) {\n-                    _this.el.trigger('contentChanged', [_this.id, response.html]);\n-                    _this.render(response.html, _this.scroll_to_problem_meta);\n-                    _this.updateProgress(response);\n+                    that.el.trigger('contentChanged', [that.id, response.html]);\n+                    that.render(response.html, that.scroll_to_problem_meta);\n+                    that.updateProgress(response);\n                     return window.SR.readText(gettext('This problem has been reset.'));\n                 } else {\n-                    return _this.gentle_alert(response.msg);\n+                    return that.gentle_alert(response.msg);\n                 }\n             });\n         };\n \n-        Problem.prototype.show = function () {\n-            var _this = this;\n+        // TODO this needs modification to deal with javascript responses; perhaps we\n+        // need something where responsetypes can define their own behavior when show\n+        // is called.\n+        Problem.prototype.show = function() {\n+            var that = this;\n             Logger.log('problem_show', {\n                 problem: this.id\n             });\n-            return $.postWithPrefix(\"\" + this.url + \"/problem_show\", function (response) {\n+            return $.postWithPrefix('' + this.url + '/problem_show', function(response) {\n                 var answers;\n                 answers = response.answers;\n-                $.each(answers, function (key, value) {\n-                    var answer, choice, solution, _i, _len, _results;\n+                $.each(answers, function(key, value) {\n+                    var answer, choice, i, len, results;\n                     if ($.isArray(value)) {\n-                        _results = [];\n-                        for (_i = 0, _len = value.length; _i < _len; _i++) {\n-                            choice = value[_i];\n-                            _results.push(_this.$(\"label[for='input_\" + key + \"_\" + choice + \"']\").attr({\n+                        results = [];\n+                        for (i = 0, len = value.length; i < len; i++) {\n+                            choice = value[i];\n+                            results.push(that.$('label[for=\"input_' + key + '_' + choice + '\"]').attr({\n                                 correct_answer: 'true'\n                             }));\n                         }\n-                        return _results;\n+                        return results;\n                     } else {\n-                        answer = _this.$(\"#answer_\" + key + \", #solution_\" + key);\n+                        answer = that.$('#answer_' + key + ', #solution_' + key);\n                         edx.HtmlUtils.setHtml(answer, edx.HtmlUtils.HTML(value));\n                         Collapsible.setCollapsibles(answer);\n+\n+                        // Sometimes, `value` is just a string containing a MathJax formula.\n+                        // If this is the case, jQuery will throw an error in some corner cases\n+                        // because of an incorrect selector. We setup a try..catch so that\n+                        // the script doesn't break in such cases.\n+                        //\n+                        // We will fallback to the second `if statement` below, if an\n+                        // error is thrown by jQuery.\n                         try {\n-                            return solution = $(value).find('.detailed-solution');\n+                            return $(value).find('.detailed-solution');\n                         } catch (e) {\n-                            return solution = {};\n+                            return {};\n                         }\n+\n+                        // TODO remove the above once everything is extracted into its own","path":"common/lib/xmodule/xmodule/js/src/capa/display.js","position":null,"original_position":1022,"commit_id":"975f6d5855507d12d792702fed25b412c03a7e32","original_commit_id":"975f6d5855507d12d792702fed25b412c03a7e32","user":{"login":"cahrens","id":484484,"avatar_url":"https://avatars.githubusercontent.com/u/484484?v=3","gravatar_id":"","url":"https://api.github.com/users/cahrens","html_url":"https://github.com/cahrens","followers_url":"https://api.github.com/users/cahrens/followers","following_url":"https://api.github.com/users/cahrens/following{/other_user}","gists_url":"https://api.github.com/users/cahrens/gists{/gist_id}","starred_url":"https://api.github.com/users/cahrens/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cahrens/subscriptions","organizations_url":"https://api.github.com/users/cahrens/orgs","repos_url":"https://api.github.com/users/cahrens/repos","events_url":"https://api.github.com/users/cahrens/events{/privacy}","received_events_url":"https://api.github.com/users/cahrens/received_events","type":"User","site_admin":false},"body":"Same reasoning, just wanted to keep comments as-is.","created_at":"2016-10-13T16:48:18Z","updated_at":"2016-10-13T16:48:18Z","html_url":"https://github.com/edx/edx-platform/pull/13704#discussion_r83260651","pull_request_url":"https://api.github.com/repos/edx/edx-platform/pulls/13704","_links":{"self":{"href":"https://api.github.com/repos/edx/edx-platform/pulls/comments/83260651"},"html":{"href":"https://github.com/edx/edx-platform/pull/13704#discussion_r83260651"},"pull_request":{"href":"https://api.github.com/repos/edx/edx-platform/pulls/13704"}}},"pull_request":{"url":"https://api.github.com/repos/edx/edx-platform/pulls/13704","id":88450986,"html_url":"https://github.com/edx/edx-platform/pull/13704","diff_url":"https://github.com/edx/edx-platform/pull/13704.diff","patch_url":"https://github.com/edx/edx-platform/pull/13704.patch","issue_url":"https://api.github.com/repos/edx/edx-platform/issues/13704","number":13704,"state":"closed","locked":false,"title":"Convert capa's display.coffee file to JS","user":{"login":"cahrens","id":484484,"avatar_url":"https://avatars.githubusercontent.com/u/484484?v=3","gravatar_id":"","url":"https://api.github.com/users/cahrens","html_url":"https://github.com/cahrens","followers_url":"https://api.github.com/users/cahrens/followers","following_url":"https://api.github.com/users/cahrens/following{/other_user}","gists_url":"https://api.github.com/users/cahrens/gists{/gist_id}","starred_url":"https://api.github.com/users/cahrens/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cahrens/subscriptions","organizations_url":"https://api.github.com/users/cahrens/orgs","repos_url":"https://api.github.com/users/cahrens/repos","events_url":"https://api.github.com/users/cahrens/events{/privacy}","received_events_url":"https://api.github.com/users/cahrens/received_events","type":"User","site_admin":false},"body":"Please review, @staubina and either @muzaffaryousaf or @muhammad-ammar.\r\n\r\nThis file had 628 eslint violations (not including indenting issues)!\r\n\r\nTo see the code changes in the JS from the CoffeeScript-generated code (not including indenting changes), see the third commit (975f6d5855507d12d792702fed25b412c03a7e32).\r\n\r\nSandbox: https://capacoffee.sandbox.edx.org","created_at":"2016-10-07T14:43:50Z","updated_at":"2016-10-13T16:48:18Z","closed_at":"2016-10-13T16:20:40Z","merged_at":null,"merge_commit_sha":"4a9463a575f7e354346fa0b6a395c17632b492ec","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/edx/edx-platform/pulls/13704/commits","review_comments_url":"https://api.github.com/repos/edx/edx-platform/pulls/13704/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/13704/comments","statuses_url":"https://api.github.com/repos/edx/edx-platform/statuses/975f6d5855507d12d792702fed25b412c03a7e32","head":{"label":"edx:christina/remove-capa-coffee","ref":"christina/remove-capa-coffee","sha":"975f6d5855507d12d792702fed25b412c03a7e32","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":"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":"2016-10-13T05:32:37Z","pushed_at":"2016-10-13T16:38:26Z","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":839604,"stargazers_count":2819,"watchers_count":2819,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":1688,"mirror_url":null,"open_issues_count":157,"forks":1688,"open_issues":157,"watchers":2819,"default_branch":"master"}},"base":{"label":"edx:master","ref":"master","sha":"a776733d51e517b464e371016e398934f15beda9","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":"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":"2016-10-13T05:32:37Z","pushed_at":"2016-10-13T16:38:26Z","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":839604,"stargazers_count":2819,"watchers_count":2819,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":1688,"mirror_url":null,"open_issues_count":157,"forks":1688,"open_issues":157,"watchers":2819,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/edx/edx-platform/pulls/13704"},"html":{"href":"https://github.com/edx/edx-platform/pull/13704"},"issue":{"href":"https://api.github.com/repos/edx/edx-platform/issues/13704"},"comments":{"href":"https://api.github.com/repos/edx/edx-platform/issues/13704/comments"},"review_comments":{"href":"https://api.github.com/repos/edx/edx-platform/pulls/13704/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/13704/commits"},"statuses":{"href":"https://api.github.com/repos/edx/edx-platform/statuses/975f6d5855507d12d792702fed25b412c03a7e32"}}}}
{"actor":{"display_login":"cahrens"}}