{"action":"created","comment":{"url":"https://api.github.com/repos/indico/indico/pulls/comments/67192858","id":67192858,"diff_hunk":"@@ -0,0 +1,332 @@\n+/* This file is part of Indico.\n+ * Copyright (C) 2002 - 2016 European Organization for Nuclear Research (CERN).\n+ *\n+ * Indico is free software; you can redistribute it and/or\n+ * modify it under the terms of the GNU General Public License as\n+ * published by the Free Software Foundation; either version 3 of the\n+ * License, or (at your option) any later version.\n+ *\n+ * Indico is distributed in the hope that it will be useful, but\n+ * WITHOUT ANY WARRANTY; without even the implied warranty of\n+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n+ * General Public License for more details.\n+ *\n+ * You should have received a copy of the GNU General Public License\n+ * along with Indico; if not, see <http://www.gnu.org/licenses/>.\n+ */\n+\n+(function($) {\n+    'use strict';\n+\n+    $.widget('indico.categorypicker', {\n+        options: {\n+            categoryId: 0,\n+            height: null,\n+            actionButtonText: $T.gettext(\"Select\"),\n+            openInDialog: false,\n+            dialogTitle: $T.gettext(\"Select a category\"),\n+            onAction: function() {}\n+        },\n+\n+        // Cache for data of already visited categories\n+        _cache: {},\n+\n+        _typeaheadTemplate:\n+            `<form>\n+            <div class=\"typeahead__container\">\n+                <div class=\"typeahead__field\">\n+                    <span class=\"typeahead__query\"></span>\n+                </div>\n+            </div>\n+        </form>`,\n+\n+        _create: function() {\n+            var self = this;\n+            if (self.options.openInDialog) {\n+                self._createInDialog();\n+            } else {\n+                self._createInline();\n+            }\n+        },\n+\n+        _createInline: function() {\n+            var self = this;\n+            self.element.addClass('category-picker');\n+            self._createNavigator();\n+            self._createSearchField();\n+            self.goToCategory(self.options.categoryId);\n+        },\n+\n+        _createInDialog: function() {\n+            var self = this;\n+            ajaxDialog({\n+                title: self.options.dialogTitle,\n+                content: $('<div>', {class: 'category-picker-wrapper'}).append($('<div>', {class: 'js-test'})),\n+                onOpen: function(dialog) {\n+                    self.element = dialog.contentContainer.find('.js-test');\n+                    self.dialog = dialog;\n+                    self._createInline();\n+                }\n+            });\n+        },\n+\n+        _createNavigator: function() {\n+            var self = this;\n+            self.$category = $('<div>');\n+            self.$categoryTree = $('<ul>', {class: 'group-list fixed-height'});\n+            self.$categoryResults = $('<ul>', {class: 'group-list fixed-height'});\n+            self.$categoryNavigator = $('<div>', {class: 'category-navigator i-box just-group-list with-hover-effect'})\n+                .append($('<div>', {class: 'i-box-content'})\n+                    .append(self.$category)\n+                    .append(self.$categoryTree)\n+                    .append(self.$categoryResults));\n+            self.element.append(self.$categoryNavigator);\n+\n+            if (self.options.height) {\n+                self.$category.closest('.category-picker').height(self.options.height);\n+            }\n+        },\n+\n+        _createSearchField: function() {\n+            var self = this;\n+\n+            // Visible search field\n+            self.$searchInput = $('<input>', {\n+                class: 'js-search-category js-typeahead',\n+                type: 'search',\n+                name: 'q',\n+                placeholder: $T.gettext(\"Search\")\n+            }).attr('autocomplete', 'off');\n+\n+            // Insert elements in DOM\n+            var $typeaheadForm = $($.parseHTML(self._typeaheadTemplate)[0]);\n+            $typeaheadForm.find('.typeahead__query').append(self.$searchInput);\n+            self.element.prepend($typeaheadForm);\n+\n+            // Typeahead init\n+            self.$searchInput.typeahead({\n+                dynamic: true,\n+                filter: false,\n+                source: {\n+                    ajax: {\n+                        url: build_url(Indico.Urls.Categories.search),\n+                        path: 'categories',\n+                        data: {\n+                            q: \"{{query}}\"\n+                        }\n+                    }\n+                },\n+                resultContainer: false,\n+                cancelButton: false,\n+                display: 'title',\n+                callback: {\n+                    onClickAfter: function(node, a, item) {\n+                        self.goToCategory(item.id);\n+                    },\n+                    onResult: function(node, query, result) {\n+                        self._renderResults(result);\n+                    },\n+                    onHideLayout: function() {\n+                        self.$categoryResults.html('');\n+                        self.$category.show();\n+                        self.$categoryTree.show();\n+                    },\n+                    onShowLayout: function(node, query) {\n+                        self.$category.hide();\n+                        self.$categoryTree.hide();\n+                    }\n+                }\n+            });\n+        },\n+\n+        _buildBreadcrumbs: function(path, clickable) {\n+            var self = this;\n+            var $breadcrumbs = $('<ul>', {class: 'breadcrumbs'});\n+            var tag = clickable? '<a>' : '<span>';\n+\n+            _.each(path, function(category) {\n+                var $item = $(tag, {\n+                    text: category.title\n+                });\n+                if (clickable) {\n+                    $item.attr('href', '');\n+                    $item.attr('title', $T.gettext(\"Go to: {0}\".format(category.title)));\n+                }\n+                self._bindGoToCategoryOnClick($item, category.id);\n+                $breadcrumbs.append($('<li>').append($item));\n+            });\n+\n+            return $breadcrumbs;\n+        },\n+\n+        _buildCategory: function(category, isSubcategory, withBreadcrums, clickableBreadcrumbs) {\n+            var self = this;\n+            var tag = isSubcategory? '<li>' : '<div>';\n+            var itemClass = isSubcategory? 'subcategory' : 'current-category';\n+\n+            var $category = $(tag, {\n+                class: 'item ' + itemClass,\n+                id: 'category-' + category.id\n+            });\n+\n+            var $categoryTitle = $('<div>', {class: 'title-wrapper'});\n+            $categoryTitle.append($('<span>', {class: 'title',text: category.title}));\n+            if (withBreadcrums) {\n+                $categoryTitle.append(self._buildBreadcrumbs(category.path, clickableBreadcrumbs));\n+            }\n+\n+            $category.append($('<div>', {class: 'icon-wrapper'}));\n+            $category.append($categoryTitle);\n+            $category.append(self._buildSidePanel(category, !isSubcategory));\n+            return $category;\n+        },\n+\n+        _buildCurrentCategory: function(category) {\n+            var self = this;\n+            return self._buildCategory(category, false, true, true);\n+        },\n+\n+        _buildSubcategory: function(category, withBreadcrums) {\n+            var self = this;\n+            var $subcategory = self._buildCategory(category, true, withBreadcrums);\n+\n+            if (category.can_access) {\n+                self._bindGoToCategoryOnClick($subcategory, category.id);\n+                $subcategory.addClass('can-access');\n+            }\n+\n+            return $subcategory;\n+        },\n+\n+        _buildSidePanel: function(category, withGoToParent) {\n+            var self = this;\n+            var $buttonWrapper = $('<div>', {class: 'button-wrapper'});\n+\n+            $buttonWrapper.append($('<div>').append($('<span>', {\n+                class: 'action-button',\n+                text: self.options.actionButtonText\n+            }).on('click', function(evt) {\n+                evt.stopPropagation();\n+                self._onAction(category);\n+            })));\n+\n+            if (withGoToParent && category.path && category.path.length) {\n+                var parent = _.last(category.path);\n+                $buttonWrapper.append($('<a>', {\n+                    class: 'icon-arrow-up navigate-up',\n+                    title: $T.gettext(\"Go to parent: {0}\".format(parent.title))\n+                }).on('click', function() {\n+                    self.goToCategory(parent.id);\n+                }));\n+            }\n+\n+            if (category.is_protected) {\n+                var $protection = $('<div>')\n+                    .append($('<span>', {class: 'icon-shield'}));\n+                $buttonWrapper.append($protection);\n+            }\n+\n+            var $info = $('<div>')\n+                .append($('<div>', {text: $T.gettext(\"{0} categories\".format(category.category_count))}))\n+                .append($('<div>', {text: $T.gettext(\"{0} events\".format(category.event_count))}));\n+\n+            $buttonWrapper.append($info);\n+\n+            return $buttonWrapper;\n+        },\n+\n+        _ellipsizeBreadcrumbs: function($category) {\n+            var self = this;\n+            var $breadcrumbs = $category.find('.breadcrumbs');\n+            var availableSpace = $category.find('.title-wrapper').width();\n+            var $ellipsis = $('<li>', {class: 'ellipsis'});\n+            var shortened = false;\n+\n+            while ($breadcrumbs.outerWidth() >= availableSpace) {\n+                var $segments = $breadcrumbs.children(':not(.ellipsis)');\n+                var middleIndex = Math.floor($segments.length / 2);\n+                if (!shortened) {\n+                    $segments.eq(middleIndex).replaceWith($ellipsis);\n+                } else {\n+                    $segments.eq(middleIndex).remove();\n+                }\n+            }\n+        },\n+\n+        _renderNavigator: function(data) {\n+            var self = this;\n+\n+            if (data.category) {\n+                self.$category.html(self._buildCurrentCategory(data.category));\n+                self._ellipsizeBreadcrumbs(self.$category);\n+            }\n+            if (data.subcategories) {\n+                _.each(data.subcategories, function(subcategory) {\n+                    self.$categoryTree.append(self._buildSubcategory(subcategory));\n+                });\n+            }\n+        },\n+\n+        _renderResults: function(categories) {\n+            var self = this;\n+\n+            self.$categoryResults.html('');\n+            _.each(categories, function(category) {\n+                var $result = self._buildSubcategory(category, true);\n+                $result.find('.icon-wrapper').append($('<i>', {class: 'icon-search', title: $T.gettext(\"Search result\")}));\n+                self.$categoryResults.append($result);\n+                self._ellipsizeBreadcrumbs($result);\n+            });\n+        },\n+\n+        _bindGoToCategoryOnClick: function($element, id) {\n+            var self = this;\n+\n+            $element.on('click', function(evt) {\n+                evt.preventDefault();\n+                self.goToCategory(id);\n+            });\n+        },\n+\n+        _onAction: function(category) {\n+            var self = this;\n+            self.options.onAction(category);\n+            if (self.dialog) {\n+                self.dialog.close();\n+            }\n+        },\n+\n+        goToCategory: function(id) {\n+            var self = this;\n+\n+            $('.category-navigator .item').animate({\n+                height: 0,\n+                paddingTop: 0,\n+                paddingBottom: 0,\n+                border: 0\n+            }, {\n+                complete: function() {\n+                    $(this).remove();\n+                }\n+            }).find('.title').fadeOut();\n+\n+            if (self._cache[id]) {","path":"indico/htdocs/js/indico/jquery/categorypicker.js","position":313,"original_position":313,"commit_id":"7d8ceb5e0ce1cc877e44ded28274af01dedba237","original_commit_id":"7d8ceb5e0ce1cc877e44ded28274af01dedba237","user":{"login":"ThiefMaster","id":179599,"avatar_url":"https://avatars.githubusercontent.com/u/179599?v=3","gravatar_id":"","url":"https://api.github.com/users/ThiefMaster","html_url":"https://github.com/ThiefMaster","followers_url":"https://api.github.com/users/ThiefMaster/followers","following_url":"https://api.github.com/users/ThiefMaster/following{/other_user}","gists_url":"https://api.github.com/users/ThiefMaster/gists{/gist_id}","starred_url":"https://api.github.com/users/ThiefMaster/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ThiefMaster/subscriptions","organizations_url":"https://api.github.com/users/ThiefMaster/orgs","repos_url":"https://api.github.com/users/ThiefMaster/repos","events_url":"https://api.github.com/users/ThiefMaster/events{/privacy}","received_events_url":"https://api.github.com/users/ThiefMaster/received_events","type":"User","site_admin":false},"body":"Could use deferred here :)\r\n\r\n```javascript\r\nself._getCategoryInfo(id).then(self._renderNavigator.bind(self));\r\n\r\nfunction _getCategoryInfo(id) {\r\n    var dfd = $.Deferred();\r\n    if (self._cache[id]) {\r\n        dfd.resolve(self._cache[id]);\r\n    } else {\r\n        // ajax call, resolve dfd and set cache in success\r\n    }\r\n    return dfd.promise();\r\n}\r\n```","created_at":"2016-06-15T16:08:17Z","updated_at":"2016-06-15T16:08:17Z","html_url":"https://github.com/indico/indico/pull/2453#discussion_r67192858","pull_request_url":"https://api.github.com/repos/indico/indico/pulls/2453","_links":{"self":{"href":"https://api.github.com/repos/indico/indico/pulls/comments/67192858"},"html":{"href":"https://github.com/indico/indico/pull/2453#discussion_r67192858"},"pull_request":{"href":"https://api.github.com/repos/indico/indico/pulls/2453"}}},"pull_request":{"url":"https://api.github.com/repos/indico/indico/pulls/2453","id":73008072,"html_url":"https://github.com/indico/indico/pull/2453","diff_url":"https://github.com/indico/indico/pull/2453.diff","patch_url":"https://github.com/indico/indico/pull/2453.patch","issue_url":"https://api.github.com/repos/indico/indico/issues/2453","number":2453,"state":"open","locked":false,"title":"Category picker field + widget","user":{"login":"ThiefMaster","id":179599,"avatar_url":"https://avatars.githubusercontent.com/u/179599?v=3","gravatar_id":"","url":"https://api.github.com/users/ThiefMaster","html_url":"https://github.com/ThiefMaster","followers_url":"https://api.github.com/users/ThiefMaster/followers","following_url":"https://api.github.com/users/ThiefMaster/following{/other_user}","gists_url":"https://api.github.com/users/ThiefMaster/gists{/gist_id}","starred_url":"https://api.github.com/users/ThiefMaster/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ThiefMaster/subscriptions","organizations_url":"https://api.github.com/users/ThiefMaster/orgs","repos_url":"https://api.github.com/users/ThiefMaster/repos","events_url":"https://api.github.com/users/ThiefMaster/events{/privacy}","received_events_url":"https://api.github.com/users/ThiefMaster/received_events","type":"User","site_admin":false},"body":"> VERY WIP, MUCH WORKING :dog2: ","created_at":"2016-06-08T08:50:46Z","updated_at":"2016-06-15T16:08:17Z","closed_at":null,"merged_at":null,"merge_commit_sha":"3c9f9e1a38256b14b2d9b7051f3bd57a2adcad87","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/indico/indico/pulls/2453/commits","review_comments_url":"https://api.github.com/repos/indico/indico/pulls/2453/comments","review_comment_url":"https://api.github.com/repos/indico/indico/pulls/comments{/number}","comments_url":"https://api.github.com/repos/indico/indico/issues/2453/comments","statuses_url":"https://api.github.com/repos/indico/indico/statuses/7d8ceb5e0ce1cc877e44ded28274af01dedba237","head":{"label":"indico:wip/cat-picker","ref":"wip/cat-picker","sha":"7d8ceb5e0ce1cc877e44ded28274af01dedba237","user":{"login":"indico","id":715236,"avatar_url":"https://avatars.githubusercontent.com/u/715236?v=3","gravatar_id":"","url":"https://api.github.com/users/indico","html_url":"https://github.com/indico","followers_url":"https://api.github.com/users/indico/followers","following_url":"https://api.github.com/users/indico/following{/other_user}","gists_url":"https://api.github.com/users/indico/gists{/gist_id}","starred_url":"https://api.github.com/users/indico/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/indico/subscriptions","organizations_url":"https://api.github.com/users/indico/orgs","repos_url":"https://api.github.com/users/indico/repos","events_url":"https://api.github.com/users/indico/events{/privacy}","received_events_url":"https://api.github.com/users/indico/received_events","type":"Organization","site_admin":false},"repo":{"id":2113067,"name":"indico","full_name":"indico/indico","owner":{"login":"indico","id":715236,"avatar_url":"https://avatars.githubusercontent.com/u/715236?v=3","gravatar_id":"","url":"https://api.github.com/users/indico","html_url":"https://github.com/indico","followers_url":"https://api.github.com/users/indico/followers","following_url":"https://api.github.com/users/indico/following{/other_user}","gists_url":"https://api.github.com/users/indico/gists{/gist_id}","starred_url":"https://api.github.com/users/indico/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/indico/subscriptions","organizations_url":"https://api.github.com/users/indico/orgs","repos_url":"https://api.github.com/users/indico/repos","events_url":"https://api.github.com/users/indico/events{/privacy}","received_events_url":"https://api.github.com/users/indico/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/indico/indico","description":"The Indico Project","fork":false,"url":"https://api.github.com/repos/indico/indico","forks_url":"https://api.github.com/repos/indico/indico/forks","keys_url":"https://api.github.com/repos/indico/indico/keys{/key_id}","collaborators_url":"https://api.github.com/repos/indico/indico/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/indico/indico/teams","hooks_url":"https://api.github.com/repos/indico/indico/hooks","issue_events_url":"https://api.github.com/repos/indico/indico/issues/events{/number}","events_url":"https://api.github.com/repos/indico/indico/events","assignees_url":"https://api.github.com/repos/indico/indico/assignees{/user}","branches_url":"https://api.github.com/repos/indico/indico/branches{/branch}","tags_url":"https://api.github.com/repos/indico/indico/tags","blobs_url":"https://api.github.com/repos/indico/indico/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/indico/indico/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/indico/indico/git/refs{/sha}","trees_url":"https://api.github.com/repos/indico/indico/git/trees{/sha}","statuses_url":"https://api.github.com/repos/indico/indico/statuses/{sha}","languages_url":"https://api.github.com/repos/indico/indico/languages","stargazers_url":"https://api.github.com/repos/indico/indico/stargazers","contributors_url":"https://api.github.com/repos/indico/indico/contributors","subscribers_url":"https://api.github.com/repos/indico/indico/subscribers","subscription_url":"https://api.github.com/repos/indico/indico/subscription","commits_url":"https://api.github.com/repos/indico/indico/commits{/sha}","git_commits_url":"https://api.github.com/repos/indico/indico/git/commits{/sha}","comments_url":"https://api.github.com/repos/indico/indico/comments{/number}","issue_comment_url":"https://api.github.com/repos/indico/indico/issues/comments{/number}","contents_url":"https://api.github.com/repos/indico/indico/contents/{+path}","compare_url":"https://api.github.com/repos/indico/indico/compare/{base}...{head}","merges_url":"https://api.github.com/repos/indico/indico/merges","archive_url":"https://api.github.com/repos/indico/indico/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/indico/indico/downloads","issues_url":"https://api.github.com/repos/indico/indico/issues{/number}","pulls_url":"https://api.github.com/repos/indico/indico/pulls{/number}","milestones_url":"https://api.github.com/repos/indico/indico/milestones{/number}","notifications_url":"https://api.github.com/repos/indico/indico/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/indico/indico/labels{/name}","releases_url":"https://api.github.com/repos/indico/indico/releases{/id}","deployments_url":"https://api.github.com/repos/indico/indico/deployments","created_at":"2011-07-27T13:56:30Z","updated_at":"2016-06-11T13:56:56Z","pushed_at":"2016-06-15T15:36:24Z","git_url":"git://github.com/indico/indico.git","ssh_url":"git@github.com:indico/indico.git","clone_url":"https://github.com/indico/indico.git","svn_url":"https://github.com/indico/indico","homepage":"http://indico-software.org","size":199763,"stargazers_count":144,"watchers_count":144,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":72,"mirror_url":null,"open_issues_count":625,"forks":72,"open_issues":625,"watchers":144,"default_branch":"master"}},"base":{"label":"indico:devel","ref":"devel","sha":"c1becd75bf249c14d35c07d4bfb445349500ee93","user":{"login":"indico","id":715236,"avatar_url":"https://avatars.githubusercontent.com/u/715236?v=3","gravatar_id":"","url":"https://api.github.com/users/indico","html_url":"https://github.com/indico","followers_url":"https://api.github.com/users/indico/followers","following_url":"https://api.github.com/users/indico/following{/other_user}","gists_url":"https://api.github.com/users/indico/gists{/gist_id}","starred_url":"https://api.github.com/users/indico/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/indico/subscriptions","organizations_url":"https://api.github.com/users/indico/orgs","repos_url":"https://api.github.com/users/indico/repos","events_url":"https://api.github.com/users/indico/events{/privacy}","received_events_url":"https://api.github.com/users/indico/received_events","type":"Organization","site_admin":false},"repo":{"id":2113067,"name":"indico","full_name":"indico/indico","owner":{"login":"indico","id":715236,"avatar_url":"https://avatars.githubusercontent.com/u/715236?v=3","gravatar_id":"","url":"https://api.github.com/users/indico","html_url":"https://github.com/indico","followers_url":"https://api.github.com/users/indico/followers","following_url":"https://api.github.com/users/indico/following{/other_user}","gists_url":"https://api.github.com/users/indico/gists{/gist_id}","starred_url":"https://api.github.com/users/indico/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/indico/subscriptions","organizations_url":"https://api.github.com/users/indico/orgs","repos_url":"https://api.github.com/users/indico/repos","events_url":"https://api.github.com/users/indico/events{/privacy}","received_events_url":"https://api.github.com/users/indico/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/indico/indico","description":"The Indico Project","fork":false,"url":"https://api.github.com/repos/indico/indico","forks_url":"https://api.github.com/repos/indico/indico/forks","keys_url":"https://api.github.com/repos/indico/indico/keys{/key_id}","collaborators_url":"https://api.github.com/repos/indico/indico/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/indico/indico/teams","hooks_url":"https://api.github.com/repos/indico/indico/hooks","issue_events_url":"https://api.github.com/repos/indico/indico/issues/events{/number}","events_url":"https://api.github.com/repos/indico/indico/events","assignees_url":"https://api.github.com/repos/indico/indico/assignees{/user}","branches_url":"https://api.github.com/repos/indico/indico/branches{/branch}","tags_url":"https://api.github.com/repos/indico/indico/tags","blobs_url":"https://api.github.com/repos/indico/indico/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/indico/indico/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/indico/indico/git/refs{/sha}","trees_url":"https://api.github.com/repos/indico/indico/git/trees{/sha}","statuses_url":"https://api.github.com/repos/indico/indico/statuses/{sha}","languages_url":"https://api.github.com/repos/indico/indico/languages","stargazers_url":"https://api.github.com/repos/indico/indico/stargazers","contributors_url":"https://api.github.com/repos/indico/indico/contributors","subscribers_url":"https://api.github.com/repos/indico/indico/subscribers","subscription_url":"https://api.github.com/repos/indico/indico/subscription","commits_url":"https://api.github.com/repos/indico/indico/commits{/sha}","git_commits_url":"https://api.github.com/repos/indico/indico/git/commits{/sha}","comments_url":"https://api.github.com/repos/indico/indico/comments{/number}","issue_comment_url":"https://api.github.com/repos/indico/indico/issues/comments{/number}","contents_url":"https://api.github.com/repos/indico/indico/contents/{+path}","compare_url":"https://api.github.com/repos/indico/indico/compare/{base}...{head}","merges_url":"https://api.github.com/repos/indico/indico/merges","archive_url":"https://api.github.com/repos/indico/indico/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/indico/indico/downloads","issues_url":"https://api.github.com/repos/indico/indico/issues{/number}","pulls_url":"https://api.github.com/repos/indico/indico/pulls{/number}","milestones_url":"https://api.github.com/repos/indico/indico/milestones{/number}","notifications_url":"https://api.github.com/repos/indico/indico/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/indico/indico/labels{/name}","releases_url":"https://api.github.com/repos/indico/indico/releases{/id}","deployments_url":"https://api.github.com/repos/indico/indico/deployments","created_at":"2011-07-27T13:56:30Z","updated_at":"2016-06-11T13:56:56Z","pushed_at":"2016-06-15T15:36:24Z","git_url":"git://github.com/indico/indico.git","ssh_url":"git@github.com:indico/indico.git","clone_url":"https://github.com/indico/indico.git","svn_url":"https://github.com/indico/indico","homepage":"http://indico-software.org","size":199763,"stargazers_count":144,"watchers_count":144,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":72,"mirror_url":null,"open_issues_count":625,"forks":72,"open_issues":625,"watchers":144,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/indico/indico/pulls/2453"},"html":{"href":"https://github.com/indico/indico/pull/2453"},"issue":{"href":"https://api.github.com/repos/indico/indico/issues/2453"},"comments":{"href":"https://api.github.com/repos/indico/indico/issues/2453/comments"},"review_comments":{"href":"https://api.github.com/repos/indico/indico/pulls/2453/comments"},"review_comment":{"href":"https://api.github.com/repos/indico/indico/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/indico/indico/pulls/2453/commits"},"statuses":{"href":"https://api.github.com/repos/indico/indico/statuses/7d8ceb5e0ce1cc877e44ded28274af01dedba237"}}}}
{"actor":{"display_login":"ThiefMaster"}}