{"action":"created","comment":{"url":"https://api.github.com/repos/caciviclab/disclosure-backend/pulls/comments/49685314","id":49685314,"diff_hunk":"@@ -0,0 +1,365 @@\n+\"\"\"\n+Command to download and load California campaign finance data from Netfile.\n+\"\"\"\n+\n+import datetime\n+import time\n+import warnings\n+from dateutil.parser import parse as date_parse\n+from numbers import Number\n+\n+import numpy as np\n+import pandas as pd\n+from django.db import transaction\n+\n+from ... import models\n+from ballot.models import Ballot, BallotItemResponse\n+from locality.models import City, State, ZipCode\n+from netfile_raw.management.commands import downloadnetfilerawdata\n+from office_election.models import Office, OfficeElection, Candidate\n+from referendum.models import Referendum\n+\n+\n+class Command(downloadnetfilerawdata.Command):\n+    help = 'Download and load the netfile raw data into the clean database.'\n+\n+    def load(self):\n+        \"\"\"\n+        According to:\n+        https://github.com/caciviclab/caciviclab.github.io/wiki/Campaign-Finance\n+\n+        To get a comprehensive total of the amount of money raised for\n+        any ballot measure, you must include:\n+        * Form 460, Schedules A (monetary contributions) and\n+            C (nonmonetary contributions), for all Primarily Formed and\n+            Candidate Controlled committees\n+        * Form 497, beginning from the ending period of the last Form 460 that\n+            was filed, for all Primarily Formed and\n+            Candidate Controlled committees\n+        * Form 496, only expenses in support, only from committees that\n+            are NOT the Primarily Formed or Candidate Controlled committees,\n+            and only those beginning from the ending period of the\n+            last Form 460 that was filed\n+        \"\"\"\n+        if self.verbosity:\n+            self.header(\"Loading disclosure data into database.\")\n+\n+        self.data = pd.read_csv(self.combined_csv_path)\n+        if self.verbosity:\n+            print(\"There are %d rows in %s\" % (\n+                len(self.data), self.combined_csv_path))\n+\n+        # Check for any potentially missing data.\n+        form_types = self.data['form_Type'].unique()\n+        if len({None, np.nan} - set(form_types)) != 2:\n+            warnings.warn(\"Some data don't have form_Type set.\")\n+\n+        self.load_f460A_data()\n+        if self.verbosity:\n+            print(form_types)\n+        self.load_f497_data()\n+        self.load_f496_data()\n+\n+    def load_f460A_data(self):  # noqa\n+        \"\"\" Loads data from Form 460 Schedule A:\n+        contributions to primarily formed committees.\"\"\"\n+\n+        # Split data by type, add column defs.\n+        self.f460A_data = self.data[self.data['form_Type'] == 'A']\n+\n+        def isnan(val):\n+            return isinstance(val, Number) and np.isnan(val)\n+\n+        def isnone(val):\n+            return val is None or val == 'None'\n+\n+        # Parse out the contributor information.\n+        error_rows = []\n+        self.misses = []\n+        for ri, (_, raw_row) in enumerate(self.f460A_data.T.iteritems()):\n+            assert raw_row['rec_Type'] == 'RCPT'\n+            minimal_row = raw_row.copy()\n+\n+            # remove useless columns for easier exploring\n+            for col in minimal_row.keys():\n+                if isnone(minimal_row[col]) or isnan(minimal_row[col]):\n+                    del minimal_row[col]\n+\n+            # Store errors, for review later.\n+            try:\n+                self.load_f460A_row(minimal_row)\n+            except Exception as e:\n+                raise\n+                if self.verbosity:\n+                    print(\"%d: \\n\\n%s\\n\\n\" % (len(error_rows) + 1, e))\n+                    time.sleep(0.5)\n+                error_rows.append((ri, raw_row, minimal_row, e))\n+\n+        # Report errors  TODO: push to the database.\n+        if len(error_rows) > 0:\n+            if self.verbosity:\n+                print(\"Encountered %d errors; debug!\" % len(error_rows))","path":"finance/management/commands/xformnetfilerawdata.py","position":101,"original_position":101,"commit_id":"25d91d3bb97988eb85e3da80d7ae6894726eed2e","original_commit_id":"25d91d3bb97988eb85e3da80d7ae6894726eed2e","user":{"login":"bcipolli","id":4072455,"avatar_url":"https://avatars.githubusercontent.com/u/4072455?v=3","gravatar_id":"","url":"https://api.github.com/users/bcipolli","html_url":"https://github.com/bcipolli","followers_url":"https://api.github.com/users/bcipolli/followers","following_url":"https://api.github.com/users/bcipolli/following{/other_user}","gists_url":"https://api.github.com/users/bcipolli/gists{/gist_id}","starred_url":"https://api.github.com/users/bcipolli/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bcipolli/subscriptions","organizations_url":"https://api.github.com/users/bcipolli/orgs","repos_url":"https://api.github.com/users/bcipolli/repos","events_url":"https://api.github.com/users/bcipolli/events{/privacy}","received_events_url":"https://api.github.com/users/bcipolli/received_events","type":"User","site_admin":false},"body":":+1:","created_at":"2016-01-14T03:52:54Z","updated_at":"2016-01-14T03:52:54Z","html_url":"https://github.com/caciviclab/disclosure-backend/pull/124#discussion_r49685314","pull_request_url":"https://api.github.com/repos/caciviclab/disclosure-backend/pulls/124","_links":{"self":{"href":"https://api.github.com/repos/caciviclab/disclosure-backend/pulls/comments/49685314"},"html":{"href":"https://github.com/caciviclab/disclosure-backend/pull/124#discussion_r49685314"},"pull_request":{"href":"https://api.github.com/repos/caciviclab/disclosure-backend/pulls/124"}}},"pull_request":{"url":"https://api.github.com/repos/caciviclab/disclosure-backend/pulls/124","id":55509462,"html_url":"https://github.com/caciviclab/disclosure-backend/pull/124","diff_url":"https://github.com/caciviclab/disclosure-backend/pull/124.diff","patch_url":"https://github.com/caciviclab/disclosure-backend/pull/124.patch","issue_url":"https://api.github.com/repos/caciviclab/disclosure-backend/issues/124","number":124,"state":"open","locked":false,"title":"Transform netfile data to a database schema useful for APIs.","user":{"login":"bcipolli","id":4072455,"avatar_url":"https://avatars.githubusercontent.com/u/4072455?v=3","gravatar_id":"","url":"https://api.github.com/users/bcipolli","html_url":"https://github.com/bcipolli","followers_url":"https://api.github.com/users/bcipolli/followers","following_url":"https://api.github.com/users/bcipolli/following{/other_user}","gists_url":"https://api.github.com/users/bcipolli/gists{/gist_id}","starred_url":"https://api.github.com/users/bcipolli/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bcipolli/subscriptions","organizations_url":"https://api.github.com/users/bcipolli/orgs","repos_url":"https://api.github.com/users/bcipolli/repos","events_url":"https://api.github.com/users/bcipolli/events{/privacy}","received_events_url":"https://api.github.com/users/bcipolli/received_events","type":"User","site_admin":false},"body":"This PR tries to take netfile data and shove it into the schema specified in https://github.com/caciviclab/disclosure-backend/pull/103 . Trying to do this has made me change that schema time and time again, which is great!\r\n\r\nCurrently done:\r\n* Validate the `finance` schema--it seems to be working well.\r\n* Do a reasonable job creating different models for different types of benefactors (those contributing and spending on behalf of a ballot measure choice/candidate), such as individuals, companies, committees\r\n* Do a reasonable job filling in data for beneficiaries (committees).\r\n* Do a reasonable job saving contribution data from Form 460A.\r\n\r\nTo do before merge:\r\n* [x] Scrape locality data for beneficiary, ballot models.\r\n* [x] Scrape candidate/ballot measure name for beneficiary, ballot measure choice models.\r\n* [ ] Find some info indicating support/oppose\r\n* [ ] Find some info about reporting period start/end from the data.\r\n* [x] Figure out what `filingId` is.\r\n* [x] Add `help_text` for each model field\r\n* [x] Fix default (`None` vs. empty) for each model field.\r\n\r\nTo do after merge (will open issues after merge):\r\n* Get form 496 data working. (better to get this in with limited data, so that we can get APIs up & running)\r\n* Get form 497 data working (harder, because timing matters)\r\n* Alert admins when new ballot info has been added. It could be error-prone or have missing data, and needs to be manually checked.\r\n* Alert admins when csv rows have failed to be saved. Each failed row should be stored in the database and checked manually.\r\n* Fix up data issues (e.g. zip codes can be 5 digit or 10 digit (5-4 format))\r\n\r\nI have run this on a subset of the data (ANA, 2015), and am currently running it on all the data (68 agencies, 2014-2015). \r\n\r\n@mrmaksimize let's work on this branch together, yes?\r\n","created_at":"2016-01-08T20:55:46Z","updated_at":"2016-01-14T03:52:54Z","closed_at":null,"merged_at":null,"merge_commit_sha":"0176de8034a38364e33caaf12214b83e81875585","assignee":null,"milestone":{"url":"https://api.github.com/repos/caciviclab/disclosure-backend/milestones/1","html_url":"https://github.com/caciviclab/disclosure-backend/milestones/v1","labels_url":"https://api.github.com/repos/caciviclab/disclosure-backend/milestones/1/labels","id":1226589,"number":1,"title":"v1","description":"End of September release to present to funders. Criteria discussed in the [June 2015 meeting](https://docs.google.com/document/d/1S9Hn6FtA8P06LgE1h5PiQT0G5vNAoaMaOBISAnJlse4/edit#).","creator":{"login":"adborden","id":509703,"avatar_url":"https://avatars.githubusercontent.com/u/509703?v=3","gravatar_id":"","url":"https://api.github.com/users/adborden","html_url":"https://github.com/adborden","followers_url":"https://api.github.com/users/adborden/followers","following_url":"https://api.github.com/users/adborden/following{/other_user}","gists_url":"https://api.github.com/users/adborden/gists{/gist_id}","starred_url":"https://api.github.com/users/adborden/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/adborden/subscriptions","organizations_url":"https://api.github.com/users/adborden/orgs","repos_url":"https://api.github.com/users/adborden/repos","events_url":"https://api.github.com/users/adborden/events{/privacy}","received_events_url":"https://api.github.com/users/adborden/received_events","type":"User","site_admin":false},"open_issues":11,"closed_issues":15,"state":"open","created_at":"2015-07-27T00:17:22Z","updated_at":"2016-01-13T23:46:27Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/caciviclab/disclosure-backend/pulls/124/commits","review_comments_url":"https://api.github.com/repos/caciviclab/disclosure-backend/pulls/124/comments","review_comment_url":"https://api.github.com/repos/caciviclab/disclosure-backend/pulls/comments{/number}","comments_url":"https://api.github.com/repos/caciviclab/disclosure-backend/issues/124/comments","statuses_url":"https://api.github.com/repos/caciviclab/disclosure-backend/statuses/25d91d3bb97988eb85e3da80d7ae6894726eed2e","head":{"label":"bcipolli:xform-netfile","ref":"xform-netfile","sha":"25d91d3bb97988eb85e3da80d7ae6894726eed2e","user":{"login":"bcipolli","id":4072455,"avatar_url":"https://avatars.githubusercontent.com/u/4072455?v=3","gravatar_id":"","url":"https://api.github.com/users/bcipolli","html_url":"https://github.com/bcipolli","followers_url":"https://api.github.com/users/bcipolli/followers","following_url":"https://api.github.com/users/bcipolli/following{/other_user}","gists_url":"https://api.github.com/users/bcipolli/gists{/gist_id}","starred_url":"https://api.github.com/users/bcipolli/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bcipolli/subscriptions","organizations_url":"https://api.github.com/users/bcipolli/orgs","repos_url":"https://api.github.com/users/bcipolli/repos","events_url":"https://api.github.com/users/bcipolli/events{/privacy}","received_events_url":"https://api.github.com/users/bcipolli/received_events","type":"User","site_admin":false},"repo":{"id":48266125,"name":"opendisclosure-backend","full_name":"bcipolli/opendisclosure-backend","owner":{"login":"bcipolli","id":4072455,"avatar_url":"https://avatars.githubusercontent.com/u/4072455?v=3","gravatar_id":"","url":"https://api.github.com/users/bcipolli","html_url":"https://github.com/bcipolli","followers_url":"https://api.github.com/users/bcipolli/followers","following_url":"https://api.github.com/users/bcipolli/following{/other_user}","gists_url":"https://api.github.com/users/bcipolli/gists{/gist_id}","starred_url":"https://api.github.com/users/bcipolli/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bcipolli/subscriptions","organizations_url":"https://api.github.com/users/bcipolli/orgs","repos_url":"https://api.github.com/users/bcipolli/repos","events_url":"https://api.github.com/users/bcipolli/events{/privacy}","received_events_url":"https://api.github.com/users/bcipolli/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/bcipolli/opendisclosure-backend","description":"A Django app to download, extract and load campaign finance and lobbying activity data from the California Secretary of State's CAL-ACCESS database as well as local Netfile jurisdictions","fork":true,"url":"https://api.github.com/repos/bcipolli/opendisclosure-backend","forks_url":"https://api.github.com/repos/bcipolli/opendisclosure-backend/forks","keys_url":"https://api.github.com/repos/bcipolli/opendisclosure-backend/keys{/key_id}","collaborators_url":"https://api.github.com/repos/bcipolli/opendisclosure-backend/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/bcipolli/opendisclosure-backend/teams","hooks_url":"https://api.github.com/repos/bcipolli/opendisclosure-backend/hooks","issue_events_url":"https://api.github.com/repos/bcipolli/opendisclosure-backend/issues/events{/number}","events_url":"https://api.github.com/repos/bcipolli/opendisclosure-backend/events","assignees_url":"https://api.github.com/repos/bcipolli/opendisclosure-backend/assignees{/user}","branches_url":"https://api.github.com/repos/bcipolli/opendisclosure-backend/branches{/branch}","tags_url":"https://api.github.com/repos/bcipolli/opendisclosure-backend/tags","blobs_url":"https://api.github.com/repos/bcipolli/opendisclosure-backend/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/bcipolli/opendisclosure-backend/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/bcipolli/opendisclosure-backend/git/refs{/sha}","trees_url":"https://api.github.com/repos/bcipolli/opendisclosure-backend/git/trees{/sha}","statuses_url":"https://api.github.com/repos/bcipolli/opendisclosure-backend/statuses/{sha}","languages_url":"https://api.github.com/repos/bcipolli/opendisclosure-backend/languages","stargazers_url":"https://api.github.com/repos/bcipolli/opendisclosure-backend/stargazers","contributors_url":"https://api.github.com/repos/bcipolli/opendisclosure-backend/contributors","subscribers_url":"https://api.github.com/repos/bcipolli/opendisclosure-backend/subscribers","subscription_url":"https://api.github.com/repos/bcipolli/opendisclosure-backend/subscription","commits_url":"https://api.github.com/repos/bcipolli/opendisclosure-backend/commits{/sha}","git_commits_url":"https://api.github.com/repos/bcipolli/opendisclosure-backend/git/commits{/sha}","comments_url":"https://api.github.com/repos/bcipolli/opendisclosure-backend/comments{/number}","issue_comment_url":"https://api.github.com/repos/bcipolli/opendisclosure-backend/issues/comments{/number}","contents_url":"https://api.github.com/repos/bcipolli/opendisclosure-backend/contents/{+path}","compare_url":"https://api.github.com/repos/bcipolli/opendisclosure-backend/compare/{base}...{head}","merges_url":"https://api.github.com/repos/bcipolli/opendisclosure-backend/merges","archive_url":"https://api.github.com/repos/bcipolli/opendisclosure-backend/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/bcipolli/opendisclosure-backend/downloads","issues_url":"https://api.github.com/repos/bcipolli/opendisclosure-backend/issues{/number}","pulls_url":"https://api.github.com/repos/bcipolli/opendisclosure-backend/pulls{/number}","milestones_url":"https://api.github.com/repos/bcipolli/opendisclosure-backend/milestones{/number}","notifications_url":"https://api.github.com/repos/bcipolli/opendisclosure-backend/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/bcipolli/opendisclosure-backend/labels{/name}","releases_url":"https://api.github.com/repos/bcipolli/opendisclosure-backend/releases{/id}","created_at":"2015-12-19T02:53:28Z","updated_at":"2015-12-19T02:53:33Z","pushed_at":"2016-01-13T13:36:45Z","git_url":"git://github.com/bcipolli/opendisclosure-backend.git","ssh_url":"git@github.com:bcipolli/opendisclosure-backend.git","clone_url":"https://github.com/bcipolli/opendisclosure-backend.git","svn_url":"https://github.com/bcipolli/opendisclosure-backend","homepage":"http://admin.caciviclab.org","size":8567,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"caciviclab:master","ref":"master","sha":"174dac611204d67572d59b1c41017420b6638e4b","user":{"login":"caciviclab","id":9602455,"avatar_url":"https://avatars.githubusercontent.com/u/9602455?v=3","gravatar_id":"","url":"https://api.github.com/users/caciviclab","html_url":"https://github.com/caciviclab","followers_url":"https://api.github.com/users/caciviclab/followers","following_url":"https://api.github.com/users/caciviclab/following{/other_user}","gists_url":"https://api.github.com/users/caciviclab/gists{/gist_id}","starred_url":"https://api.github.com/users/caciviclab/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/caciviclab/subscriptions","organizations_url":"https://api.github.com/users/caciviclab/orgs","repos_url":"https://api.github.com/users/caciviclab/repos","events_url":"https://api.github.com/users/caciviclab/events{/privacy}","received_events_url":"https://api.github.com/users/caciviclab/received_events","type":"Organization","site_admin":false},"repo":{"id":35735318,"name":"disclosure-backend","full_name":"caciviclab/disclosure-backend","owner":{"login":"caciviclab","id":9602455,"avatar_url":"https://avatars.githubusercontent.com/u/9602455?v=3","gravatar_id":"","url":"https://api.github.com/users/caciviclab","html_url":"https://github.com/caciviclab","followers_url":"https://api.github.com/users/caciviclab/followers","following_url":"https://api.github.com/users/caciviclab/following{/other_user}","gists_url":"https://api.github.com/users/caciviclab/gists{/gist_id}","starred_url":"https://api.github.com/users/caciviclab/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/caciviclab/subscriptions","organizations_url":"https://api.github.com/users/caciviclab/orgs","repos_url":"https://api.github.com/users/caciviclab/repos","events_url":"https://api.github.com/users/caciviclab/events{/privacy}","received_events_url":"https://api.github.com/users/caciviclab/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/caciviclab/disclosure-backend","description":"A Django app to download, extract and load campaign finance and lobbying activity data from the California Secretary of State's CAL-ACCESS database as well as local Netfile jurisdictions","fork":false,"url":"https://api.github.com/repos/caciviclab/disclosure-backend","forks_url":"https://api.github.com/repos/caciviclab/disclosure-backend/forks","keys_url":"https://api.github.com/repos/caciviclab/disclosure-backend/keys{/key_id}","collaborators_url":"https://api.github.com/repos/caciviclab/disclosure-backend/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/caciviclab/disclosure-backend/teams","hooks_url":"https://api.github.com/repos/caciviclab/disclosure-backend/hooks","issue_events_url":"https://api.github.com/repos/caciviclab/disclosure-backend/issues/events{/number}","events_url":"https://api.github.com/repos/caciviclab/disclosure-backend/events","assignees_url":"https://api.github.com/repos/caciviclab/disclosure-backend/assignees{/user}","branches_url":"https://api.github.com/repos/caciviclab/disclosure-backend/branches{/branch}","tags_url":"https://api.github.com/repos/caciviclab/disclosure-backend/tags","blobs_url":"https://api.github.com/repos/caciviclab/disclosure-backend/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/caciviclab/disclosure-backend/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/caciviclab/disclosure-backend/git/refs{/sha}","trees_url":"https://api.github.com/repos/caciviclab/disclosure-backend/git/trees{/sha}","statuses_url":"https://api.github.com/repos/caciviclab/disclosure-backend/statuses/{sha}","languages_url":"https://api.github.com/repos/caciviclab/disclosure-backend/languages","stargazers_url":"https://api.github.com/repos/caciviclab/disclosure-backend/stargazers","contributors_url":"https://api.github.com/repos/caciviclab/disclosure-backend/contributors","subscribers_url":"https://api.github.com/repos/caciviclab/disclosure-backend/subscribers","subscription_url":"https://api.github.com/repos/caciviclab/disclosure-backend/subscription","commits_url":"https://api.github.com/repos/caciviclab/disclosure-backend/commits{/sha}","git_commits_url":"https://api.github.com/repos/caciviclab/disclosure-backend/git/commits{/sha}","comments_url":"https://api.github.com/repos/caciviclab/disclosure-backend/comments{/number}","issue_comment_url":"https://api.github.com/repos/caciviclab/disclosure-backend/issues/comments{/number}","contents_url":"https://api.github.com/repos/caciviclab/disclosure-backend/contents/{+path}","compare_url":"https://api.github.com/repos/caciviclab/disclosure-backend/compare/{base}...{head}","merges_url":"https://api.github.com/repos/caciviclab/disclosure-backend/merges","archive_url":"https://api.github.com/repos/caciviclab/disclosure-backend/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/caciviclab/disclosure-backend/downloads","issues_url":"https://api.github.com/repos/caciviclab/disclosure-backend/issues{/number}","pulls_url":"https://api.github.com/repos/caciviclab/disclosure-backend/pulls{/number}","milestones_url":"https://api.github.com/repos/caciviclab/disclosure-backend/milestones{/number}","notifications_url":"https://api.github.com/repos/caciviclab/disclosure-backend/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/caciviclab/disclosure-backend/labels{/name}","releases_url":"https://api.github.com/repos/caciviclab/disclosure-backend/releases{/id}","created_at":"2015-05-16T18:30:44Z","updated_at":"2016-01-13T13:28:28Z","pushed_at":"2016-01-13T13:36:25Z","git_url":"git://github.com/caciviclab/disclosure-backend.git","ssh_url":"git@github.com:caciviclab/disclosure-backend.git","clone_url":"https://github.com/caciviclab/disclosure-backend.git","svn_url":"https://github.com/caciviclab/disclosure-backend","homepage":"http://admin.caciviclab.org","size":8625,"stargazers_count":5,"watchers_count":5,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":12,"mirror_url":null,"open_issues_count":38,"forks":12,"open_issues":38,"watchers":5,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/caciviclab/disclosure-backend/pulls/124"},"html":{"href":"https://github.com/caciviclab/disclosure-backend/pull/124"},"issue":{"href":"https://api.github.com/repos/caciviclab/disclosure-backend/issues/124"},"comments":{"href":"https://api.github.com/repos/caciviclab/disclosure-backend/issues/124/comments"},"review_comments":{"href":"https://api.github.com/repos/caciviclab/disclosure-backend/pulls/124/comments"},"review_comment":{"href":"https://api.github.com/repos/caciviclab/disclosure-backend/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/caciviclab/disclosure-backend/pulls/124/commits"},"statuses":{"href":"https://api.github.com/repos/caciviclab/disclosure-backend/statuses/25d91d3bb97988eb85e3da80d7ae6894726eed2e"}}}}