)]}'
{"keystone/assignment/backends/ldap.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"05acf41f0b8d0127fbf9053407a808ce50bb2043","unresolved":false,"context_lines":[{"line_number":548,"context_line":"    def add_user(self, role_id, role_dn, user_dn, tenant_id\u003dNone):"},{"line_number":549,"context_line":"        try:"},{"line_number":550,"context_line":"            super(RoleApi, self).add_member(user_dn, role_dn)"},{"line_number":551,"context_line":"        except ldap.NO_SUCH_OBJECT:"},{"line_number":552,"context_line":"            if tenant_id is None or self.get(role_id) is None:"},{"line_number":553,"context_line":"                raise Exception(_(\"Role %s not found\") % (role_id,))"},{"line_number":554,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAW3%2F%2FiHQ%3D","line":551,"updated":"2014-04-13 15:59:51.000000000","message":"the code that was removed had a useful error message that we don\u0027t want to lose. It\u0027s hard enough as it is to figure out what\u0027s going wrong.","commit_id":"9afaacf4fb852d8b3d4aacafab8121f5c53e9ab2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"cb77b6d6b2980faf4a499b1a7fb62275761362e0","unresolved":false,"context_lines":[{"line_number":550,"context_line":"                 \u0027tenant %(tenant_id)s\u0027) %"},{"line_number":551,"context_line":"               dict(user_id\u003duser_id, role_id\u003drole_id, tenant_id\u003dtenant_id))"},{"line_number":552,"context_line":"        try:"},{"line_number":553,"context_line":"            super(RoleApi, self).add_member(user_dn, role_dn, msg)"},{"line_number":554,"context_line":"        except ldap.NO_SUCH_OBJECT:"},{"line_number":555,"context_line":"            if tenant_id is None or self.get(role_id) is None:"},{"line_number":556,"context_line":"                raise Exception(_(\"Role %s not found\") % (role_id,))"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAW3%2F%2FYL8%3D","line":553,"updated":"2014-04-15 02:00:24.000000000","message":"passing the message is not pretty. Have add_member raise Conflict (or a new exception, whatever works) and have this function raise Conflict with the new message if add_member raises Conflict.","commit_id":"d8230b9b09085c1ef042a0dd4ed40623d6536804"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"282f3b143d31ee863667c8941029627bcce35990","unresolved":false,"context_lines":[{"line_number":552,"context_line":"            msg \u003d (_(\u0027User %(user_id)s already has role %(role_id)s in \u0027"},{"line_number":553,"context_line":"                     \u0027tenant %(tenant_id)s\u0027) %"},{"line_number":554,"context_line":"                   dict(user_id\u003duser_id, role_id\u003drole_id, tenant_id\u003dtenant_id))"},{"line_number":555,"context_line":"            raise exception.Conflict(msg)"},{"line_number":556,"context_line":"        except self.NotFound:"},{"line_number":557,"context_line":"            if tenant_id is None or self.get(role_id) is None:"},{"line_number":558,"context_line":"                raise Exception(_(\"Role %s not found\") % (role_id,))"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAXH%2F%2F%2FnY%3D","line":555,"updated":"2014-04-16 01:26:28.000000000","message":"this line should have changed from the original --\n\n raise exception.Conflict(type\u003d\u0027role grant\u0027, details\u003dmsg)\n\nunless there was something wrong with the original?","commit_id":"6e50fcbddaf77028d8c0935d28b77b51ed63b333"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"0092df3ae8f214d12df71fc85bb97c44fbf1afb9","unresolved":false,"context_lines":[{"line_number":552,"context_line":"            msg \u003d (_(\u0027User %(user_id)s already has role %(role_id)s in \u0027"},{"line_number":553,"context_line":"                     \u0027tenant %(tenant_id)s\u0027) %"},{"line_number":554,"context_line":"                   dict(user_id\u003duser_id, role_id\u003drole_id, tenant_id\u003dtenant_id))"},{"line_number":555,"context_line":"            raise exception.Conflict(msg)"},{"line_number":556,"context_line":"        except self.NotFound:"},{"line_number":557,"context_line":"            if tenant_id is None or self.get(role_id) is None:"},{"line_number":558,"context_line":"                raise Exception(_(\"Role %s not found\") % (role_id,))"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAXH%2F%2F8p0%3D","line":555,"in_reply_to":"AAAAXH%2F%2F%2FnY%3D","updated":"2014-04-16 10:46:49.000000000","message":"You are right.","commit_id":"6e50fcbddaf77028d8c0935d28b77b51ed63b333"}],"keystone/common/ldap/core.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"05acf41f0b8d0127fbf9053407a808ce50bb2043","unresolved":false,"context_lines":[{"line_number":1015,"context_line":"        finally:"},{"line_number":1016,"context_line":"            conn.unbind_s()"},{"line_number":1017,"context_line":""},{"line_number":1018,"context_line":"    def add_member(self, member_dn, member_list_dn):"},{"line_number":1019,"context_line":"        conn \u003d self.get_connection()"},{"line_number":1020,"context_line":"        try:"},{"line_number":1021,"context_line":"            conn.modify_s("}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAW3%2F%2FiHo%3D","line":1018,"updated":"2014-04-13 15:59:51.000000000","message":"add a docstring that says what exceptions are raised.","commit_id":"9afaacf4fb852d8b3d4aacafab8121f5c53e9ab2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"05acf41f0b8d0127fbf9053407a808ce50bb2043","unresolved":false,"context_lines":[{"line_number":1029,"context_line":"        finally:"},{"line_number":1030,"context_line":"            conn.unbind_s()"},{"line_number":1031,"context_line":""},{"line_number":1032,"context_line":"    def remove_member(self, member_dn, member_list_dn):"},{"line_number":1033,"context_line":"        conn \u003d self.get_connection()"},{"line_number":1034,"context_line":"        try:"},{"line_number":1035,"context_line":"            conn.modify_s(member_list_dn, [(ldap.MOD_DELETE,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAW3%2F%2FiHk%3D","line":1032,"updated":"2014-04-13 15:59:51.000000000","message":"add a docstring that says what exceptions are raised.","commit_id":"9afaacf4fb852d8b3d4aacafab8121f5c53e9ab2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"cb77b6d6b2980faf4a499b1a7fb62275761362e0","unresolved":false,"context_lines":[{"line_number":1018,"context_line":"    def add_member(self, member_dn, member_list_dn, exp_message\u003dNone):"},{"line_number":1019,"context_line":"        \"\"\"Add member to the member list."},{"line_number":1020,"context_line":""},{"line_number":1021,"context_line":"        :param member_dn: Dn of member to be added."},{"line_number":1022,"context_line":"        :param member_list_dn: Dn of group to which the"},{"line_number":1023,"context_line":"                               member will be added."},{"line_number":1024,"context_line":"        :param exp_message: Message for exception which will be"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAW3%2F%2FYLM%3D","line":1021,"updated":"2014-04-15 02:00:24.000000000","message":"change \"Dn\" to \"DN\" -- this applies to all these comments.","commit_id":"d8230b9b09085c1ef042a0dd4ed40623d6536804"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"cb77b6d6b2980faf4a499b1a7fb62275761362e0","unresolved":false,"context_lines":[{"line_number":1025,"context_line":"                            raised if member already exists."},{"line_number":1026,"context_line":""},{"line_number":1027,"context_line":"        :raises: exception.Conflict,"},{"line_number":1028,"context_line":"                 ldap.NO_SUCH_OBJECT"},{"line_number":1029,"context_line":"        \"\"\""},{"line_number":1030,"context_line":"        conn \u003d self.get_connection()"},{"line_number":1031,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAW3%2F%2FYKo%3D","line":1028,"updated":"2014-04-15 02:00:24.000000000","message":"add a description when these are raised -- e.g., \n\n exception.Conflict if the user was already a member\n ldap.NO_SUCH_OBJECT if the group entry didn\u0027t exist","commit_id":"d8230b9b09085c1ef042a0dd4ed40623d6536804"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"cb77b6d6b2980faf4a499b1a7fb62275761362e0","unresolved":false,"context_lines":[{"line_number":1049,"context_line":"                               member will be removed."},{"line_number":1050,"context_line":""},{"line_number":1051,"context_line":"        :raises: ldap.NO_SUCH_OBJECT,"},{"line_number":1052,"context_line":"                 ldap.NO_SUCH_ATTRIBUTE"},{"line_number":1053,"context_line":"        \"\"\""},{"line_number":1054,"context_line":"        conn \u003d self.get_connection()"},{"line_number":1055,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAW3%2F%2FYK8%3D","line":1052,"updated":"2014-04-15 02:00:24.000000000","message":"add a description when these are raised -- e.g., \n\n ldap.NO_SUCH_OBJECT if the group entry didn\u0027t exist.\n\n ldap.NO_SUCH_ATTRIBUTE if the user wasn\u0027t a member","commit_id":"d8230b9b09085c1ef042a0dd4ed40623d6536804"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"282f3b143d31ee863667c8941029627bcce35990","unresolved":false,"context_lines":[{"line_number":1039,"context_line":"                member_list_dn,"},{"line_number":1040,"context_line":"                [(ldap.MOD_ADD,"},{"line_number":1041,"context_line":"                  self.member_attribute,"},{"line_number":1042,"context_line":"                  member_dn)])"},{"line_number":1043,"context_line":"        except ldap.TYPE_OR_VALUE_EXISTS:"},{"line_number":1044,"context_line":"            raise exception.Conflict(_(\u0027Member %(member)s has already a member\u0027"},{"line_number":1045,"context_line":"                                       \u0027 of group %(group)s\u0027) % {"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAXH%2F%2F%2Fmc%3D","line":1042,"updated":"2014-04-16 01:26:28.000000000","message":"suggest put the mod on a separate line so that this statement is simpler --\n\n mod \u003d (ldap.MOD_ADD, self.member_attribute, member_dn)","commit_id":"6e50fcbddaf77028d8c0935d28b77b51ed63b333"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"0092df3ae8f214d12df71fc85bb97c44fbf1afb9","unresolved":false,"context_lines":[{"line_number":1039,"context_line":"                member_list_dn,"},{"line_number":1040,"context_line":"                [(ldap.MOD_ADD,"},{"line_number":1041,"context_line":"                  self.member_attribute,"},{"line_number":1042,"context_line":"                  member_dn)])"},{"line_number":1043,"context_line":"        except ldap.TYPE_OR_VALUE_EXISTS:"},{"line_number":1044,"context_line":"            raise exception.Conflict(_(\u0027Member %(member)s has already a member\u0027"},{"line_number":1045,"context_line":"                                       \u0027 of group %(group)s\u0027) % {"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAXH%2F%2F8b0%3D","line":1042,"in_reply_to":"AAAAXH%2F%2F%2Fmc%3D","updated":"2014-04-16 10:46:49.000000000","message":"Yes, It\u0027s good idea","commit_id":"6e50fcbddaf77028d8c0935d28b77b51ed63b333"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"282f3b143d31ee863667c8941029627bcce35990","unresolved":false,"context_lines":[{"line_number":1041,"context_line":"                  self.member_attribute,"},{"line_number":1042,"context_line":"                  member_dn)])"},{"line_number":1043,"context_line":"        except ldap.TYPE_OR_VALUE_EXISTS:"},{"line_number":1044,"context_line":"            raise exception.Conflict(_(\u0027Member %(member)s has already a member\u0027"},{"line_number":1045,"context_line":"                                       \u0027 of group %(group)s\u0027) % {"},{"line_number":1046,"context_line":"                                     \u0027member\u0027: member_dn,"},{"line_number":1047,"context_line":"                                     \u0027group\u0027: member_list_dn})"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAXH%2F%2F%2Fmo%3D","line":1044,"updated":"2014-04-16 01:26:28.000000000","message":"change \"has already\" to \"is already\"","commit_id":"6e50fcbddaf77028d8c0935d28b77b51ed63b333"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"282f3b143d31ee863667c8941029627bcce35990","unresolved":false,"context_lines":[{"line_number":1063,"context_line":"        conn \u003d self.get_connection()"},{"line_number":1064,"context_line":"        try:"},{"line_number":1065,"context_line":"            conn.modify_s(member_list_dn, [(ldap.MOD_DELETE,"},{"line_number":1066,"context_line":"                                            self.member_attribute, member_dn)])"},{"line_number":1067,"context_line":"        except ldap.NO_SUCH_OBJECT:"},{"line_number":1068,"context_line":"            raise self._not_found(member_list_dn)"},{"line_number":1069,"context_line":"        finally:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAXH%2F%2F%2FmQ%3D","line":1066,"updated":"2014-04-16 01:26:28.000000000","message":"suggest put the mod on a separate line so that this statement is simpler --\n\n mod \u003d (ldap.MOD_ADD, self.member_attribute, member_dn)","commit_id":"6e50fcbddaf77028d8c0935d28b77b51ed63b333"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"0092df3ae8f214d12df71fc85bb97c44fbf1afb9","unresolved":false,"context_lines":[{"line_number":1063,"context_line":"        conn \u003d self.get_connection()"},{"line_number":1064,"context_line":"        try:"},{"line_number":1065,"context_line":"            conn.modify_s(member_list_dn, [(ldap.MOD_DELETE,"},{"line_number":1066,"context_line":"                                            self.member_attribute, member_dn)])"},{"line_number":1067,"context_line":"        except ldap.NO_SUCH_OBJECT:"},{"line_number":1068,"context_line":"            raise self._not_found(member_list_dn)"},{"line_number":1069,"context_line":"        finally:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAXH%2F%2F8bE%3D","line":1066,"in_reply_to":"AAAAXH%2F%2F%2FmQ%3D","updated":"2014-04-16 10:46:49.000000000","message":"good idea too, butI think you mean  \n ldap.MOD_DELETE","commit_id":"6e50fcbddaf77028d8c0935d28b77b51ed63b333"}],"keystone/identity/backends/ldap.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"05acf41f0b8d0127fbf9053407a808ce50bb2043","unresolved":false,"context_lines":[{"line_number":302,"context_line":"    def add_user(self, user_dn, group_id):"},{"line_number":303,"context_line":"        return super(GroupApi, self).add_member(user_dn,"},{"line_number":304,"context_line":"                                                self._id_to_dn(group_id))"},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"    def remove_user(self, user_dn, group_id, user_id):"},{"line_number":307,"context_line":"        try:"},{"line_number":308,"context_line":"            super(GroupApi, self).remove_member(user_dn,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAW3%2F%2FiHA%3D","line":305,"updated":"2014-04-13 15:59:51.000000000","message":"we need to have useful error messages so keep the error message that was originally reported.","commit_id":"9afaacf4fb852d8b3d4aacafab8121f5c53e9ab2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"282f3b143d31ee863667c8941029627bcce35990","unresolved":false,"context_lines":[{"line_number":302,"context_line":"        try:"},{"line_number":303,"context_line":"            super(GroupApi, self).add_member(user_dn, self._id_to_dn(group_id))"},{"line_number":304,"context_line":"        except exception.Conflict:"},{"line_number":305,"context_line":"            msg \u003d (_(\u0027User %(user_id)s is already a member of group \u0027"},{"line_number":306,"context_line":"                     \u0027%(group_id)s\u0027) % {\u0027user_id\u0027: user_id,"},{"line_number":307,"context_line":"                                        \u0027group_id\u0027: group_id})"},{"line_number":308,"context_line":"            raise exception.Conflict(msg)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAXH%2F%2F%2FlQ%3D","line":305,"updated":"2014-04-16 01:26:28.000000000","message":"looks like there\u0027s an extra ( here.","commit_id":"6e50fcbddaf77028d8c0935d28b77b51ed63b333"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"282f3b143d31ee863667c8941029627bcce35990","unresolved":false,"context_lines":[{"line_number":305,"context_line":"            msg \u003d (_(\u0027User %(user_id)s is already a member of group \u0027"},{"line_number":306,"context_line":"                     \u0027%(group_id)s\u0027) % {\u0027user_id\u0027: user_id,"},{"line_number":307,"context_line":"                                        \u0027group_id\u0027: group_id})"},{"line_number":308,"context_line":"            raise exception.Conflict(msg)"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"    def remove_user(self, user_dn, group_id, user_id):"},{"line_number":311,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAXH%2F%2F%2FlA%3D","line":308,"updated":"2014-04-16 01:26:28.000000000","message":"I don\u0027t think these lines needed to change... was\n\n raise exception.Conflict(_(\n     \u0027User %(user_id)s is already a member of group %(group_id)s\u0027) %\n     {\u0027user_id\u0027: user_id, \u0027group_id\u0027: group_id})","commit_id":"6e50fcbddaf77028d8c0935d28b77b51ed63b333"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"0092df3ae8f214d12df71fc85bb97c44fbf1afb9","unresolved":false,"context_lines":[{"line_number":305,"context_line":"            msg \u003d (_(\u0027User %(user_id)s is already a member of group \u0027"},{"line_number":306,"context_line":"                     \u0027%(group_id)s\u0027) % {\u0027user_id\u0027: user_id,"},{"line_number":307,"context_line":"                                        \u0027group_id\u0027: group_id})"},{"line_number":308,"context_line":"            raise exception.Conflict(msg)"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"    def remove_user(self, user_dn, group_id, user_id):"},{"line_number":311,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAXH%2F%2F8a0%3D","line":308,"in_reply_to":"AAAAXH%2F%2F%2FlA%3D","updated":"2014-04-16 10:46:49.000000000","message":"ok","commit_id":"6e50fcbddaf77028d8c0935d28b77b51ed63b333"}]}
