{"action":"created","comment":{"url":"https://api.github.com/repos/NYPL-Simplified/server_core/pulls/comments/138179743","pull_request_review_id":61942811,"id":138179743,"diff_hunk":"@@ -6616,6 +6620,98 @@ def update_availability(\n \n         return changes_made\n \n+    def update_availability_from_delta(self, event_type, event_date, delta, analytics=None):\n+        \"\"\"Call update_availability based on a single change seen in the\n+        distributor data, rather than a complete snapshot of\n+        distributor information as of a certain time.\n+\n+        This information is unlikely to be completely accurate, but it\n+        should suffice until more accurate information can be\n+        obtained.\n+\n+        No CirculationEvent is created until `update_availability` is\n+        called.\n+\n+        Events must be processed in chronological order. Any event\n+        that happened than `LicensePool.last_checked` is ignored, and\n+        calling this method will update `LicensePool.last_checked` to\n+        the time of the event.\n+\n+        :param event_type: A CirculationEvent constant representing the\n+        type of change that was seen.\n+\n+        :param event_date: A datetime corresponding to when the \n+        change was seen.\n+\n+        :param delta: The magnitude of the change that was seen.\n+\n+        \"\"\"\n+        if event_date != CirculationEvent.NO_DATE and self.last_checked and event_date < self.last_checked:\n+            # This is an old event and its effect on availability has\n+            # already been taken into account.\n+            return\n+\n+        if self.last_checked and event_date == CirculationEvent.NO_DATE:\n+            # We have a history for this LicensePool and we don't know\n+            # where this event fits into that history. Ignore the\n+            # event.\n+            return\n+\n+        (new_licenses_owned, new_licenses_available, \n+         new_licenses_reserved, \n+         new_patrons_in_hold_queue) = self._calculate_change_from_one_event(\n+             event_type, delta\n+         )","path":"model.py","position":72,"original_position":72,"commit_id":"8b18acf8110a1acb2988d8933e5173740054be5b","original_commit_id":"8b18acf8110a1acb2988d8933e5173740054be5b","user":{"login":"aslagle","id":3409215,"avatar_url":"https://avatars3.githubusercontent.com/u/3409215?v=4","gravatar_id":"","url":"https://api.github.com/users/aslagle","html_url":"https://github.com/aslagle","followers_url":"https://api.github.com/users/aslagle/followers","following_url":"https://api.github.com/users/aslagle/following{/other_user}","gists_url":"https://api.github.com/users/aslagle/gists{/gist_id}","starred_url":"https://api.github.com/users/aslagle/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aslagle/subscriptions","organizations_url":"https://api.github.com/users/aslagle/orgs","repos_url":"https://api.github.com/users/aslagle/repos","events_url":"https://api.github.com/users/aslagle/events{/privacy}","received_events_url":"https://api.github.com/users/aslagle/received_events","type":"User","site_admin":false},"body":"`update_availability` uses these four values to guess the event type, basically reversing the work you just did. I'm not sure how to improve it though.","created_at":"2017-09-11T20:19:38Z","updated_at":"2017-09-11T20:19:38Z","html_url":"https://github.com/NYPL-Simplified/server_core/pull/640#discussion_r138179743","pull_request_url":"https://api.github.com/repos/NYPL-Simplified/server_core/pulls/640","author_association":"OWNER","_links":{"self":{"href":"https://api.github.com/repos/NYPL-Simplified/server_core/pulls/comments/138179743"},"html":{"href":"https://github.com/NYPL-Simplified/server_core/pull/640#discussion_r138179743"},"pull_request":{"href":"https://api.github.com/repos/NYPL-Simplified/server_core/pulls/640"}}},"pull_request":{"url":"https://api.github.com/repos/NYPL-Simplified/server_core/pulls/640","id":140385966,"html_url":"https://github.com/NYPL-Simplified/server_core/pull/640","diff_url":"https://github.com/NYPL-Simplified/server_core/pull/640.diff","patch_url":"https://github.com/NYPL-Simplified/server_core/pull/640.patch","issue_url":"https://api.github.com/repos/NYPL-Simplified/server_core/issues/640","number":640,"state":"open","locked":false,"title":"Change a LicensePool based on a CirculationEvent","user":{"login":"leonardr","id":662474,"avatar_url":"https://avatars0.githubusercontent.com/u/662474?v=4","gravatar_id":"","url":"https://api.github.com/users/leonardr","html_url":"https://github.com/leonardr","followers_url":"https://api.github.com/users/leonardr/followers","following_url":"https://api.github.com/users/leonardr/following{/other_user}","gists_url":"https://api.github.com/users/leonardr/gists{/gist_id}","starred_url":"https://api.github.com/users/leonardr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/leonardr/subscriptions","organizations_url":"https://api.github.com/users/leonardr/orgs","repos_url":"https://api.github.com/users/leonardr/repos","events_url":"https://api.github.com/users/leonardr/events{/privacy}","received_events_url":"https://api.github.com/users/leonardr/received_events","type":"User","site_admin":false},"body":"This branch makes it possible to update a LicensePool's availability information based on the information in a CirculationEvent. Usually we update a LicensePool's availability information and then send out CirculationEvents to match, but for Bibliotheca we do things in the other order.\r\n\r\nThis is not 100% reliable because we a single event doesn't give us certainty about the complete state of a LicensePool, but it's better than nothing and it should do a good job of filling in the gaps between runs of the `BibliothecaCirculationSweep`.","created_at":"2017-09-11T16:59:13Z","updated_at":"2017-09-11T20:19:38Z","closed_at":null,"merged_at":null,"merge_commit_sha":"eccdbea156bb101ffcb6ce8ca2931d18eb9ec43e","assignee":null,"assignees":[],"requested_reviewers":[],"milestone":null,"commits_url":"https://api.github.com/repos/NYPL-Simplified/server_core/pulls/640/commits","review_comments_url":"https://api.github.com/repos/NYPL-Simplified/server_core/pulls/640/comments","review_comment_url":"https://api.github.com/repos/NYPL-Simplified/server_core/pulls/comments{/number}","comments_url":"https://api.github.com/repos/NYPL-Simplified/server_core/issues/640/comments","statuses_url":"https://api.github.com/repos/NYPL-Simplified/server_core/statuses/8b18acf8110a1acb2988d8933e5173740054be5b","head":{"label":"NYPL-Simplified:update-availability-from-event","ref":"update-availability-from-event","sha":"8b18acf8110a1acb2988d8933e5173740054be5b","user":{"login":"NYPL-Simplified","id":16416905,"avatar_url":"https://avatars1.githubusercontent.com/u/16416905?v=4","gravatar_id":"","url":"https://api.github.com/users/NYPL-Simplified","html_url":"https://github.com/NYPL-Simplified","followers_url":"https://api.github.com/users/NYPL-Simplified/followers","following_url":"https://api.github.com/users/NYPL-Simplified/following{/other_user}","gists_url":"https://api.github.com/users/NYPL-Simplified/gists{/gist_id}","starred_url":"https://api.github.com/users/NYPL-Simplified/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/NYPL-Simplified/subscriptions","organizations_url":"https://api.github.com/users/NYPL-Simplified/orgs","repos_url":"https://api.github.com/users/NYPL-Simplified/repos","events_url":"https://api.github.com/users/NYPL-Simplified/events{/privacy}","received_events_url":"https://api.github.com/users/NYPL-Simplified/received_events","type":"Organization","site_admin":false},"repo":{"id":27601287,"name":"server_core","full_name":"NYPL-Simplified/server_core","owner":{"login":"NYPL-Simplified","id":16416905,"avatar_url":"https://avatars1.githubusercontent.com/u/16416905?v=4","gravatar_id":"","url":"https://api.github.com/users/NYPL-Simplified","html_url":"https://github.com/NYPL-Simplified","followers_url":"https://api.github.com/users/NYPL-Simplified/followers","following_url":"https://api.github.com/users/NYPL-Simplified/following{/other_user}","gists_url":"https://api.github.com/users/NYPL-Simplified/gists{/gist_id}","starred_url":"https://api.github.com/users/NYPL-Simplified/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/NYPL-Simplified/subscriptions","organizations_url":"https://api.github.com/users/NYPL-Simplified/orgs","repos_url":"https://api.github.com/users/NYPL-Simplified/repos","events_url":"https://api.github.com/users/NYPL-Simplified/events{/privacy}","received_events_url":"https://api.github.com/users/NYPL-Simplified/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/NYPL-Simplified/server_core","description":"Shared data model and utilities for Library Simplified server applications","fork":false,"url":"https://api.github.com/repos/NYPL-Simplified/server_core","forks_url":"https://api.github.com/repos/NYPL-Simplified/server_core/forks","keys_url":"https://api.github.com/repos/NYPL-Simplified/server_core/keys{/key_id}","collaborators_url":"https://api.github.com/repos/NYPL-Simplified/server_core/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/NYPL-Simplified/server_core/teams","hooks_url":"https://api.github.com/repos/NYPL-Simplified/server_core/hooks","issue_events_url":"https://api.github.com/repos/NYPL-Simplified/server_core/issues/events{/number}","events_url":"https://api.github.com/repos/NYPL-Simplified/server_core/events","assignees_url":"https://api.github.com/repos/NYPL-Simplified/server_core/assignees{/user}","branches_url":"https://api.github.com/repos/NYPL-Simplified/server_core/branches{/branch}","tags_url":"https://api.github.com/repos/NYPL-Simplified/server_core/tags","blobs_url":"https://api.github.com/repos/NYPL-Simplified/server_core/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/NYPL-Simplified/server_core/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/NYPL-Simplified/server_core/git/refs{/sha}","trees_url":"https://api.github.com/repos/NYPL-Simplified/server_core/git/trees{/sha}","statuses_url":"https://api.github.com/repos/NYPL-Simplified/server_core/statuses/{sha}","languages_url":"https://api.github.com/repos/NYPL-Simplified/server_core/languages","stargazers_url":"https://api.github.com/repos/NYPL-Simplified/server_core/stargazers","contributors_url":"https://api.github.com/repos/NYPL-Simplified/server_core/contributors","subscribers_url":"https://api.github.com/repos/NYPL-Simplified/server_core/subscribers","subscription_url":"https://api.github.com/repos/NYPL-Simplified/server_core/subscription","commits_url":"https://api.github.com/repos/NYPL-Simplified/server_core/commits{/sha}","git_commits_url":"https://api.github.com/repos/NYPL-Simplified/server_core/git/commits{/sha}","comments_url":"https://api.github.com/repos/NYPL-Simplified/server_core/comments{/number}","issue_comment_url":"https://api.github.com/repos/NYPL-Simplified/server_core/issues/comments{/number}","contents_url":"https://api.github.com/repos/NYPL-Simplified/server_core/contents/{+path}","compare_url":"https://api.github.com/repos/NYPL-Simplified/server_core/compare/{base}...{head}","merges_url":"https://api.github.com/repos/NYPL-Simplified/server_core/merges","archive_url":"https://api.github.com/repos/NYPL-Simplified/server_core/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/NYPL-Simplified/server_core/downloads","issues_url":"https://api.github.com/repos/NYPL-Simplified/server_core/issues{/number}","pulls_url":"https://api.github.com/repos/NYPL-Simplified/server_core/pulls{/number}","milestones_url":"https://api.github.com/repos/NYPL-Simplified/server_core/milestones{/number}","notifications_url":"https://api.github.com/repos/NYPL-Simplified/server_core/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/NYPL-Simplified/server_core/labels{/name}","releases_url":"https://api.github.com/repos/NYPL-Simplified/server_core/releases{/id}","deployments_url":"https://api.github.com/repos/NYPL-Simplified/server_core/deployments","created_at":"2014-12-05T17:03:04Z","updated_at":"2017-05-15T13:58:57Z","pushed_at":"2017-09-11T20:06:46Z","git_url":"git://github.com/NYPL-Simplified/server_core.git","ssh_url":"git@github.com:NYPL-Simplified/server_core.git","clone_url":"https://github.com/NYPL-Simplified/server_core.git","svn_url":"https://github.com/NYPL-Simplified/server_core","homepage":null,"size":6677,"stargazers_count":1,"watchers_count":1,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":5,"mirror_url":null,"open_issues_count":58,"forks":5,"open_issues":58,"watchers":1,"default_branch":"master"}},"base":{"label":"NYPL-Simplified:master","ref":"master","sha":"762e7022d6ddd28e9e598c4f26f139abcbdc505a","user":{"login":"NYPL-Simplified","id":16416905,"avatar_url":"https://avatars1.githubusercontent.com/u/16416905?v=4","gravatar_id":"","url":"https://api.github.com/users/NYPL-Simplified","html_url":"https://github.com/NYPL-Simplified","followers_url":"https://api.github.com/users/NYPL-Simplified/followers","following_url":"https://api.github.com/users/NYPL-Simplified/following{/other_user}","gists_url":"https://api.github.com/users/NYPL-Simplified/gists{/gist_id}","starred_url":"https://api.github.com/users/NYPL-Simplified/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/NYPL-Simplified/subscriptions","organizations_url":"https://api.github.com/users/NYPL-Simplified/orgs","repos_url":"https://api.github.com/users/NYPL-Simplified/repos","events_url":"https://api.github.com/users/NYPL-Simplified/events{/privacy}","received_events_url":"https://api.github.com/users/NYPL-Simplified/received_events","type":"Organization","site_admin":false},"repo":{"id":27601287,"name":"server_core","full_name":"NYPL-Simplified/server_core","owner":{"login":"NYPL-Simplified","id":16416905,"avatar_url":"https://avatars1.githubusercontent.com/u/16416905?v=4","gravatar_id":"","url":"https://api.github.com/users/NYPL-Simplified","html_url":"https://github.com/NYPL-Simplified","followers_url":"https://api.github.com/users/NYPL-Simplified/followers","following_url":"https://api.github.com/users/NYPL-Simplified/following{/other_user}","gists_url":"https://api.github.com/users/NYPL-Simplified/gists{/gist_id}","starred_url":"https://api.github.com/users/NYPL-Simplified/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/NYPL-Simplified/subscriptions","organizations_url":"https://api.github.com/users/NYPL-Simplified/orgs","repos_url":"https://api.github.com/users/NYPL-Simplified/repos","events_url":"https://api.github.com/users/NYPL-Simplified/events{/privacy}","received_events_url":"https://api.github.com/users/NYPL-Simplified/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/NYPL-Simplified/server_core","description":"Shared data model and utilities for Library Simplified server applications","fork":false,"url":"https://api.github.com/repos/NYPL-Simplified/server_core","forks_url":"https://api.github.com/repos/NYPL-Simplified/server_core/forks","keys_url":"https://api.github.com/repos/NYPL-Simplified/server_core/keys{/key_id}","collaborators_url":"https://api.github.com/repos/NYPL-Simplified/server_core/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/NYPL-Simplified/server_core/teams","hooks_url":"https://api.github.com/repos/NYPL-Simplified/server_core/hooks","issue_events_url":"https://api.github.com/repos/NYPL-Simplified/server_core/issues/events{/number}","events_url":"https://api.github.com/repos/NYPL-Simplified/server_core/events","assignees_url":"https://api.github.com/repos/NYPL-Simplified/server_core/assignees{/user}","branches_url":"https://api.github.com/repos/NYPL-Simplified/server_core/branches{/branch}","tags_url":"https://api.github.com/repos/NYPL-Simplified/server_core/tags","blobs_url":"https://api.github.com/repos/NYPL-Simplified/server_core/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/NYPL-Simplified/server_core/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/NYPL-Simplified/server_core/git/refs{/sha}","trees_url":"https://api.github.com/repos/NYPL-Simplified/server_core/git/trees{/sha}","statuses_url":"https://api.github.com/repos/NYPL-Simplified/server_core/statuses/{sha}","languages_url":"https://api.github.com/repos/NYPL-Simplified/server_core/languages","stargazers_url":"https://api.github.com/repos/NYPL-Simplified/server_core/stargazers","contributors_url":"https://api.github.com/repos/NYPL-Simplified/server_core/contributors","subscribers_url":"https://api.github.com/repos/NYPL-Simplified/server_core/subscribers","subscription_url":"https://api.github.com/repos/NYPL-Simplified/server_core/subscription","commits_url":"https://api.github.com/repos/NYPL-Simplified/server_core/commits{/sha}","git_commits_url":"https://api.github.com/repos/NYPL-Simplified/server_core/git/commits{/sha}","comments_url":"https://api.github.com/repos/NYPL-Simplified/server_core/comments{/number}","issue_comment_url":"https://api.github.com/repos/NYPL-Simplified/server_core/issues/comments{/number}","contents_url":"https://api.github.com/repos/NYPL-Simplified/server_core/contents/{+path}","compare_url":"https://api.github.com/repos/NYPL-Simplified/server_core/compare/{base}...{head}","merges_url":"https://api.github.com/repos/NYPL-Simplified/server_core/merges","archive_url":"https://api.github.com/repos/NYPL-Simplified/server_core/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/NYPL-Simplified/server_core/downloads","issues_url":"https://api.github.com/repos/NYPL-Simplified/server_core/issues{/number}","pulls_url":"https://api.github.com/repos/NYPL-Simplified/server_core/pulls{/number}","milestones_url":"https://api.github.com/repos/NYPL-Simplified/server_core/milestones{/number}","notifications_url":"https://api.github.com/repos/NYPL-Simplified/server_core/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/NYPL-Simplified/server_core/labels{/name}","releases_url":"https://api.github.com/repos/NYPL-Simplified/server_core/releases{/id}","deployments_url":"https://api.github.com/repos/NYPL-Simplified/server_core/deployments","created_at":"2014-12-05T17:03:04Z","updated_at":"2017-05-15T13:58:57Z","pushed_at":"2017-09-11T20:06:46Z","git_url":"git://github.com/NYPL-Simplified/server_core.git","ssh_url":"git@github.com:NYPL-Simplified/server_core.git","clone_url":"https://github.com/NYPL-Simplified/server_core.git","svn_url":"https://github.com/NYPL-Simplified/server_core","homepage":null,"size":6677,"stargazers_count":1,"watchers_count":1,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":5,"mirror_url":null,"open_issues_count":58,"forks":5,"open_issues":58,"watchers":1,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/NYPL-Simplified/server_core/pulls/640"},"html":{"href":"https://github.com/NYPL-Simplified/server_core/pull/640"},"issue":{"href":"https://api.github.com/repos/NYPL-Simplified/server_core/issues/640"},"comments":{"href":"https://api.github.com/repos/NYPL-Simplified/server_core/issues/640/comments"},"review_comments":{"href":"https://api.github.com/repos/NYPL-Simplified/server_core/pulls/640/comments"},"review_comment":{"href":"https://api.github.com/repos/NYPL-Simplified/server_core/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/NYPL-Simplified/server_core/pulls/640/commits"},"statuses":{"href":"https://api.github.com/repos/NYPL-Simplified/server_core/statuses/8b18acf8110a1acb2988d8933e5173740054be5b"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"aslagle"}}