)]}'
{"etc/keystone.conf.sample":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d749f4d7ee2b03853e574d3564da8fcfdd16babc","unresolved":false,"context_lines":[{"line_number":27,"context_line":"# FIXME(dolph): This should really be defined as [policy] default_rule"},{"line_number":28,"context_line":"# policy_default_rule \u003d admin_required"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"#Role for migrating membership relationships"},{"line_number":31,"context_line":"#During a SQL upgrade, the following values will be used to create a new role"},{"line_number":32,"context_line":"#that will replace what was previously done when adding a member to a project."},{"line_number":33,"context_line":"#after migration, the member_role_id will be used in the API add_user_to_project,"}],"source_content_type":"application/octet-stream","patch_set":11,"id":"AAAAM3%2F%2Bz6g%3D","line":30,"updated":"2013-02-18 19:37:04.000000000","message":"spaces after hashes throughout","commit_id":"ec2ae7dd177f90f46a55ce0ede70f2e09f9079d5"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"c4f26a1e1dfb1c8be9635636e37b75c273565aab","unresolved":false,"context_lines":[{"line_number":27,"context_line":"# FIXME(dolph): This should really be defined as [policy] default_rule"},{"line_number":28,"context_line":"# policy_default_rule \u003d admin_required"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"#Role for migrating membership relationships"},{"line_number":31,"context_line":"#During a SQL upgrade, the following values will be used to create a new role"},{"line_number":32,"context_line":"#that will replace what was previously done when adding a member to a project."},{"line_number":33,"context_line":"#after migration, the member_role_id will be used in the API add_user_to_project,"}],"source_content_type":"application/octet-stream","patch_set":11,"id":"AAAAM3%2F%2Bz1A%3D","line":30,"in_reply_to":"AAAAM3%2F%2Bz6g%3D","updated":"2013-02-18 20:12:30.000000000","message":"Done","commit_id":"ec2ae7dd177f90f46a55ce0ede70f2e09f9079d5"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d749f4d7ee2b03853e574d3564da8fcfdd16babc","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"#Role for migrating membership relationships"},{"line_number":31,"context_line":"#During a SQL upgrade, the following values will be used to create a new role"},{"line_number":32,"context_line":"#that will replace what was previously done when adding a member to a project."},{"line_number":33,"context_line":"#after migration, the member_role_id will be used in the API add_user_to_project,"},{"line_number":34,"context_line":"#and member_role_name will be ignored."},{"line_number":35,"context_line":"# member_role_id \u003d 9fe2ff9ee4384b1894a90878d3e92bab"}],"source_content_type":"application/octet-stream","patch_set":11,"id":"AAAAM3%2F%2Bz7I%3D","line":32,"updated":"2013-02-18 19:37:04.000000000","message":"\"what was previously done\" -\u003e \"replace records in the user_tenant_membership table with explicit role grants\"","commit_id":"ec2ae7dd177f90f46a55ce0ede70f2e09f9079d5"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"c4f26a1e1dfb1c8be9635636e37b75c273565aab","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"#Role for migrating membership relationships"},{"line_number":31,"context_line":"#During a SQL upgrade, the following values will be used to create a new role"},{"line_number":32,"context_line":"#that will replace what was previously done when adding a member to a project."},{"line_number":33,"context_line":"#after migration, the member_role_id will be used in the API add_user_to_project,"},{"line_number":34,"context_line":"#and member_role_name will be ignored."},{"line_number":35,"context_line":"# member_role_id \u003d 9fe2ff9ee4384b1894a90878d3e92bab"}],"source_content_type":"application/octet-stream","patch_set":11,"id":"AAAAM3%2F%2Bz04%3D","line":32,"in_reply_to":"AAAAM3%2F%2Bz7I%3D","updated":"2013-02-18 20:12:30.000000000","message":"Done","commit_id":"ec2ae7dd177f90f46a55ce0ede70f2e09f9079d5"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d749f4d7ee2b03853e574d3564da8fcfdd16babc","unresolved":false,"context_lines":[{"line_number":30,"context_line":"#Role for migrating membership relationships"},{"line_number":31,"context_line":"#During a SQL upgrade, the following values will be used to create a new role"},{"line_number":32,"context_line":"#that will replace what was previously done when adding a member to a project."},{"line_number":33,"context_line":"#after migration, the member_role_id will be used in the API add_user_to_project,"},{"line_number":34,"context_line":"#and member_role_name will be ignored."},{"line_number":35,"context_line":"# member_role_id \u003d 9fe2ff9ee4384b1894a90878d3e92bab"},{"line_number":36,"context_line":"# member_role_name \u003d _member_"}],"source_content_type":"application/octet-stream","patch_set":11,"id":"AAAAM3%2F%2Bz7E%3D","line":33,"updated":"2013-02-18 19:37:04.000000000","message":"sentence case","commit_id":"ec2ae7dd177f90f46a55ce0ede70f2e09f9079d5"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"c4f26a1e1dfb1c8be9635636e37b75c273565aab","unresolved":false,"context_lines":[{"line_number":30,"context_line":"#Role for migrating membership relationships"},{"line_number":31,"context_line":"#During a SQL upgrade, the following values will be used to create a new role"},{"line_number":32,"context_line":"#that will replace what was previously done when adding a member to a project."},{"line_number":33,"context_line":"#after migration, the member_role_id will be used in the API add_user_to_project,"},{"line_number":34,"context_line":"#and member_role_name will be ignored."},{"line_number":35,"context_line":"# member_role_id \u003d 9fe2ff9ee4384b1894a90878d3e92bab"},{"line_number":36,"context_line":"# member_role_name \u003d _member_"}],"source_content_type":"application/octet-stream","patch_set":11,"id":"AAAAM3%2F%2Bz08%3D","line":33,"in_reply_to":"AAAAM3%2F%2Bz7E%3D","updated":"2013-02-18 20:12:30.000000000","message":"Done","commit_id":"ec2ae7dd177f90f46a55ce0ede70f2e09f9079d5"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"a0e46fec225091d658a8eae96b523690cb61a4e7","unresolved":false,"context_lines":[{"line_number":31,"context_line":"# During a SQL upgrade, the following values will be used to create a new role"},{"line_number":32,"context_line":"# that will replace records in the user_tenant_membership table with explicit"},{"line_number":33,"context_line":"# role grants.  After migration, the member_role_id will be used in the API"},{"line_number":34,"context_line":"# add_user_to_project, and member_role_name will be ignored."},{"line_number":35,"context_line":"# member_role_id \u003d 9fe2ff9ee4384b1894a90878d3e92bab"},{"line_number":36,"context_line":"# member_role_name \u003d _member_"},{"line_number":37,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":13,"id":"AAAAM3%2F%2Bzyk%3D","line":34,"updated":"2013-02-18 20:23:31.000000000","message":"nice","commit_id":"b20302aa3e08421295140576d0aeea2fa9e34188"}],"keystone/common/ldap/fakeldap.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"1bbd412ecb17728fce981b33915cceb4114c6401","unresolved":false,"context_lines":[{"line_number":45,"context_line":"#If you need debugging output for fakeladp, comment out the following line."},{"line_number":46,"context_line":"#since this file should not show up in a live deployment, it does not make"},{"line_number":47,"context_line":"#sense to have logging for it in log.config."},{"line_number":48,"context_line":"LOG.level \u003d LOG.error"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"def _match_query(query, attrs):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2B6pQ%3D","line":48,"updated":"2013-02-14 16:45:53.000000000","message":"Besides all the spelling and grammar errors here, I\u0027d rather cut the unnecessary debug output statements rather than hardcoding a set log level.\n\nThis also appears to be very out of scope for this patch.","commit_id":"ffe7b4f98f1385975fe5407825533c24bcff341b"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"b1679a74e695a96189a88265311df4e5d23030ab","unresolved":false,"context_lines":[{"line_number":45,"context_line":"#If you need debugging output for fakeladp, comment out the following line."},{"line_number":46,"context_line":"#since this file should not show up in a live deployment, it does not make"},{"line_number":47,"context_line":"#sense to have logging for it in log.config."},{"line_number":48,"context_line":"LOG.level \u003d LOG.error"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"def _match_query(query, attrs):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2B5jQ%3D","line":48,"in_reply_to":"AAAAM3%2F%2B6pQ%3D","updated":"2013-02-15 14:01:39.000000000","message":"Done","commit_id":"ffe7b4f98f1385975fe5407825533c24bcff341b"}],"keystone/common/sql/migrate_repo/versions/015_tenant_to_project.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e349ab871c732056f67b0cc21e208b9a89abff00","unresolved":false,"context_lines":[{"line_number":19,"context_line":"    session \u003d maker()"},{"line_number":20,"context_line":"    for tenant in session.query(tenant_table).all():"},{"line_number":21,"context_line":"        session.execute("},{"line_number":22,"context_line":"        \u0027insert into project (id, name, extra, description, enabled) values (:id, :name, :extra, :description, :enabled)\u0027,"},{"line_number":23,"context_line":"        tenant)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    user_project_membership_table \u003d sql.Table("}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2FHws%3D","line":22,"updated":"2013-02-06 16:22:06.000000000","message":"checkout migration 8 (recently updated) for an even cleaner way to do inserts","commit_id":"d86f2a5d9b5066905d463a23a6984a7f3ef15803"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e349ab871c732056f67b0cc21e208b9a89abff00","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        session.execute("},{"line_number":42,"context_line":"        \u0027insert into user_project_membership (user_id, project_id) values (:user_id, :project_id)\u0027,"},{"line_number":43,"context_line":"        membership)"},{"line_number":44,"context_line":"    session.execute(\"drop table user_tenant_membership\")"},{"line_number":45,"context_line":"    session.execute(\"drop table tenant\")"},{"line_number":46,"context_line":"    session.commit()"},{"line_number":47,"context_line":"    session.close()"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2FHwQ%3D","line":44,"updated":"2013-02-06 16:22:06.000000000","message":"legacy_membership_table.drop()","commit_id":"d86f2a5d9b5066905d463a23a6984a7f3ef15803"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"323a76861a0a27ffd7ad3a81226fd517a4a2425f","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        session.execute("},{"line_number":42,"context_line":"        \u0027insert into user_project_membership (user_id, project_id) values (:user_id, :project_id)\u0027,"},{"line_number":43,"context_line":"        membership)"},{"line_number":44,"context_line":"    session.execute(\"drop table user_tenant_membership\")"},{"line_number":45,"context_line":"    session.execute(\"drop table tenant\")"},{"line_number":46,"context_line":"    session.commit()"},{"line_number":47,"context_line":"    session.close()"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2FHJ0%3D","line":44,"in_reply_to":"AAAAM3%2F%2FHwQ%3D","updated":"2013-02-06 20:29:55.000000000","message":"Done","commit_id":"d86f2a5d9b5066905d463a23a6984a7f3ef15803"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e349ab871c732056f67b0cc21e208b9a89abff00","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        \u0027insert into user_project_membership (user_id, project_id) values (:user_id, :project_id)\u0027,"},{"line_number":43,"context_line":"        membership)"},{"line_number":44,"context_line":"    session.execute(\"drop table user_tenant_membership\")"},{"line_number":45,"context_line":"    session.execute(\"drop table tenant\")"},{"line_number":46,"context_line":"    session.commit()"},{"line_number":47,"context_line":"    session.close()"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2FHwI%3D","line":45,"updated":"2013-02-06 16:22:06.000000000","message":"is this supposed to go here?","commit_id":"d86f2a5d9b5066905d463a23a6984a7f3ef15803"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"323a76861a0a27ffd7ad3a81226fd517a4a2425f","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        \u0027insert into user_project_membership (user_id, project_id) values (:user_id, :project_id)\u0027,"},{"line_number":43,"context_line":"        membership)"},{"line_number":44,"context_line":"    session.execute(\"drop table user_tenant_membership\")"},{"line_number":45,"context_line":"    session.execute(\"drop table tenant\")"},{"line_number":46,"context_line":"    session.commit()"},{"line_number":47,"context_line":"    session.close()"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2FHJ8%3D","line":45,"in_reply_to":"AAAAM3%2F%2FHwI%3D","updated":"2013-02-06 20:29:55.000000000","message":"yes.  converting the tenant table to the project table.  Get rid of the tenant table, and restore in downgrade.","commit_id":"d86f2a5d9b5066905d463a23a6984a7f3ef15803"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"c9f3822b971aa46409ef50fe2b23231425b756c6","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    legacy_membership_table.drop()"},{"line_number":46,"context_line":"    tenant_table.drop()"},{"line_number":47,"context_line":"    session.commit()"},{"line_number":48,"context_line":"    session.close()"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"def downgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2FBhk%3D","line":48,"updated":"2013-02-11 11:06:43.000000000","message":"Is the reason to do this so because you are seeing instabilities in the .rename in some DB engines?  I\u0027m no longer seeing this in my patch (https://review.openstack.org/#/c/19820) now that I have combined our changes - however, see my TODO comment on test_downgrade_project_to_tenant().","commit_id":"6c427f8d3c5ddf31f2009e0a2d8c41cbd1452e46"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"d8fbb65ef371abf7d2c2cecd3372e363a52edd72","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    legacy_membership_table.drop()"},{"line_number":46,"context_line":"    tenant_table.drop()"},{"line_number":47,"context_line":"    session.commit()"},{"line_number":48,"context_line":"    session.close()"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"def downgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2B7io%3D","line":48,"in_reply_to":"AAAAM3%2F%2FBCs%3D","updated":"2013-02-14 03:03:08.000000000","message":"They wouldn\u0027t be necessary if we ran all of the updates in a single commit, but we don\u0027t.  This way, when we run the tests, we see the intermediate results of the upgrade in the database, and therefore the tests show the proper results.","commit_id":"6c427f8d3c5ddf31f2009e0a2d8c41cbd1452e46"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"a3d74dc35419bb0ae3c627822f7fb3e337ec47db","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    legacy_membership_table.drop()"},{"line_number":46,"context_line":"    tenant_table.drop()"},{"line_number":47,"context_line":"    session.commit()"},{"line_number":48,"context_line":"    session.close()"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"def downgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2FBCs%3D","line":48,"in_reply_to":"AAAAM3%2F%2FBhk%3D","updated":"2013-02-11 16:55:21.000000000","message":"i don\u0027t understand where all the session.commit()/close() calls are coming from either -- no other project does this and it really doesn\u0027t seem necessary","commit_id":"6c427f8d3c5ddf31f2009e0a2d8c41cbd1452e46"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"92fd214bd9740fb2c65a752d5f6db0a491abc024","unresolved":false,"context_lines":[{"line_number":65,"context_line":"    session.close()"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    user_tenant_membership_table.drop()"},{"line_number":68,"context_line":"    tenant_table.drop()"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"def downgrade_with_copy(meta, migrate_engine):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAM3%2F%2B0ow%3D","line":68,"updated":"2013-02-18 15:45:20.000000000","message":"i assume these should be done before the above session is closed?","commit_id":"331ad426ccd62bc491059643cd6f92dc4b5e6be9"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"57326a347f7ba3b6b9c5bd99b835e10bcf65dddd","unresolved":false,"context_lines":[{"line_number":65,"context_line":"    session.close()"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    user_tenant_membership_table.drop()"},{"line_number":68,"context_line":"    tenant_table.drop()"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"def downgrade_with_copy(meta, migrate_engine):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAM3%2F%2B0lo%3D","line":68,"in_reply_to":"AAAAM3%2F%2B0ow%3D","updated":"2013-02-18 16:02:51.000000000","message":"Makes no difference.  There is no implicit relationship between the session and the drop commands.","commit_id":"331ad426ccd62bc491059643cd6f92dc4b5e6be9"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"92fd214bd9740fb2c65a752d5f6db0a491abc024","unresolved":false,"context_lines":[{"line_number":112,"context_line":"    user_project_membership_table.drop()"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    session.commit()"},{"line_number":115,"context_line":"    session.close()"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"def upgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAM3%2F%2B0oo%3D","line":115,"updated":"2013-02-18 15:45:20.000000000","message":"the session commit/close calls are only performed for sqlite -- is that intentional?","commit_id":"331ad426ccd62bc491059643cd6f92dc4b5e6be9"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"57326a347f7ba3b6b9c5bd99b835e10bcf65dddd","unresolved":false,"context_lines":[{"line_number":112,"context_line":"    user_project_membership_table.drop()"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    session.commit()"},{"line_number":115,"context_line":"    session.close()"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"def upgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAM3%2F%2B0lk%3D","line":115,"in_reply_to":"AAAAM3%2F%2B0oo%3D","updated":"2013-02-18 16:02:51.000000000","message":"Yes, as only sqlite is using the session API.  Migrate is wonky.","commit_id":"331ad426ccd62bc491059643cd6f92dc4b5e6be9"}],"keystone/common/sql/migrate_repo/versions/016_membership_role.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"a3d74dc35419bb0ae3c627822f7fb3e337ec47db","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    conn \u003d migrate_engine.connect()"},{"line_number":33,"context_line":"    conn.execute(role_table.insert(),"},{"line_number":34,"context_line":"                 id\u003dconfig.CONF.member_role_id,"},{"line_number":35,"context_line":"                 name\u003d\"Member_of_Project\","},{"line_number":36,"context_line":"                 description\u003d\u0027Default Role for Project Membership\u0027,"},{"line_number":37,"context_line":"                 extra\u003djson.dumps({\u0027description\u0027:"},{"line_number":38,"context_line":"                                   \u0027Default Role for Project Membership\u0027}))"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2FBCI%3D","line":35,"updated":"2013-02-11 16:55:21.000000000","message":"can you just rename this to Member? end-users could apply it to domains as well, and the underscores are ugly, especially for something we\u0027re creating automatically","commit_id":"6c427f8d3c5ddf31f2009e0a2d8c41cbd1452e46"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"d8fbb65ef371abf7d2c2cecd3372e363a52edd72","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    conn \u003d migrate_engine.connect()"},{"line_number":33,"context_line":"    conn.execute(role_table.insert(),"},{"line_number":34,"context_line":"                 id\u003dconfig.CONF.member_role_id,"},{"line_number":35,"context_line":"                 name\u003d\"Member_of_Project\","},{"line_number":36,"context_line":"                 description\u003d\u0027Default Role for Project Membership\u0027,"},{"line_number":37,"context_line":"                 extra\u003djson.dumps({\u0027description\u0027:"},{"line_number":38,"context_line":"                                   \u0027Default Role for Project Membership\u0027}))"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2B7ik%3D","line":35,"in_reply_to":"AAAAM3%2F%2FBCI%3D","updated":"2013-02-14 03:03:08.000000000","message":"I didn\u0027t want to clash with an existing field.  Member seems to be used already in the unit tests.  I intentionally went as ugly as possible.","commit_id":"6c427f8d3c5ddf31f2009e0a2d8c41cbd1452e46"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"a3d74dc35419bb0ae3c627822f7fb3e337ec47db","unresolved":false,"context_lines":[{"line_number":35,"context_line":"                 name\u003d\"Member_of_Project\","},{"line_number":36,"context_line":"                 description\u003d\u0027Default Role for Project Membership\u0027,"},{"line_number":37,"context_line":"                 extra\u003djson.dumps({\u0027description\u0027:"},{"line_number":38,"context_line":"                                   \u0027Default Role for Project Membership\u0027}))"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    user_project_membership_table \u003d sql.Table(\u0027user_project_membership\u0027,"},{"line_number":41,"context_line":"                                              meta, autoload\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2FBCE%3D","line":38,"updated":"2013-02-11 16:55:21.000000000","message":"use sentence case, and definitely don\u0027t insert the description twice","commit_id":"6c427f8d3c5ddf31f2009e0a2d8c41cbd1452e46"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"d8fbb65ef371abf7d2c2cecd3372e363a52edd72","unresolved":false,"context_lines":[{"line_number":35,"context_line":"                 name\u003d\"Member_of_Project\","},{"line_number":36,"context_line":"                 description\u003d\u0027Default Role for Project Membership\u0027,"},{"line_number":37,"context_line":"                 extra\u003djson.dumps({\u0027description\u0027:"},{"line_number":38,"context_line":"                                   \u0027Default Role for Project Membership\u0027}))"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    user_project_membership_table \u003d sql.Table(\u0027user_project_membership\u0027,"},{"line_number":41,"context_line":"                                              meta, autoload\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2B7iU%3D","line":38,"in_reply_to":"AAAAM3%2F%2FBCE%3D","updated":"2013-02-14 03:03:08.000000000","message":"Done","commit_id":"6c427f8d3c5ddf31f2009e0a2d8c41cbd1452e46"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"c9f3822b971aa46409ef50fe2b23231425b756c6","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    user_project_membership_table \u003d sql.Table(\u0027user_project_membership\u0027,"},{"line_number":41,"context_line":"                                              meta, autoload\u003dTrue)"},{"line_number":42,"context_line":"    maker \u003d sql.orm.sessionmaker(bind\u003dmigrate_engine)"},{"line_number":43,"context_line":"    session \u003d maker()"},{"line_number":44,"context_line":"    for membership in session.query(user_project_membership_table):"},{"line_number":45,"context_line":"        data \u003d {\u0027roles\u0027: [config.CONF.member_role_id]}"},{"line_number":46,"context_line":"        ins \u003d user_project_role_table.insert().values("}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2FBhU%3D","line":43,"updated":"2013-02-11 11:06:43.000000000","message":"(as an aside):\n\nsession \u003d sql.orm.sessionmaker(bind\u003dmigrate_engine)()\n\ncould be written instead, but go with your preference","commit_id":"6c427f8d3c5ddf31f2009e0a2d8c41cbd1452e46"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"a3d74dc35419bb0ae3c627822f7fb3e337ec47db","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    user_project_membership_table \u003d sql.Table(\u0027user_project_membership\u0027,"},{"line_number":41,"context_line":"                                              meta, autoload\u003dTrue)"},{"line_number":42,"context_line":"    maker \u003d sql.orm.sessionmaker(bind\u003dmigrate_engine)"},{"line_number":43,"context_line":"    session \u003d maker()"},{"line_number":44,"context_line":"    for membership in session.query(user_project_membership_table):"},{"line_number":45,"context_line":"        data \u003d {\u0027roles\u0027: [config.CONF.member_role_id]}"},{"line_number":46,"context_line":"        ins \u003d user_project_role_table.insert().values("}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2FBCk%3D","line":43,"in_reply_to":"AAAAM3%2F%2FBhU%3D","updated":"2013-02-11 16:55:21.000000000","message":"+1 no need to keep the sessionmaker around","commit_id":"6c427f8d3c5ddf31f2009e0a2d8c41cbd1452e46"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"d8fbb65ef371abf7d2c2cecd3372e363a52edd72","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    user_project_membership_table \u003d sql.Table(\u0027user_project_membership\u0027,"},{"line_number":41,"context_line":"                                              meta, autoload\u003dTrue)"},{"line_number":42,"context_line":"    maker \u003d sql.orm.sessionmaker(bind\u003dmigrate_engine)"},{"line_number":43,"context_line":"    session \u003d maker()"},{"line_number":44,"context_line":"    for membership in session.query(user_project_membership_table):"},{"line_number":45,"context_line":"        data \u003d {\u0027roles\u0027: [config.CONF.member_role_id]}"},{"line_number":46,"context_line":"        ins \u003d user_project_role_table.insert().values("}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2B7iQ%3D","line":43,"in_reply_to":"AAAAM3%2F%2FBhU%3D","updated":"2013-02-14 03:03:08.000000000","message":"Done","commit_id":"6c427f8d3c5ddf31f2009e0a2d8c41cbd1452e46"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"c9f3822b971aa46409ef50fe2b23231425b756c6","unresolved":false,"context_lines":[{"line_number":48,"context_line":"            project_id\u003dmembership.project_id,"},{"line_number":49,"context_line":"            data\u003djson.dumps(data))"},{"line_number":50,"context_line":"        conn.execute(ins)"},{"line_number":51,"context_line":"    user_project_membership_table.drop()"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"def downgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2FBhA%3D","line":51,"updated":"2013-02-11 11:06:43.000000000","message":"So I assume user_project_metadata replaces the old \u0027metadata\u0027 table?  If so, don\u0027t we need to copy in the contents of \u0027metadata\u0027 as well and then drop it?","commit_id":"6c427f8d3c5ddf31f2009e0a2d8c41cbd1452e46"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"d8fbb65ef371abf7d2c2cecd3372e363a52edd72","unresolved":false,"context_lines":[{"line_number":48,"context_line":"            project_id\u003dmembership.project_id,"},{"line_number":49,"context_line":"            data\u003djson.dumps(data))"},{"line_number":50,"context_line":"        conn.execute(ins)"},{"line_number":51,"context_line":"    user_project_membership_table.drop()"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"def downgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2B7iM%3D","line":51,"in_reply_to":"AAAAM3%2F%2FBB8%3D","updated":"2013-02-14 03:03:08.000000000","message":"I need the role grants.  As far as I know, I don\u0027t need anything else.","commit_id":"6c427f8d3c5ddf31f2009e0a2d8c41cbd1452e46"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"a3d74dc35419bb0ae3c627822f7fb3e337ec47db","unresolved":false,"context_lines":[{"line_number":48,"context_line":"            project_id\u003dmembership.project_id,"},{"line_number":49,"context_line":"            data\u003djson.dumps(data))"},{"line_number":50,"context_line":"        conn.execute(ins)"},{"line_number":51,"context_line":"    user_project_membership_table.drop()"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"def downgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2FBB8%3D","line":51,"in_reply_to":"AAAAM3%2F%2FBhA%3D","updated":"2013-02-11 16:55:21.000000000","message":"user_project_metadata represents the combined contents of  proper role grants and vacuous \"add user to project\" calls\n\ni\u0027m not clear on what you want to copy / where it should be going?","commit_id":"6c427f8d3c5ddf31f2009e0a2d8c41cbd1452e46"}],"keystone/common/sql/migrate_repo/versions/017_membership_role.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"1bbd412ecb17728fce981b33915cceb4114c6401","unresolved":false,"context_lines":[{"line_number":4,"context_line":""},{"line_number":5,"context_line":"import uuid"},{"line_number":6,"context_line":"from keystone import config"},{"line_number":7,"context_line":"from keystone import exception"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"def upgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2B6pA%3D","line":7,"updated":"2013-02-14 16:45:53.000000000","message":"clean up the imports per HACKING","commit_id":"ffe7b4f98f1385975fe5407825533c24bcff341b"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"1bbd412ecb17728fce981b33915cceb4114c6401","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    conn \u003d migrate_engine.connect()"},{"line_number":33,"context_line":"    conn.execute(role_table.insert(),"},{"line_number":34,"context_line":"                 id\u003dconfig.CONF.member_role_id,"},{"line_number":35,"context_line":"                 name\u003d\"Member_of_Project\","},{"line_number":36,"context_line":"                 extra\u003djson.dumps({\u0027description\u0027:"},{"line_number":37,"context_line":"                                   \u0027Default role for project membership\u0027}))"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2B6ow%3D","line":35,"updated":"2013-02-14 16:45:53.000000000","message":"Still not in favor of this. It\u0027s not specific to projects and I\u0027d rather it conform to our documented suggestions for roles -- e.g. \"member\".\n\nThere\u0027s no reason why you can\u0027t look for a role named \"member\" and use it if it already exists.\n\nI\u0027m also not sure the role ID needs to be configurable -- it can just be generated randomly as part of the migration.","commit_id":"ffe7b4f98f1385975fe5407825533c24bcff341b"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"b1679a74e695a96189a88265311df4e5d23030ab","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    conn \u003d migrate_engine.connect()"},{"line_number":33,"context_line":"    conn.execute(role_table.insert(),"},{"line_number":34,"context_line":"                 id\u003dconfig.CONF.member_role_id,"},{"line_number":35,"context_line":"                 name\u003d\"Member_of_Project\","},{"line_number":36,"context_line":"                 extra\u003djson.dumps({\u0027description\u0027:"},{"line_number":37,"context_line":"                                   \u0027Default role for project membership\u0027}))"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2B5i8%3D","line":35,"in_reply_to":"AAAAM3%2F%2B6ow%3D","updated":"2013-02-15 14:01:39.000000000","message":"The role id has to be deterministic in order to have a functioning downgrade script.\nWhat if there is is a member role already, and they are using it for different semantics? \n\nIf there is a member role already, we don\u0027t want to remove it in the downgrade script.\n\nIf this process is not determined by preset values, we need to record the values used during the upgrade to figure out what to do during a downgrade.  That seems like madness.\n\nI will make the name of the field configurable, with a default to _member_.  We can document what an end user should be aware of on a migration if they want to use their own role name and id.","commit_id":"ffe7b4f98f1385975fe5407825533c24bcff341b"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"1bbd412ecb17728fce981b33915cceb4114c6401","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        if \u0027roles\u0027 in membership:"},{"line_number":82,"context_line":"            roles \u003d membership[\u0027roles\u0027]"},{"line_number":83,"context_line":"            if config.CONF.member_role_id in roles:"},{"line_number":84,"context_line":"                ins \u003d user_project_membership_table.insert().\\"},{"line_number":85,"context_line":"                    values(user_id\u003dmembership.user_id,"},{"line_number":86,"context_line":"                           project_id\u003dmembership.project_id)"},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2B6og%3D","line":84,"updated":"2013-02-14 16:45:53.000000000","message":"HACKING - backslash continuation","commit_id":"ffe7b4f98f1385975fe5407825533c24bcff341b"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"b1679a74e695a96189a88265311df4e5d23030ab","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        if \u0027roles\u0027 in membership:"},{"line_number":82,"context_line":"            roles \u003d membership[\u0027roles\u0027]"},{"line_number":83,"context_line":"            if config.CONF.member_role_id in roles:"},{"line_number":84,"context_line":"                ins \u003d user_project_membership_table.insert().\\"},{"line_number":85,"context_line":"                    values(user_id\u003dmembership.user_id,"},{"line_number":86,"context_line":"                           project_id\u003dmembership.project_id)"},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2B5ik%3D","line":84,"in_reply_to":"AAAAM3%2F%2B6og%3D","updated":"2013-02-15 14:01:39.000000000","message":"Done","commit_id":"ffe7b4f98f1385975fe5407825533c24bcff341b"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"92fd214bd9740fb2c65a752d5f6db0a491abc024","unresolved":false,"context_lines":[{"line_number":2,"context_line":"import sqlalchemy as sql"},{"line_number":3,"context_line":"from sqlalchemy import orm"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"import uuid"},{"line_number":6,"context_line":"from keystone import config"},{"line_number":7,"context_line":"from keystone import exception"},{"line_number":8,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAM3%2F%2B0qk%3D","line":5,"updated":"2013-02-18 15:45:20.000000000","message":"clean up imports\n\n  import stdlib\n\n  import libs\n\n  import local","commit_id":"331ad426ccd62bc491059643cd6f92dc4b5e6be9"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"57326a347f7ba3b6b9c5bd99b835e10bcf65dddd","unresolved":false,"context_lines":[{"line_number":2,"context_line":"import sqlalchemy as sql"},{"line_number":3,"context_line":"from sqlalchemy import orm"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"import uuid"},{"line_number":6,"context_line":"from keystone import config"},{"line_number":7,"context_line":"from keystone import exception"},{"line_number":8,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAM3%2F%2B0lM%3D","line":5,"in_reply_to":"AAAAM3%2F%2B0qk%3D","updated":"2013-02-18 16:02:51.000000000","message":"Done","commit_id":"331ad426ccd62bc491059643cd6f92dc4b5e6be9"}],"keystone/config.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e349ab871c732056f67b0cc21e208b9a89abff00","unresolved":false,"context_lines":[{"line_number":145,"context_line":"# we allow tokens to be a bit larger to accomidate PKI"},{"line_number":146,"context_line":"register_int(\u0027max_token_size\u0027, default\u003d8192)"},{"line_number":147,"context_line":"register_str(\u0027member_role_uuid\u0027, "},{"line_number":148,"context_line":"             default\u003d\u00279fe2ff9ee4384b1894a90878d3e92bab\u0027)"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"# identity"},{"line_number":151,"context_line":"register_str(\u0027default_domain_id\u0027, group\u003d\u0027identity\u0027, default\u003d\u0027default\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2FHv0%3D","line":148,"updated":"2013-02-06 16:22:06.000000000","message":"change this to `member_role_id`, as there\u0027s no specific reason why it can\u0027t be set to a non-uuid","commit_id":"d86f2a5d9b5066905d463a23a6984a7f3ef15803"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"323a76861a0a27ffd7ad3a81226fd517a4a2425f","unresolved":false,"context_lines":[{"line_number":145,"context_line":"# we allow tokens to be a bit larger to accomidate PKI"},{"line_number":146,"context_line":"register_int(\u0027max_token_size\u0027, default\u003d8192)"},{"line_number":147,"context_line":"register_str(\u0027member_role_uuid\u0027, "},{"line_number":148,"context_line":"             default\u003d\u00279fe2ff9ee4384b1894a90878d3e92bab\u0027)"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"# identity"},{"line_number":151,"context_line":"register_str(\u0027default_domain_id\u0027, group\u003d\u0027identity\u0027, default\u003d\u0027default\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2FHP4%3D","line":148,"in_reply_to":"AAAAM3%2F%2FHv0%3D","updated":"2013-02-06 20:29:55.000000000","message":"Done","commit_id":"d86f2a5d9b5066905d463a23a6984a7f3ef15803"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"a3d74dc35419bb0ae3c627822f7fb3e337ec47db","unresolved":false,"context_lines":[{"line_number":145,"context_line":"# we allow tokens to be a bit larger to accomidate PKI"},{"line_number":146,"context_line":"register_int(\u0027max_token_size\u0027, default\u003d8192)"},{"line_number":147,"context_line":"register_str(\u0027member_role_id\u0027,"},{"line_number":148,"context_line":"             default\u003d\u00279fe2ff9ee4384b1894a90878d3e92bab\u0027)"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"# identity"},{"line_number":151,"context_line":"register_str(\u0027default_domain_id\u0027, group\u003d\u0027identity\u0027, default\u003d\u0027default\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2FBBM%3D","line":148,"updated":"2013-02-11 16:55:21.000000000","message":"still torn on whether we should do something like this, or default to \u0027member\u0027, and let the migration fail if such a role already exists. i don\u0027t think either solution is ideal","commit_id":"6c427f8d3c5ddf31f2009e0a2d8c41cbd1452e46"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"d8fbb65ef371abf7d2c2cecd3372e363a52edd72","unresolved":false,"context_lines":[{"line_number":145,"context_line":"# we allow tokens to be a bit larger to accomidate PKI"},{"line_number":146,"context_line":"register_int(\u0027max_token_size\u0027, default\u003d8192)"},{"line_number":147,"context_line":"register_str(\u0027member_role_id\u0027,"},{"line_number":148,"context_line":"             default\u003d\u00279fe2ff9ee4384b1894a90878d3e92bab\u0027)"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"# identity"},{"line_number":151,"context_line":"register_str(\u0027default_domain_id\u0027, group\u003d\u0027identity\u0027, default\u003d\u0027default\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2B7iI%3D","line":148,"in_reply_to":"AAAAM3%2F%2FBBM%3D","updated":"2013-02-14 03:03:08.000000000","message":"Lets keep this for now.  It is the less risky way to go.  I just wonder if this should be hard coded into the scripts,as we don\u0027t really want people changing it.","commit_id":"6c427f8d3c5ddf31f2009e0a2d8c41cbd1452e46"},{"author":{"_account_id":6,"name":"Joe Heck","email":"heckj@mac.com","username":"heckj"},"change_message_id":"8bd6be4d51419b0e1e4a0268dea0b2fbc0b743cb","unresolved":false,"context_lines":[{"line_number":196,"context_line":"# we allow tokens to be a bit larger to accommodate PKI"},{"line_number":197,"context_line":"register_int(\u0027max_token_size\u0027, default\u003d8192)"},{"line_number":198,"context_line":"register_str(\u0027member_role_id\u0027,"},{"line_number":199,"context_line":"             default\u003d\u00279fe2ff9ee4384b1894a90878d3e92bab\u0027)"},{"line_number":200,"context_line":"register_str(\u0027member_role_name\u0027, default\u003d\u0027_member_\u0027)"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAM3%2F%2B3gg%3D","line":199,"updated":"2013-02-16 00:41:49.000000000","message":"this is sort of a bizarre, arbitrary UUID to include as a default. Why are we including this as a config option instead of looking up the \"member_role_name\" defined role name and using that?","commit_id":"b79bf9fdf0afacf948a525192577eb8128e82eb9"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"d582a00926cb8892e02259f32fda60ec5725e168","unresolved":false,"context_lines":[{"line_number":196,"context_line":"# we allow tokens to be a bit larger to accommodate PKI"},{"line_number":197,"context_line":"register_int(\u0027max_token_size\u0027, default\u003d8192)"},{"line_number":198,"context_line":"register_str(\u0027member_role_id\u0027,"},{"line_number":199,"context_line":"             default\u003d\u00279fe2ff9ee4384b1894a90878d3e92bab\u0027)"},{"line_number":200,"context_line":"register_str(\u0027member_role_name\u0027, default\u003d\u0027_member_\u0027)"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAM3%2F%2B3TU%3D","line":199,"in_reply_to":"AAAAM3%2F%2B3gg%3D","updated":"2013-02-16 02:54:17.000000000","message":"Lots of discussion on this point.  The short of it is that we don\u0027t want to conflict with what users might have used in the past, as we won\u0027t be able to run the sql downgrade scripts without doing some sort of damage.  Either we will remove more or less in certain circumstances.  This is neutral, a trifle ugly, but understandable. It is also configurable.","commit_id":"b79bf9fdf0afacf948a525192577eb8128e82eb9"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"92fd214bd9740fb2c65a752d5f6db0a491abc024","unresolved":false,"context_lines":[{"line_number":195,"context_line":"register_int(\u0027max_token_size\u0027, default\u003d8192)"},{"line_number":196,"context_line":"register_str(\u0027member_role_id\u0027,"},{"line_number":197,"context_line":"             default\u003d\u00279fe2ff9ee4384b1894a90878d3e92bab\u0027)"},{"line_number":198,"context_line":"register_str(\u0027member_role_name\u0027, default\u003d\u0027_member_\u0027)"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"# identity"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAM3%2F%2B0mo%3D","line":198,"updated":"2013-02-18 15:45:20.000000000","message":"need to revise keystone.conf.sample to document these.\n\ni\u0027m also worried about the case where a user sets one of these but not the other, or sets them both to valid values referring to different roles. thoughts? if nothing else, it need to have very strong wording in the docs","commit_id":"331ad426ccd62bc491059643cd6f92dc4b5e6be9"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"57326a347f7ba3b6b9c5bd99b835e10bcf65dddd","unresolved":false,"context_lines":[{"line_number":195,"context_line":"register_int(\u0027max_token_size\u0027, default\u003d8192)"},{"line_number":196,"context_line":"register_str(\u0027member_role_id\u0027,"},{"line_number":197,"context_line":"             default\u003d\u00279fe2ff9ee4384b1894a90878d3e92bab\u0027)"},{"line_number":198,"context_line":"register_str(\u0027member_role_name\u0027, default\u003d\u0027_member_\u0027)"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"# identity"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAM3%2F%2B0lE%3D","line":198,"in_reply_to":"AAAAM3%2F%2B0mo%3D","updated":"2013-02-18 16:02:51.000000000","message":"Before migrate: Role name is unique, and should fail upon the inser of a duplicate name.  \nAfter migrate: Only the member role ID field will take effect.  User will be confused, but they will have done it to themselves.  No permanent damage will havebeen done.","commit_id":"331ad426ccd62bc491059643cd6f92dc4b5e6be9"}],"keystone/identity/backends/kvs.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"a3d74dc35419bb0ae3c627822f7fb3e337ec47db","unresolved":false,"context_lines":[{"line_number":137,"context_line":"            tenants.remove(tenant_id)"},{"line_number":138,"context_line":"        except KeyError:"},{"line_number":139,"context_line":"            raise exception.NotFound(\u0027User not found in tenant\u0027)"},{"line_number":140,"context_line":"        self.update_user(user_id, {\u0027tenants\u0027: list(tenants)})"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    def get_projects_for_user(self, user_id):"},{"line_number":143,"context_line":"        user_ref \u003d self._get_user(user_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2FBBA%3D","side":"PARENT","line":140,"updated":"2013-02-11 16:55:21.000000000","message":"yay!","commit_id":"0bd114acae68d3ff8e28e6eb73ae2e35080c8fa6"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"a3d74dc35419bb0ae3c627822f7fb3e337ec47db","unresolved":false,"context_lines":[{"line_number":333,"context_line":"            self.db.set(\u0027metadata-%s-%s\u0027 % (tenant_id, user_id), metadata)"},{"line_number":334,"context_line":"            user_ref \u003d self._get_user(user_id)"},{"line_number":335,"context_line":"            tenants \u003d set(user_ref.get(\u0027tenants\u0027, []))"},{"line_number":336,"context_line":"            if not tenants.__contains__(tenant_id):"},{"line_number":337,"context_line":"                tenants.add(tenant_id)"},{"line_number":338,"context_line":"                user_ref[\u0027tenants\u0027] \u003d list(tenants)"},{"line_number":339,"context_line":"                self.update_user(user_id, user_ref)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2FBA4%3D","line":336,"updated":"2013-02-11 16:55:21.000000000","message":"same as below","commit_id":"6c427f8d3c5ddf31f2009e0a2d8c41cbd1452e46"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"d8fbb65ef371abf7d2c2cecd3372e363a52edd72","unresolved":false,"context_lines":[{"line_number":333,"context_line":"            self.db.set(\u0027metadata-%s-%s\u0027 % (tenant_id, user_id), metadata)"},{"line_number":334,"context_line":"            user_ref \u003d self._get_user(user_id)"},{"line_number":335,"context_line":"            tenants \u003d set(user_ref.get(\u0027tenants\u0027, []))"},{"line_number":336,"context_line":"            if not tenants.__contains__(tenant_id):"},{"line_number":337,"context_line":"                tenants.add(tenant_id)"},{"line_number":338,"context_line":"                user_ref[\u0027tenants\u0027] \u003d list(tenants)"},{"line_number":339,"context_line":"                self.update_user(user_id, user_ref)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2B7eE%3D","line":336,"in_reply_to":"AAAAM3%2F%2FBA4%3D","updated":"2013-02-14 03:03:08.000000000","message":"Henry\u0027s change made this superfluous.","commit_id":"6c427f8d3c5ddf31f2009e0a2d8c41cbd1452e46"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"a3d74dc35419bb0ae3c627822f7fb3e337ec47db","unresolved":false,"context_lines":[{"line_number":347,"context_line":"            self.db.set(\u0027metadata-%s-%s\u0027 % (tenant_id, user_id), metadata)"},{"line_number":348,"context_line":"            user_ref \u003d self._get_user(user_id)"},{"line_number":349,"context_line":"            tenants \u003d set(user_ref.get(\u0027tenants\u0027, []))"},{"line_number":350,"context_line":"            if not tenants.__contains__(tenant_id):"},{"line_number":351,"context_line":"                tenants.add(tenant_id)"},{"line_number":352,"context_line":"                user_ref[\u0027tenants\u0027] \u003d list(tenants)"},{"line_number":353,"context_line":"                self.update_user(user_id, user_ref)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2FBA8%3D","line":350,"updated":"2013-02-11 16:55:21.000000000","message":"? don\u0027t call __contains__ directly\n\n  if tenant_id not in tenants:","commit_id":"6c427f8d3c5ddf31f2009e0a2d8c41cbd1452e46"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"d8fbb65ef371abf7d2c2cecd3372e363a52edd72","unresolved":false,"context_lines":[{"line_number":347,"context_line":"            self.db.set(\u0027metadata-%s-%s\u0027 % (tenant_id, user_id), metadata)"},{"line_number":348,"context_line":"            user_ref \u003d self._get_user(user_id)"},{"line_number":349,"context_line":"            tenants \u003d set(user_ref.get(\u0027tenants\u0027, []))"},{"line_number":350,"context_line":"            if not tenants.__contains__(tenant_id):"},{"line_number":351,"context_line":"                tenants.add(tenant_id)"},{"line_number":352,"context_line":"                user_ref[\u0027tenants\u0027] \u003d list(tenants)"},{"line_number":353,"context_line":"                self.update_user(user_id, user_ref)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2B7eQ%3D","line":350,"in_reply_to":"AAAAM3%2F%2FBA8%3D","updated":"2013-02-14 03:03:08.000000000","message":"Done","commit_id":"6c427f8d3c5ddf31f2009e0a2d8c41cbd1452e46"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"1bbd412ecb17728fce981b33915cceb4114c6401","unresolved":false,"context_lines":[{"line_number":148,"context_line":"            tenants.remove(tenant_id)"},{"line_number":149,"context_line":"        except KeyError:"},{"line_number":150,"context_line":"            raise exception.NotFound(\u0027User not found in tenant\u0027)"},{"line_number":151,"context_line":"        self.update_user(user_id, {\u0027tenants\u0027: list(tenants)})"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    def get_projects_for_user(self, user_id):"},{"line_number":154,"context_line":"        user_ref \u003d self._get_user(user_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2B6n0%3D","side":"PARENT","line":151,"updated":"2013-02-14 16:45:53.000000000","message":"this makes me happy every time i see it","commit_id":"fc9ded38d93c6c91faf47de7881d5c528b0ee3fc"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"1bbd412ecb17728fce981b33915cceb4114c6401","unresolved":false,"context_lines":[{"line_number":175,"context_line":"        roles.remove(role_id)"},{"line_number":176,"context_line":"        metadata_ref[\u0027roles\u0027] \u003d list(roles)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"        if (len(roles) \u003d\u003d 0):"},{"line_number":179,"context_line":"            self.db.delete(\u0027metadata-%s-%s\u0027 % (tenant_id, user_id))"},{"line_number":180,"context_line":"            user_ref \u003d self._get_user(user_id)"},{"line_number":181,"context_line":"            tenants \u003d set(user_ref.get(\u0027tenants\u0027, []))"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2B6oQ%3D","line":178,"updated":"2013-02-14 16:45:53.000000000","message":"if not len(roles):","commit_id":"ffe7b4f98f1385975fe5407825533c24bcff341b"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"b1679a74e695a96189a88265311df4e5d23030ab","unresolved":false,"context_lines":[{"line_number":175,"context_line":"        roles.remove(role_id)"},{"line_number":176,"context_line":"        metadata_ref[\u0027roles\u0027] \u003d list(roles)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"        if (len(roles) \u003d\u003d 0):"},{"line_number":179,"context_line":"            self.db.delete(\u0027metadata-%s-%s\u0027 % (tenant_id, user_id))"},{"line_number":180,"context_line":"            user_ref \u003d self._get_user(user_id)"},{"line_number":181,"context_line":"            tenants \u003d set(user_ref.get(\u0027tenants\u0027, []))"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2B5h4%3D","line":178,"in_reply_to":"AAAAM3%2F%2B6oQ%3D","updated":"2013-02-15 14:01:39.000000000","message":"Done","commit_id":"ffe7b4f98f1385975fe5407825533c24bcff341b"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"1bbd412ecb17728fce981b33915cceb4114c6401","unresolved":false,"context_lines":[{"line_number":351,"context_line":"                self.db.set(\u0027metadata-%s-%s\u0027 % (tenant_id, user_id), metadata)"},{"line_number":352,"context_line":"                user_ref \u003d self._get_user(user_id)"},{"line_number":353,"context_line":"                tenants \u003d set(user_ref.get(\u0027tenants\u0027, []))"},{"line_number":354,"context_line":"                if not tenant_id in tenants:"},{"line_number":355,"context_line":"                    tenants.add(tenant_id)"},{"line_number":356,"context_line":"                    user_ref[\u0027tenants\u0027] \u003d list(tenants)"},{"line_number":357,"context_line":"                    self.update_user(user_id, user_ref)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2B6oI%3D","line":354,"updated":"2013-02-14 16:45:53.000000000","message":"HACKING:\n\n  if tenant_id not in tenants:","commit_id":"ffe7b4f98f1385975fe5407825533c24bcff341b"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"b1679a74e695a96189a88265311df4e5d23030ab","unresolved":false,"context_lines":[{"line_number":351,"context_line":"                self.db.set(\u0027metadata-%s-%s\u0027 % (tenant_id, user_id), metadata)"},{"line_number":352,"context_line":"                user_ref \u003d self._get_user(user_id)"},{"line_number":353,"context_line":"                tenants \u003d set(user_ref.get(\u0027tenants\u0027, []))"},{"line_number":354,"context_line":"                if not tenant_id in tenants:"},{"line_number":355,"context_line":"                    tenants.add(tenant_id)"},{"line_number":356,"context_line":"                    user_ref[\u0027tenants\u0027] \u003d list(tenants)"},{"line_number":357,"context_line":"                    self.update_user(user_id, user_ref)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2B5h0%3D","line":354,"in_reply_to":"AAAAM3%2F%2B6oI%3D","updated":"2013-02-15 14:01:39.000000000","message":"Done","commit_id":"ffe7b4f98f1385975fe5407825533c24bcff341b"}],"keystone/identity/backends/ldap/core.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e349ab871c732056f67b0cc21e208b9a89abff00","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        tenant_list \u003d []"},{"line_number":154,"context_line":"        for tenant in self.project.get_user_projects(user_id):"},{"line_number":155,"context_line":"            tenant_list.append(tenant)"},{"line_number":156,"context_line":"        return tenant_list"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def get_project_users(self, tenant_id):"},{"line_number":159,"context_line":"        self.get_project(tenant_id)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2FHvo%3D","line":156,"updated":"2013-02-06 16:22:06.000000000","message":"after this change, why not just return self.project.get_user_projects(user_id)?","commit_id":"d86f2a5d9b5066905d463a23a6984a7f3ef15803"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"323a76861a0a27ffd7ad3a81226fd517a4a2425f","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        tenant_list \u003d []"},{"line_number":154,"context_line":"        for tenant in self.project.get_user_projects(user_id):"},{"line_number":155,"context_line":"            tenant_list.append(tenant)"},{"line_number":156,"context_line":"        return tenant_list"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def get_project_users(self, tenant_id):"},{"line_number":159,"context_line":"        self.get_project(tenant_id)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2FHPM%3D","line":156,"in_reply_to":"AAAAM3%2F%2FHvo%3D","updated":"2013-02-06 20:29:55.000000000","message":"Done","commit_id":"d86f2a5d9b5066905d463a23a6984a7f3ef15803"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e349ab871c732056f67b0cc21e208b9a89abff00","unresolved":false,"context_lines":[{"line_number":549,"context_line":"        memberships \u003d set()"},{"line_number":550,"context_line":"        for assoc in associations:"},{"line_number":551,"context_line":"            memberships.add(assoc.project_id)"},{"line_number":552,"context_line":"        return list(memberships)"},{"line_number":553,"context_line":""},{"line_number":554,"context_line":"    def list_for_user_get_page(self, user, marker, limit):"},{"line_number":555,"context_line":"        return self._get_page(marker,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2FHvI%3D","line":552,"updated":"2013-02-06 16:22:06.000000000","message":"cool","commit_id":"d86f2a5d9b5066905d463a23a6984a7f3ef15803"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"a3d74dc35419bb0ae3c627822f7fb3e337ec47db","unresolved":false,"context_lines":[{"line_number":543,"context_line":"        memberships \u003d set()"},{"line_number":544,"context_line":"        for assoc in associations:"},{"line_number":545,"context_line":"            memberships.add(assoc.project_id)"},{"line_number":546,"context_line":"        return list(memberships)"},{"line_number":547,"context_line":""},{"line_number":548,"context_line":"    def list_for_user_get_page(self, user, marker, limit):"},{"line_number":549,"context_line":"        return self._get_page(marker,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2FA8M%3D","line":546,"updated":"2013-02-11 16:55:21.000000000","message":"is this supposed to return a list of projects or project_id\u0027s?","commit_id":"6c427f8d3c5ddf31f2009e0a2d8c41cbd1452e46"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"d8fbb65ef371abf7d2c2cecd3372e363a52edd72","unresolved":false,"context_lines":[{"line_number":543,"context_line":"        memberships \u003d set()"},{"line_number":544,"context_line":"        for assoc in associations:"},{"line_number":545,"context_line":"            memberships.add(assoc.project_id)"},{"line_number":546,"context_line":"        return list(memberships)"},{"line_number":547,"context_line":""},{"line_number":548,"context_line":"    def list_for_user_get_page(self, user, marker, limit):"},{"line_number":549,"context_line":"        return self._get_page(marker,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2B7d4%3D","line":546,"in_reply_to":"AAAAM3%2F%2FA8M%3D","updated":"2013-02-14 03:03:08.000000000","message":"project_ids.  Will change variable name to make that clearer.","commit_id":"6c427f8d3c5ddf31f2009e0a2d8c41cbd1452e46"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"1bbd412ecb17728fce981b33915cceb4114c6401","unresolved":false,"context_lines":[{"line_number":547,"context_line":"        projects \u003d []"},{"line_number":548,"context_line":"        for project_id in project_ids:"},{"line_number":549,"context_line":"            #slower to get them one at a time, but a huge list could blow out"},{"line_number":550,"context_line":"            #the connection.  This is the safer way"},{"line_number":551,"context_line":"            projects.append(self.get(project_id))"},{"line_number":552,"context_line":"        return projects"},{"line_number":553,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2B6lo%3D","line":550,"updated":"2013-02-14 16:45:53.000000000","message":"Jose addressed this in another patch -- adding a configurable limit to the number of entities per list operation. I assume this would be a *really* slow operation as-is","commit_id":"ffe7b4f98f1385975fe5407825533c24bcff341b"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"b1679a74e695a96189a88265311df4e5d23030ab","unresolved":false,"context_lines":[{"line_number":547,"context_line":"        projects \u003d []"},{"line_number":548,"context_line":"        for project_id in project_ids:"},{"line_number":549,"context_line":"            #slower to get them one at a time, but a huge list could blow out"},{"line_number":550,"context_line":"            #the connection.  This is the safer way"},{"line_number":551,"context_line":"            projects.append(self.get(project_id))"},{"line_number":552,"context_line":"        return projects"},{"line_number":553,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2B5f4%3D","line":550,"in_reply_to":"AAAAM3%2F%2B6lo%3D","updated":"2013-02-15 14:01:39.000000000","message":"Shouldn\u0027t actually be that bad in the normal case, one request per item.  It will only be really slow if the user is in a lot of projects, which is the case we want to watch out for.  Is Jose\u0027s patch actually submitted?  If not, we can add this to that patch.","commit_id":"ffe7b4f98f1385975fe5407825533c24bcff341b"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"92fd214bd9740fb2c65a752d5f6db0a491abc024","unresolved":false,"context_lines":[{"line_number":544,"context_line":"        associations \u003d self.role_api.list_project_roles_for_user(user_id)"},{"line_number":545,"context_line":"        project_ids \u003d set()"},{"line_number":546,"context_line":"        for assoc in associations:"},{"line_number":547,"context_line":"            project_ids.add(assoc.project_id)"},{"line_number":548,"context_line":"        projects \u003d []"},{"line_number":549,"context_line":"        for project_id in project_ids:"},{"line_number":550,"context_line":"            #slower to get them one at a time, but a huge list could blow out"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAM3%2F%2B0nY%3D","line":547,"updated":"2013-02-18 15:45:20.000000000","message":"if you want to, you could reduce this to a comprehension:\n\n  for project_id in set(a.project_id for a in associations):","commit_id":"331ad426ccd62bc491059643cd6f92dc4b5e6be9"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"57326a347f7ba3b6b9c5bd99b835e10bcf65dddd","unresolved":false,"context_lines":[{"line_number":544,"context_line":"        associations \u003d self.role_api.list_project_roles_for_user(user_id)"},{"line_number":545,"context_line":"        project_ids \u003d set()"},{"line_number":546,"context_line":"        for assoc in associations:"},{"line_number":547,"context_line":"            project_ids.add(assoc.project_id)"},{"line_number":548,"context_line":"        projects \u003d []"},{"line_number":549,"context_line":"        for project_id in project_ids:"},{"line_number":550,"context_line":"            #slower to get them one at a time, but a huge list could blow out"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAM3%2F%2B0k8%3D","line":547,"in_reply_to":"AAAAM3%2F%2B0nY%3D","updated":"2013-02-18 16:02:51.000000000","message":"I\u0027ve read that three times and it doesn\u0027t parse immediately.  I realize python lets you do things like that, but I don\u0027t particularly find them more readable.","commit_id":"331ad426ccd62bc491059643cd6f92dc4b5e6be9"}],"keystone/identity/backends/sql.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e349ab871c732056f67b0cc21e208b9a89abff00","unresolved":false,"context_lines":[{"line_number":79,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"# TODO(dolph): rename to Project"},{"line_number":83,"context_line":"class Project(sql.ModelBase, sql.DictBase):"},{"line_number":84,"context_line":"    __tablename__ \u003d \u0027project\u0027"},{"line_number":85,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027name\u0027]"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2FHvE%3D","side":"PARENT","line":82,"updated":"2013-02-06 16:22:06.000000000","message":"thanks","commit_id":"8ec247bf61be0e487332d5d891246d2b7b606989"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"a3d74dc35419bb0ae3c627822f7fb3e337ec47db","unresolved":false,"context_lines":[{"line_number":408,"context_line":"            metadata_ref \u003d self.get_metadata(user_id, tenant_id)"},{"line_number":409,"context_line":"            roles \u003d set(metadata_ref.get(\u0027roles\u0027, []))"},{"line_number":410,"context_line":"            if role_id not in roles:"},{"line_number":411,"context_line":"                msg \u003d \u0027Cannot remove role that has not been granted, %s\u0027 %\\"},{"line_number":412,"context_line":"                    role_id"},{"line_number":413,"context_line":"                raise exception.RoleNotFound(message\u003dmsg)"},{"line_number":414,"context_line":"            roles.remove(role_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2FA7s%3D","line":411,"updated":"2013-02-11 16:55:21.000000000","message":"_()","commit_id":"6c427f8d3c5ddf31f2009e0a2d8c41cbd1452e46"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"a3d74dc35419bb0ae3c627822f7fb3e337ec47db","unresolved":false,"context_lines":[{"line_number":419,"context_line":"                session \u003d self.get_session()"},{"line_number":420,"context_line":"                q \u003d session.query(UserProjectGrant)"},{"line_number":421,"context_line":"                q \u003d q.filter_by(project_id\u003dtenant_id)"},{"line_number":422,"context_line":"                q.delete()"},{"line_number":423,"context_line":"        except exception.MetadataNotFound:"},{"line_number":424,"context_line":"            msg \u003d \u0027Cannot remove role that has not been granted, %s\u0027 % role_id"},{"line_number":425,"context_line":"            raise exception.RoleNotFound(message\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2FA7k%3D","line":422,"updated":"2013-02-11 16:55:21.000000000","message":"this will delete all roles, not just the specified one","commit_id":"6c427f8d3c5ddf31f2009e0a2d8c41cbd1452e46"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"d8fbb65ef371abf7d2c2cecd3372e363a52edd72","unresolved":false,"context_lines":[{"line_number":419,"context_line":"                session \u003d self.get_session()"},{"line_number":420,"context_line":"                q \u003d session.query(UserProjectGrant)"},{"line_number":421,"context_line":"                q \u003d q.filter_by(project_id\u003dtenant_id)"},{"line_number":422,"context_line":"                q.delete()"},{"line_number":423,"context_line":"        except exception.MetadataNotFound:"},{"line_number":424,"context_line":"            msg \u003d \u0027Cannot remove role that has not been granted, %s\u0027 % role_id"},{"line_number":425,"context_line":"            raise exception.RoleNotFound(message\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2B7dI%3D","line":422,"in_reply_to":"AAAAM3%2F%2FA7k%3D","updated":"2013-02-14 03:03:08.000000000","message":"That is correct.  The number of roles left in this project is 0 (tested line 416), so we delete the grant.","commit_id":"6c427f8d3c5ddf31f2009e0a2d8c41cbd1452e46"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"1bbd412ecb17728fce981b33915cceb4114c6401","unresolved":false,"context_lines":[{"line_number":114,"context_line":""},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"class UserProjectGrant(sql.ModelBase, BaseGrant):"},{"line_number":117,"context_line":"    # TODO(dolph): rename to user_project_metadata (needs a migration)"},{"line_number":118,"context_line":"    __tablename__ \u003d \u0027metadata\u0027"},{"line_number":119,"context_line":"    user_id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":120,"context_line":"    # TODO(dolph): rename to project_id (needs a migration)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2B6lY%3D","side":"PARENT","line":117,"updated":"2013-02-14 16:45:53.000000000","message":"yay","commit_id":"fc9ded38d93c6c91faf47de7881d5c528b0ee3fc"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"1bbd412ecb17728fce981b33915cceb4114c6401","unresolved":false,"context_lines":[{"line_number":422,"context_line":"                raise exception.RoleNotFound(message\u003dmsg)"},{"line_number":423,"context_line":"            roles.remove(role_id)"},{"line_number":424,"context_line":"            metadata_ref[\u0027roles\u0027] \u003d list(roles)"},{"line_number":425,"context_line":"            if (len(roles) \u003e 0):"},{"line_number":426,"context_line":"                self.update_metadata(user_id, tenant_id, metadata_ref)"},{"line_number":427,"context_line":"            else:"},{"line_number":428,"context_line":"                session \u003d self.get_session()"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2B6lA%3D","line":425,"updated":"2013-02-14 16:45:53.000000000","message":"simplify to:\n\n  if len(roles):","commit_id":"ffe7b4f98f1385975fe5407825533c24bcff341b"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"b1679a74e695a96189a88265311df4e5d23030ab","unresolved":false,"context_lines":[{"line_number":422,"context_line":"                raise exception.RoleNotFound(message\u003dmsg)"},{"line_number":423,"context_line":"            roles.remove(role_id)"},{"line_number":424,"context_line":"            metadata_ref[\u0027roles\u0027] \u003d list(roles)"},{"line_number":425,"context_line":"            if (len(roles) \u003e 0):"},{"line_number":426,"context_line":"                self.update_metadata(user_id, tenant_id, metadata_ref)"},{"line_number":427,"context_line":"            else:"},{"line_number":428,"context_line":"                session \u003d self.get_session()"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2B5fs%3D","line":425,"in_reply_to":"AAAAM3%2F%2B6lA%3D","updated":"2013-02-15 14:01:39.000000000","message":"Done","commit_id":"ffe7b4f98f1385975fe5407825533c24bcff341b"}],"keystone/identity/controllers.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"a3d74dc35419bb0ae3c627822f7fb3e337ec47db","unresolved":false,"context_lines":[{"line_number":286,"context_line":""},{"line_number":287,"context_line":"        # This still has the weird legacy semantics that adding a role to"},{"line_number":288,"context_line":"        # a user also adds them to a tenant"},{"line_number":289,"context_line":"        #self.identity_api.add_user_to_project(context, tenant_id, user_id)"},{"line_number":290,"context_line":"        self.identity_api.add_role_to_user_and_project("},{"line_number":291,"context_line":"            context, user_id, tenant_id, role_id)"},{"line_number":292,"context_line":"        self.token_api.revoke_tokens(context, user_id, tenant_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2FA7Y%3D","line":289,"updated":"2013-02-11 16:55:21.000000000","message":"delete the line and above comment","commit_id":"6c427f8d3c5ddf31f2009e0a2d8c41cbd1452e46"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"d8fbb65ef371abf7d2c2cecd3372e363a52edd72","unresolved":false,"context_lines":[{"line_number":286,"context_line":""},{"line_number":287,"context_line":"        # This still has the weird legacy semantics that adding a role to"},{"line_number":288,"context_line":"        # a user also adds them to a tenant"},{"line_number":289,"context_line":"        #self.identity_api.add_user_to_project(context, tenant_id, user_id)"},{"line_number":290,"context_line":"        self.identity_api.add_role_to_user_and_project("},{"line_number":291,"context_line":"            context, user_id, tenant_id, role_id)"},{"line_number":292,"context_line":"        self.token_api.revoke_tokens(context, user_id, tenant_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2B7cs%3D","line":289,"in_reply_to":"AAAAM3%2F%2FA7Y%3D","updated":"2013-02-14 03:03:08.000000000","message":"Done.  Gladly.","commit_id":"6c427f8d3c5ddf31f2009e0a2d8c41cbd1452e46"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"1bbd412ecb17728fce981b33915cceb4114c6401","unresolved":false,"context_lines":[{"line_number":377,"context_line":"        role_id \u003d role.get(\u0027roleId\u0027)"},{"line_number":378,"context_line":"        self.identity_api.add_user_to_project(context, tenant_id, user_id)"},{"line_number":379,"context_line":"        self.identity_api.add_role_to_user_and_project("},{"line_number":380,"context_line":"            context, user_id, tenant_id, role_id)"},{"line_number":381,"context_line":"        self.token_api.revoke_tokens(context, user_id, tenant_id)"},{"line_number":382,"context_line":""},{"line_number":383,"context_line":"        role_ref \u003d self.identity_api.get_role(context, role_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2B6kk%3D","side":"PARENT","line":380,"updated":"2013-02-14 16:45:53.000000000","message":"I think you deleted the wrong one here? add_user_to_project should be removed, not add_role_*\n\ncan also remove termie\u0027s comment now?","commit_id":"fc9ded38d93c6c91faf47de7881d5c528b0ee3fc"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"b1679a74e695a96189a88265311df4e5d23030ab","unresolved":false,"context_lines":[{"line_number":377,"context_line":"        role_id \u003d role.get(\u0027roleId\u0027)"},{"line_number":378,"context_line":"        self.identity_api.add_user_to_project(context, tenant_id, user_id)"},{"line_number":379,"context_line":"        self.identity_api.add_role_to_user_and_project("},{"line_number":380,"context_line":"            context, user_id, tenant_id, role_id)"},{"line_number":381,"context_line":"        self.token_api.revoke_tokens(context, user_id, tenant_id)"},{"line_number":382,"context_line":""},{"line_number":383,"context_line":"        role_ref \u003d self.identity_api.get_role(context, role_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2B5e4%3D","side":"PARENT","line":380,"in_reply_to":"AAAAM3%2F%2B6kk%3D","updated":"2013-02-15 14:01:39.000000000","message":"Done:\n\nSince we were ignoring the actual role, they had the same effect.  We may well be able to get rid of add_user_to_project soon...","commit_id":"fc9ded38d93c6c91faf47de7881d5c528b0ee3fc"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"1bbd412ecb17728fce981b33915cceb4114c6401","unresolved":false,"context_lines":[{"line_number":398,"context_line":"            context, user_id, tenant_id)"},{"line_number":399,"context_line":"        if not roles:"},{"line_number":400,"context_line":"            try:"},{"line_number":401,"context_line":"                self.identity_api.remove_user_from_project("},{"line_number":402,"context_line":"                    context,"},{"line_number":403,"context_line":"                    tenant_id,"},{"line_number":404,"context_line":"                    user_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2B6kc%3D","line":401,"updated":"2013-02-14 16:45:53.000000000","message":"same as above, i thought all the calls without an explicit role reference could go away now","commit_id":"ffe7b4f98f1385975fe5407825533c24bcff341b"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"b1679a74e695a96189a88265311df4e5d23030ab","unresolved":false,"context_lines":[{"line_number":398,"context_line":"            context, user_id, tenant_id)"},{"line_number":399,"context_line":"        if not roles:"},{"line_number":400,"context_line":"            try:"},{"line_number":401,"context_line":"                self.identity_api.remove_user_from_project("},{"line_number":402,"context_line":"                    context,"},{"line_number":403,"context_line":"                    tenant_id,"},{"line_number":404,"context_line":"                    user_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2B5eY%3D","line":401,"in_reply_to":"AAAAM3%2F%2B6kc%3D","updated":"2013-02-15 14:01:39.000000000","message":"Done","commit_id":"ffe7b4f98f1385975fe5407825533c24bcff341b"}],"keystone/identity/core.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e349ab871c732056f67b0cc21e208b9a89abff00","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        \"\"\""},{"line_number":100,"context_line":"        raise exception.NotImplemented()"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def add_user_to_project(self, tenant_id, user_id):"},{"line_number":103,"context_line":"            \"\"\"Add user to a tenant without an explicit role relationship."},{"line_number":104,"context_line":"    "},{"line_number":105,"context_line":"            :raises: keystone.exception.ProjectNotFound,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2FHuc%3D","line":102,"updated":"2013-02-06 16:22:06.000000000","message":"can we not just remove this method?","commit_id":"d86f2a5d9b5066905d463a23a6984a7f3ef15803"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"323a76861a0a27ffd7ad3a81226fd517a4a2425f","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        \"\"\""},{"line_number":100,"context_line":"        raise exception.NotImplemented()"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def add_user_to_project(self, tenant_id, user_id):"},{"line_number":103,"context_line":"            \"\"\"Add user to a tenant without an explicit role relationship."},{"line_number":104,"context_line":"    "},{"line_number":105,"context_line":"            :raises: keystone.exception.ProjectNotFound,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2FHN8%3D","line":102,"in_reply_to":"AAAAM3%2F%2FHuc%3D","updated":"2013-02-06 20:29:55.000000000","message":"It seems to be used by the KCAdmin  controller.  We can remove the method, but would have to port the logic over there to keep it compat.  Future work.","commit_id":"d86f2a5d9b5066905d463a23a6984a7f3ef15803"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"a3d74dc35419bb0ae3c627822f7fb3e337ec47db","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        \"\"\""},{"line_number":100,"context_line":"        raise exception.NotImplemented()"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def add_user_to_project(self, tenant_id, user_id):"},{"line_number":103,"context_line":"            \"\"\"Add user to a tenant without an explicit role relationship."},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"            :raises: keystone.exception.ProjectNotFound,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2FA7E%3D","line":102,"updated":"2013-02-11 16:55:21.000000000","message":"just delete this function, it shouldn\u0027t be called","commit_id":"6c427f8d3c5ddf31f2009e0a2d8c41cbd1452e46"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"d8fbb65ef371abf7d2c2cecd3372e363a52edd72","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        \"\"\""},{"line_number":100,"context_line":"        raise exception.NotImplemented()"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def add_user_to_project(self, tenant_id, user_id):"},{"line_number":103,"context_line":"            \"\"\"Add user to a tenant without an explicit role relationship."},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"            :raises: keystone.exception.ProjectNotFound,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2B7cc%3D","line":102,"in_reply_to":"AAAAM3%2F%2FA7E%3D","updated":"2013-02-14 03:03:08.000000000","message":"Can\u0027t.  Logic for this is used in the Contrib code.  I\u0027d have to move it there. I\u0027d rather leave it here for now.","commit_id":"6c427f8d3c5ddf31f2009e0a2d8c41cbd1452e46"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"a3d74dc35419bb0ae3c627822f7fb3e337ec47db","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                                              tenant_id,"},{"line_number":121,"context_line":"                                              config.CONF.member_role_id)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def remove_user_from_project(self, tenant_id, user_id):"},{"line_number":124,"context_line":"        \"\"\"Remove user from a tenant"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        :raises: keystone.exception.ProjectNotFound,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2FA7A%3D","line":123,"updated":"2013-02-11 16:55:21.000000000","message":"delete this one too","commit_id":"6c427f8d3c5ddf31f2009e0a2d8c41cbd1452e46"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"d8fbb65ef371abf7d2c2cecd3372e363a52edd72","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                                              tenant_id,"},{"line_number":121,"context_line":"                                              config.CONF.member_role_id)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def remove_user_from_project(self, tenant_id, user_id):"},{"line_number":124,"context_line":"        \"\"\"Remove user from a tenant"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        :raises: keystone.exception.ProjectNotFound,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2B7cY%3D","line":123,"in_reply_to":"AAAAM3%2F%2FA7A%3D","updated":"2013-02-14 03:03:08.000000000","message":"Same as above","commit_id":"6c427f8d3c5ddf31f2009e0a2d8c41cbd1452e46"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"c9f3822b971aa46409ef50fe2b23231425b756c6","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        if not roles:"},{"line_number":132,"context_line":"            raise exception.NotFound(tenant_id)"},{"line_number":133,"context_line":"        for role_id in roles:"},{"line_number":134,"context_line":"            self.remove_role_from_user_and_project(user_id, tenant_id, role_id)"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    def get_all_projects(self):"},{"line_number":137,"context_line":"        \"\"\"FIXME(dolph): Lists all tenants in the system? I\u0027m not sure how this"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2FBfU%3D","line":134,"updated":"2013-02-11 11:06:43.000000000","message":"Although I think this is OK, is this meant to be a subtle change in what this function did when it was in the backends?  The flow seemed to originally be (e.g. in remove_role_from_user and delete_role_ref in the controller):\n\nIf no roles left for user in the project then\n    call remove_user_from_project()\n\n...and remove_user_from_project() would just delete the user-project membership entry.  In this version, remove_user_from_project() will delete all the roles, not just the one mirroring user-project membership","commit_id":"6c427f8d3c5ddf31f2009e0a2d8c41cbd1452e46"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"d8fbb65ef371abf7d2c2cecd3372e363a52edd72","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        if not roles:"},{"line_number":132,"context_line":"            raise exception.NotFound(tenant_id)"},{"line_number":133,"context_line":"        for role_id in roles:"},{"line_number":134,"context_line":"            self.remove_role_from_user_and_project(user_id, tenant_id, role_id)"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    def get_all_projects(self):"},{"line_number":137,"context_line":"        \"\"\"FIXME(dolph): Lists all tenants in the system? I\u0027m not sure how this"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2B7cU%3D","line":134,"in_reply_to":"AAAAM3%2F%2FBfU%3D","updated":"2013-02-14 03:03:08.000000000","message":"Yep, that is correct.  There is no \"membership\" any more, only role assignment.","commit_id":"6c427f8d3c5ddf31f2009e0a2d8c41cbd1452e46"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"1bbd412ecb17728fce981b33915cceb4114c6401","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        \"\"\""},{"line_number":102,"context_line":"        raise exception.NotImplemented()"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def add_user_to_project(self, tenant_id, user_id):"},{"line_number":105,"context_line":"            \"\"\"Add user to a tenant without an explicit role relationship."},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"            :raises: keystone.exception.ProjectNotFound,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2B6kM%3D","line":104,"updated":"2013-02-14 16:45:53.000000000","message":"I think this entire method can be removed from the driver interface","commit_id":"ffe7b4f98f1385975fe5407825533c24bcff341b"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"b1679a74e695a96189a88265311df4e5d23030ab","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        \"\"\""},{"line_number":102,"context_line":"        raise exception.NotImplemented()"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def add_user_to_project(self, tenant_id, user_id):"},{"line_number":105,"context_line":"            \"\"\"Add user to a tenant without an explicit role relationship."},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"            :raises: keystone.exception.ProjectNotFound,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2B5cM%3D","line":104,"in_reply_to":"AAAAM3%2F%2B6kM%3D","updated":"2013-02-15 14:01:39.000000000","message":"it is currently called by\nkeystone/common/sql/nova.py:89:\nkeystone/common/sql/legacy.py:135:\nkeystone/common/sql/legacy.py:161:\nkeystone/identity/controllers.py:209:\nkeystone/identity/controllers.py:245:\n\nAnd we shouldn\u0027t duplicate the logic of the default role.  However, the logic that creates the role has gone away:  that was a side effect of improper unit test setup.  Now rectified","commit_id":"ffe7b4f98f1385975fe5407825533c24bcff341b"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"1bbd412ecb17728fce981b33915cceb4114c6401","unresolved":false,"context_lines":[{"line_number":122,"context_line":"                                              tenant_id,"},{"line_number":123,"context_line":"                                              config.CONF.member_role_id)"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def remove_user_from_project(self, tenant_id, user_id):"},{"line_number":126,"context_line":"        \"\"\"Remove user from a tenant"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"        :raises: keystone.exception.ProjectNotFound,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2B6kA%3D","line":125,"updated":"2013-02-14 16:45:53.000000000","message":"same as above","commit_id":"ffe7b4f98f1385975fe5407825533c24bcff341b"},{"author":{"_account_id":6,"name":"Joe Heck","email":"heckj@mac.com","username":"heckj"},"change_message_id":"8bd6be4d51419b0e1e4a0268dea0b2fbc0b743cb","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        \"\"\""},{"line_number":102,"context_line":"        raise exception.NotImplemented()"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def add_user_to_project(self, tenant_id, user_id):"},{"line_number":105,"context_line":"            \"\"\"Add user to a tenant by creating a default role relationship."},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"            :raises: keystone.exception.ProjectNotFound,"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAM3%2F%2B3f0%3D","line":104,"updated":"2013-02-16 00:41:49.000000000","message":"if we want to keep this high level \"helper\" api call, then we should be looking up the role ID from the name in the config and applying that - not storing deployment specific details in the config instead.","commit_id":"b79bf9fdf0afacf948a525192577eb8128e82eb9"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"d582a00926cb8892e02259f32fda60ec5725e168","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        \"\"\""},{"line_number":102,"context_line":"        raise exception.NotImplemented()"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def add_user_to_project(self, tenant_id, user_id):"},{"line_number":105,"context_line":"            \"\"\"Add user to a tenant by creating a default role relationship."},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"            :raises: keystone.exception.ProjectNotFound,"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAM3%2F%2B3S4%3D","line":104,"in_reply_to":"AAAAM3%2F%2B3f0%3D","updated":"2013-02-16 02:54:17.000000000","message":"No, we want to get  rid of this API, just there are a few places that use it still, and this patch was creeping out of scope.  But both values ned to be in the config file, as people might want to use an existing role for membership, as opposed to the one we generate for them.","commit_id":"b79bf9fdf0afacf948a525192577eb8128e82eb9"}],"tests/default_fixtures.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"a3d74dc35419bb0ae3c627822f7fb3e337ec47db","unresolved":false,"context_lines":[{"line_number":15,"context_line":"# under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"# NOTE(dolph): please try to avoid additional fixtures if possible; test suite"},{"line_number":18,"context_line":"#              performance may be negatively affected."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"TENANTS \u003d ["},{"line_number":21,"context_line":"    {"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2FA64%3D","line":18,"updated":"2013-02-11 16:55:21.000000000","message":"please re-use existing entities or create them in setUp methods specific to your tests","commit_id":"6c427f8d3c5ddf31f2009e0a2d8c41cbd1452e46"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"d8fbb65ef371abf7d2c2cecd3372e363a52edd72","unresolved":false,"context_lines":[{"line_number":15,"context_line":"# under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"# NOTE(dolph): please try to avoid additional fixtures if possible; test suite"},{"line_number":18,"context_line":"#              performance may be negatively affected."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"TENANTS \u003d ["},{"line_number":21,"context_line":"    {"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2B7cQ%3D","line":18,"in_reply_to":"AAAAM3%2F%2FA64%3D","updated":"2013-02-14 03:03:08.000000000","message":"These I would like to leave.  There are issues with using the role  \u0027Member\u0027 and so forth in existing tests that I would like to clean up later, but will need to have these available.  There are enough tests that need multiple tenants and roles that having these availble will be useful.","commit_id":"6c427f8d3c5ddf31f2009e0a2d8c41cbd1452e46"}],"tests/test_backend.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e349ab871c732056f67b0cc21e208b9a89abff00","unresolved":false,"context_lines":[{"line_number":23,"context_line":"from keystone import exception"},{"line_number":24,"context_line":"from keystone.openstack.common import timeutils"},{"line_number":25,"context_line":"from keystone import test"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class IdentityTests(object):"},{"line_number":29,"context_line":"    def test_tenant_add_and_remove_user_role(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2FHuQ%3D","line":26,"updated":"2013-02-06 16:22:06.000000000","message":"CONF \u003d config.CONF","commit_id":"d86f2a5d9b5066905d463a23a6984a7f3ef15803"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"323a76861a0a27ffd7ad3a81226fd517a4a2425f","unresolved":false,"context_lines":[{"line_number":23,"context_line":"from keystone import exception"},{"line_number":24,"context_line":"from keystone.openstack.common import timeutils"},{"line_number":25,"context_line":"from keystone import test"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class IdentityTests(object):"},{"line_number":29,"context_line":"    def test_tenant_add_and_remove_user_role(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2FHNk%3D","line":26,"in_reply_to":"AAAAM3%2F%2FHuQ%3D","updated":"2013-02-06 20:29:55.000000000","message":"Done","commit_id":"d86f2a5d9b5066905d463a23a6984a7f3ef15803"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"1bbd412ecb17728fce981b33915cceb4114c6401","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class IdentityTests(object):"},{"line_number":34,"context_line":"    def test_tenant_add_and_remove_user_role(self):"},{"line_number":35,"context_line":"        user_refs \u003d self.identity_api.get_project_users(self.tenant_bar[\u0027id\u0027])"},{"line_number":36,"context_line":"        self.assertNotIn(self.user_two[\u0027id\u0027], [x[\u0027id\u0027] for x in user_refs])"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2B6j4%3D","line":34,"updated":"2013-02-14 16:45:53.000000000","message":"tenant -\u003e project","commit_id":"ffe7b4f98f1385975fe5407825533c24bcff341b"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"b1679a74e695a96189a88265311df4e5d23030ab","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class IdentityTests(object):"},{"line_number":34,"context_line":"    def test_tenant_add_and_remove_user_role(self):"},{"line_number":35,"context_line":"        user_refs \u003d self.identity_api.get_project_users(self.tenant_bar[\u0027id\u0027])"},{"line_number":36,"context_line":"        self.assertNotIn(self.user_two[\u0027id\u0027], [x[\u0027id\u0027] for x in user_refs])"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2B5cI%3D","line":34,"in_reply_to":"AAAAM3%2F%2B6j4%3D","updated":"2013-02-15 14:01:39.000000000","message":"YAY!","commit_id":"ffe7b4f98f1385975fe5407825533c24bcff341b"}],"tests/test_content_types.py":[{"author":{"_account_id":6,"name":"Joe Heck","email":"heckj@mac.com","username":"heckj"},"change_message_id":"8bd6be4d51419b0e1e4a0268dea0b2fbc0b743cb","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        # Initialize headers dictionary"},{"line_number":91,"context_line":"        headers \u003d {} if not headers else headers"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        connection \u003d httplib.HTTPConnection(host, port, timeout\u003d100000)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        # Perform the request"},{"line_number":96,"context_line":"        connection.request(method, path, body, headers)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAM3%2F%2B3fY%3D","line":93,"updated":"2013-02-16 00:41:49.000000000","message":"why the timeout increase?","commit_id":"b79bf9fdf0afacf948a525192577eb8128e82eb9"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"d582a00926cb8892e02259f32fda60ec5725e168","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        # Initialize headers dictionary"},{"line_number":91,"context_line":"        headers \u003d {} if not headers else headers"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        connection \u003d httplib.HTTPConnection(host, port, timeout\u003d100000)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        # Perform the request"},{"line_number":96,"context_line":"        connection.request(method, path, body, headers)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAM3%2F%2B3S0%3D","line":93,"in_reply_to":"AAAAM3%2F%2B3fY%3D","updated":"2013-02-16 02:54:17.000000000","message":"Ah..debugging vestige.  I will remove.","commit_id":"b79bf9fdf0afacf948a525192577eb8128e82eb9"}],"tests/test_migrate_nova_auth.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"1bbd412ecb17728fce981b33915cceb4114c6401","unresolved":false,"context_lines":[{"line_number":150,"context_line":"                    user[\u0027id\u0027], tenant[\u0027id\u0027])"},{"line_number":151,"context_line":"                actual \u003d [self.identity_api.get_role(role_id)[\u0027name\u0027]"},{"line_number":152,"context_line":"                          for role_id in roles]"},{"line_number":153,"context_line":"                if actual.__contains__(\u0027Member_of_Project\u0027):"},{"line_number":154,"context_line":"                    actual.remove(\u0027Member_of_Project\u0027)"},{"line_number":155,"context_line":"                expected \u003d old_project_map.get(tenant_name, [])"},{"line_number":156,"context_line":"                self.assertEqual(set(actual), set(expected))"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2B6js%3D","line":153,"updated":"2013-02-14 16:45:53.000000000","message":"don\u0027t use __contains__ directly","commit_id":"ffe7b4f98f1385975fe5407825533c24bcff341b"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"b1679a74e695a96189a88265311df4e5d23030ab","unresolved":false,"context_lines":[{"line_number":150,"context_line":"                    user[\u0027id\u0027], tenant[\u0027id\u0027])"},{"line_number":151,"context_line":"                actual \u003d [self.identity_api.get_role(role_id)[\u0027name\u0027]"},{"line_number":152,"context_line":"                          for role_id in roles]"},{"line_number":153,"context_line":"                if actual.__contains__(\u0027Member_of_Project\u0027):"},{"line_number":154,"context_line":"                    actual.remove(\u0027Member_of_Project\u0027)"},{"line_number":155,"context_line":"                expected \u003d old_project_map.get(tenant_name, [])"},{"line_number":156,"context_line":"                self.assertEqual(set(actual), set(expected))"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2B5bA%3D","line":153,"in_reply_to":"AAAAM3%2F%2B6js%3D","updated":"2013-02-15 14:01:39.000000000","message":"Done","commit_id":"ffe7b4f98f1385975fe5407825533c24bcff341b"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"1bbd412ecb17728fce981b33915cceb4114c6401","unresolved":false,"context_lines":[{"line_number":151,"context_line":"                actual \u003d [self.identity_api.get_role(role_id)[\u0027name\u0027]"},{"line_number":152,"context_line":"                          for role_id in roles]"},{"line_number":153,"context_line":"                if actual.__contains__(\u0027Member_of_Project\u0027):"},{"line_number":154,"context_line":"                    actual.remove(\u0027Member_of_Project\u0027)"},{"line_number":155,"context_line":"                expected \u003d old_project_map.get(tenant_name, [])"},{"line_number":156,"context_line":"                self.assertEqual(set(actual), set(expected))"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2B6jo%3D","line":154,"updated":"2013-02-14 16:45:53.000000000","message":"you can also just do actual.pop(s, None) here","commit_id":"ffe7b4f98f1385975fe5407825533c24bcff341b"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"b1679a74e695a96189a88265311df4e5d23030ab","unresolved":false,"context_lines":[{"line_number":151,"context_line":"                actual \u003d [self.identity_api.get_role(role_id)[\u0027name\u0027]"},{"line_number":152,"context_line":"                          for role_id in roles]"},{"line_number":153,"context_line":"                if actual.__contains__(\u0027Member_of_Project\u0027):"},{"line_number":154,"context_line":"                    actual.remove(\u0027Member_of_Project\u0027)"},{"line_number":155,"context_line":"                expected \u003d old_project_map.get(tenant_name, [])"},{"line_number":156,"context_line":"                self.assertEqual(set(actual), set(expected))"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2B5bs%3D","line":154,"in_reply_to":"AAAAM3%2F%2B6jo%3D","updated":"2013-02-15 14:01:39.000000000","message":"Done","commit_id":"ffe7b4f98f1385975fe5407825533c24bcff341b"}],"tests/test_sql_upgrade.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"1bbd412ecb17728fce981b33915cceb4114c6401","unresolved":false,"context_lines":[{"line_number":438,"context_line":""},{"line_number":439,"context_line":"    def test_upgrade_default_roles(self):"},{"line_number":440,"context_line":"        def count_member_roles(session):"},{"line_number":441,"context_line":"            query_string \u003d\\"},{"line_number":442,"context_line":"                \"select count(*) as c from role\"\\"},{"line_number":443,"context_line":"                \" where name\u003d\u0027Member_of_Project\u0027\""},{"line_number":444,"context_line":"            return session.execute(query_string).fetchone()[\u0027c\u0027]"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2B6jY%3D","line":441,"updated":"2013-02-14 16:45:53.000000000","message":"HACKING","commit_id":"ffe7b4f98f1385975fe5407825533c24bcff341b"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"b1679a74e695a96189a88265311df4e5d23030ab","unresolved":false,"context_lines":[{"line_number":438,"context_line":""},{"line_number":439,"context_line":"    def test_upgrade_default_roles(self):"},{"line_number":440,"context_line":"        def count_member_roles(session):"},{"line_number":441,"context_line":"            query_string \u003d\\"},{"line_number":442,"context_line":"                \"select count(*) as c from role\"\\"},{"line_number":443,"context_line":"                \" where name\u003d\u0027Member_of_Project\u0027\""},{"line_number":444,"context_line":"            return session.execute(query_string).fetchone()[\u0027c\u0027]"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2B5a4%3D","line":441,"in_reply_to":"AAAAM3%2F%2B6jY%3D","updated":"2013-02-15 14:01:39.000000000","message":"Done","commit_id":"ffe7b4f98f1385975fe5407825533c24bcff341b"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"1bbd412ecb17728fce981b33915cceb4114c6401","unresolved":false,"context_lines":[{"line_number":440,"context_line":"        def count_member_roles(session):"},{"line_number":441,"context_line":"            query_string \u003d\\"},{"line_number":442,"context_line":"                \"select count(*) as c from role\"\\"},{"line_number":443,"context_line":"                \" where name\u003d\u0027Member_of_Project\u0027\""},{"line_number":444,"context_line":"            return session.execute(query_string).fetchone()[\u0027c\u0027]"},{"line_number":445,"context_line":""},{"line_number":446,"context_line":"        self.upgrade(16)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2B6jI%3D","line":443,"updated":"2013-02-14 16:45:53.000000000","message":"HACKING","commit_id":"ffe7b4f98f1385975fe5407825533c24bcff341b"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"b1679a74e695a96189a88265311df4e5d23030ab","unresolved":false,"context_lines":[{"line_number":440,"context_line":"        def count_member_roles(session):"},{"line_number":441,"context_line":"            query_string \u003d\\"},{"line_number":442,"context_line":"                \"select count(*) as c from role\"\\"},{"line_number":443,"context_line":"                \" where name\u003d\u0027Member_of_Project\u0027\""},{"line_number":444,"context_line":"            return session.execute(query_string).fetchone()[\u0027c\u0027]"},{"line_number":445,"context_line":""},{"line_number":446,"context_line":"        self.upgrade(16)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2B5as%3D","line":443,"in_reply_to":"AAAAM3%2F%2B6jI%3D","updated":"2013-02-15 14:01:39.000000000","message":"Which rule?","commit_id":"ffe7b4f98f1385975fe5407825533c24bcff341b"}],"tests/test_v3.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e349ab871c732056f67b0cc21e208b9a89abff00","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        \"\"\""},{"line_number":170,"context_line":"        keys \u003d entity_keys"},{"line_number":171,"context_line":"        if keys is None:"},{"line_number":172,"context_line":"            keys \u003d [\u0027name\u0027, \u0027description\u0027, \u0027enabled\u0027]"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        for k in [\u0027id\u0027] + keys:"},{"line_number":175,"context_line":"            msg \u003d \u0027%s unexpectedly None in %s\u0027 % (k, entity)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2FHtk%3D","line":172,"updated":"2013-02-06 16:22:06.000000000","message":"i\u0027d rather pass in a list of keys to ignore, rather than whole new list, e.g.:\n\n  default_keys \u003d [\u0027name\u0027, \u0027description\u0027, \u0027enabled\u0027]\n  ignore_keys \u003d [\u0027enabled\u0027]\n\n  keys \u003d set(default_keys).difference(set(ignore_keys))","commit_id":"d86f2a5d9b5066905d463a23a6984a7f3ef15803"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"323a76861a0a27ffd7ad3a81226fd517a4a2425f","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        \"\"\""},{"line_number":170,"context_line":"        keys \u003d entity_keys"},{"line_number":171,"context_line":"        if keys is None:"},{"line_number":172,"context_line":"            keys \u003d [\u0027name\u0027, \u0027description\u0027, \u0027enabled\u0027]"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        for k in [\u0027id\u0027] + keys:"},{"line_number":175,"context_line":"            msg \u003d \u0027%s unexpectedly None in %s\u0027 % (k, entity)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2FHM0%3D","line":172,"in_reply_to":"AAAAM3%2F%2FHtk%3D","updated":"2013-02-06 20:29:55.000000000","message":"I think that the check is more useful if you explicitly provide the keys, as we could then use it for entities other than just the ones we have now.  It probably makes more sense to make the key list a non-optional parameter and then have a standard list.\n\nLet me know if this change is a must.","commit_id":"d86f2a5d9b5066905d463a23a6984a7f3ef15803"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"a3d74dc35419bb0ae3c627822f7fb3e337ec47db","unresolved":false,"context_lines":[{"line_number":186,"context_line":"        \"\"\""},{"line_number":187,"context_line":"        keys \u003d entity_keys"},{"line_number":188,"context_line":"        if keys is None:"},{"line_number":189,"context_line":"            keys \u003d [\u0027name\u0027, \u0027description\u0027, \u0027enabled\u0027]"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"        for k in [\u0027id\u0027] + keys:"},{"line_number":192,"context_line":"            msg \u003d \u0027%s unexpectedly None in %s\u0027 % (k, entity)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2FA6g%3D","line":189,"updated":"2013-02-11 16:55:21.000000000","message":"specify exceptions to the convention rather than requiring a whole new convention to be provided\n\nin other words, change entity_keys to ignore_entity_keys and just pass in (\u0027enabled\u0027,)","commit_id":"6c427f8d3c5ddf31f2009e0a2d8c41cbd1452e46"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"d8fbb65ef371abf7d2c2cecd3372e363a52edd72","unresolved":false,"context_lines":[{"line_number":186,"context_line":"        \"\"\""},{"line_number":187,"context_line":"        keys \u003d entity_keys"},{"line_number":188,"context_line":"        if keys is None:"},{"line_number":189,"context_line":"            keys \u003d [\u0027name\u0027, \u0027description\u0027, \u0027enabled\u0027]"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"        for k in [\u0027id\u0027] + keys:"},{"line_number":192,"context_line":"            msg \u003d \u0027%s unexpectedly None in %s\u0027 % (k, entity)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2B7cE%3D","line":189,"in_reply_to":"AAAAM3%2F%2FA6g%3D","updated":"2013-02-14 03:03:08.000000000","message":"I am not sure I agree that \u0027enabled\u0027 is the norm.  We have a need for it on the \u0027entities\u0027 but not on the relationships.  None of the assignement types will need it.  I felt this was a good middle ground.","commit_id":"6c427f8d3c5ddf31f2009e0a2d8c41cbd1452e46"}],"tests/test_v3_identity.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e349ab871c732056f67b0cc21e208b9a89abff00","unresolved":false,"context_lines":[{"line_number":172,"context_line":"            \u0027roles\u0027,"},{"line_number":173,"context_line":"            self.assertValidRole,"},{"line_number":174,"context_line":"            ref,"},{"line_number":175,"context_line":"            [\u0027name\u0027, \u0027description\u0027])"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    def assertValidRoleResponse(self, resp, ref):"},{"line_number":178,"context_line":"        return self.assertValidResponse("}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2FHtg%3D","line":175,"updated":"2013-02-06 16:22:06.000000000","message":"since this is an optional kwarg:\n\n  ignore_keys\u003d[\u0027enabled\u0027]","commit_id":"d86f2a5d9b5066905d463a23a6984a7f3ef15803"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"323a76861a0a27ffd7ad3a81226fd517a4a2425f","unresolved":false,"context_lines":[{"line_number":172,"context_line":"            \u0027roles\u0027,"},{"line_number":173,"context_line":"            self.assertValidRole,"},{"line_number":174,"context_line":"            ref,"},{"line_number":175,"context_line":"            [\u0027name\u0027, \u0027description\u0027])"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    def assertValidRoleResponse(self, resp, ref):"},{"line_number":178,"context_line":"        return self.assertValidResponse("}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2FHMI%3D","line":175,"in_reply_to":"AAAAM3%2F%2FHtg%3D","updated":"2013-02-06 20:29:55.000000000","message":"I\u0027d like to make it non-optional...see other comment.","commit_id":"d86f2a5d9b5066905d463a23a6984a7f3ef15803"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"a3d74dc35419bb0ae3c627822f7fb3e337ec47db","unresolved":false,"context_lines":[{"line_number":171,"context_line":"            resp,"},{"line_number":172,"context_line":"            \u0027roles\u0027,"},{"line_number":173,"context_line":"            self.assertValidRole,"},{"line_number":174,"context_line":"            entity_keys\u003d[\u0027name\u0027, \u0027description\u0027],"},{"line_number":175,"context_line":"            **kwargs)"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    def assertValidRoleResponse(self, resp, ref):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2FA6U%3D","line":174,"updated":"2013-02-11 16:55:21.000000000","message":"make it clear what you\u0027re trying to accomplish:\n\n  ignore_entity_keys\u003d(\u0027enabled\u0027,)","commit_id":"6c427f8d3c5ddf31f2009e0a2d8c41cbd1452e46"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"d8fbb65ef371abf7d2c2cecd3372e363a52edd72","unresolved":false,"context_lines":[{"line_number":171,"context_line":"            resp,"},{"line_number":172,"context_line":"            \u0027roles\u0027,"},{"line_number":173,"context_line":"            self.assertValidRole,"},{"line_number":174,"context_line":"            entity_keys\u003d[\u0027name\u0027, \u0027description\u0027],"},{"line_number":175,"context_line":"            **kwargs)"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    def assertValidRoleResponse(self, resp, ref):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2B7b4%3D","line":174,"in_reply_to":"AAAAM3%2F%2FA6U%3D","updated":"2013-02-14 03:03:08.000000000","message":"If you insist, I will, but I think you are limiting a potentially reusable function.  I can see this being used for many lists if you just pass in the keys list.","commit_id":"6c427f8d3c5ddf31f2009e0a2d8c41cbd1452e46"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"1bbd412ecb17728fce981b33915cceb4114c6401","unresolved":false,"context_lines":[{"line_number":171,"context_line":"            resp,"},{"line_number":172,"context_line":"            \u0027roles\u0027,"},{"line_number":173,"context_line":"            self.assertValidRole,"},{"line_number":174,"context_line":"            entity_keys\u003d[\u0027name\u0027, \u0027description\u0027],"},{"line_number":175,"context_line":"            **kwargs)"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    def assertValidRoleResponse(self, resp, ref):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2B6jA%3D","line":174,"updated":"2013-02-14 16:45:53.000000000","message":"as previously discussed, please change this to ignore_entity_keys or something to tweak the convention, not to override it with a new convention","commit_id":"ffe7b4f98f1385975fe5407825533c24bcff341b"}]}
