{"action":"created","comment":{"url":"https://api.github.com/repos/azavea/raster-foundry/pulls/comments/38546907","id":38546907,"diff_hunk":"@@ -0,0 +1,381 @@\n+'use strict';\n+\n+var React = require('react'),\n+    _ = require('underscore'),\n+    router = require('../router').router,\n+    asset = require('../core/utils').asset,\n+    settings = require('../settings');\n+\n+var VideoBackground = React.createBackboneClass({\n+    render: function() {\n+        return (\n+            <div className=\"video-background\">\n+                <img src={asset('img/ffc-space.png')} className=\"placeholder\" />\n+                <video autoPlay loop preload>\n+                    <source src={asset('video/ffc-space.webm')} type=\"video/webm\" />\n+                    <source src={asset('video/ffc-space.m4v')} type=\"video/mp4\" />\n+                    <source src={asset('video/ffc-space.ogv')} type=\"video/ogg\" />\n+                </video>\n+            </div>\n+        );\n+    }\n+});\n+\n+var UserScreen = React.createBackboneClass({\n+    render: function() {\n+        return (\n+            <div>\n+                <div className=\"block user-screen-block\">\n+                    <img src={asset('img/logo-raster-foundry.png')} />\n+                    {this.props.content}\n+                </div>\n+                <VideoBackground />\n+            </div>\n+        );\n+    }\n+});\n+\n+var ModelValidationMixin = {\n+    handleServerSuccess: function() {\n+        this.getModel().set({\n+            'success': true,\n+            'client_errors': null,\n+            'server_errors': null\n+        });\n+    },\n+\n+    // Default failure handler, will display any `errors` received from server.\n+    handleServerFailure: function(response) {\n+        var server_errors = ['Server communication error'];\n+        if (response && response.responseJSON && response.responseJSON.errors) {\n+            server_errors = response.responseJSON.errors;\n+        }\n+        this.getModel().set({\n+            'success': false,\n+            'client_errors': null,\n+            'server_errors': server_errors\n+        });\n+    },\n+\n+    // Performs Primary Action if model is in valid state.\n+    validate: function(e) {\n+        e.preventDefault();\n+        this.setFields();\n+        if (this.getModel().isValid()) {\n+            this.primaryAction();\n+        } else {\n+            this.onValidateFailure();\n+        }\n+    },\n+\n+    renderErrors: function() {\n+        var self = this;\n+        function renderErrorItems(errorKey) {\n+            var errors = '';\n+            if (self.getModel().get(errorKey)) {\n+                errors = self.getModel().get(errorKey).map(function(error,i) {\n+                    return <li key={errorKey + '-' + i}>{error}</li>;\n+                });\n+            }\n+            return errors;\n+        }\n+\n+        return (\n+            <ul>\n+                {renderErrorItems('client_errors')}\n+                {renderErrorItems('server_errors')}\n+            </ul>\n+        );\n+    }\n+};\n+\n+var FormGroup = React.createBackboneClass({\n+    getDefaultProps: function() {\n+        return {\n+            type: 'text'\n+        };\n+    },\n+\n+    getValue: function() {\n+        if (this.props.type === 'checkbox') {\n+            return React.findDOMNode(this.refs.input).checked;\n+        } else {\n+            return React.findDOMNode(this.refs.input).value;\n+        }\n+    },\n+\n+    setFocus: function() {\n+        React.findDOMNode(this.refs.input).focus();\n+    },\n+\n+    render: function() {\n+        if (this.props.type === 'checkbox') {\n+            return (\n+                <div className=\"checkbox form-group\">\n+                    <input type=\"checkbox\"\n+                        ref=\"input\"\n+                        id={this.props.name} />\n+                    <label>\n+                        {this.props.displayName}\n+                    </label>\n+                </div>\n+            );\n+        } else {\n+            return (\n+                <div className=\"form-group\">\n+                    <label htmlFor={this.props.name}>{this.props.displayName}</label>\n+                    <input type={this.props.type}\n+                        className=\"form-control\"\n+                        ref=\"input\"\n+                        id={this.props.name}\n+                        defaultChecked={this.props.value} />\n+                </div>\n+            );\n+        }\n+    }\n+});\n+\n+var LoginScreen = React.createBackboneClass({\n+    mixins: [ModelValidationMixin],\n+\n+    onValidateFailure: function() {\n+        this.refs.username.setFocus();\n+    },\n+\n+    setFields: function() {\n+        this.getModel().set({\n+            username: this.refs.username.getValue(),\n+            password: this.refs.password.getValue()\n+        }, { silent: true });\n+    },\n+\n+    primaryAction: function() {\n+        settings.getUser().login(this.getModel().attributes)\n+        .done(_.bind(this.handleSuccess, this))\n+        .fail(_.bind(this.handleFailure, this));\n+    },\n+\n+    handleSuccess: function() {\n+        router.go('/');\n+    },\n+\n+    handleFailure: function(response) {\n+        this.handleServerFailure(response);\n+    },\n+\n+    render: function() {\n+        var content = (\n+            <div>\n+                {this.renderErrors()}\n+                <div className=\"link-block\">\n+                    <a href=\"/forgot/\" data-url=\"/forgot/\"\n+                        className=\"text-muted small forgot\">Forgot?</a>\n+                    <a href=\"/send-activation/\" data-url=\"/send-activation/\"\n+                        className=\"text-muted small send-activation\">Send Activation Email</a>\n+                    <a href=\"/sign-up/\" data-url=\"/sign-up/\"\n+                        className=\"text-muted small sign-up\">Sign Up</a>\n+                </div>\n+                <form method=\"post\" onSubmit={this.validate}>\n+                    <FormGroup name=\"username\" displayName=\"Username\"\n+                        ref=\"username\"\n+                        value={this.getModel().get('username')}/>\n+                    <FormGroup name=\"password\" displayName=\"Password\"\n+                        ref=\"password\" type=\"password\"\n+                        value={this.getModel().get('password')}/>\n+                    <div className=\"form-action\">\n+                        <input type=\"submit\" className=\"btn btn-secondary btn-block\" value=\"Log In\" />\n+                    </div>\n+                </form>\n+            </div>\n+        );\n+\n+        return <UserScreen content={content} />;\n+    }\n+});\n+\n+var SignUpScreen = React.createBackboneClass({\n+    mixins: [ModelValidationMixin],\n+\n+    onValidateFailure: function() {\n+        this.refs.username.setFocus();\n+    },\n+\n+    getFormData: function() {\n+        return {\n+            username: this.refs.username.getValue(),\n+            email: this.refs.email.getValue(),\n+            password1: this.refs.password1.getValue(),\n+            password2: this.refs.password2.getValue(),\n+            agreed: this.refs.agreed.getValue()\n+        };\n+    },\n+\n+    setFields: function() {\n+        this.getModel().set(this.getFormData(), { silent: true });\n+    },\n+\n+    primaryAction: function() {\n+        this.getModel()\n+            .fetch({\n+                method: 'POST',\n+                data: this.getFormData()\n+            })\n+            .done(_.bind(this.handleServerSuccess, this))\n+            .fail(_.bind(this.handleServerFailure, this));\n+    },\n+\n+    handleSuccess: function() {\n+    },\n+\n+    handleFailure: function(response) {\n+        this.handleServerFailure(response);\n+    },\n+\n+    render: function() {\n+        var content = 'Please check your email to activate your account.';\n+        if (!this.getModel().get('success')) {\n+            content = (\n+                <form method=\"post\" onSubmit={this.validate}>\n+                    {this.renderErrors()}\n+                    <FormGroup name=\"username\" displayName=\"Username\" ref=\"username\" value={this.getModel().get('username')}/>\n+                    <FormGroup name=\"email\" displayName=\"Email\" ref=\"email\" value={this.getModel().get('email')}/>","path":"src/rf/js/src/user/components.js","position":241,"original_position":241,"commit_id":"c83e4fa45be0383d90bf7a1f9fee647acc205c30","original_commit_id":"c83e4fa45be0383d90bf7a1f9fee647acc205c30","user":{"login":"lliss","id":903219,"avatar_url":"https://avatars.githubusercontent.com/u/903219?v=3","gravatar_id":"","url":"https://api.github.com/users/lliss","html_url":"https://github.com/lliss","followers_url":"https://api.github.com/users/lliss/followers","following_url":"https://api.github.com/users/lliss/following{/other_user}","gists_url":"https://api.github.com/users/lliss/gists{/gist_id}","starred_url":"https://api.github.com/users/lliss/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lliss/subscriptions","organizations_url":"https://api.github.com/users/lliss/orgs","repos_url":"https://api.github.com/users/lliss/repos","events_url":"https://api.github.com/users/lliss/events{/privacy}","received_events_url":"https://api.github.com/users/lliss/received_events","type":"User","site_admin":false},"body":"I still think this should be of type \"email\"\r\n\r\nIf you don't want built in browser validation you can add `noValidate` at line 238\r\n","created_at":"2015-09-02T15:35:02Z","updated_at":"2015-09-02T15:35:02Z","html_url":"https://github.com/azavea/raster-foundry/pull/63#discussion_r38546907","pull_request_url":"https://api.github.com/repos/azavea/raster-foundry/pulls/63","_links":{"self":{"href":"https://api.github.com/repos/azavea/raster-foundry/pulls/comments/38546907"},"html":{"href":"https://github.com/azavea/raster-foundry/pull/63#discussion_r38546907"},"pull_request":{"href":"https://api.github.com/repos/azavea/raster-foundry/pulls/63"}}},"pull_request":{"url":"https://api.github.com/repos/azavea/raster-foundry/pulls/63","id":43903845,"html_url":"https://github.com/azavea/raster-foundry/pull/63","diff_url":"https://github.com/azavea/raster-foundry/pull/63.diff","patch_url":"https://github.com/azavea/raster-foundry/pull/63.patch","issue_url":"https://api.github.com/repos/azavea/raster-foundry/issues/63","number":63,"state":"open","locked":false,"title":"Add registration functionality","user":{"login":"lewfish","id":1896461,"avatar_url":"https://avatars.githubusercontent.com/u/1896461?v=3","gravatar_id":"","url":"https://api.github.com/users/lewfish","html_url":"https://github.com/lewfish","followers_url":"https://api.github.com/users/lewfish/followers","following_url":"https://api.github.com/users/lewfish/following{/other_user}","gists_url":"https://api.github.com/users/lewfish/gists{/gist_id}","starred_url":"https://api.github.com/users/lewfish/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lewfish/subscriptions","organizations_url":"https://api.github.com/users/lewfish/orgs","repos_url":"https://api.github.com/users/lewfish/repos","events_url":"https://api.github.com/users/lewfish/events{/privacy}","received_events_url":"https://api.github.com/users/lewfish/received_events","type":"User","site_admin":false},"body":"I adapted the user registration (and 'Forgot' and 'Send Activation') code from MMW to use React.js and the RF style. I also made it so different screens correspond to different URLs and the activation screen is rendered client-side.\r\n\r\nTo test:\r\n * Try logging in and logging out. Try making some client-side and server-side errors, which should be listed. \r\n * Try signing up. This should take you to /sign-up. Try making some client-side and server-side errors, which should be listed. Try hitting back to go to /login. \r\n * Go to /sign-up and put in valid info and then follow activation link in email (that is shown in console). You should be directed to /activate where you can click the button to go to / (and you should be logged in automatically).\r\n * Click the Send Activation Email link. That should do the same as above.\r\n * Click Forgot link. Try making some client-side and server-side errors, which should be listed. Following the link in the email to change password does not currently work. I think I'm going to make a new issue for this.\r\n\r\nConnects #52","created_at":"2015-09-01T17:33:42Z","updated_at":"2015-09-02T15:35:02Z","closed_at":null,"merged_at":null,"merge_commit_sha":"aa4e667318bd8bf12e5611f9da4e9610344783e6","assignee":{"login":"lliss","id":903219,"avatar_url":"https://avatars.githubusercontent.com/u/903219?v=3","gravatar_id":"","url":"https://api.github.com/users/lliss","html_url":"https://github.com/lliss","followers_url":"https://api.github.com/users/lliss/followers","following_url":"https://api.github.com/users/lliss/following{/other_user}","gists_url":"https://api.github.com/users/lliss/gists{/gist_id}","starred_url":"https://api.github.com/users/lliss/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lliss/subscriptions","organizations_url":"https://api.github.com/users/lliss/orgs","repos_url":"https://api.github.com/users/lliss/repos","events_url":"https://api.github.com/users/lliss/events{/privacy}","received_events_url":"https://api.github.com/users/lliss/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/azavea/raster-foundry/pulls/63/commits","review_comments_url":"https://api.github.com/repos/azavea/raster-foundry/pulls/63/comments","review_comment_url":"https://api.github.com/repos/azavea/raster-foundry/pulls/comments{/number}","comments_url":"https://api.github.com/repos/azavea/raster-foundry/issues/63/comments","statuses_url":"https://api.github.com/repos/azavea/raster-foundry/statuses/c83e4fa45be0383d90bf7a1f9fee647acc205c30","head":{"label":"lewfish:feature/registration","ref":"feature/registration","sha":"c83e4fa45be0383d90bf7a1f9fee647acc205c30","user":{"login":"lewfish","id":1896461,"avatar_url":"https://avatars.githubusercontent.com/u/1896461?v=3","gravatar_id":"","url":"https://api.github.com/users/lewfish","html_url":"https://github.com/lewfish","followers_url":"https://api.github.com/users/lewfish/followers","following_url":"https://api.github.com/users/lewfish/following{/other_user}","gists_url":"https://api.github.com/users/lewfish/gists{/gist_id}","starred_url":"https://api.github.com/users/lewfish/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lewfish/subscriptions","organizations_url":"https://api.github.com/users/lewfish/orgs","repos_url":"https://api.github.com/users/lewfish/repos","events_url":"https://api.github.com/users/lewfish/events{/privacy}","received_events_url":"https://api.github.com/users/lewfish/received_events","type":"User","site_admin":false},"repo":{"id":40567584,"name":"raster-foundry","full_name":"lewfish/raster-foundry","owner":{"login":"lewfish","id":1896461,"avatar_url":"https://avatars.githubusercontent.com/u/1896461?v=3","gravatar_id":"","url":"https://api.github.com/users/lewfish","html_url":"https://github.com/lewfish","followers_url":"https://api.github.com/users/lewfish/followers","following_url":"https://api.github.com/users/lewfish/following{/other_user}","gists_url":"https://api.github.com/users/lewfish/gists{/gist_id}","starred_url":"https://api.github.com/users/lewfish/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lewfish/subscriptions","organizations_url":"https://api.github.com/users/lewfish/orgs","repos_url":"https://api.github.com/users/lewfish/repos","events_url":"https://api.github.com/users/lewfish/events{/privacy}","received_events_url":"https://api.github.com/users/lewfish/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/lewfish/raster-foundry","description":"Raster Foundry.","fork":true,"url":"https://api.github.com/repos/lewfish/raster-foundry","forks_url":"https://api.github.com/repos/lewfish/raster-foundry/forks","keys_url":"https://api.github.com/repos/lewfish/raster-foundry/keys{/key_id}","collaborators_url":"https://api.github.com/repos/lewfish/raster-foundry/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/lewfish/raster-foundry/teams","hooks_url":"https://api.github.com/repos/lewfish/raster-foundry/hooks","issue_events_url":"https://api.github.com/repos/lewfish/raster-foundry/issues/events{/number}","events_url":"https://api.github.com/repos/lewfish/raster-foundry/events","assignees_url":"https://api.github.com/repos/lewfish/raster-foundry/assignees{/user}","branches_url":"https://api.github.com/repos/lewfish/raster-foundry/branches{/branch}","tags_url":"https://api.github.com/repos/lewfish/raster-foundry/tags","blobs_url":"https://api.github.com/repos/lewfish/raster-foundry/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/lewfish/raster-foundry/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/lewfish/raster-foundry/git/refs{/sha}","trees_url":"https://api.github.com/repos/lewfish/raster-foundry/git/trees{/sha}","statuses_url":"https://api.github.com/repos/lewfish/raster-foundry/statuses/{sha}","languages_url":"https://api.github.com/repos/lewfish/raster-foundry/languages","stargazers_url":"https://api.github.com/repos/lewfish/raster-foundry/stargazers","contributors_url":"https://api.github.com/repos/lewfish/raster-foundry/contributors","subscribers_url":"https://api.github.com/repos/lewfish/raster-foundry/subscribers","subscription_url":"https://api.github.com/repos/lewfish/raster-foundry/subscription","commits_url":"https://api.github.com/repos/lewfish/raster-foundry/commits{/sha}","git_commits_url":"https://api.github.com/repos/lewfish/raster-foundry/git/commits{/sha}","comments_url":"https://api.github.com/repos/lewfish/raster-foundry/comments{/number}","issue_comment_url":"https://api.github.com/repos/lewfish/raster-foundry/issues/comments{/number}","contents_url":"https://api.github.com/repos/lewfish/raster-foundry/contents/{+path}","compare_url":"https://api.github.com/repos/lewfish/raster-foundry/compare/{base}...{head}","merges_url":"https://api.github.com/repos/lewfish/raster-foundry/merges","archive_url":"https://api.github.com/repos/lewfish/raster-foundry/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/lewfish/raster-foundry/downloads","issues_url":"https://api.github.com/repos/lewfish/raster-foundry/issues{/number}","pulls_url":"https://api.github.com/repos/lewfish/raster-foundry/pulls{/number}","milestones_url":"https://api.github.com/repos/lewfish/raster-foundry/milestones{/number}","notifications_url":"https://api.github.com/repos/lewfish/raster-foundry/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/lewfish/raster-foundry/labels{/name}","releases_url":"https://api.github.com/repos/lewfish/raster-foundry/releases{/id}","created_at":"2015-08-11T22:08:56Z","updated_at":"2015-08-11T22:08:57Z","pushed_at":"2015-09-01T22:24:43Z","git_url":"git://github.com/lewfish/raster-foundry.git","ssh_url":"git@github.com:lewfish/raster-foundry.git","clone_url":"https://github.com/lewfish/raster-foundry.git","svn_url":"https://github.com/lewfish/raster-foundry","homepage":null,"size":12190,"stargazers_count":0,"watchers_count":0,"language":"HTML","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"develop"}},"base":{"label":"azavea:develop","ref":"develop","sha":"ba0a620a0f1ac92747bbdedf04d4983828eedd1e","user":{"login":"azavea","id":595231,"avatar_url":"https://avatars.githubusercontent.com/u/595231?v=3","gravatar_id":"","url":"https://api.github.com/users/azavea","html_url":"https://github.com/azavea","followers_url":"https://api.github.com/users/azavea/followers","following_url":"https://api.github.com/users/azavea/following{/other_user}","gists_url":"https://api.github.com/users/azavea/gists{/gist_id}","starred_url":"https://api.github.com/users/azavea/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/azavea/subscriptions","organizations_url":"https://api.github.com/users/azavea/orgs","repos_url":"https://api.github.com/users/azavea/repos","events_url":"https://api.github.com/users/azavea/events{/privacy}","received_events_url":"https://api.github.com/users/azavea/received_events","type":"Organization","site_admin":false},"repo":{"id":36464140,"name":"raster-foundry","full_name":"azavea/raster-foundry","owner":{"login":"azavea","id":595231,"avatar_url":"https://avatars.githubusercontent.com/u/595231?v=3","gravatar_id":"","url":"https://api.github.com/users/azavea","html_url":"https://github.com/azavea","followers_url":"https://api.github.com/users/azavea/followers","following_url":"https://api.github.com/users/azavea/following{/other_user}","gists_url":"https://api.github.com/users/azavea/gists{/gist_id}","starred_url":"https://api.github.com/users/azavea/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/azavea/subscriptions","organizations_url":"https://api.github.com/users/azavea/orgs","repos_url":"https://api.github.com/users/azavea/repos","events_url":"https://api.github.com/users/azavea/events{/privacy}","received_events_url":"https://api.github.com/users/azavea/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/azavea/raster-foundry","description":"Raster Foundry.","fork":false,"url":"https://api.github.com/repos/azavea/raster-foundry","forks_url":"https://api.github.com/repos/azavea/raster-foundry/forks","keys_url":"https://api.github.com/repos/azavea/raster-foundry/keys{/key_id}","collaborators_url":"https://api.github.com/repos/azavea/raster-foundry/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/azavea/raster-foundry/teams","hooks_url":"https://api.github.com/repos/azavea/raster-foundry/hooks","issue_events_url":"https://api.github.com/repos/azavea/raster-foundry/issues/events{/number}","events_url":"https://api.github.com/repos/azavea/raster-foundry/events","assignees_url":"https://api.github.com/repos/azavea/raster-foundry/assignees{/user}","branches_url":"https://api.github.com/repos/azavea/raster-foundry/branches{/branch}","tags_url":"https://api.github.com/repos/azavea/raster-foundry/tags","blobs_url":"https://api.github.com/repos/azavea/raster-foundry/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/azavea/raster-foundry/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/azavea/raster-foundry/git/refs{/sha}","trees_url":"https://api.github.com/repos/azavea/raster-foundry/git/trees{/sha}","statuses_url":"https://api.github.com/repos/azavea/raster-foundry/statuses/{sha}","languages_url":"https://api.github.com/repos/azavea/raster-foundry/languages","stargazers_url":"https://api.github.com/repos/azavea/raster-foundry/stargazers","contributors_url":"https://api.github.com/repos/azavea/raster-foundry/contributors","subscribers_url":"https://api.github.com/repos/azavea/raster-foundry/subscribers","subscription_url":"https://api.github.com/repos/azavea/raster-foundry/subscription","commits_url":"https://api.github.com/repos/azavea/raster-foundry/commits{/sha}","git_commits_url":"https://api.github.com/repos/azavea/raster-foundry/git/commits{/sha}","comments_url":"https://api.github.com/repos/azavea/raster-foundry/comments{/number}","issue_comment_url":"https://api.github.com/repos/azavea/raster-foundry/issues/comments{/number}","contents_url":"https://api.github.com/repos/azavea/raster-foundry/contents/{+path}","compare_url":"https://api.github.com/repos/azavea/raster-foundry/compare/{base}...{head}","merges_url":"https://api.github.com/repos/azavea/raster-foundry/merges","archive_url":"https://api.github.com/repos/azavea/raster-foundry/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/azavea/raster-foundry/downloads","issues_url":"https://api.github.com/repos/azavea/raster-foundry/issues{/number}","pulls_url":"https://api.github.com/repos/azavea/raster-foundry/pulls{/number}","milestones_url":"https://api.github.com/repos/azavea/raster-foundry/milestones{/number}","notifications_url":"https://api.github.com/repos/azavea/raster-foundry/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/azavea/raster-foundry/labels{/name}","releases_url":"https://api.github.com/repos/azavea/raster-foundry/releases{/id}","created_at":"2015-05-28T20:25:45Z","updated_at":"2015-08-18T18:45:13Z","pushed_at":"2015-09-02T15:05:14Z","git_url":"git://github.com/azavea/raster-foundry.git","ssh_url":"git@github.com:azavea/raster-foundry.git","clone_url":"https://github.com/azavea/raster-foundry.git","svn_url":"https://github.com/azavea/raster-foundry","homepage":null,"size":12635,"stargazers_count":3,"watchers_count":3,"language":"CSS","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":7,"mirror_url":null,"open_issues_count":21,"forks":7,"open_issues":21,"watchers":3,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/azavea/raster-foundry/pulls/63"},"html":{"href":"https://github.com/azavea/raster-foundry/pull/63"},"issue":{"href":"https://api.github.com/repos/azavea/raster-foundry/issues/63"},"comments":{"href":"https://api.github.com/repos/azavea/raster-foundry/issues/63/comments"},"review_comments":{"href":"https://api.github.com/repos/azavea/raster-foundry/pulls/63/comments"},"review_comment":{"href":"https://api.github.com/repos/azavea/raster-foundry/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/azavea/raster-foundry/pulls/63/commits"},"statuses":{"href":"https://api.github.com/repos/azavea/raster-foundry/statuses/c83e4fa45be0383d90bf7a1f9fee647acc205c30"}}}}