{"action":"created","comment":{"url":"https://api.github.com/repos/dimagi/commcare-hq/pulls/comments/212804695","pull_request_review_id":149516919,"id":212804695,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIxMjgwNDY5NQ==","diff_hunk":"@@ -0,0 +1,293 @@\n+hqDefine(\"reports/js/report_config_models\", [\n+    'jquery',\n+    'knockout',\n+    'underscore',\n+    'analytix/js/google',\n+    'reports/js/standard_hq_report',\n+    'jquery-ui/ui/datepicker',\n+], function(\n+    $,\n+    ko,\n+    _,\n+    googleAnalytics,\n+    standardHQReportModule\n+) {\n+    var reportConfig = function (data) {\n+        var self = ko.mapping.fromJS(data, {\n+            'copy': ['filters'],\n+        });\n+\n+        self.error = ko.observable(false);\n+\n+        self.isNew = ko.computed(function () {\n+            return typeof self._id === \"undefined\";\n+        });\n+\n+        self.modalTitle = ko.computed(function () {\n+            return (self.isNew() ? 'New' : 'Edit') + ' Saved Report' +\n+                (self.name() ? ': ' + self.name() : '');\n+        });\n+\n+        self.validate = function() {\n+            var date_range = self.date_range(),\n+                error = false;\n+\n+            if (_.isEmpty(self.name())) {\n+                error = true;\n+            }else if (date_range === 'lastn') {\n+                var days = parseInt(self.days());\n+                if (!_.isNumber(days) || _.isNaN(days)) {\n+                    error = true;\n+                }\n+            } else if ((date_range === 'since' || date_range === 'range') && _.isEmpty(self.start_date())) {\n+                error = true;\n+            } else if (date_range === 'range' && _.isEmpty(self.end_date())) {\n+                error = true;\n+            }\n+            self.error(error);\n+            return !error;\n+        };\n+\n+        self.unwrap = function () {\n+            var data = ko.mapping.toJS(self);\n+            var standardHQReport = standardHQReportModule.getStandardHQReport();\n+            if (standardHQReport.slug) {\n+                data['report_slug'] = standardHQReport.slug;\n+            }\n+            if (standardHQReport.type) {\n+                data['report_type'] = standardHQReport.type;\n+            }\n+            if (standardHQReport.subReportSlug) {\n+                data['subreport_slug'] = standardHQReport.subReportSlug;\n+            }\n+            return data;\n+        };\n+\n+        self.dateRangeSubs = self.date_range.subscribe(function(newValue) {\n+            if (newValue === 'since' || newValue === 'range') {\n+                $('.date-picker').datepicker({\n+                    changeMonth: true,\n+                    changeYear: true,\n+                    showButtonPanel: true,\n+                    dateFormat: 'yy-mm-dd',\n+                });\n+            }\n+        });\n+\n+        return self;\n+    };\n+\n+    var reportConfigsViewModel = function (options) {\n+        var self = {};\n+\n+        self.filterForm = options.filterForm;\n+\n+        self.initialLoad = true;\n+\n+        self.reportConfigs = ko.observableArray(ko.utils.arrayMap(options.items, function (item) {\n+            return reportConfig(item);\n+        }));\n+\n+        self.configBeingViewed = ko.observable();\n+\n+        self.configBeingEdited = ko.observable();\n+\n+        self.filterHeadingName = ko.computed(function () {\n+            var config = self.configBeingViewed(),\n+                text = 'Report Filters';\n+\n+            if (config && !config.isNew()) {\n+                text += ': ' + config.name();\n+            }\n+\n+            return text;\n+        });\n+\n+        self.addOrReplaceConfig = function (config) {\n+            for (var i = 0; i < self.reportConfigs().length; i++) {\n+                if (ko.utils.unwrapObservable(self.reportConfigs()[i]._id) === config._id()) {\n+                    self.reportConfigs.splice(i, 1, config);\n+                    return;\n+                }\n+            }\n+\n+            // todo: alphabetize\n+            self.reportConfigs.push(config);\n+        };\n+\n+        self.deleteConfig = function (config) {\n+            $.ajax({\n+                type: \"DELETE\",\n+                url: options.saveUrl + '/' + config._id(),\n+                success: function (data) {\n+                    window.location.reload();\n+                },\n+            });\n+        };\n+\n+        self.setConfigBeingViewed = function (config) {\n+            self.configBeingViewed(config);\n+            if (self.initialLoad) {\n+                self.initialLoad = false;\n+            } else {\n+                window.location.href = config.url();\n+            }\n+        };\n+\n+        self.setUserConfigurableConfigBeingViewed = function (config) {\n+            self.configBeingViewed(config);\n+\n+            var filters = config.filters;\n+            update_filters = function() {\n+                for (var filter_name in filters) {\n+                    var val = filters[filter_name];\n+                    $('[name=\"' + filter_name + '\"]').val(val);\n+                }\n+            };\n+\n+            if (self.initialLoad) {\n+                self.initialLoad = false;\n+                update_filters();\n+            } else {\n+                update_filters();\n+                window.location.href = \"?config_id=\" + config._id();\n+            }\n+        };\n+\n+        // edit the config currently being viewed\n+        self.setConfigBeingEdited = function (config) {\n+            var filters = {},\n+                excludeFilters = ['startdate', 'enddate', 'format', 'date'];\n+            if (self.filterForm) {\n+                self.filterForm.find(\":input\").each(function () {\n+                    var el = $(this),\n+                        name = el.prop('name'),\n+                        val = el.val(),\n+                        type = el.prop('type');\n+\n+                    if (type === 'checkbox') {\n+                        if (el.prop('checked') === true) {\n+                            if (!filters.hasOwnProperty(name)) {\n+                                filters[name] = [];\n+                            }\n+\n+                            filters[name].push(val);\n+                        }\n+                    } else if (type === 'radio') {\n+                        if (el.prop('checked') === true) {\n+                            filters[name] = val;\n+                        }\n+                    } else if (name && excludeFilters.indexOf(name) === -1) {\n+                        filters[name] = val;\n+                    }\n+                });\n+            } else {\n+                self.configBeingViewed(config);\n+                filters = config.filters;\n+            }\n+\n+            self.configBeingViewed().filters = filters;\n+\n+            var editedConfig = self.configBeingViewed();\n+            if (editedConfig.isNew()) {\n+                var daterangepicker = $(\"#filter_range\").data('daterangepicker');\n+                if (daterangepicker) {\n+                    switch (daterangepicker.chosenLabel) {\n+                        case \"Last 7 Days\":\n+                            editedConfig.date_range(\"last7\");\n+                            break;\n+                        case \"Last 30 Days\":\n+                            editedConfig.date_range(\"last30\");\n+                            break;\n+                        case \"Last Month\":\n+                            editedConfig.date_range(\"lastmonth\");\n+                            break;\n+                        case \"Custom Range\":\n+                            editedConfig.start_date = daterangepicker.startDate.format(\"YYYY-MM-DD\");\n+                            editedConfig.end_date = daterangepicker.endDate.format(\"YYYY-MM-DD\");\n+                            editedConfig.date_range(\"range\");\n+                            break;\n+                        default:\n+                    }\n+                }\n+            }\n+            self.configBeingEdited(self.configBeingViewed());\n+            self.modalSaveButton.state('save');\n+\n+            // Required to initialise datepicker if modal opened with date_range in ('since', 'range')\n+            $(\".date-picker\").datepicker({\n+                changeMonth: true,\n+                changeYear: true,\n+                showButtonPanel: true,\n+                dateFormat: 'yy-mm-dd',\n+            });\n+        };\n+\n+        self.trackConfigBeingEdited = function(builderReportType) {\n+            googleAnalytics.track.event('Scheduled Reports', 'Create a saved report', '-');\n+            if (builderReportType) {\n+                googleAnalytics.track.event('Report Viewer', 'Save Report', builderReportType);\n+            }\n+        };\n+\n+        self.unsetConfigBeingEdited = function () {\n+            self.configBeingEdited(undefined);\n+        };\n+\n+        self.validate = function() {\n+            return self.configBeingEdited().validate();\n+        };\n+\n+        self.modalSaveButton = {\n+            state: ko.observable(),\n+            saveOptions: function () {\n+                var config_data = self.configBeingEdited().unwrap();\n+                var select2 = $(\"[data-ajax-select2]\").map(function() {\n+                    return $(this).attr('name');\n+                }).toArray();\n+                for (var key in config_data[\"filters\"]) {\n+                    // Make ajax select2 fields into lists so they serialize properly\n+                    if (select2.indexOf(key) >= 0) {\n+                        config_data[\"filters\"][key] = config_data[\"filters\"][key].split(',');\n+                    }\n+                    // remove null filters\n+                    if (config_data[\"filters\"].hasOwnProperty(key)) {\n+                        if (config_data[\"filters\"][key] === null) {\n+                            delete config_data[\"filters\"][key];\n+                        }\n+                    }\n+                }\n+                return {\n+                    url: options.saveUrl,\n+                    type: 'post',\n+                    data: JSON.stringify(config_data),\n+                    dataType: 'json',\n+                    success: function (data) {\n+                        var newConfig = reportConfig(data);\n+                        self.addOrReplaceConfig(newConfig);\n+                        self.unsetConfigBeingEdited();\n+                        if (newConfig.report_slug == 'configurable') {","path":"corehq/apps/reports/static/reports/js/report_config_models.js","position":269,"original_position":269,"commit_id":"2bede52348fa5bf6251993f41bfeeda9e1387ee2","original_commit_id":"2bede52348fa5bf6251993f41bfeeda9e1387ee2","user":{"login":"stickler-ci","id":16011037,"node_id":"MDQ6VXNlcjE2MDExMDM3","avatar_url":"https://avatars3.githubusercontent.com/u/16011037?v=4","gravatar_id":"","url":"https://api.github.com/users/stickler-ci","html_url":"https://github.com/stickler-ci","followers_url":"https://api.github.com/users/stickler-ci/followers","following_url":"https://api.github.com/users/stickler-ci/following{/other_user}","gists_url":"https://api.github.com/users/stickler-ci/gists{/gist_id}","starred_url":"https://api.github.com/users/stickler-ci/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stickler-ci/subscriptions","organizations_url":"https://api.github.com/users/stickler-ci/orgs","repos_url":"https://api.github.com/users/stickler-ci/repos","events_url":"https://api.github.com/users/stickler-ci/events{/privacy}","received_events_url":"https://api.github.com/users/stickler-ci/received_events","type":"User","site_admin":false},"body":"Expected '===' and instead saw '=='. (eqeqeq)","created_at":"2018-08-25T17:57:23Z","updated_at":"2018-08-25T17:57:25Z","html_url":"https://github.com/dimagi/commcare-hq/pull/21601#discussion_r212804695","pull_request_url":"https://api.github.com/repos/dimagi/commcare-hq/pulls/21601","author_association":"NONE","_links":{"self":{"href":"https://api.github.com/repos/dimagi/commcare-hq/pulls/comments/212804695"},"html":{"href":"https://github.com/dimagi/commcare-hq/pull/21601#discussion_r212804695"},"pull_request":{"href":"https://api.github.com/repos/dimagi/commcare-hq/pulls/21601"}}},"pull_request":{"url":"https://api.github.com/repos/dimagi/commcare-hq/pulls/21601","id":209695624,"node_id":"MDExOlB1bGxSZXF1ZXN0MjA5Njk1NjI0","html_url":"https://github.com/dimagi/commcare-hq/pull/21601","diff_url":"https://github.com/dimagi/commcare-hq/pull/21601.diff","patch_url":"https://github.com/dimagi/commcare-hq/pull/21601.patch","issue_url":"https://api.github.com/repos/dimagi/commcare-hq/issues/21601","number":21601,"state":"open","locked":false,"title":"Annual pricing","user":{"login":"gbova","id":15271571,"node_id":"MDQ6VXNlcjE1MjcxNTcx","avatar_url":"https://avatars0.githubusercontent.com/u/15271571?v=4","gravatar_id":"","url":"https://api.github.com/users/gbova","html_url":"https://github.com/gbova","followers_url":"https://api.github.com/users/gbova/followers","following_url":"https://api.github.com/users/gbova/following{/other_user}","gists_url":"https://api.github.com/users/gbova/gists{/gist_id}","starred_url":"https://api.github.com/users/gbova/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gbova/subscriptions","organizations_url":"https://api.github.com/users/gbova/orgs","repos_url":"https://api.github.com/users/gbova/repos","events_url":"https://api.github.com/users/gbova/events{/privacy}","received_events_url":"https://api.github.com/users/gbova/received_events","type":"User","site_admin":false},"body":"https://docs.google.com/document/d/1JSZQ_7iIPxkdZurn9ZzXYMCFa9ni4V6dH7MatrU4UQQ/edit","created_at":"2018-08-21T03:00:32Z","updated_at":"2018-08-25T17:57:24Z","closed_at":null,"merged_at":null,"merge_commit_sha":"f63103084666744720e8ea1deae7c7ea19eb8945","assignee":null,"assignees":[],"requested_reviewers":[{"login":"biyeun","id":716573,"node_id":"MDQ6VXNlcjcxNjU3Mw==","avatar_url":"https://avatars1.githubusercontent.com/u/716573?v=4","gravatar_id":"","url":"https://api.github.com/users/biyeun","html_url":"https://github.com/biyeun","followers_url":"https://api.github.com/users/biyeun/followers","following_url":"https://api.github.com/users/biyeun/following{/other_user}","gists_url":"https://api.github.com/users/biyeun/gists{/gist_id}","starred_url":"https://api.github.com/users/biyeun/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/biyeun/subscriptions","organizations_url":"https://api.github.com/users/biyeun/orgs","repos_url":"https://api.github.com/users/biyeun/repos","events_url":"https://api.github.com/users/biyeun/events{/privacy}","received_events_url":"https://api.github.com/users/biyeun/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":79032211,"node_id":"MDU6TGFiZWw3OTAzMjIxMQ==","url":"https://api.github.com/repos/dimagi/commcare-hq/labels/Open%20for%20review:%20do%20not%20merge","name":"Open for review: do not merge","color":"5319e7","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/dimagi/commcare-hq/pulls/21601/commits","review_comments_url":"https://api.github.com/repos/dimagi/commcare-hq/pulls/21601/comments","review_comment_url":"https://api.github.com/repos/dimagi/commcare-hq/pulls/comments{/number}","comments_url":"https://api.github.com/repos/dimagi/commcare-hq/issues/21601/comments","statuses_url":"https://api.github.com/repos/dimagi/commcare-hq/statuses/2bede52348fa5bf6251993f41bfeeda9e1387ee2","head":{"label":"dimagi:annual-pricing","ref":"annual-pricing","sha":"2bede52348fa5bf6251993f41bfeeda9e1387ee2","user":{"login":"dimagi","id":94514,"node_id":"MDEyOk9yZ2FuaXphdGlvbjk0NTE0","avatar_url":"https://avatars1.githubusercontent.com/u/94514?v=4","gravatar_id":"","url":"https://api.github.com/users/dimagi","html_url":"https://github.com/dimagi","followers_url":"https://api.github.com/users/dimagi/followers","following_url":"https://api.github.com/users/dimagi/following{/other_user}","gists_url":"https://api.github.com/users/dimagi/gists{/gist_id}","starred_url":"https://api.github.com/users/dimagi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dimagi/subscriptions","organizations_url":"https://api.github.com/users/dimagi/orgs","repos_url":"https://api.github.com/users/dimagi/repos","events_url":"https://api.github.com/users/dimagi/events{/privacy}","received_events_url":"https://api.github.com/users/dimagi/received_events","type":"Organization","site_admin":false},"repo":{"id":247278,"node_id":"MDEwOlJlcG9zaXRvcnkyNDcyNzg=","name":"commcare-hq","full_name":"dimagi/commcare-hq","owner":{"login":"dimagi","id":94514,"node_id":"MDEyOk9yZ2FuaXphdGlvbjk0NTE0","avatar_url":"https://avatars1.githubusercontent.com/u/94514?v=4","gravatar_id":"","url":"https://api.github.com/users/dimagi","html_url":"https://github.com/dimagi","followers_url":"https://api.github.com/users/dimagi/followers","following_url":"https://api.github.com/users/dimagi/following{/other_user}","gists_url":"https://api.github.com/users/dimagi/gists{/gist_id}","starred_url":"https://api.github.com/users/dimagi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dimagi/subscriptions","organizations_url":"https://api.github.com/users/dimagi/orgs","repos_url":"https://api.github.com/users/dimagi/repos","events_url":"https://api.github.com/users/dimagi/events{/privacy}","received_events_url":"https://api.github.com/users/dimagi/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/dimagi/commcare-hq","description":"A server-side tool to help manage community health workers, written in Django","fork":false,"url":"https://api.github.com/repos/dimagi/commcare-hq","forks_url":"https://api.github.com/repos/dimagi/commcare-hq/forks","keys_url":"https://api.github.com/repos/dimagi/commcare-hq/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dimagi/commcare-hq/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dimagi/commcare-hq/teams","hooks_url":"https://api.github.com/repos/dimagi/commcare-hq/hooks","issue_events_url":"https://api.github.com/repos/dimagi/commcare-hq/issues/events{/number}","events_url":"https://api.github.com/repos/dimagi/commcare-hq/events","assignees_url":"https://api.github.com/repos/dimagi/commcare-hq/assignees{/user}","branches_url":"https://api.github.com/repos/dimagi/commcare-hq/branches{/branch}","tags_url":"https://api.github.com/repos/dimagi/commcare-hq/tags","blobs_url":"https://api.github.com/repos/dimagi/commcare-hq/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dimagi/commcare-hq/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dimagi/commcare-hq/git/refs{/sha}","trees_url":"https://api.github.com/repos/dimagi/commcare-hq/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dimagi/commcare-hq/statuses/{sha}","languages_url":"https://api.github.com/repos/dimagi/commcare-hq/languages","stargazers_url":"https://api.github.com/repos/dimagi/commcare-hq/stargazers","contributors_url":"https://api.github.com/repos/dimagi/commcare-hq/contributors","subscribers_url":"https://api.github.com/repos/dimagi/commcare-hq/subscribers","subscription_url":"https://api.github.com/repos/dimagi/commcare-hq/subscription","commits_url":"https://api.github.com/repos/dimagi/commcare-hq/commits{/sha}","git_commits_url":"https://api.github.com/repos/dimagi/commcare-hq/git/commits{/sha}","comments_url":"https://api.github.com/repos/dimagi/commcare-hq/comments{/number}","issue_comment_url":"https://api.github.com/repos/dimagi/commcare-hq/issues/comments{/number}","contents_url":"https://api.github.com/repos/dimagi/commcare-hq/contents/{+path}","compare_url":"https://api.github.com/repos/dimagi/commcare-hq/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dimagi/commcare-hq/merges","archive_url":"https://api.github.com/repos/dimagi/commcare-hq/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dimagi/commcare-hq/downloads","issues_url":"https://api.github.com/repos/dimagi/commcare-hq/issues{/number}","pulls_url":"https://api.github.com/repos/dimagi/commcare-hq/pulls{/number}","milestones_url":"https://api.github.com/repos/dimagi/commcare-hq/milestones{/number}","notifications_url":"https://api.github.com/repos/dimagi/commcare-hq/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dimagi/commcare-hq/labels{/name}","releases_url":"https://api.github.com/repos/dimagi/commcare-hq/releases{/id}","deployments_url":"https://api.github.com/repos/dimagi/commcare-hq/deployments","created_at":"2009-07-09T17:00:07Z","updated_at":"2018-08-25T06:56:57Z","pushed_at":"2018-08-25T17:48:03Z","git_url":"git://github.com/dimagi/commcare-hq.git","ssh_url":"git@github.com:dimagi/commcare-hq.git","clone_url":"https://github.com/dimagi/commcare-hq.git","svn_url":"https://github.com/dimagi/commcare-hq","homepage":"https://www.commcarehq.org","size":457740,"stargazers_count":303,"watchers_count":303,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":119,"mirror_url":null,"archived":false,"open_issues_count":82,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":119,"open_issues":82,"watchers":303,"default_branch":"master"}},"base":{"label":"dimagi:master","ref":"master","sha":"1e409d179b038e37132a147b6211ef0c7dcdd7d6","user":{"login":"dimagi","id":94514,"node_id":"MDEyOk9yZ2FuaXphdGlvbjk0NTE0","avatar_url":"https://avatars1.githubusercontent.com/u/94514?v=4","gravatar_id":"","url":"https://api.github.com/users/dimagi","html_url":"https://github.com/dimagi","followers_url":"https://api.github.com/users/dimagi/followers","following_url":"https://api.github.com/users/dimagi/following{/other_user}","gists_url":"https://api.github.com/users/dimagi/gists{/gist_id}","starred_url":"https://api.github.com/users/dimagi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dimagi/subscriptions","organizations_url":"https://api.github.com/users/dimagi/orgs","repos_url":"https://api.github.com/users/dimagi/repos","events_url":"https://api.github.com/users/dimagi/events{/privacy}","received_events_url":"https://api.github.com/users/dimagi/received_events","type":"Organization","site_admin":false},"repo":{"id":247278,"node_id":"MDEwOlJlcG9zaXRvcnkyNDcyNzg=","name":"commcare-hq","full_name":"dimagi/commcare-hq","owner":{"login":"dimagi","id":94514,"node_id":"MDEyOk9yZ2FuaXphdGlvbjk0NTE0","avatar_url":"https://avatars1.githubusercontent.com/u/94514?v=4","gravatar_id":"","url":"https://api.github.com/users/dimagi","html_url":"https://github.com/dimagi","followers_url":"https://api.github.com/users/dimagi/followers","following_url":"https://api.github.com/users/dimagi/following{/other_user}","gists_url":"https://api.github.com/users/dimagi/gists{/gist_id}","starred_url":"https://api.github.com/users/dimagi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dimagi/subscriptions","organizations_url":"https://api.github.com/users/dimagi/orgs","repos_url":"https://api.github.com/users/dimagi/repos","events_url":"https://api.github.com/users/dimagi/events{/privacy}","received_events_url":"https://api.github.com/users/dimagi/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/dimagi/commcare-hq","description":"A server-side tool to help manage community health workers, written in Django","fork":false,"url":"https://api.github.com/repos/dimagi/commcare-hq","forks_url":"https://api.github.com/repos/dimagi/commcare-hq/forks","keys_url":"https://api.github.com/repos/dimagi/commcare-hq/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dimagi/commcare-hq/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dimagi/commcare-hq/teams","hooks_url":"https://api.github.com/repos/dimagi/commcare-hq/hooks","issue_events_url":"https://api.github.com/repos/dimagi/commcare-hq/issues/events{/number}","events_url":"https://api.github.com/repos/dimagi/commcare-hq/events","assignees_url":"https://api.github.com/repos/dimagi/commcare-hq/assignees{/user}","branches_url":"https://api.github.com/repos/dimagi/commcare-hq/branches{/branch}","tags_url":"https://api.github.com/repos/dimagi/commcare-hq/tags","blobs_url":"https://api.github.com/repos/dimagi/commcare-hq/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dimagi/commcare-hq/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dimagi/commcare-hq/git/refs{/sha}","trees_url":"https://api.github.com/repos/dimagi/commcare-hq/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dimagi/commcare-hq/statuses/{sha}","languages_url":"https://api.github.com/repos/dimagi/commcare-hq/languages","stargazers_url":"https://api.github.com/repos/dimagi/commcare-hq/stargazers","contributors_url":"https://api.github.com/repos/dimagi/commcare-hq/contributors","subscribers_url":"https://api.github.com/repos/dimagi/commcare-hq/subscribers","subscription_url":"https://api.github.com/repos/dimagi/commcare-hq/subscription","commits_url":"https://api.github.com/repos/dimagi/commcare-hq/commits{/sha}","git_commits_url":"https://api.github.com/repos/dimagi/commcare-hq/git/commits{/sha}","comments_url":"https://api.github.com/repos/dimagi/commcare-hq/comments{/number}","issue_comment_url":"https://api.github.com/repos/dimagi/commcare-hq/issues/comments{/number}","contents_url":"https://api.github.com/repos/dimagi/commcare-hq/contents/{+path}","compare_url":"https://api.github.com/repos/dimagi/commcare-hq/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dimagi/commcare-hq/merges","archive_url":"https://api.github.com/repos/dimagi/commcare-hq/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dimagi/commcare-hq/downloads","issues_url":"https://api.github.com/repos/dimagi/commcare-hq/issues{/number}","pulls_url":"https://api.github.com/repos/dimagi/commcare-hq/pulls{/number}","milestones_url":"https://api.github.com/repos/dimagi/commcare-hq/milestones{/number}","notifications_url":"https://api.github.com/repos/dimagi/commcare-hq/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dimagi/commcare-hq/labels{/name}","releases_url":"https://api.github.com/repos/dimagi/commcare-hq/releases{/id}","deployments_url":"https://api.github.com/repos/dimagi/commcare-hq/deployments","created_at":"2009-07-09T17:00:07Z","updated_at":"2018-08-25T06:56:57Z","pushed_at":"2018-08-25T17:48:03Z","git_url":"git://github.com/dimagi/commcare-hq.git","ssh_url":"git@github.com:dimagi/commcare-hq.git","clone_url":"https://github.com/dimagi/commcare-hq.git","svn_url":"https://github.com/dimagi/commcare-hq","homepage":"https://www.commcarehq.org","size":457740,"stargazers_count":303,"watchers_count":303,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":119,"mirror_url":null,"archived":false,"open_issues_count":82,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":119,"open_issues":82,"watchers":303,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dimagi/commcare-hq/pulls/21601"},"html":{"href":"https://github.com/dimagi/commcare-hq/pull/21601"},"issue":{"href":"https://api.github.com/repos/dimagi/commcare-hq/issues/21601"},"comments":{"href":"https://api.github.com/repos/dimagi/commcare-hq/issues/21601/comments"},"review_comments":{"href":"https://api.github.com/repos/dimagi/commcare-hq/pulls/21601/comments"},"review_comment":{"href":"https://api.github.com/repos/dimagi/commcare-hq/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/dimagi/commcare-hq/pulls/21601/commits"},"statuses":{"href":"https://api.github.com/repos/dimagi/commcare-hq/statuses/2bede52348fa5bf6251993f41bfeeda9e1387ee2"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"stickler-ci"}}