{"action":"created","issue":{"url":"https://api.github.com/repos/petrilli/pyramid_transactional_celery/issues/6","repository_url":"https://api.github.com/repos/petrilli/pyramid_transactional_celery","labels_url":"https://api.github.com/repos/petrilli/pyramid_transactional_celery/issues/6/labels{/name}","comments_url":"https://api.github.com/repos/petrilli/pyramid_transactional_celery/issues/6/comments","events_url":"https://api.github.com/repos/petrilli/pyramid_transactional_celery/issues/6/events","html_url":"https://github.com/petrilli/pyramid_transactional_celery/issues/6","id":146451447,"number":6,"title":"thank you.","user":{"login":"jvanasco","id":204779,"avatar_url":"https://avatars.githubusercontent.com/u/204779?v=3","gravatar_id":"","url":"https://api.github.com/users/jvanasco","html_url":"https://github.com/jvanasco","followers_url":"https://api.github.com/users/jvanasco/followers","following_url":"https://api.github.com/users/jvanasco/following{/other_user}","gists_url":"https://api.github.com/users/jvanasco/gists{/gist_id}","starred_url":"https://api.github.com/users/jvanasco/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jvanasco/subscriptions","organizations_url":"https://api.github.com/users/jvanasco/orgs","repos_url":"https://api.github.com/users/jvanasco/repos","events_url":"https://api.github.com/users/jvanasco/events{/privacy}","received_events_url":"https://api.github.com/users/jvanasco/received_events","type":"User","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":null,"milestone":null,"comments":2,"created_at":"2016-04-06T22:20:02Z","updated_at":"2016-04-06T23:32:28Z","closed_at":null,"body":"This isn't actually an issue.  Just a huge thank-you!"},"comment":{"url":"https://api.github.com/repos/petrilli/pyramid_transactional_celery/issues/comments/206619692","html_url":"https://github.com/petrilli/pyramid_transactional_celery/issues/6#issuecomment-206619692","issue_url":"https://api.github.com/repos/petrilli/pyramid_transactional_celery/issues/6","id":206619692,"user":{"login":"jvanasco","id":204779,"avatar_url":"https://avatars.githubusercontent.com/u/204779?v=3","gravatar_id":"","url":"https://api.github.com/users/jvanasco","html_url":"https://github.com/jvanasco","followers_url":"https://api.github.com/users/jvanasco/followers","following_url":"https://api.github.com/users/jvanasco/following{/other_user}","gists_url":"https://api.github.com/users/jvanasco/gists{/gist_id}","starred_url":"https://api.github.com/users/jvanasco/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jvanasco/subscriptions","organizations_url":"https://api.github.com/users/jvanasco/orgs","repos_url":"https://api.github.com/users/jvanasco/repos","events_url":"https://api.github.com/users/jvanasco/events{/privacy}","received_events_url":"https://api.github.com/users/jvanasco/received_events","type":"User","site_admin":false},"created_at":"2016-04-06T23:32:28Z","updated_at":"2016-04-06T23:32:28Z","body":"Sure.\r\n\r\nConsumerPyramidApp has a form that allows for customization of a service.\r\nInternalPyramidApp manages provisioning for the service.\r\n\r\nIf a consumer changes a particular field on an existing form, the internal app needs to do some bookkeeping and backend work. Consumer can't talk directly to Internal for a few reasons... so Celery.\r\n\r\nUsually we handle celery stuff with pyramid using explicit transactions, because there is only 1 discrete action.  For example:\r\n\r\n* begin\r\n* user uploads photo\r\n* commit\r\n* notify celery about photo for resizing\r\n* do other stuff\r\n* commit\r\n\r\nIn this case, I'm dealing with existing code that manages a 10+ element form with a lot of logic/bookkeping/revision control/etc.  To use the existing approach, I'd have to handle the form , then see if this particular element changed for a commit + celery queue.  I was close to writing something like this myself, then found your package in a last ditch effort.\r\n\r\nAnyways, because Celery doesn't offer 2Phase itself, I really use it as a preferred \"trigger\".  There's also a twisted daemon that periodically checks DB records to ensure celery acted on a request and manage the edge cases:\r\n\r\n• App1 creates a provisioning record with \"start\" + timestamp\r\n• Celery updates the record with \"notified\"\r\n• App2 does something\r\n• Celery updates the record with \"completed\"\r\n\r\nTwisted just checks to see if there are any stale items that read \"start\", and re-queues them.\r\n"}}