{"action":"created","comment":{"url":"https://api.github.com/repos/kavdev/dj-stripe/pulls/comments/68856655","id":68856655,"diff_hunk":"@@ -14,95 +15,195 @@\n \n \"\"\"\n \n+from django.utils import six\n from . import webhooks\n from .models import Charge, Customer, Card, Subscription, Plan, Transfer, Invoice, InvoiceItem\n \n-STRIPE_CRUD_EVENTS = [\"created\", \"updated\", \"deleted\"]\n \n-\n-# ---------------------------\n-# Charge model events\n-# ---------------------------\n-@webhooks.handler(['charge'])\n-def charge_webhook_handler(event, event_data, event_type, event_subtype):\n-    versioned_charge_data = Charge(stripe_id=event_data[\"object\"][\"id\"]).api_retrieve()\n-    Charge.sync_from_stripe_data(versioned_charge_data)\n-\n-\n-# ---------------------------\n-# Customer model events\n-# ---------------------------\n @webhooks.handler_all\n def customer_event_attach(event, event_data, event_type, event_subtype):\n+    \"\"\" Makes the related customer available on the event for all handlers. \"\"\"\n+    event.customer = None\n+    crud_type = CrudType.determine(event_subtype, exact=True)\n \n-    if event_type == \"customer\" and event_subtype in STRIPE_CRUD_EVENTS:\n-        stripe_customer_id = event_data[\"object\"][\"id\"]\n+    if event_type == \"customer\" and crud_type.valid:\n+        customer_stripe_id = event_data[\"object\"][\"id\"]\n     else:\n-        stripe_customer_id = event_data[\"object\"].get(\"customer\", None)\n+        customer_stripe_id = event_data[\"object\"].get(\"customer\", None)\n \n-    if stripe_customer_id:\n-        try:\n-            event.customer = Customer.objects.get(stripe_id=stripe_customer_id)\n-        except Customer.DoesNotExist:\n-            pass\n+    if not customer_stripe_id:\n+        return\n+\n+    try:\n+        event.customer = Customer.objects.get(stripe_id=customer_stripe_id)\n+    except Customer.DoesNotExist:\n+        pass\n+\n+\n+@webhooks.handler(\"customer\")\n+def customer_webhook_handler(\n+        event, event_data, event_type, event_subtype):\n+    \"\"\" Handles updates for customer objects. \"\"\"\n+    crud_type = CrudType.determine(event_subtype, exact=True)","path":"djstripe/event_handlers.py","position":63,"original_position":63,"commit_id":"839607401f938ef81b0e6769e2f4e05ddb56fef7","original_commit_id":"839607401f938ef81b0e6769e2f4e05ddb56fef7","user":{"login":"kavdev","id":4859329,"avatar_url":"https://avatars.githubusercontent.com/u/4859329?v=3","gravatar_id":"","url":"https://api.github.com/users/kavdev","html_url":"https://github.com/kavdev","followers_url":"https://api.github.com/users/kavdev/followers","following_url":"https://api.github.com/users/kavdev/following{/other_user}","gists_url":"https://api.github.com/users/kavdev/gists{/gist_id}","starred_url":"https://api.github.com/users/kavdev/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kavdev/subscriptions","organizations_url":"https://api.github.com/users/kavdev/orgs","repos_url":"https://api.github.com/users/kavdev/repos","events_url":"https://api.github.com/users/kavdev/events{/privacy}","received_events_url":"https://api.github.com/users/kavdev/received_events","type":"User","site_admin":false},"body":"line break after docstring, line break before conditional","created_at":"2016-06-28T22:35:03Z","updated_at":"2016-06-28T22:35:03Z","html_url":"https://github.com/kavdev/dj-stripe/pull/321#discussion_r68856655","pull_request_url":"https://api.github.com/repos/kavdev/dj-stripe/pulls/321","_links":{"self":{"href":"https://api.github.com/repos/kavdev/dj-stripe/pulls/comments/68856655"},"html":{"href":"https://github.com/kavdev/dj-stripe/pull/321#discussion_r68856655"},"pull_request":{"href":"https://api.github.com/repos/kavdev/dj-stripe/pulls/321"}}},"pull_request":{"url":"https://api.github.com/repos/kavdev/dj-stripe/pulls/321","id":75234406,"html_url":"https://github.com/kavdev/dj-stripe/pull/321","diff_url":"https://github.com/kavdev/dj-stripe/pull/321.diff","patch_url":"https://github.com/kavdev/dj-stripe/pull/321.patch","issue_url":"https://api.github.com/repos/kavdev/dj-stripe/issues/321","number":321,"state":"open","locked":false,"title":"Improve CRUD-like event handling for objects","user":{"login":"lskillen","id":2248287,"avatar_url":"https://avatars.githubusercontent.com/u/2248287?v=3","gravatar_id":"","url":"https://api.github.com/users/lskillen","html_url":"https://github.com/lskillen","followers_url":"https://api.github.com/users/lskillen/followers","following_url":"https://api.github.com/users/lskillen/following{/other_user}","gists_url":"https://api.github.com/users/lskillen/gists{/gist_id}","starred_url":"https://api.github.com/users/lskillen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lskillen/subscriptions","organizations_url":"https://api.github.com/users/lskillen/orgs","repos_url":"https://api.github.com/users/lskillen/repos","events_url":"https://api.github.com/users/lskillen/events{/privacy}","received_events_url":"https://api.github.com/users/lskillen/received_events","type":"User","site_admin":false},"body":"## Description\r\n\r\nDuring integration we noticed that our local state was occasionally getting de-synchronised from the Stripe account - This primarily happened on deletion events, where objects that have been deleted upstream didn't cause a deletion locally.\r\n\r\nThis PR refactors the event handling code to ensure that CRUD-like (without the 'R', so creation, updating and deletion) are handled correctly.  it also ensures that if a customer's default source is deleted, it unsets it for them and also ensures that the customer itself doesn't get deleted (a surprising side-effect without `on_delete`, hehe).\r\n\r\nAs a part of the refactor, I extended the functionality provided by PR #316 by allowing matching at every part of the event, so it is now possible to subscribe a handler to `customer.subscription` to receive all sub-events within that (e.g. `customer.subscription.created`) - This allows us to write slightly nicer handlers that don't need as many branching conditions.\r\n\r\nHopefully all of this is above-board - If there's any questions or changes required, fire away!\r\n\r\n## Test Output\r\n\r\nRan: `python runtests.py --skip-utc`\r\n\r\n```\r\nWelcome to the dj-stripe test suite.\r\n\r\nStep 1: Running unit tests.\r\n\r\nnosetests . --verbosity=1\r\nCreating test database for alias 'default'...\r\n.............................................................................................................................................................................................................S...S.........................................\r\n----------------------------------------------------------------------\r\nRan 251 tests in 5.234s\r\n\r\nOK (SKIP=2)\r\nDestroying test database for alias 'default'...\r\n\r\nStep 2: Generating coverage results.\r\n\r\nName                                             Stmts   Miss Branch BrPart  Cover   Missing\r\n--------------------------------------------------------------------------------------------\r\ndjstripe/context_managers.py                         8      0      0      0   100%\r\ndjstripe/contrib/rest_framework/permissions.py       9      0      0      0   100%\r\ndjstripe/contrib/rest_framework/serializers.py      11      0      0      0   100%\r\ndjstripe/contrib/rest_framework/urls.py              5      0      0      0   100%\r\ndjstripe/contrib/rest_framework/views.py            36      0      2      0   100%\r\ndjstripe/decorators.py                              19      0      4      0   100%\r\ndjstripe/event_handlers.py                          80      0     26      0   100%\r\ndjstripe/exceptions.py                               7      0      0      0   100%\r\ndjstripe/fields.py                                  76      0     18      0   100%\r\ndjstripe/forms.py                                    7      0      0      0   100%\r\ndjstripe/managers.py                                37      0      0      0   100%\r\ndjstripe/middleware.py                              36      0     18      0   100%\r\ndjstripe/mixins.py                                  26      0      2      0   100%\r\ndjstripe/models.py                                 344      0    104      0   100%\r\ndjstripe/settings.py                                43      0     12      0   100%\r\ndjstripe/signals.py                                  3      0      0      0   100%\r\ndjstripe/stripe_objects.py                         441      0     53      0   100%\r\ndjstripe/sync.py                                    29      0      4      0   100%\r\ndjstripe/templatetags/djstripe_tags.py              20      0      4      0   100%\r\ndjstripe/urls.py                                     6      0      0      0   100%\r\ndjstripe/utils.py                                   35      0     14      0   100%\r\ndjstripe/views.py                                  133      0     22      0   100%\r\ndjstripe/webhooks.py                                28      0     10      0   100%\r\n--------------------------------------------------------------------------------------------\r\nTOTAL                                             1439      0    293      0   100%\r\n\r\nStep 3: Checking for pep8 errors.\r\n\r\npep8 errors:\r\n----------------------------------------------------------------------\r\nNone\r\n\r\nTests completed successfully with no errors. Congrats!\r\n```","created_at":"2016-06-26T16:45:35Z","updated_at":"2016-06-28T22:35:03Z","closed_at":null,"merged_at":null,"merge_commit_sha":"d0f51d9d937f9c2be015e7fa73ed1ab53659b419","assignee":{"login":"kavdev","id":4859329,"avatar_url":"https://avatars.githubusercontent.com/u/4859329?v=3","gravatar_id":"","url":"https://api.github.com/users/kavdev","html_url":"https://github.com/kavdev","followers_url":"https://api.github.com/users/kavdev/followers","following_url":"https://api.github.com/users/kavdev/following{/other_user}","gists_url":"https://api.github.com/users/kavdev/gists{/gist_id}","starred_url":"https://api.github.com/users/kavdev/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kavdev/subscriptions","organizations_url":"https://api.github.com/users/kavdev/orgs","repos_url":"https://api.github.com/users/kavdev/repos","events_url":"https://api.github.com/users/kavdev/events{/privacy}","received_events_url":"https://api.github.com/users/kavdev/received_events","type":"User","site_admin":false},"assignees":[{"login":"kavdev","id":4859329,"avatar_url":"https://avatars.githubusercontent.com/u/4859329?v=3","gravatar_id":"","url":"https://api.github.com/users/kavdev","html_url":"https://github.com/kavdev","followers_url":"https://api.github.com/users/kavdev/followers","following_url":"https://api.github.com/users/kavdev/following{/other_user}","gists_url":"https://api.github.com/users/kavdev/gists{/gist_id}","starred_url":"https://api.github.com/users/kavdev/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kavdev/subscriptions","organizations_url":"https://api.github.com/users/kavdev/orgs","repos_url":"https://api.github.com/users/kavdev/repos","events_url":"https://api.github.com/users/kavdev/events{/privacy}","received_events_url":"https://api.github.com/users/kavdev/received_events","type":"User","site_admin":false}],"milestone":{"url":"https://api.github.com/repos/kavdev/dj-stripe/milestones/3","html_url":"https://github.com/kavdev/dj-stripe/milestones/1.0.0","labels_url":"https://api.github.com/repos/kavdev/dj-stripe/milestones/3/labels","id":1203614,"number":3,"title":"1.0.0","description":"API updates to 2015-07-28","creator":{"login":"kavdev","id":4859329,"avatar_url":"https://avatars.githubusercontent.com/u/4859329?v=3","gravatar_id":"","url":"https://api.github.com/users/kavdev","html_url":"https://github.com/kavdev","followers_url":"https://api.github.com/users/kavdev/followers","following_url":"https://api.github.com/users/kavdev/following{/other_user}","gists_url":"https://api.github.com/users/kavdev/gists{/gist_id}","starred_url":"https://api.github.com/users/kavdev/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kavdev/subscriptions","organizations_url":"https://api.github.com/users/kavdev/orgs","repos_url":"https://api.github.com/users/kavdev/repos","events_url":"https://api.github.com/users/kavdev/events{/privacy}","received_events_url":"https://api.github.com/users/kavdev/received_events","type":"User","site_admin":false},"open_issues":4,"closed_issues":15,"state":"open","created_at":"2015-07-11T23:32:00Z","updated_at":"2016-06-28T22:30:57Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/kavdev/dj-stripe/pulls/321/commits","review_comments_url":"https://api.github.com/repos/kavdev/dj-stripe/pulls/321/comments","review_comment_url":"https://api.github.com/repos/kavdev/dj-stripe/pulls/comments{/number}","comments_url":"https://api.github.com/repos/kavdev/dj-stripe/issues/321/comments","statuses_url":"https://api.github.com/repos/kavdev/dj-stripe/statuses/839607401f938ef81b0e6769e2f4e05ddb56fef7","head":{"label":"cloudsmith-io:feature-event-crud-handling","ref":"feature-event-crud-handling","sha":"839607401f938ef81b0e6769e2f4e05ddb56fef7","user":{"login":"cloudsmith-io","id":7657912,"avatar_url":"https://avatars.githubusercontent.com/u/7657912?v=3","gravatar_id":"","url":"https://api.github.com/users/cloudsmith-io","html_url":"https://github.com/cloudsmith-io","followers_url":"https://api.github.com/users/cloudsmith-io/followers","following_url":"https://api.github.com/users/cloudsmith-io/following{/other_user}","gists_url":"https://api.github.com/users/cloudsmith-io/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudsmith-io/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudsmith-io/subscriptions","organizations_url":"https://api.github.com/users/cloudsmith-io/orgs","repos_url":"https://api.github.com/users/cloudsmith-io/repos","events_url":"https://api.github.com/users/cloudsmith-io/events{/privacy}","received_events_url":"https://api.github.com/users/cloudsmith-io/received_events","type":"Organization","site_admin":false},"repo":{"id":60565187,"name":"dj-stripe","full_name":"cloudsmith-io/dj-stripe","owner":{"login":"cloudsmith-io","id":7657912,"avatar_url":"https://avatars.githubusercontent.com/u/7657912?v=3","gravatar_id":"","url":"https://api.github.com/users/cloudsmith-io","html_url":"https://github.com/cloudsmith-io","followers_url":"https://api.github.com/users/cloudsmith-io/followers","following_url":"https://api.github.com/users/cloudsmith-io/following{/other_user}","gists_url":"https://api.github.com/users/cloudsmith-io/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudsmith-io/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudsmith-io/subscriptions","organizations_url":"https://api.github.com/users/cloudsmith-io/orgs","repos_url":"https://api.github.com/users/cloudsmith-io/repos","events_url":"https://api.github.com/users/cloudsmith-io/events{/privacy}","received_events_url":"https://api.github.com/users/cloudsmith-io/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/cloudsmith-io/dj-stripe","description":"Django + Stripe Made Easy","fork":true,"url":"https://api.github.com/repos/cloudsmith-io/dj-stripe","forks_url":"https://api.github.com/repos/cloudsmith-io/dj-stripe/forks","keys_url":"https://api.github.com/repos/cloudsmith-io/dj-stripe/keys{/key_id}","collaborators_url":"https://api.github.com/repos/cloudsmith-io/dj-stripe/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/cloudsmith-io/dj-stripe/teams","hooks_url":"https://api.github.com/repos/cloudsmith-io/dj-stripe/hooks","issue_events_url":"https://api.github.com/repos/cloudsmith-io/dj-stripe/issues/events{/number}","events_url":"https://api.github.com/repos/cloudsmith-io/dj-stripe/events","assignees_url":"https://api.github.com/repos/cloudsmith-io/dj-stripe/assignees{/user}","branches_url":"https://api.github.com/repos/cloudsmith-io/dj-stripe/branches{/branch}","tags_url":"https://api.github.com/repos/cloudsmith-io/dj-stripe/tags","blobs_url":"https://api.github.com/repos/cloudsmith-io/dj-stripe/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/cloudsmith-io/dj-stripe/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/cloudsmith-io/dj-stripe/git/refs{/sha}","trees_url":"https://api.github.com/repos/cloudsmith-io/dj-stripe/git/trees{/sha}","statuses_url":"https://api.github.com/repos/cloudsmith-io/dj-stripe/statuses/{sha}","languages_url":"https://api.github.com/repos/cloudsmith-io/dj-stripe/languages","stargazers_url":"https://api.github.com/repos/cloudsmith-io/dj-stripe/stargazers","contributors_url":"https://api.github.com/repos/cloudsmith-io/dj-stripe/contributors","subscribers_url":"https://api.github.com/repos/cloudsmith-io/dj-stripe/subscribers","subscription_url":"https://api.github.com/repos/cloudsmith-io/dj-stripe/subscription","commits_url":"https://api.github.com/repos/cloudsmith-io/dj-stripe/commits{/sha}","git_commits_url":"https://api.github.com/repos/cloudsmith-io/dj-stripe/git/commits{/sha}","comments_url":"https://api.github.com/repos/cloudsmith-io/dj-stripe/comments{/number}","issue_comment_url":"https://api.github.com/repos/cloudsmith-io/dj-stripe/issues/comments{/number}","contents_url":"https://api.github.com/repos/cloudsmith-io/dj-stripe/contents/{+path}","compare_url":"https://api.github.com/repos/cloudsmith-io/dj-stripe/compare/{base}...{head}","merges_url":"https://api.github.com/repos/cloudsmith-io/dj-stripe/merges","archive_url":"https://api.github.com/repos/cloudsmith-io/dj-stripe/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/cloudsmith-io/dj-stripe/downloads","issues_url":"https://api.github.com/repos/cloudsmith-io/dj-stripe/issues{/number}","pulls_url":"https://api.github.com/repos/cloudsmith-io/dj-stripe/pulls{/number}","milestones_url":"https://api.github.com/repos/cloudsmith-io/dj-stripe/milestones{/number}","notifications_url":"https://api.github.com/repos/cloudsmith-io/dj-stripe/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/cloudsmith-io/dj-stripe/labels{/name}","releases_url":"https://api.github.com/repos/cloudsmith-io/dj-stripe/releases{/id}","deployments_url":"https://api.github.com/repos/cloudsmith-io/dj-stripe/deployments","created_at":"2016-06-06T22:31:59Z","updated_at":"2016-06-06T22:32:01Z","pushed_at":"2016-06-28T19:15:16Z","git_url":"git://github.com/cloudsmith-io/dj-stripe.git","ssh_url":"git@github.com:cloudsmith-io/dj-stripe.git","clone_url":"https://github.com/cloudsmith-io/dj-stripe.git","svn_url":"https://github.com/cloudsmith-io/dj-stripe","homepage":"","size":1587,"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":"kavdev:#162-api-updates-through_2015-07-28","ref":"#162-api-updates-through_2015-07-28","sha":"194327925e693bd9e707b4eaf112a1274bd2a539","user":{"login":"kavdev","id":4859329,"avatar_url":"https://avatars.githubusercontent.com/u/4859329?v=3","gravatar_id":"","url":"https://api.github.com/users/kavdev","html_url":"https://github.com/kavdev","followers_url":"https://api.github.com/users/kavdev/followers","following_url":"https://api.github.com/users/kavdev/following{/other_user}","gists_url":"https://api.github.com/users/kavdev/gists{/gist_id}","starred_url":"https://api.github.com/users/kavdev/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kavdev/subscriptions","organizations_url":"https://api.github.com/users/kavdev/orgs","repos_url":"https://api.github.com/users/kavdev/repos","events_url":"https://api.github.com/users/kavdev/events{/privacy}","received_events_url":"https://api.github.com/users/kavdev/received_events","type":"User","site_admin":false},"repo":{"id":11901762,"name":"dj-stripe","full_name":"kavdev/dj-stripe","owner":{"login":"kavdev","id":4859329,"avatar_url":"https://avatars.githubusercontent.com/u/4859329?v=3","gravatar_id":"","url":"https://api.github.com/users/kavdev","html_url":"https://github.com/kavdev","followers_url":"https://api.github.com/users/kavdev/followers","following_url":"https://api.github.com/users/kavdev/following{/other_user}","gists_url":"https://api.github.com/users/kavdev/gists{/gist_id}","starred_url":"https://api.github.com/users/kavdev/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kavdev/subscriptions","organizations_url":"https://api.github.com/users/kavdev/orgs","repos_url":"https://api.github.com/users/kavdev/repos","events_url":"https://api.github.com/users/kavdev/events{/privacy}","received_events_url":"https://api.github.com/users/kavdev/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/kavdev/dj-stripe","description":"Django + Stripe Made Easy","fork":false,"url":"https://api.github.com/repos/kavdev/dj-stripe","forks_url":"https://api.github.com/repos/kavdev/dj-stripe/forks","keys_url":"https://api.github.com/repos/kavdev/dj-stripe/keys{/key_id}","collaborators_url":"https://api.github.com/repos/kavdev/dj-stripe/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/kavdev/dj-stripe/teams","hooks_url":"https://api.github.com/repos/kavdev/dj-stripe/hooks","issue_events_url":"https://api.github.com/repos/kavdev/dj-stripe/issues/events{/number}","events_url":"https://api.github.com/repos/kavdev/dj-stripe/events","assignees_url":"https://api.github.com/repos/kavdev/dj-stripe/assignees{/user}","branches_url":"https://api.github.com/repos/kavdev/dj-stripe/branches{/branch}","tags_url":"https://api.github.com/repos/kavdev/dj-stripe/tags","blobs_url":"https://api.github.com/repos/kavdev/dj-stripe/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/kavdev/dj-stripe/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/kavdev/dj-stripe/git/refs{/sha}","trees_url":"https://api.github.com/repos/kavdev/dj-stripe/git/trees{/sha}","statuses_url":"https://api.github.com/repos/kavdev/dj-stripe/statuses/{sha}","languages_url":"https://api.github.com/repos/kavdev/dj-stripe/languages","stargazers_url":"https://api.github.com/repos/kavdev/dj-stripe/stargazers","contributors_url":"https://api.github.com/repos/kavdev/dj-stripe/contributors","subscribers_url":"https://api.github.com/repos/kavdev/dj-stripe/subscribers","subscription_url":"https://api.github.com/repos/kavdev/dj-stripe/subscription","commits_url":"https://api.github.com/repos/kavdev/dj-stripe/commits{/sha}","git_commits_url":"https://api.github.com/repos/kavdev/dj-stripe/git/commits{/sha}","comments_url":"https://api.github.com/repos/kavdev/dj-stripe/comments{/number}","issue_comment_url":"https://api.github.com/repos/kavdev/dj-stripe/issues/comments{/number}","contents_url":"https://api.github.com/repos/kavdev/dj-stripe/contents/{+path}","compare_url":"https://api.github.com/repos/kavdev/dj-stripe/compare/{base}...{head}","merges_url":"https://api.github.com/repos/kavdev/dj-stripe/merges","archive_url":"https://api.github.com/repos/kavdev/dj-stripe/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/kavdev/dj-stripe/downloads","issues_url":"https://api.github.com/repos/kavdev/dj-stripe/issues{/number}","pulls_url":"https://api.github.com/repos/kavdev/dj-stripe/pulls{/number}","milestones_url":"https://api.github.com/repos/kavdev/dj-stripe/milestones{/number}","notifications_url":"https://api.github.com/repos/kavdev/dj-stripe/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/kavdev/dj-stripe/labels{/name}","releases_url":"https://api.github.com/repos/kavdev/dj-stripe/releases{/id}","deployments_url":"https://api.github.com/repos/kavdev/dj-stripe/deployments","created_at":"2013-08-05T15:31:30Z","updated_at":"2016-06-26T23:56:46Z","pushed_at":"2016-06-28T19:15:17Z","git_url":"git://github.com/kavdev/dj-stripe.git","ssh_url":"git@github.com:kavdev/dj-stripe.git","clone_url":"https://github.com/kavdev/dj-stripe.git","svn_url":"https://github.com/kavdev/dj-stripe","homepage":"","size":2047,"stargazers_count":298,"watchers_count":298,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":141,"mirror_url":null,"open_issues_count":27,"forks":141,"open_issues":27,"watchers":298,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/kavdev/dj-stripe/pulls/321"},"html":{"href":"https://github.com/kavdev/dj-stripe/pull/321"},"issue":{"href":"https://api.github.com/repos/kavdev/dj-stripe/issues/321"},"comments":{"href":"https://api.github.com/repos/kavdev/dj-stripe/issues/321/comments"},"review_comments":{"href":"https://api.github.com/repos/kavdev/dj-stripe/pulls/321/comments"},"review_comment":{"href":"https://api.github.com/repos/kavdev/dj-stripe/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/kavdev/dj-stripe/pulls/321/commits"},"statuses":{"href":"https://api.github.com/repos/kavdev/dj-stripe/statuses/839607401f938ef81b0e6769e2f4e05ddb56fef7"}}}}
{"actor":{"display_login":"kavdev"}}