{"action":"created","comment":{"url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/pulls/comments/101409182","pull_request_review_id":22137336,"id":101409182,"diff_hunk":"@@ -0,0 +1,32 @@\n+\"\"\"user_requests events on update cascade\n+\n+Revision ID: 8797e9a71f62\n+Revises: 85068c55138a\n+Create Date: 2017-02-13 15:48:25.344003\n+\n+\"\"\"\n+\n+# revision identifiers, used by Alembic.\n+revision = '8797e9a71f62'\n+down_revision = '85068c55138a'\n+\n+from alembic import op\n+import sqlalchemy as sa","path":"migrations/versions/8797e9a71f62_user_requests_events_on_update_cascade.py","position":14,"original_position":14,"commit_id":"57bf2ff5bd463484fa7260a195fe14e02ec9cfb4","original_commit_id":"57bf2ff5bd463484fa7260a195fe14e02ec9cfb4","user":{"login":"codacy-bot","id":19940114,"avatar_url":"https://avatars.githubusercontent.com/u/19940114?v=3","gravatar_id":"","url":"https://api.github.com/users/codacy-bot","html_url":"https://github.com/codacy-bot","followers_url":"https://api.github.com/users/codacy-bot/followers","following_url":"https://api.github.com/users/codacy-bot/following{/other_user}","gists_url":"https://api.github.com/users/codacy-bot/gists{/gist_id}","starred_url":"https://api.github.com/users/codacy-bot/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/codacy-bot/subscriptions","organizations_url":"https://api.github.com/users/codacy-bot/orgs","repos_url":"https://api.github.com/users/codacy-bot/repos","events_url":"https://api.github.com/users/codacy-bot/events{/privacy}","received_events_url":"https://api.github.com/users/codacy-bot/received_events","type":"User","site_admin":false},"body":"![Codacy](https://www.codacy.com/assets/images/favicon.png) Issue found: [Unused sqlalchemy imported as sa](https://www.codacy.com/app/NYCRecords/openrecords_v2_0/pullRequest?prid=518782)","created_at":"2017-02-15T23:19:49Z","updated_at":"2017-02-15T23:19:49Z","html_url":"https://github.com/joelbcastillo/openrecords_v2_0/pull/198#discussion_r101409182","pull_request_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/pulls/198","_links":{"self":{"href":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/pulls/comments/101409182"},"html":{"href":"https://github.com/joelbcastillo/openrecords_v2_0/pull/198#discussion_r101409182"},"pull_request":{"href":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/pulls/198"}}},"pull_request":{"url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/pulls/198","id":106194209,"html_url":"https://github.com/joelbcastillo/openrecords_v2_0/pull/198","diff_url":"https://github.com/joelbcastillo/openrecords_v2_0/pull/198.diff","patch_url":"https://github.com/joelbcastillo/openrecords_v2_0/pull/198.patch","issue_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/issues/198","number":198,"state":"open","locked":false,"title":"task/OP-1058: NYC.ID semi-compliant login functionality","user":{"login":"Palisand","id":4138177,"avatar_url":"https://avatars.githubusercontent.com/u/4138177?v=3","gravatar_id":"","url":"https://api.github.com/users/Palisand","html_url":"https://github.com/Palisand","followers_url":"https://api.github.com/users/Palisand/followers","following_url":"https://api.github.com/users/Palisand/following{/other_user}","gists_url":"https://api.github.com/users/Palisand/gists{/gist_id}","starred_url":"https://api.github.com/users/Palisand/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Palisand/subscriptions","organizations_url":"https://api.github.com/users/Palisand/orgs","repos_url":"https://api.github.com/users/Palisand/repos","events_url":"https://api.github.com/users/Palisand/events{/privacy}","received_events_url":"https://api.github.com/users/Palisand/received_events","type":"User","site_admin":false},"body":"Why \"semi-compliant\"? Because we cannot implement SAML Single Logout.\r\nSee [Application Requirements](https://nyc4d.nycnet/nycid/application-requirements.shtml)\r\n\r\nThis PR also includes [bugfix/OP-1094](https://nycrecords.atlassian.net/browse/OP-1094)--which ignores response tokens if the response is public--in order to prevent merge conflicts.\r\n\r\n### What's Supposed to Happen\r\n- Clicking login will redirect users to the SAML Identity Provider (IDP) where they will have the option to login via **NYC.ID** (username & password form) or via a [**federated identity**](https://nyc4d.nycnet/nycid/glossary.shtml#federated-identity-providers) (NYC Employees, Microsoft, Google, Facebook, etc.).\r\n  - The staging IDP only provides the **NYC.ID** and **Microsoft** login options (so **the changes in this PR have NOT BEEN TESTED WITH AN *NYC Employees* USER**)\r\n- After logging in to the IDP, the user will be redirected to the OpenRecords homepage with its SAML information. Then the following will occur:\r\n1. [Email Validation](https://nyc4d.nycnet/nycid/email-validation.shtml)\r\n    - This is skipped if the user did not log in via **NYC.ID**.\r\n    - If the *nycExtEmailValidationFlag* provided by SAML indicates that the user has not validated its email address, the Email Validation Web Service will be invoked to determine the current validation status.\r\n    - If the status returned indicates the email address has not been validated, the user is redirected to the Email Confirmation Required page where it can request a validation email.\r\n    - After validating, the user can return to OpenRecords to login again.\r\n2. [Terms of Use Acceptance](https://nyc4d.nycnet/nycid/terms-of-use.shtml)\r\n    - This is skipped if the user logged in using the **NYC Employees** button.\r\n    - The Terms of Use Web Service will be invoked to determine if the user has accepted the latest NYC.ID TOU.\r\n    - If the status returned indicates the user has not accepted the latest terms of use, the user will be redirected to the NYC TOU page where it can accept the latest terms.\r\n3. [Enrollment](https://nyc4d.nycnet/nycid/enrollment.shtml)\r\n    - The Get Enrollment Web Service will be invoked to determine if the user has been enrolled with OpenRecords.\r\n    - If the user has not been enrolled, the Create Enrollment Web Service will be invoked and that user will be enrolled with OpenRecords.\r\n    - Un-enrollment functionality is included for when we determine how a user becomes unauthorized from OpenRecords.\r\n4. Database Update\r\n    - If no first name is provided by SAML, the mailbox portion of the SAML-provided email address will be stored as the user's first name (e.g. jdoe@records.nyc.gov -> jdoe).\r\n    - If an existing user cannot be found using the SAML-provided guid and user type, an existing user is searched for by the SAML-provided email address (anonymous users are ignored).\r\n    - If **no** existing user is found, a user is created with the information provided by SAML and, having passed email validation and terms of use acceptance at this point, with \"email_validated\" and \"terms_of_use_accepted\" set to True.\r\n    - If an existing user if found, that user record is updated with the information provided by SAML.\r\n      - Updating a user's guid or auth type (which **will occur** for users who previously logged in via LDAP) will also update any associated Events and UserRequests.\r\n- At the end of this process, the user is redirected to the homepage and is logged in to OpenRecords.\r\n- The \"Profile\" link will be present on the NYC header if the user is an *NYC.ID* user.\r\n    - Clicking the link will send the user to its [Account Profile](https://nyc4d.nycnet/nycid/account-profile.shtml).\r\n    - The user can return to OpenRecords from this page after saving its changes or clicking on \"Back\".\r\n- If a user is not logged in and attempts to access a page / perform an action that requires authentication (manually navigating to the Agency Administration, downloading a private file, etc.), the user will be redirected to the IDP and, after logging in, will be redirected back to its previous location.\r\n- On **Logout**, a new browser tab will open for the IDP logout and then closed after a short time (currently set to 1 second). The user will then be logged out of OpenRecords and redirected to the homepage.\r\n  - If the IDP logout was successful, the user, upon clicking \"Log In\", will be redirected to the IDP login page. Otherwise, the user will automatically logged in. It's not the best solution (a logout redirect url would be great), but that's all we have for now.\r\n- **Manage Account**\r\n  - A user cannot enter a *Title* that exceeds 64 characters, an *Organization* that exceeds 128 characters, or a *Notification Email* that exceeds 254 characters.\r\n    - The character counter is not included for the email field... who the hell has email addresses that large anyway?\r\n  - A user must enter at least one method of contact: Notification Email, Phone Number, Fax Number, or Mailing Address (Line 1, City, State, Zip).\r\n\r\n### Other / Technical\r\n- **`requirements.txt` updated**\r\n  - `requests-oauthlib` added\r\n  - `requests` updated and 'security' extra added (reduces the chances of an SSL Error occurring)\r\n  - `pipdeptree` added - now we can view a pip dependency tree, hooray!\r\n- **`webServicesUrl` and `logoutUrl` in [`app/templates/base.js.html`](https://github.com/joelbcastillo/openrecords_v2_0/pull/198/files#diff-dccf88a9ecfdca42e05dd3f421ed3b14R4) must be set manually to match the app environment (STG, TST, DEV, PRD).**\r\n   - Currently set to staging.\r\n- Environment Variables Added\r\n  - `USE_OAUTH` (replaces `USE_SAML`)\r\n  - `WEB_SERVICES_URL` (https://nyc-stg-web.csc.nycnet for staging)\r\n  - `VERIFY_WEB_SERVICES`\r\n  - `NYC_ID_USERNAME` (OpenRecords)\r\n  - `NYC_ID_PASSWORD`\r\n- Additional error information added to 400 page.\r\n  - Currently will report an [unsafe login redirect url](https://github.com/joelbcastillo/openrecords_v2_0/pull/198/files#diff-0b7656a862d42513bf0c2fa36a84bed4R189)\r\n- `ManageUserAccountForm` is derived from a custom, poorly-named [StripperForm](https://github.com/joelbcastillo/openrecords_v2_0/pull/198/files#diff-23180ebe4225418c65b5b3a68d63fc19R24) that strips whitespace from any form fields... we can use this for other wtforms, along with the autofill technique as an alternative to jinja.\r\n   - Backend validation matches frontend so submission should fail even if parsley is removed.\r\n- Minor changes to `db_utils.py`:\r\n  - Generic `Exception` replaced; all possible sql alchemy errors derive from `sqlalchemy.exc.SQLAlchemyError`\r\n  - rollback before logging (caused some weird error-within-error issue that prevented catching)\r\n  - try block added to `get_obj`\r\n- Removed `app/lib/onelogin`... you will see a lot of red.\r\n- `current_users.is_authenticated` check [added](https://github.com/joelbcastillo/openrecords_v2_0/pull/198/files#diff-0c2c91424295414147b785283d7e168bR31) to `app.lib.permission_utils.has_permission`\r\n  - `Users.is_authenticated` [updated](https://github.com/joelbcastillo/openrecords_v2_0/pull/198/files#diff-413e9aa8961126d20e2d90befa13e0f1R276) to verify access token.\r\n- ON UPDATE CASCADE [added](https://github.com/joelbcastillo/openrecords_v2_0/pull/198/files#diff-413e9aa8961126d20e2d90befa13e0f1R692) to foreign key constraints for users -> events and users -> user_requests ([migration](https://github.com/joelbcastillo/openrecords_v2_0/pull/198/files#diff-85ca47dc3776ea16af94937598ad390cR1) added).\r\n- `Requests.es_update` will only execute [if the request's agency is active](https://github.com/joelbcastillo/openrecords_v2_0/pull/198/files#diff-413e9aa8961126d20e2d90befa13e0f1R600).\r\n- `es_recreate`: request docs will only be created [if the request's agency is active](https://github.com/joelbcastillo/openrecords_v2_0/pull/198/files#diff-12e3f4d2bd65c312302b9c0cefd5d58cR104).\r\n- Flask-Login\r\n  - `return_to_url` changed to `next_url` to match package\r\n  - `login_url` and `login_manager.login_view` used rather than `url_for` and `\"auth.login\"`\r\n    - if `login_url` is provided and `login_view` is already defined, then why not just use that? (rhetorical)\r\n- `MAX_RESULT_SIZE` constant added to ensure search set [does not exceed](https://github.com/joelbcastillo/openrecords_v2_0/pull/198/files#diff-12e3f4d2bd65c312302b9c0cefd5d58cR336) 50 results.\r\n- `current_user.is_authenticated` was [changed](https://github.com/joelbcastillo/openrecords_v2_0/pull/198/files#diff-bff546bd6ad91653feda8ddab8bc85ffR4) to `not current_user.is_anonymous` to prevent duplicate token validation on page load.\r\n- [Wording change](https://github.com/joelbcastillo/openrecords_v2_0/pull/198/files#diff-77de5e0bab7dfa5cb409e1ac2c186c59R25) for 500 / 400 page (sometimes refreshing actually works!).\r\n","created_at":"2017-02-14T21:19:36Z","updated_at":"2017-02-15T23:19:49Z","closed_at":null,"merged_at":null,"merge_commit_sha":"8c09021a80ebc2a2752db74dc0d5e4479ddb9939","assignee":{"login":"joelbcastillo","id":3308161,"avatar_url":"https://avatars.githubusercontent.com/u/3308161?v=3","gravatar_id":"","url":"https://api.github.com/users/joelbcastillo","html_url":"https://github.com/joelbcastillo","followers_url":"https://api.github.com/users/joelbcastillo/followers","following_url":"https://api.github.com/users/joelbcastillo/following{/other_user}","gists_url":"https://api.github.com/users/joelbcastillo/gists{/gist_id}","starred_url":"https://api.github.com/users/joelbcastillo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/joelbcastillo/subscriptions","organizations_url":"https://api.github.com/users/joelbcastillo/orgs","repos_url":"https://api.github.com/users/joelbcastillo/repos","events_url":"https://api.github.com/users/joelbcastillo/events{/privacy}","received_events_url":"https://api.github.com/users/joelbcastillo/received_events","type":"User","site_admin":false},"assignees":[{"login":"joelbcastillo","id":3308161,"avatar_url":"https://avatars.githubusercontent.com/u/3308161?v=3","gravatar_id":"","url":"https://api.github.com/users/joelbcastillo","html_url":"https://github.com/joelbcastillo","followers_url":"https://api.github.com/users/joelbcastillo/followers","following_url":"https://api.github.com/users/joelbcastillo/following{/other_user}","gists_url":"https://api.github.com/users/joelbcastillo/gists{/gist_id}","starred_url":"https://api.github.com/users/joelbcastillo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/joelbcastillo/subscriptions","organizations_url":"https://api.github.com/users/joelbcastillo/orgs","repos_url":"https://api.github.com/users/joelbcastillo/repos","events_url":"https://api.github.com/users/joelbcastillo/events{/privacy}","received_events_url":"https://api.github.com/users/joelbcastillo/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/pulls/198/commits","review_comments_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/pulls/198/comments","review_comment_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/pulls/comments{/number}","comments_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/issues/198/comments","statuses_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/statuses/57bf2ff5bd463484fa7260a195fe14e02ec9cfb4","head":{"label":"joelbcastillo:task/OP-1058","ref":"task/OP-1058","sha":"57bf2ff5bd463484fa7260a195fe14e02ec9cfb4","user":{"login":"joelbcastillo","id":3308161,"avatar_url":"https://avatars.githubusercontent.com/u/3308161?v=3","gravatar_id":"","url":"https://api.github.com/users/joelbcastillo","html_url":"https://github.com/joelbcastillo","followers_url":"https://api.github.com/users/joelbcastillo/followers","following_url":"https://api.github.com/users/joelbcastillo/following{/other_user}","gists_url":"https://api.github.com/users/joelbcastillo/gists{/gist_id}","starred_url":"https://api.github.com/users/joelbcastillo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/joelbcastillo/subscriptions","organizations_url":"https://api.github.com/users/joelbcastillo/orgs","repos_url":"https://api.github.com/users/joelbcastillo/repos","events_url":"https://api.github.com/users/joelbcastillo/events{/privacy}","received_events_url":"https://api.github.com/users/joelbcastillo/received_events","type":"User","site_admin":false},"repo":{"id":60886481,"name":"openrecords_v2_0","full_name":"joelbcastillo/openrecords_v2_0","owner":{"login":"joelbcastillo","id":3308161,"avatar_url":"https://avatars.githubusercontent.com/u/3308161?v=3","gravatar_id":"","url":"https://api.github.com/users/joelbcastillo","html_url":"https://github.com/joelbcastillo","followers_url":"https://api.github.com/users/joelbcastillo/followers","following_url":"https://api.github.com/users/joelbcastillo/following{/other_user}","gists_url":"https://api.github.com/users/joelbcastillo/gists{/gist_id}","starred_url":"https://api.github.com/users/joelbcastillo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/joelbcastillo/subscriptions","organizations_url":"https://api.github.com/users/joelbcastillo/orgs","repos_url":"https://api.github.com/users/joelbcastillo/repos","events_url":"https://api.github.com/users/joelbcastillo/events{/privacy}","received_events_url":"https://api.github.com/users/joelbcastillo/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/joelbcastillo/openrecords_v2_0","description":"NYC OpenRecords Application - v2.0","fork":false,"url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0","forks_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/forks","keys_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/keys{/key_id}","collaborators_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/teams","hooks_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/hooks","issue_events_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/issues/events{/number}","events_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/events","assignees_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/assignees{/user}","branches_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/branches{/branch}","tags_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/tags","blobs_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/git/refs{/sha}","trees_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/git/trees{/sha}","statuses_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/statuses/{sha}","languages_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/languages","stargazers_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/stargazers","contributors_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/contributors","subscribers_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/subscribers","subscription_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/subscription","commits_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/commits{/sha}","git_commits_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/git/commits{/sha}","comments_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/comments{/number}","issue_comment_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/issues/comments{/number}","contents_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/contents/{+path}","compare_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/compare/{base}...{head}","merges_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/merges","archive_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/downloads","issues_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/issues{/number}","pulls_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/pulls{/number}","milestones_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/milestones{/number}","notifications_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/labels{/name}","releases_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/releases{/id}","deployments_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/deployments","created_at":"2016-06-11T01:58:34Z","updated_at":"2016-12-20T21:46:32Z","pushed_at":"2017-02-15T23:17:35Z","git_url":"git://github.com/joelbcastillo/openrecords_v2_0.git","ssh_url":"git@github.com:joelbcastillo/openrecords_v2_0.git","clone_url":"https://github.com/joelbcastillo/openrecords_v2_0.git","svn_url":"https://github.com/joelbcastillo/openrecords_v2_0","homepage":null,"size":10384,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":3,"forks":0,"open_issues":3,"watchers":0,"default_branch":"develop"}},"base":{"label":"joelbcastillo:develop","ref":"develop","sha":"c8ff8ab064e4a03ab71eab1795f38f246f509090","user":{"login":"joelbcastillo","id":3308161,"avatar_url":"https://avatars.githubusercontent.com/u/3308161?v=3","gravatar_id":"","url":"https://api.github.com/users/joelbcastillo","html_url":"https://github.com/joelbcastillo","followers_url":"https://api.github.com/users/joelbcastillo/followers","following_url":"https://api.github.com/users/joelbcastillo/following{/other_user}","gists_url":"https://api.github.com/users/joelbcastillo/gists{/gist_id}","starred_url":"https://api.github.com/users/joelbcastillo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/joelbcastillo/subscriptions","organizations_url":"https://api.github.com/users/joelbcastillo/orgs","repos_url":"https://api.github.com/users/joelbcastillo/repos","events_url":"https://api.github.com/users/joelbcastillo/events{/privacy}","received_events_url":"https://api.github.com/users/joelbcastillo/received_events","type":"User","site_admin":false},"repo":{"id":60886481,"name":"openrecords_v2_0","full_name":"joelbcastillo/openrecords_v2_0","owner":{"login":"joelbcastillo","id":3308161,"avatar_url":"https://avatars.githubusercontent.com/u/3308161?v=3","gravatar_id":"","url":"https://api.github.com/users/joelbcastillo","html_url":"https://github.com/joelbcastillo","followers_url":"https://api.github.com/users/joelbcastillo/followers","following_url":"https://api.github.com/users/joelbcastillo/following{/other_user}","gists_url":"https://api.github.com/users/joelbcastillo/gists{/gist_id}","starred_url":"https://api.github.com/users/joelbcastillo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/joelbcastillo/subscriptions","organizations_url":"https://api.github.com/users/joelbcastillo/orgs","repos_url":"https://api.github.com/users/joelbcastillo/repos","events_url":"https://api.github.com/users/joelbcastillo/events{/privacy}","received_events_url":"https://api.github.com/users/joelbcastillo/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/joelbcastillo/openrecords_v2_0","description":"NYC OpenRecords Application - v2.0","fork":false,"url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0","forks_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/forks","keys_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/keys{/key_id}","collaborators_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/teams","hooks_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/hooks","issue_events_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/issues/events{/number}","events_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/events","assignees_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/assignees{/user}","branches_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/branches{/branch}","tags_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/tags","blobs_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/git/refs{/sha}","trees_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/git/trees{/sha}","statuses_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/statuses/{sha}","languages_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/languages","stargazers_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/stargazers","contributors_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/contributors","subscribers_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/subscribers","subscription_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/subscription","commits_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/commits{/sha}","git_commits_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/git/commits{/sha}","comments_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/comments{/number}","issue_comment_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/issues/comments{/number}","contents_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/contents/{+path}","compare_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/compare/{base}...{head}","merges_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/merges","archive_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/downloads","issues_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/issues{/number}","pulls_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/pulls{/number}","milestones_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/milestones{/number}","notifications_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/labels{/name}","releases_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/releases{/id}","deployments_url":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/deployments","created_at":"2016-06-11T01:58:34Z","updated_at":"2016-12-20T21:46:32Z","pushed_at":"2017-02-15T23:17:35Z","git_url":"git://github.com/joelbcastillo/openrecords_v2_0.git","ssh_url":"git@github.com:joelbcastillo/openrecords_v2_0.git","clone_url":"https://github.com/joelbcastillo/openrecords_v2_0.git","svn_url":"https://github.com/joelbcastillo/openrecords_v2_0","homepage":null,"size":10384,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":3,"forks":0,"open_issues":3,"watchers":0,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/pulls/198"},"html":{"href":"https://github.com/joelbcastillo/openrecords_v2_0/pull/198"},"issue":{"href":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/issues/198"},"comments":{"href":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/issues/198/comments"},"review_comments":{"href":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/pulls/198/comments"},"review_comment":{"href":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/pulls/198/commits"},"statuses":{"href":"https://api.github.com/repos/joelbcastillo/openrecords_v2_0/statuses/57bf2ff5bd463484fa7260a195fe14e02ec9cfb4"}}}}
{"actor":{"display_login":"codacy-bot"}}