)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"8693ca4edf73f2dafaebcbd78610da44903c3b6a","unresolved":false,"context_lines":[{"line_number":15,"context_line":"https://review.openstack.org/#/c/589378/"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Change-Id: I3c74f2345a944ce03a8189c4e66c3c37350cd34f"},{"line_number":18,"context_line":"Closes-Bug: #1473292"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"3f79a3b5_f5ff8463","line":18,"range":{"start_line":18,"start_character":0,"end_line":18,"end_character":10},"updated":"2018-09-27 20:07:04.000000000","message":"Your other patch closed the bug, you could use Related-Bug here instead","commit_id":"37b17c3f72b14b6f611da550bc1e1f2d7b5843f5"}],"keystone/tests/unit/trust/test_backends.py":[{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"95650dfe3dc168b989857fc48f90ccc6e59af6bb","unresolved":false,"context_lines":[{"line_number":436,"context_line":"        self.assertIsNotNone(trust_data)"},{"line_number":437,"context_line":""},{"line_number":438,"context_line":"        PROVIDERS.trust_api.flush_expired_and_soft_deleted_trusts("},{"line_number":439,"context_line":"            trustor_user_id\u003dself.user_foo[\u0027id\u0027])"},{"line_number":440,"context_line":"        trusts \u003d self.trust_api.list_trusts()"},{"line_number":441,"context_line":"        self.assertEqual(len(trusts), 1)"},{"line_number":442,"context_line":"        self.assertEqual(trust_ref1[\u0027id\u0027], trusts[0][\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_4f26e0cd","line":439,"range":{"start_line":439,"start_character":12,"end_line":439,"end_character":47},"updated":"2018-09-28 07:06:47.000000000","message":"don\u0027t need to pass any parameter so that this can sure the function works as design.","commit_id":"0745999b81ff88f4d105bc52606a6a49f60a2228"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"b609b25b26b85b7bab1f25a21b7b0614889bda87","unresolved":false,"context_lines":[{"line_number":426,"context_line":"            project_id\u003dself.tenant_bar[\u0027id\u0027])"},{"line_number":427,"context_line":"        trust_ref2[\u0027expires_at\u0027] \u003d \\"},{"line_number":428,"context_line":"            timeutils.utcnow() + datetime.timedelta(minutes\u003d5)"},{"line_number":429,"context_line":"        trust_ref2[\u0027deleted_at\u0027] \u003d timeutils.utcnow()"},{"line_number":430,"context_line":""},{"line_number":431,"context_line":"        trust_data \u003d PROVIDERS.trust_api.create_trust(trust_ref1[\u0027id\u0027],"},{"line_number":432,"context_line":"                                                      trust_ref1, roles)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_2dedacef","line":429,"range":{"start_line":429,"start_character":35,"end_line":429,"end_character":53},"updated":"2018-09-28 08:51:51.000000000","message":"(nit) you might go through PROVIDERS.trust_api.delete_trust rather than setting the deletion time directly","commit_id":"8bfb165c166e46a94b2232520d01fa59f8d71223"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"d7e90a54426f5467a3d6d35d6611d0bd0578372f","unresolved":false,"context_lines":[{"line_number":426,"context_line":"            project_id\u003dself.tenant_bar[\u0027id\u0027])"},{"line_number":427,"context_line":"        trust_ref2[\u0027expires_at\u0027] \u003d \\"},{"line_number":428,"context_line":"            timeutils.utcnow() + datetime.timedelta(minutes\u003d5)"},{"line_number":429,"context_line":"        trust_ref2[\u0027deleted_at\u0027] \u003d timeutils.utcnow()"},{"line_number":430,"context_line":""},{"line_number":431,"context_line":"        trust_data \u003d PROVIDERS.trust_api.create_trust(trust_ref1[\u0027id\u0027],"},{"line_number":432,"context_line":"                                                      trust_ref1, roles)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_372e2ef9","line":429,"range":{"start_line":429,"start_character":35,"end_line":429,"end_character":53},"in_reply_to":"3f79a3b5_2dedacef","updated":"2018-10-01 05:46:59.000000000","message":"done","commit_id":"8bfb165c166e46a94b2232520d01fa59f8d71223"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"b609b25b26b85b7bab1f25a21b7b0614889bda87","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"3f79a3b5_2dfa8c42","line":442,"updated":"2018-09-28 08:51:51.000000000","message":"I had a doubt about whether unexpired undeleted trusts were safe and wrote a test to make sure: http://paste.openstack.org/show/731069/ could you include a test like that as well?","commit_id":"8bfb165c166e46a94b2232520d01fa59f8d71223"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"d7e90a54426f5467a3d6d35d6611d0bd0578372f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"3f79a3b5_5733aa61","line":442,"in_reply_to":"3f79a3b5_2dfa8c42","updated":"2018-10-01 05:46:59.000000000","message":"Done","commit_id":"8bfb165c166e46a94b2232520d01fa59f8d71223"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"c6837079ff0c49d50f1ce0df43354c8ce28e4abf","unresolved":false,"context_lines":[{"line_number":439,"context_line":"        self.assertEqual(len(trusts), 1)"},{"line_number":440,"context_line":"        self.assertEqual(trust_ref1[\u0027id\u0027], trusts[0][\u0027id\u0027])"},{"line_number":441,"context_line":""},{"line_number":442,"context_line":"    def test_non_expired_non_deleted_trusts(self):"},{"line_number":443,"context_line":"        roles \u003d [{\"id\": \"member\"},"},{"line_number":444,"context_line":"                 {\"id\": \"other\"},"},{"line_number":445,"context_line":"                 {\"id\": \"browser\"}]"}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_13e1942b","line":442,"range":{"start_line":442,"start_character":8,"end_line":442,"end_character":43},"updated":"2018-10-03 05:08:19.000000000","message":"This testcase looks like a little redundant, shouldn\u0027t this be included in the case above?","commit_id":"6aba78a7a213335bf38ddfb4c0e1ef329653305e"}],"keystone/trust/backends/sql.py":[{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"8693ca4edf73f2dafaebcbd78610da44903c3b6a","unresolved":false,"context_lines":[{"line_number":192,"context_line":"            for trust_ref in trusts:"},{"line_number":193,"context_line":"                trust_ref.deleted_at \u003d timeutils.utcnow()"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    def flush_expired_trusts(self, project_id\u003dNone, trustor_user_id\u003dNone,"},{"line_number":196,"context_line":"                             trustee_user_id\u003dNone):"},{"line_number":197,"context_line":"        with sql.session_for_write() as session:"},{"line_number":198,"context_line":"            query \u003d session.query(TrustModel)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_95cdf05f","line":195,"range":{"start_line":195,"start_character":14,"end_line":195,"end_character":21},"updated":"2018-09-27 20:07:04.000000000","message":"Since this is now also purging unexpired deleted trusts the name of this method should change, and the doc strings should be updated to make it clear what is happening.","commit_id":"37b17c3f72b14b6f611da550bc1e1f2d7b5843f5"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"b609b25b26b85b7bab1f25a21b7b0614889bda87","unresolved":false,"context_lines":[{"line_number":200,"context_line":"            if trustee_user_id:"},{"line_number":201,"context_line":"                query \u003d query.filter_by(trustee_user_id\u003dtrustee_user_id)"},{"line_number":202,"context_line":"            for ref in query:"},{"line_number":203,"context_line":"                if ref.expires_at is not None:"},{"line_number":204,"context_line":"                    if ref.expires_at \u003c timeutils.utcnow():"},{"line_number":205,"context_line":"                        session.delete(ref)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_0d84705c","side":"PARENT","line":203,"range":{"start_line":203,"start_character":16,"end_line":203,"end_character":46},"updated":"2018-09-28 08:51:51.000000000","message":"It seems like this case is missing now - does the sqlalchemy \u003c filter handle this properly?","commit_id":"50b2d6aa0e7b9cd9f43daf67db94e49882a57448"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"d7e90a54426f5467a3d6d35d6611d0bd0578372f","unresolved":false,"context_lines":[{"line_number":200,"context_line":"            if trustee_user_id:"},{"line_number":201,"context_line":"                query \u003d query.filter_by(trustee_user_id\u003dtrustee_user_id)"},{"line_number":202,"context_line":"            for ref in query:"},{"line_number":203,"context_line":"                if ref.expires_at is not None:"},{"line_number":204,"context_line":"                    if ref.expires_at \u003c timeutils.utcnow():"},{"line_number":205,"context_line":"                        session.delete(ref)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_971622a7","side":"PARENT","line":203,"range":{"start_line":203,"start_character":16,"end_line":203,"end_character":46},"in_reply_to":"3f79a3b5_0d84705c","updated":"2018-10-01 05:46:59.000000000","message":"Done","commit_id":"50b2d6aa0e7b9cd9f43daf67db94e49882a57448"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"b609b25b26b85b7bab1f25a21b7b0614889bda87","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from six.moves import range"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from sqlalchemy.ext.hybrid import hybrid_property"},{"line_number":19,"context_line":"from sqlalchemy import or_"},{"line_number":20,"context_line":"from sqlalchemy.sql import null"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from keystone.common import sql"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_ad53fc15","line":19,"updated":"2018-09-28 08:51:51.000000000","message":"It seems to not be hard requirement of the hacking check, but for consistency it would be a little better to just import sqlalchemy and then use sqlalchemy.or_ later, like we have for instance here: http://git.openstack.org/cgit/openstack/keystone/tree/keystone/identity/backends/sql.py#n151","commit_id":"8bfb165c166e46a94b2232520d01fa59f8d71223"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"d7e90a54426f5467a3d6d35d6611d0bd0578372f","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from six.moves import range"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from sqlalchemy.ext.hybrid import hybrid_property"},{"line_number":19,"context_line":"from sqlalchemy import or_"},{"line_number":20,"context_line":"from sqlalchemy.sql import null"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from keystone.common import sql"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_f73bd635","line":19,"in_reply_to":"3f79a3b5_ad53fc15","updated":"2018-10-01 05:46:59.000000000","message":"Done","commit_id":"8bfb165c166e46a94b2232520d01fa59f8d71223"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"b609b25b26b85b7bab1f25a21b7b0614889bda87","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from sqlalchemy.ext.hybrid import hybrid_property"},{"line_number":19,"context_line":"from sqlalchemy import or_"},{"line_number":20,"context_line":"from sqlalchemy.sql import null"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from keystone.common import sql"},{"line_number":23,"context_line":"from keystone import exception"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_cd567806","line":20,"updated":"2018-09-28 08:51:51.000000000","message":"Is this really needed, or could we just use None?","commit_id":"8bfb165c166e46a94b2232520d01fa59f8d71223"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"ce8ab82feca83b3dbe0c8769def53630541fb2d5","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from sqlalchemy.ext.hybrid import hybrid_property"},{"line_number":19,"context_line":"from sqlalchemy import or_"},{"line_number":20,"context_line":"from sqlalchemy.sql import null"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from keystone.common import sql"},{"line_number":23,"context_line":"from keystone import exception"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_5d20ab9a","line":20,"in_reply_to":"3f79a3b5_771106af","updated":"2018-10-01 08:11:27.000000000","message":"How about using .isnot(None) as suggested here: https://stackoverflow.com/a/37196866","commit_id":"8bfb165c166e46a94b2232520d01fa59f8d71223"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"d7e90a54426f5467a3d6d35d6611d0bd0578372f","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from sqlalchemy.ext.hybrid import hybrid_property"},{"line_number":19,"context_line":"from sqlalchemy import or_"},{"line_number":20,"context_line":"from sqlalchemy.sql import null"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from keystone.common import sql"},{"line_number":23,"context_line":"from keystone import exception"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_771106af","line":20,"in_reply_to":"3f79a3b5_cd567806","updated":"2018-10-01 05:46:59.000000000","message":"I tried using None in query.filter, But the pep8 wasn\u0027t supporting \"!\u003d None\", and query wasn\u0027t responding on \"is not None \" So I choose null. If you have any suggestion to resolve this??","commit_id":"8bfb165c166e46a94b2232520d01fa59f8d71223"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"c6837079ff0c49d50f1ce0df43354c8ce28e4abf","unresolved":false,"context_lines":[{"line_number":208,"context_line":"                query \u003d query.filter_by(trustor_user_id\u003dtrustor_user_id)"},{"line_number":209,"context_line":"            if trustee_user_id:"},{"line_number":210,"context_line":"                query \u003d query.filter_by(trustee_user_id\u003dtrustee_user_id)"},{"line_number":211,"context_line":"            query.delete(synchronize_session\u003dFalse)"},{"line_number":212,"context_line":"            session.flush()"}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_d399dccf","line":211,"range":{"start_line":211,"start_character":25,"end_line":211,"end_character":50},"updated":"2018-10-03 05:08:19.000000000","message":"Just curious why it is \"false\" instead of \"evaluate\" or \"fetch\"? consistent with existing implementation or any special consideration?","commit_id":"6aba78a7a213335bf38ddfb4c0e1ef329653305e"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"42ed10fca022c5f33d3af9821df97fa6fb028196","unresolved":false,"context_lines":[{"line_number":208,"context_line":"                query \u003d query.filter_by(trustor_user_id\u003dtrustor_user_id)"},{"line_number":209,"context_line":"            if trustee_user_id:"},{"line_number":210,"context_line":"                query \u003d query.filter_by(trustee_user_id\u003dtrustee_user_id)"},{"line_number":211,"context_line":"            query.delete(synchronize_session\u003dFalse)"},{"line_number":212,"context_line":"            session.flush()"}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_f37ad8ed","line":211,"range":{"start_line":211,"start_character":25,"end_line":211,"end_character":50},"in_reply_to":"3f79a3b5_d399dccf","updated":"2018-10-03 06:00:57.000000000","message":"Hi Dave. Thanks for your concern. For consistency with the existing implementation marked it as False. Any suggestions to improve?","commit_id":"6aba78a7a213335bf38ddfb4c0e1ef329653305e"}]}
