{"action":"created","comment":{"url":"https://api.github.com/repos/learningequality/kolibri/pulls/comments/186461649","pull_request_review_id":118043560,"id":186461649,"diff_hunk":"@@ -123,22 +125,43 @@ def prepare_bases():\n \n         with open(SCHEMA_PATH_TEMPLATE.format(name=name), 'rb') as f:\n             metadata = pickle.load(f)\n-        BASES[name] = prepare_base(metadata)\n+        cascade_relationships = name == CONTENT_SCHEMA_VERSION\n+        BASES[name] = prepare_base(metadata, cascade_relationships=cascade_relationships)\n \n \n-def prepare_base(metadata):\n+def get_model_from_cls(cls):\n+    return next((m for m in apps.get_models(include_auto_created=True) if m._meta.db_table == cls.__table__.name), None)\n+\n+\n+def get_field_from_model_by_column(model, column):\n+    return next((f for f in model._meta.fields if f.column == column), None)\n+\n+\n+def prepare_base(metadata, cascade_relationships=False):\n     \"\"\"\n     Create a Base mapping for models for a particular schema version of the content app\n     A Base mapping defines the mapping from database tables to the SQLAlchemy ORM and is\n     our main entrypoint for interacting with content databases and the content app tables\n     of the default database.\n+    If cascade_relationships is True, then also attempt to use Django model information\n+    to setup proper relationship cascade behaviour to allow deletion in SQLAlchemy.\n     \"\"\"\n     # Set up the base mapping using the automap_base method, using the metadata passed in\n     Base = automap_base(metadata=metadata)\n-    # TODO map relationship backreferences using the django names\n     # Calling Base.prepare() means that Base now has SQLALchemy ORM classes corresponding to\n     # every database table that we need\n-    Base.prepare()\n+\n+    def _gen_relationship(base, direction, return_fn,\n+                          attrname, local_cls, referred_cls, **kw):\n+        if direction is interfaces.ONETOMANY:\n+            kw['cascade'] = 'all, delete-orphan'\n+        # Add cascade behaviour on deletion\n+        return generate_relationship(base, direction, return_fn,","path":"kolibri/content/utils/sqlalchemybridge.py","position":48,"original_position":48,"commit_id":"3ca0d0de750fac21ddd42be1371d9b56c03af386","original_commit_id":"31f0507049fabe824a5235436a285a0580fed375","user":{"login":"bonidjukic","id":2150991,"avatar_url":"https://avatars0.githubusercontent.com/u/2150991?v=4","gravatar_id":"","url":"https://api.github.com/users/bonidjukic","html_url":"https://github.com/bonidjukic","followers_url":"https://api.github.com/users/bonidjukic/followers","following_url":"https://api.github.com/users/bonidjukic/following{/other_user}","gists_url":"https://api.github.com/users/bonidjukic/gists{/gist_id}","starred_url":"https://api.github.com/users/bonidjukic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bonidjukic/subscriptions","organizations_url":"https://api.github.com/users/bonidjukic/orgs","repos_url":"https://api.github.com/users/bonidjukic/repos","events_url":"https://api.github.com/users/bonidjukic/events{/privacy}","received_events_url":"https://api.github.com/users/bonidjukic/received_events","type":"User","site_admin":false},"body":"@rtibbles Just an observation: you wrapped line #154 even though one-lining it would be shorter than e.g. #133. I guess this might be a good case for https://github.com/learningequality/kolibri/issues/3609.","created_at":"2018-05-07T15:38:51Z","updated_at":"2018-05-07T15:38:52Z","html_url":"https://github.com/learningequality/kolibri/pull/3538#discussion_r186461649","pull_request_url":"https://api.github.com/repos/learningequality/kolibri/pulls/3538","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/learningequality/kolibri/pulls/comments/186461649"},"html":{"href":"https://github.com/learningequality/kolibri/pull/3538#discussion_r186461649"},"pull_request":{"href":"https://api.github.com/repos/learningequality/kolibri/pulls/3538"}}},"pull_request":{"url":"https://api.github.com/repos/learningequality/kolibri/pulls/3538","id":181361388,"html_url":"https://github.com/learningequality/kolibri/pull/3538","diff_url":"https://github.com/learningequality/kolibri/pull/3538.diff","patch_url":"https://github.com/learningequality/kolibri/pull/3538.patch","issue_url":"https://api.github.com/repos/learningequality/kolibri/issues/3538","number":3538,"state":"open","locked":false,"title":"Cancellable channel import","user":{"login":"rtibbles","id":1680573,"avatar_url":"https://avatars3.githubusercontent.com/u/1680573?v=4","gravatar_id":"","url":"https://api.github.com/users/rtibbles","html_url":"https://github.com/rtibbles","followers_url":"https://api.github.com/users/rtibbles/followers","following_url":"https://api.github.com/users/rtibbles/following{/other_user}","gists_url":"https://api.github.com/users/rtibbles/gists{/gist_id}","starred_url":"https://api.github.com/users/rtibbles/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rtibbles/subscriptions","organizations_url":"https://api.github.com/users/rtibbles/orgs","repos_url":"https://api.github.com/users/rtibbles/repos","events_url":"https://api.github.com/users/rtibbles/events{/privacy}","received_events_url":"https://api.github.com/users/rtibbles/received_events","type":"User","site_admin":false},"body":"### Summary\r\n* Resolves the availability after channel update bug that was fixed by #3519, but in a cleaner way.\r\n* Uses cascade deletion in SQLAlchemy to delete previously existing content database rows related to a channel\r\n* Does channel import updating and deletion within a transaction to allow rollback\r\n* Implements cancellation in the channelimport command\r\n* Changes the task api endpoint to make channelimport a cancellable job\r\n* Updates the import export wizard to include a loading channel metadata interstitial state\r\n* On navigation back from this state, attempt to cancel the channel import task\r\n* On refresh, redirect to the manage content page\r\n* ~Fix bug where we were fetching the list of channels twice on the manage content page~ Cherry picked to 0.9 and merged from there.\r\n* Fix bug where we were reimporting channel metadata even if it was imported, just because we had not downloaded any content yet\r\n\r\n### Reviewer guidance\r\nThis is ready for review, but I anticipate needing to make updates due to the following two issues:\r\nI think I am cancelling the channel import task, but I am not certain.\r\nWhen I cancel the task and navigate back to the same channel, I get an error - any help appreciated!\r\n\r\n### References\r\nFixes #2041\r\nFixes #2745\r\nFixes #3246\r\nFixes #2731\r\nSupersedes #3484 \r\n\r\n----\r\n\r\n### Contributor Checklist\r\n\r\n- [x] Contributor has fully tested the PR manually\r\n- [x] PR has the correct target branch and milestone\r\n- [x] PR has 'needs review' or 'work-in-progress' label\r\n- [x] If PR is ready for review, a reviewer has been added. (Don't use 'Assignees')\r\n- [ ] If there are any front-end changes, before/after screenshots are included\r\n- [ ] If this is an important user-facing change, PR or related issue has a 'changelog' label\r\n\r\n### Reviewer Checklist\r\n\r\n- [ ] Automated test coverage is satisfactory\r\n- [ ] Reviewer has fully tested the PR manually\r\n- [ ] PR has been tested for [accessibility regressions](http://kolibri-dev.readthedocs.io/en/develop/manual_testing.html#accessibility-a11y-testing)\r\n- [ ] External dependencies files were updated (`yarn` and `pip`)\r\n- [ ] Documentation is updated\r\n- [ ] Link to diff of internal dependency change is included\r\n- [ ] CHANGELOG.rst is updated for high-level changes\r\n- [ ] Contributor is in AUTHORS.rst\r\n","created_at":"2018-04-13T00:55:02Z","updated_at":"2018-05-07T15:38:52Z","closed_at":null,"merged_at":null,"merge_commit_sha":"5ba63018dcd72e43d05e379dc1ac84653d55fab3","assignee":null,"assignees":[],"requested_reviewers":[{"login":"aronasorman","id":191955,"avatar_url":"https://avatars0.githubusercontent.com/u/191955?v=4","gravatar_id":"","url":"https://api.github.com/users/aronasorman","html_url":"https://github.com/aronasorman","followers_url":"https://api.github.com/users/aronasorman/followers","following_url":"https://api.github.com/users/aronasorman/following{/other_user}","gists_url":"https://api.github.com/users/aronasorman/gists{/gist_id}","starred_url":"https://api.github.com/users/aronasorman/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aronasorman/subscriptions","organizations_url":"https://api.github.com/users/aronasorman/orgs","repos_url":"https://api.github.com/users/aronasorman/repos","events_url":"https://api.github.com/users/aronasorman/events{/privacy}","received_events_url":"https://api.github.com/users/aronasorman/received_events","type":"User","site_admin":false},{"login":"ralphiee22","id":6361732,"avatar_url":"https://avatars3.githubusercontent.com/u/6361732?v=4","gravatar_id":"","url":"https://api.github.com/users/ralphiee22","html_url":"https://github.com/ralphiee22","followers_url":"https://api.github.com/users/ralphiee22/followers","following_url":"https://api.github.com/users/ralphiee22/following{/other_user}","gists_url":"https://api.github.com/users/ralphiee22/gists{/gist_id}","starred_url":"https://api.github.com/users/ralphiee22/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ralphiee22/subscriptions","organizations_url":"https://api.github.com/users/ralphiee22/orgs","repos_url":"https://api.github.com/users/ralphiee22/repos","events_url":"https://api.github.com/users/ralphiee22/events{/privacy}","received_events_url":"https://api.github.com/users/ralphiee22/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":410338552,"url":"https://api.github.com/repos/learningequality/kolibri/labels/PR:%20needs%20review","name":"PR: needs review","color":"1f6ad6","default":false}],"milestone":{"url":"https://api.github.com/repos/learningequality/kolibri/milestones/18","html_url":"https://github.com/learningequality/kolibri/milestone/18","labels_url":"https://api.github.com/repos/learningequality/kolibri/milestones/18/labels","id":3097289,"number":18,"title":"0.10.0","description":"","creator":{"login":"indirectlylit","id":2367265,"avatar_url":"https://avatars2.githubusercontent.com/u/2367265?v=4","gravatar_id":"","url":"https://api.github.com/users/indirectlylit","html_url":"https://github.com/indirectlylit","followers_url":"https://api.github.com/users/indirectlylit/followers","following_url":"https://api.github.com/users/indirectlylit/following{/other_user}","gists_url":"https://api.github.com/users/indirectlylit/gists{/gist_id}","starred_url":"https://api.github.com/users/indirectlylit/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/indirectlylit/subscriptions","organizations_url":"https://api.github.com/users/indirectlylit/orgs","repos_url":"https://api.github.com/users/indirectlylit/repos","events_url":"https://api.github.com/users/indirectlylit/events{/privacy}","received_events_url":"https://api.github.com/users/indirectlylit/received_events","type":"User","site_admin":false},"open_issues":30,"closed_issues":55,"state":"open","created_at":"2018-02-07T17:08:38Z","updated_at":"2018-05-07T03:51:10Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/learningequality/kolibri/pulls/3538/commits","review_comments_url":"https://api.github.com/repos/learningequality/kolibri/pulls/3538/comments","review_comment_url":"https://api.github.com/repos/learningequality/kolibri/pulls/comments{/number}","comments_url":"https://api.github.com/repos/learningequality/kolibri/issues/3538/comments","statuses_url":"https://api.github.com/repos/learningequality/kolibri/statuses/3ca0d0de750fac21ddd42be1371d9b56c03af386","head":{"label":"rtibbles:cancellable_channel_import","ref":"cancellable_channel_import","sha":"3ca0d0de750fac21ddd42be1371d9b56c03af386","user":{"login":"rtibbles","id":1680573,"avatar_url":"https://avatars3.githubusercontent.com/u/1680573?v=4","gravatar_id":"","url":"https://api.github.com/users/rtibbles","html_url":"https://github.com/rtibbles","followers_url":"https://api.github.com/users/rtibbles/followers","following_url":"https://api.github.com/users/rtibbles/following{/other_user}","gists_url":"https://api.github.com/users/rtibbles/gists{/gist_id}","starred_url":"https://api.github.com/users/rtibbles/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rtibbles/subscriptions","organizations_url":"https://api.github.com/users/rtibbles/orgs","repos_url":"https://api.github.com/users/rtibbles/repos","events_url":"https://api.github.com/users/rtibbles/events{/privacy}","received_events_url":"https://api.github.com/users/rtibbles/received_events","type":"User","site_admin":false},"repo":{"id":50074818,"name":"kolibri","full_name":"rtibbles/kolibri","owner":{"login":"rtibbles","id":1680573,"avatar_url":"https://avatars3.githubusercontent.com/u/1680573?v=4","gravatar_id":"","url":"https://api.github.com/users/rtibbles","html_url":"https://github.com/rtibbles","followers_url":"https://api.github.com/users/rtibbles/followers","following_url":"https://api.github.com/users/rtibbles/following{/other_user}","gists_url":"https://api.github.com/users/rtibbles/gists{/gist_id}","starred_url":"https://api.github.com/users/rtibbles/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rtibbles/subscriptions","organizations_url":"https://api.github.com/users/rtibbles/orgs","repos_url":"https://api.github.com/users/rtibbles/repos","events_url":"https://api.github.com/users/rtibbles/events{/privacy}","received_events_url":"https://api.github.com/users/rtibbles/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/rtibbles/kolibri","description":"This is where Kolibri shall be born, watch and participate!","fork":true,"url":"https://api.github.com/repos/rtibbles/kolibri","forks_url":"https://api.github.com/repos/rtibbles/kolibri/forks","keys_url":"https://api.github.com/repos/rtibbles/kolibri/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rtibbles/kolibri/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rtibbles/kolibri/teams","hooks_url":"https://api.github.com/repos/rtibbles/kolibri/hooks","issue_events_url":"https://api.github.com/repos/rtibbles/kolibri/issues/events{/number}","events_url":"https://api.github.com/repos/rtibbles/kolibri/events","assignees_url":"https://api.github.com/repos/rtibbles/kolibri/assignees{/user}","branches_url":"https://api.github.com/repos/rtibbles/kolibri/branches{/branch}","tags_url":"https://api.github.com/repos/rtibbles/kolibri/tags","blobs_url":"https://api.github.com/repos/rtibbles/kolibri/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rtibbles/kolibri/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rtibbles/kolibri/git/refs{/sha}","trees_url":"https://api.github.com/repos/rtibbles/kolibri/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rtibbles/kolibri/statuses/{sha}","languages_url":"https://api.github.com/repos/rtibbles/kolibri/languages","stargazers_url":"https://api.github.com/repos/rtibbles/kolibri/stargazers","contributors_url":"https://api.github.com/repos/rtibbles/kolibri/contributors","subscribers_url":"https://api.github.com/repos/rtibbles/kolibri/subscribers","subscription_url":"https://api.github.com/repos/rtibbles/kolibri/subscription","commits_url":"https://api.github.com/repos/rtibbles/kolibri/commits{/sha}","git_commits_url":"https://api.github.com/repos/rtibbles/kolibri/git/commits{/sha}","comments_url":"https://api.github.com/repos/rtibbles/kolibri/comments{/number}","issue_comment_url":"https://api.github.com/repos/rtibbles/kolibri/issues/comments{/number}","contents_url":"https://api.github.com/repos/rtibbles/kolibri/contents/{+path}","compare_url":"https://api.github.com/repos/rtibbles/kolibri/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rtibbles/kolibri/merges","archive_url":"https://api.github.com/repos/rtibbles/kolibri/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rtibbles/kolibri/downloads","issues_url":"https://api.github.com/repos/rtibbles/kolibri/issues{/number}","pulls_url":"https://api.github.com/repos/rtibbles/kolibri/pulls{/number}","milestones_url":"https://api.github.com/repos/rtibbles/kolibri/milestones{/number}","notifications_url":"https://api.github.com/repos/rtibbles/kolibri/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rtibbles/kolibri/labels{/name}","releases_url":"https://api.github.com/repos/rtibbles/kolibri/releases{/id}","deployments_url":"https://api.github.com/repos/rtibbles/kolibri/deployments","created_at":"2016-01-21T02:03:42Z","updated_at":"2016-01-31T03:57:29Z","pushed_at":"2018-05-04T23:51:48Z","git_url":"git://github.com/rtibbles/kolibri.git","ssh_url":"git@github.com:rtibbles/kolibri.git","clone_url":"https://github.com/rtibbles/kolibri.git","svn_url":"https://github.com/rtibbles/kolibri","homepage":"http://learningequality.org/kolibri/","size":37685,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit"},"forks":0,"open_issues":0,"watchers":0,"default_branch":"develop"}},"base":{"label":"learningequality:develop","ref":"develop","sha":"ac76f36701cf4608f16a81353a57a9f6c2589aa7","user":{"login":"learningequality","id":3926525,"avatar_url":"https://avatars1.githubusercontent.com/u/3926525?v=4","gravatar_id":"","url":"https://api.github.com/users/learningequality","html_url":"https://github.com/learningequality","followers_url":"https://api.github.com/users/learningequality/followers","following_url":"https://api.github.com/users/learningequality/following{/other_user}","gists_url":"https://api.github.com/users/learningequality/gists{/gist_id}","starred_url":"https://api.github.com/users/learningequality/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/learningequality/subscriptions","organizations_url":"https://api.github.com/users/learningequality/orgs","repos_url":"https://api.github.com/users/learningequality/repos","events_url":"https://api.github.com/users/learningequality/events{/privacy}","received_events_url":"https://api.github.com/users/learningequality/received_events","type":"Organization","site_admin":false},"repo":{"id":49976939,"name":"kolibri","full_name":"learningequality/kolibri","owner":{"login":"learningequality","id":3926525,"avatar_url":"https://avatars1.githubusercontent.com/u/3926525?v=4","gravatar_id":"","url":"https://api.github.com/users/learningequality","html_url":"https://github.com/learningequality","followers_url":"https://api.github.com/users/learningequality/followers","following_url":"https://api.github.com/users/learningequality/following{/other_user}","gists_url":"https://api.github.com/users/learningequality/gists{/gist_id}","starred_url":"https://api.github.com/users/learningequality/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/learningequality/subscriptions","organizations_url":"https://api.github.com/users/learningequality/orgs","repos_url":"https://api.github.com/users/learningequality/repos","events_url":"https://api.github.com/users/learningequality/events{/privacy}","received_events_url":"https://api.github.com/users/learningequality/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/learningequality/kolibri","description":"Kolibri: the offline app for universal education","fork":false,"url":"https://api.github.com/repos/learningequality/kolibri","forks_url":"https://api.github.com/repos/learningequality/kolibri/forks","keys_url":"https://api.github.com/repos/learningequality/kolibri/keys{/key_id}","collaborators_url":"https://api.github.com/repos/learningequality/kolibri/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/learningequality/kolibri/teams","hooks_url":"https://api.github.com/repos/learningequality/kolibri/hooks","issue_events_url":"https://api.github.com/repos/learningequality/kolibri/issues/events{/number}","events_url":"https://api.github.com/repos/learningequality/kolibri/events","assignees_url":"https://api.github.com/repos/learningequality/kolibri/assignees{/user}","branches_url":"https://api.github.com/repos/learningequality/kolibri/branches{/branch}","tags_url":"https://api.github.com/repos/learningequality/kolibri/tags","blobs_url":"https://api.github.com/repos/learningequality/kolibri/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/learningequality/kolibri/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/learningequality/kolibri/git/refs{/sha}","trees_url":"https://api.github.com/repos/learningequality/kolibri/git/trees{/sha}","statuses_url":"https://api.github.com/repos/learningequality/kolibri/statuses/{sha}","languages_url":"https://api.github.com/repos/learningequality/kolibri/languages","stargazers_url":"https://api.github.com/repos/learningequality/kolibri/stargazers","contributors_url":"https://api.github.com/repos/learningequality/kolibri/contributors","subscribers_url":"https://api.github.com/repos/learningequality/kolibri/subscribers","subscription_url":"https://api.github.com/repos/learningequality/kolibri/subscription","commits_url":"https://api.github.com/repos/learningequality/kolibri/commits{/sha}","git_commits_url":"https://api.github.com/repos/learningequality/kolibri/git/commits{/sha}","comments_url":"https://api.github.com/repos/learningequality/kolibri/comments{/number}","issue_comment_url":"https://api.github.com/repos/learningequality/kolibri/issues/comments{/number}","contents_url":"https://api.github.com/repos/learningequality/kolibri/contents/{+path}","compare_url":"https://api.github.com/repos/learningequality/kolibri/compare/{base}...{head}","merges_url":"https://api.github.com/repos/learningequality/kolibri/merges","archive_url":"https://api.github.com/repos/learningequality/kolibri/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/learningequality/kolibri/downloads","issues_url":"https://api.github.com/repos/learningequality/kolibri/issues{/number}","pulls_url":"https://api.github.com/repos/learningequality/kolibri/pulls{/number}","milestones_url":"https://api.github.com/repos/learningequality/kolibri/milestones{/number}","notifications_url":"https://api.github.com/repos/learningequality/kolibri/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/learningequality/kolibri/labels{/name}","releases_url":"https://api.github.com/repos/learningequality/kolibri/releases{/id}","deployments_url":"https://api.github.com/repos/learningequality/kolibri/deployments","created_at":"2016-01-19T19:22:07Z","updated_at":"2018-05-04T23:23:25Z","pushed_at":"2018-05-07T14:12:33Z","git_url":"git://github.com/learningequality/kolibri.git","ssh_url":"git@github.com:learningequality/kolibri.git","clone_url":"https://github.com/learningequality/kolibri.git","svn_url":"https://github.com/learningequality/kolibri","homepage":"http://learningequality.org/kolibri/","size":37684,"stargazers_count":163,"watchers_count":163,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":129,"mirror_url":null,"archived":false,"open_issues_count":242,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit"},"forks":129,"open_issues":242,"watchers":163,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/learningequality/kolibri/pulls/3538"},"html":{"href":"https://github.com/learningequality/kolibri/pull/3538"},"issue":{"href":"https://api.github.com/repos/learningequality/kolibri/issues/3538"},"comments":{"href":"https://api.github.com/repos/learningequality/kolibri/issues/3538/comments"},"review_comments":{"href":"https://api.github.com/repos/learningequality/kolibri/pulls/3538/comments"},"review_comment":{"href":"https://api.github.com/repos/learningequality/kolibri/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/learningequality/kolibri/pulls/3538/commits"},"statuses":{"href":"https://api.github.com/repos/learningequality/kolibri/statuses/3ca0d0de750fac21ddd42be1371d9b56c03af386"}},"author_association":"OWNER"}}
{"actor":{"display_login":"bonidjukic"}}