{"action":"created","comment":{"url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/pulls/comments/36577057","id":36577057,"diff_hunk":"@@ -305,14 +409,724 @@ def test_reset_password_form_and_inputs_not_autofillable(\n             self, data_api_client\n     ):\n         data_api_client.get_user.return_value = self.user(\n-            123, \"email@email.com\", 1234, 'email'\n+            123, \"email@email.com\", 1234, 'email', 'name'\n         )\n \n         with self.app.app_context():\n-            url = helpers.email.generate_reset_url(123, \"email@email.com\")\n+            token = generate_token(\n+                {\n+                    \"user\": 123,\n+                    \"email\": 'email@email.com',\n+                },\n+                self.app.config['SECRET_KEY'],\n+                self.app.config['RESET_PASSWORD_SALT'])\n+\n+            url = '/suppliers/reset-password/{}'.format(token)\n \n         self._forms_and_inputs_not_autofillable(\n             url,\n             \"Reset password\",\n             \"Reset password for email@email.com\"\n         )\n+\n+\n+class TestInviteUser(BaseApplicationTest):\n+\n+    def test_should_be_an_error_for_invalid_email(self):\n+        with self.app.app_context():\n+            self.login()\n+            res = self.client.post(\n+                '/suppliers/invite-user',\n+                data={\n+                    'email_address': 'invalid'\n+                }\n+            )\n+            assert_true(\"Please enter a valid email address\" in res.get_data(as_text=True))\n+            assert_equal(res.status_code, 400)\n+\n+    def test_should_be_an_error_for_missing_email(self):\n+        with self.app.app_context():\n+            self.login()\n+            res = self.client.post(\n+                '/suppliers/invite-user',\n+                data={}\n+            )\n+            assert_true(\"Email can not be empty\" in res.get_data(as_text=True))\n+            assert_equal(res.status_code, 400)\n+\n+    @mock.patch('app.main.views.login.send_email')\n+    def test_should_redirect_in_success(self, send_email):\n+        with self.app.app_context():\n+            self.login()\n+            res = self.client.post(\n+                '/suppliers/invite-user',\n+                data={\n+                    'email_address': 'this@isvalid.com'\n+                }\n+            )\n+            assert_equal(res.status_code, 302)\n+            assert_equal(res.location, 'http://localhost/suppliers/invite-user')\n+\n+    @mock.patch('app.main.views.login.send_email')\n+    def test_should_show_success_message(self, send_email):\n+        with self.app.app_context():\n+            self.login()\n+            res = self.client.post(\n+                '/suppliers/invite-user',\n+                data={\n+                    'email_address': 'this@isvalid.com'\n+                },\n+                follow_redirects=True)\n+            assert_equal(res.status_code, 200)\n+            assert_true(\"User invited\" in res.get_data(as_text=True))\n+\n+    @mock.patch('app.main.views.login.generate_token')\n+    @mock.patch('app.main.views.login.send_email')\n+    def test_should_call_generate_token_with_correct_params(self, send_email, generate_token):\n+        with self.app.app_context():\n+\n+            self.app.config['SHARED_EMAIL_KEY'] = \"KEY\"\n+            self.app.config['INVITE_EMAIL_SALT'] = \"SALT\"\n+\n+            self.login()\n+            res = self.client.post(\n+                '/suppliers/invite-user',\n+                data={\n+                    'email_address': 'this@isvalid.com'\n+                })\n+            assert_equal(res.status_code, 302)\n+            generate_token.assert_called_once_with(\n+                {\n+                    \"supplier_id\": 1234,\n+                    \"supplier_name\": \"Supplier Name\",\n+                    \"email_address\": \"this@isvalid.com\"\n+                },\n+                'KEY',\n+                'SALT'\n+            )\n+\n+    @mock.patch('app.main.views.login.send_email')\n+    @mock.patch('app.main.views.login.generate_token')\n+    def test_should_not_generate_token_or_send_email_if_invalid_email(self, send_email, generate_token):\n+        with self.app.app_context():\n+\n+            self.login()\n+            res = self.client.post(\n+                '/suppliers/invite-user',\n+                data={\n+                    'email_address': 'total rubbish'\n+                })\n+            assert_equal(res.status_code, 400)\n+            assert not send_email.called\n+            assert not generate_token.called\n+\n+    @mock.patch('app.main.views.login.send_email')\n+    def test_should_be_an_error_if_send_invitation_email_fails(\n+            self, send_email\n+    ):\n+        with self.app.app_context():\n+            self.login()\n+\n+            send_email.side_effect = MandrillException(Exception('API is down'))\n+\n+            res = self.client.post(\n+                '/suppliers/invite-user',\n+                data={'email_address': 'email@email.com', 'name': 'valid'}\n+            )\n+\n+            assert_equal(res.status_code, 503)\n+\n+    @mock.patch('app.main.views.login.send_email')\n+    def test_should_call_send_invitation_email_with_correct_params(\n+            self, send_email\n+    ):\n+        with self.app.app_context():\n+\n+            self.login()\n+\n+            self.app.config['DM_MANDRILL_API_KEY'] = \"API KEY\"\n+            self.app.config['INVITE_EMAIL_SUBJECT'] = \"SUBJECT\"\n+            self.app.config['INVITE_EMAIL_FROM'] = \"EMAIL FROM\"\n+            self.app.config['INVITE_EMAIL_NAME'] = \"EMAIL NAME\"\n+\n+            res = self.client.post(\n+                '/suppliers/invite-user',\n+                data={'email_address': 'email@email.com', 'name': 'valid'}\n+            )\n+\n+            assert_equal(res.status_code, 302)\n+\n+            send_email.assert_called_once_with(\n+                \"email@email.com\",\n+                mock.ANY,\n+                \"API KEY\",\n+                \"SUBJECT\",\n+                \"EMAIL FROM\",\n+                \"EMAIL NAME\",\n+                [\"user-invite\"]\n+            )\n+\n+    def test_should_be_an_error_for_invalid_token(self):\n+        with self.app.app_context():\n+            token = \"1234\"\n+            res = self.client.get(\n+                '/suppliers/create-user/{}'.format(token)\n+            )\n+            assert_equal(res.status_code, 400)\n+\n+    def test_should_be_an_error_for_missing_token(self):\n+        with self.app.app_context():\n+            res = self.client.get(\n+                '/suppliers/create-user'\n+            )\n+            assert_equal(res.status_code, 404)\n+\n+    def test_should_be_an_error_for_missing_token_trailing_slash(self):\n+        with self.app.app_context():\n+            res = self.client.get(\n+                '/suppliers/create-user/'\n+            )\n+            assert_equal(res.status_code, 301)\n+            assert_equal(res.location, 'http://localhost/suppliers/create-user')\n+\n+    @mock.patch('app.main.views.login.data_api_client')\n+    def test_should_be_an_error_for_invalid_token_contents(self, data_api_client):\n+        with self.app.app_context():\n+\n+            token = generate_token(\n+                {\n+                    'this_is_not_expected': 1234\n+                },\n+                self.app.config['SHARED_EMAIL_KEY'],\n+                self.app.config['INVITE_EMAIL_SALT']\n+            )\n+\n+            res = self.client.get(\n+                '/suppliers/create-user/{}'.format(token)\n+            )\n+            assert_equal(res.status_code, 400)\n+            assert_equal(data_api_client.get_user.called, False)\n+            assert_equal(data_api_client.get_supplier.called, False)\n+\n+    @mock.patch('app.main.views.login.generate_token')\n+    def test_should_be_a_bad_request_if_token_expired(self, generate_token):\n+        with self.app.app_context():\n+\n+            generate_token.side_effect = BadTimeSignature(\"Too old\")\n+\n+            res = self.client.get(\n+                '/suppliers/create-user/12345'\n+            )\n+\n+            assert_equal(res.status_code, 400)\n+            assert_true(\n+                \"Check you&#146;ve entered the correct link or ask the person who invited you to send a new invitation.\"  # noqa\n+                in res.get_data(as_text=True)\n+            )\n+\n+    @mock.patch('app.main.views.login.data_api_client')\n+    def test_should_render_create_user_page_if_user_does_not_exist(self, data_api_client):\n+        with self.app.app_context():\n+\n+            data_api_client.get_user.return_value = None\n+\n+            token = generate_token(\n+                {\n+                    'supplier_id': 1234,\n+                    'supplier_name': 'Supplier Name',\n+                    'email_address': 'testme@email.com'\n+                },\n+                self.app.config['SHARED_EMAIL_KEY'],\n+                self.app.config['INVITE_EMAIL_SALT']\n+            )\n+\n+            res = self.client.get(\n+                '/suppliers/create-user/{}'.format(token)\n+            )\n+\n+            assert_equal(res.status_code, 200)\n+            assert_true(\n+                \"Supplier Name\"\n+                in res.get_data(as_text=True)\n+            )\n+            assert_true(\n+                \"testme@email.com\"\n+                in res.get_data(as_text=True)\n+            )\n+            assert_true(\n+                '<button class=\"button-save\">Create contributor account</button>'\n+                in res.get_data(as_text=True)\n+            )\n+            assert_true(\n+                '<form autocomplete=\"off\" action=\"/suppliers/create-user/{}\" method=\"POST\" id=\"createUserForm\">'.format(token)  # noqa\n+                in res.get_data(as_text=True)\n+            )\n+\n+    @mock.patch('app.main.views.login.data_api_client')\n+    def test_should_render_update_user_page_if_user_does_exist(self, data_api_client):\n+        with self.app.app_context():\n+\n+            data_api_client.get_user.return_value = self.user(\n+                123,\n+                'testme@email.com',\n+                None,\n+                None,\n+                'Users name'\n+            )\n+\n+            token = generate_token(\n+                {\n+                    'supplier_id': 1234,\n+                    'supplier_name': 'Supplier Name',\n+                    'email_address': 'testme@email.com'\n+                },\n+                self.app.config['SHARED_EMAIL_KEY'],\n+                self.app.config['INVITE_EMAIL_SALT']\n+            )\n+\n+            res = self.client.get(\n+                '/suppliers/create-user/{}'.format(token)\n+            )\n+\n+            assert_equal(res.status_code, 200)\n+            assert_true(\n+                \"Supplier Name\"\n+                in res.get_data(as_text=True)\n+            )\n+            assert_true(\n+                '<button class=\"button-save\">Create contributor account</button>'\n+                in res.get_data(as_text=True)\n+            )\n+            assert_true(\n+                '<form autocomplete=\"off\" action=\"/suppliers/update-user/{}\" method=\"POST\" id=\"updateUserForm\">'.format(token)  # noqa\n+                in res.get_data(as_text=True)\n+            )\n+\n+    def test_should_be_an_error_if_invalid_token_on_submit(self):\n+        with self.app.app_context():\n+            res = self.client.post(\n+                '/suppliers/create-user/invalidtoken',\n+                data={\n+                    'password': '123456789',\n+                    'name': 'name',\n+                    'email_address': 'valid@test.com'}\n+            )\n+\n+            assert_equal(res.status_code, 400)\n+            assert_equal(\n+                \"Check you&#146;ve entered the correct link or ask the person who invited you to send a new invitation.\" in res.get_data(as_text=True),  # noqa\n+                True\n+            )\n+            assert_equal(\n+                '<button class=\"button-save\">Create contributor account</button>' in res.get_data(as_text=True),\n+                False\n+            )\n+\n+    def test_should_be_an_error_if_invalid_token_on_update(self):\n+        with self.app.app_context():\n+            res = self.client.post(\n+                '/suppliers/update-user/invalidtoken'\n+            )\n+\n+            assert_equal(res.status_code, 400)\n+            assert_equal(\n+                \"Check you&#146;ve entered the correct link or ask the person who invited you to send a new invitation.\" in res.get_data(as_text=True),  # noqa\n+                True\n+            )\n+            assert_equal(\n+                '<button class=\"button-save\">Update user</button>' in res.get_data(as_text=True),  # noqa\n+                False\n+            )\n+\n+    def test_should_be_an_error_if_missing_name_and_password(self):\n+        with self.app.app_context():\n+\n+            token = generate_token(\n+                {\n+                    'supplier_id': 1234,\n+                    'supplier_name': 'Supplier Name',\n+                    'email_address': 'testme@email.com'\n+                },\n+                self.app.config['SHARED_EMAIL_KEY'],\n+                self.app.config['INVITE_EMAIL_SALT']\n+            )\n+\n+            res = self.client.post(\n+                '/suppliers/create-user/{}'.format(token),\n+                data={\n+                    'password': None,\n+                    'name': None\n+                }","path":"tests/app/main/test_login.py","position":580,"original_position":580,"commit_id":"cdc7a76c39f7462057c7179bef01656279d84fcf","original_commit_id":"cdc7a76c39f7462057c7179bef01656279d84fcf","user":{"login":"robyoung","id":14287,"avatar_url":"https://avatars.githubusercontent.com/u/14287?v=3","gravatar_id":"","url":"https://api.github.com/users/robyoung","html_url":"https://github.com/robyoung","followers_url":"https://api.github.com/users/robyoung/followers","following_url":"https://api.github.com/users/robyoung/following{/other_user}","gists_url":"https://api.github.com/users/robyoung/gists{/gist_id}","starred_url":"https://api.github.com/users/robyoung/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/robyoung/subscriptions","organizations_url":"https://api.github.com/users/robyoung/orgs","repos_url":"https://api.github.com/users/robyoung/repos","events_url":"https://api.github.com/users/robyoung/events{/privacy}","received_events_url":"https://api.github.com/users/robyoung/received_events","type":"User","site_admin":false},"body":"I don't think this would ever happen. Either the password and name are not submitted, in which case the data dictionary would be empty, or they are submitted empty, in which case they would have empty strings as values.","created_at":"2015-08-08T10:18:03Z","updated_at":"2015-08-08T10:18:03Z","html_url":"https://github.com/alphagov/digitalmarketplace-supplier-frontend/pull/131#discussion_r36577057","pull_request_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/pulls/131","_links":{"self":{"href":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/pulls/comments/36577057"},"html":{"href":"https://github.com/alphagov/digitalmarketplace-supplier-frontend/pull/131#discussion_r36577057"},"pull_request":{"href":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/pulls/131"}}},"pull_request":{"url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/pulls/131","id":41219145,"html_url":"https://github.com/alphagov/digitalmarketplace-supplier-frontend/pull/131","diff_url":"https://github.com/alphagov/digitalmarketplace-supplier-frontend/pull/131.diff","patch_url":"https://github.com/alphagov/digitalmarketplace-supplier-frontend/pull/131.patch","issue_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/issues/131","number":131,"state":"open","locked":false,"title":"Invite supplier users","user":{"login":"minglis","id":369454,"avatar_url":"https://avatars.githubusercontent.com/u/369454?v=3","gravatar_id":"","url":"https://api.github.com/users/minglis","html_url":"https://github.com/minglis","followers_url":"https://api.github.com/users/minglis/followers","following_url":"https://api.github.com/users/minglis/following{/other_user}","gists_url":"https://api.github.com/users/minglis/gists{/gist_id}","starred_url":"https://api.github.com/users/minglis/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/minglis/subscriptions","organizations_url":"https://api.github.com/users/minglis/orgs","repos_url":"https://api.github.com/users/minglis/repos","events_url":"https://api.github.com/users/minglis/events{/privacy}","received_events_url":"https://api.github.com/users/minglis/received_events","type":"User","site_admin":false},"body":"Adds ability to invite users from the supplier app.\r\n\r\nNote this depends on: \r\nhttps://github.com/alphagov/digitalmarketplace-supplier-frontend/pull/112\r\nAs the invite user form should be on the pages in that pull request\r\n\r\nAnd\r\nhttps://github.com/alphagov/digitalmarketplace-utils/pull/111\r\nAs email integration is now in utils\r\n\r\nIt delivers:\r\nhttps://www.pivotaltracker.com/n/projects/997836/stories/98628914\r\n\r\n\r\nPremise:\r\nExisting supplier is able to invite a user to contribute to the company:\r\n- enters email address\r\n- email is sent via mandrill\r\n- content signed of by @superroz \r\n\r\nEmail has a link generated in the same way as the password reset. Link contains\r\n- supplier_id\r\n- supplier_name\r\n- email_address of invited user\r\n\r\nWhen link clicked takes user to either\r\n- Update page - if user exits we allow a one button click to associated that account with the supplier in the token\r\n    - Locked, inactive or existing supplier accounts are all in error\r\n- Create page - if no user with that email exists we allow the user to enter a name and password and create their account\r\n\r\n- Both forms will log the user in and redirect to the dashboard\r\n\r\n\r\nCreate User:\r\n![create_contributor_account_ _digital_marketplace](https://cloud.githubusercontent.com/assets/369454/8981199/4668f83c-36ae-11e5-9b6f-c2bed4216aa5.png)\r\n\r\n\r\nUpdate user:\r\n![create_contributor_account_ _digital_marketplace](https://cloud.githubusercontent.com/assets/369454/8981216/67152e84-36ae-11e5-8e91-3c4c59e787f3.png)\r\n\r\n\r\n\r\n\r\n","created_at":"2015-07-30T10:30:46Z","updated_at":"2015-08-08T10:18:03Z","closed_at":null,"merged_at":null,"merge_commit_sha":"23775478b4b4150f25d9f2e1ec38bdd69a4ecf1e","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/pulls/131/commits","review_comments_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/pulls/131/comments","review_comment_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/pulls/comments{/number}","comments_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/issues/131/comments","statuses_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/statuses/cdc7a76c39f7462057c7179bef01656279d84fcf","head":{"label":"alphagov:invite-supplier-users","ref":"invite-supplier-users","sha":"cdc7a76c39f7462057c7179bef01656279d84fcf","user":{"login":"alphagov","id":596977,"avatar_url":"https://avatars.githubusercontent.com/u/596977?v=3","gravatar_id":"","url":"https://api.github.com/users/alphagov","html_url":"https://github.com/alphagov","followers_url":"https://api.github.com/users/alphagov/followers","following_url":"https://api.github.com/users/alphagov/following{/other_user}","gists_url":"https://api.github.com/users/alphagov/gists{/gist_id}","starred_url":"https://api.github.com/users/alphagov/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/alphagov/subscriptions","organizations_url":"https://api.github.com/users/alphagov/orgs","repos_url":"https://api.github.com/users/alphagov/repos","events_url":"https://api.github.com/users/alphagov/events{/privacy}","received_events_url":"https://api.github.com/users/alphagov/received_events","type":"Organization","site_admin":false},"repo":{"id":31256533,"name":"digitalmarketplace-supplier-frontend","full_name":"alphagov/digitalmarketplace-supplier-frontend","owner":{"login":"alphagov","id":596977,"avatar_url":"https://avatars.githubusercontent.com/u/596977?v=3","gravatar_id":"","url":"https://api.github.com/users/alphagov","html_url":"https://github.com/alphagov","followers_url":"https://api.github.com/users/alphagov/followers","following_url":"https://api.github.com/users/alphagov/following{/other_user}","gists_url":"https://api.github.com/users/alphagov/gists{/gist_id}","starred_url":"https://api.github.com/users/alphagov/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/alphagov/subscriptions","organizations_url":"https://api.github.com/users/alphagov/orgs","repos_url":"https://api.github.com/users/alphagov/repos","events_url":"https://api.github.com/users/alphagov/events{/privacy}","received_events_url":"https://api.github.com/users/alphagov/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/alphagov/digitalmarketplace-supplier-frontend","description":"Frontend supplier application for the digital marketplace.","fork":false,"url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend","forks_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/forks","keys_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/keys{/key_id}","collaborators_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/teams","hooks_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/hooks","issue_events_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/issues/events{/number}","events_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/events","assignees_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/assignees{/user}","branches_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/branches{/branch}","tags_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/tags","blobs_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/git/refs{/sha}","trees_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/git/trees{/sha}","statuses_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/statuses/{sha}","languages_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/languages","stargazers_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/stargazers","contributors_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/contributors","subscribers_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/subscribers","subscription_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/subscription","commits_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/commits{/sha}","git_commits_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/git/commits{/sha}","comments_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/comments{/number}","issue_comment_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/issues/comments{/number}","contents_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/contents/{+path}","compare_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/compare/{base}...{head}","merges_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/merges","archive_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/downloads","issues_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/issues{/number}","pulls_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/pulls{/number}","milestones_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/milestones{/number}","notifications_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/labels{/name}","releases_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/releases{/id}","created_at":"2015-02-24T11:10:47Z","updated_at":"2015-05-07T15:03:23Z","pushed_at":"2015-08-07T16:31:44Z","git_url":"git://github.com/alphagov/digitalmarketplace-supplier-frontend.git","ssh_url":"git@github.com:alphagov/digitalmarketplace-supplier-frontend.git","clone_url":"https://github.com/alphagov/digitalmarketplace-supplier-frontend.git","svn_url":"https://github.com/alphagov/digitalmarketplace-supplier-frontend","homepage":null,"size":2988,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2,"mirror_url":null,"open_issues_count":2,"forks":2,"open_issues":2,"watchers":0,"default_branch":"master"}},"base":{"label":"alphagov:master","ref":"master","sha":"10a32112f277030fc905757489d7e3c73362d2be","user":{"login":"alphagov","id":596977,"avatar_url":"https://avatars.githubusercontent.com/u/596977?v=3","gravatar_id":"","url":"https://api.github.com/users/alphagov","html_url":"https://github.com/alphagov","followers_url":"https://api.github.com/users/alphagov/followers","following_url":"https://api.github.com/users/alphagov/following{/other_user}","gists_url":"https://api.github.com/users/alphagov/gists{/gist_id}","starred_url":"https://api.github.com/users/alphagov/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/alphagov/subscriptions","organizations_url":"https://api.github.com/users/alphagov/orgs","repos_url":"https://api.github.com/users/alphagov/repos","events_url":"https://api.github.com/users/alphagov/events{/privacy}","received_events_url":"https://api.github.com/users/alphagov/received_events","type":"Organization","site_admin":false},"repo":{"id":31256533,"name":"digitalmarketplace-supplier-frontend","full_name":"alphagov/digitalmarketplace-supplier-frontend","owner":{"login":"alphagov","id":596977,"avatar_url":"https://avatars.githubusercontent.com/u/596977?v=3","gravatar_id":"","url":"https://api.github.com/users/alphagov","html_url":"https://github.com/alphagov","followers_url":"https://api.github.com/users/alphagov/followers","following_url":"https://api.github.com/users/alphagov/following{/other_user}","gists_url":"https://api.github.com/users/alphagov/gists{/gist_id}","starred_url":"https://api.github.com/users/alphagov/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/alphagov/subscriptions","organizations_url":"https://api.github.com/users/alphagov/orgs","repos_url":"https://api.github.com/users/alphagov/repos","events_url":"https://api.github.com/users/alphagov/events{/privacy}","received_events_url":"https://api.github.com/users/alphagov/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/alphagov/digitalmarketplace-supplier-frontend","description":"Frontend supplier application for the digital marketplace.","fork":false,"url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend","forks_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/forks","keys_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/keys{/key_id}","collaborators_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/teams","hooks_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/hooks","issue_events_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/issues/events{/number}","events_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/events","assignees_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/assignees{/user}","branches_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/branches{/branch}","tags_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/tags","blobs_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/git/refs{/sha}","trees_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/git/trees{/sha}","statuses_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/statuses/{sha}","languages_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/languages","stargazers_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/stargazers","contributors_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/contributors","subscribers_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/subscribers","subscription_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/subscription","commits_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/commits{/sha}","git_commits_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/git/commits{/sha}","comments_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/comments{/number}","issue_comment_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/issues/comments{/number}","contents_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/contents/{+path}","compare_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/compare/{base}...{head}","merges_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/merges","archive_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/downloads","issues_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/issues{/number}","pulls_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/pulls{/number}","milestones_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/milestones{/number}","notifications_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/labels{/name}","releases_url":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/releases{/id}","created_at":"2015-02-24T11:10:47Z","updated_at":"2015-05-07T15:03:23Z","pushed_at":"2015-08-07T16:31:44Z","git_url":"git://github.com/alphagov/digitalmarketplace-supplier-frontend.git","ssh_url":"git@github.com:alphagov/digitalmarketplace-supplier-frontend.git","clone_url":"https://github.com/alphagov/digitalmarketplace-supplier-frontend.git","svn_url":"https://github.com/alphagov/digitalmarketplace-supplier-frontend","homepage":null,"size":2988,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2,"mirror_url":null,"open_issues_count":2,"forks":2,"open_issues":2,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/pulls/131"},"html":{"href":"https://github.com/alphagov/digitalmarketplace-supplier-frontend/pull/131"},"issue":{"href":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/issues/131"},"comments":{"href":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/issues/131/comments"},"review_comments":{"href":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/pulls/131/comments"},"review_comment":{"href":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/pulls/131/commits"},"statuses":{"href":"https://api.github.com/repos/alphagov/digitalmarketplace-supplier-frontend/statuses/cdc7a76c39f7462057c7179bef01656279d84fcf"}}}}