)]}'
{"api-ref/source/v3/users.inc":[{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"3a7f2f43c103f374810dc4ba7ab95b7040020586","unresolved":false,"context_lines":[{"line_number":62,"context_line":"   - default_project_id: default_project_id_response_body"},{"line_number":63,"context_line":"   - domain_id: domain_id_response_body"},{"line_number":64,"context_line":"   - enabled: enabled_user_response_body"},{"line_number":65,"context_line":"   - federated: federated_object"},{"line_number":66,"context_line":"   - idp_id: idp_id_response_body"},{"line_number":67,"context_line":"   - protocols: protocol_object"},{"line_number":68,"context_line":"   - protocol_id: protocol_id_response_body"},{"line_number":69,"context_line":"   - unique_id: unique_id_response_body"},{"line_number":70,"context_line":"   - id: id_user_body"},{"line_number":71,"context_line":"   - links: links_user"},{"line_number":72,"context_line":"   - name: user_name_response_body"}],"source_content_type":"text/x-c++src","patch_set":14,"id":"5a3905b3_9784c3d4","line":69,"range":{"start_line":65,"start_character":2,"end_line":69,"end_character":39},"updated":"2017-01-20 18:32:20.000000000","message":"We\u0027re not returning a federated object for list_users, right?","commit_id":"9128a4143eed2bf8a1043f0659eb8ea4237b0104"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"bb02ced508cd347885cbf4dd6c3b7724c4c4c117","unresolved":false,"context_lines":[{"line_number":62,"context_line":"   - default_project_id: default_project_id_response_body"},{"line_number":63,"context_line":"   - domain_id: domain_id_response_body"},{"line_number":64,"context_line":"   - enabled: enabled_user_response_body"},{"line_number":65,"context_line":"   - federated: federated_object"},{"line_number":66,"context_line":"   - idp_id: idp_id_response_body"},{"line_number":67,"context_line":"   - protocols: protocol_object"},{"line_number":68,"context_line":"   - protocol_id: protocol_id_response_body"},{"line_number":69,"context_line":"   - unique_id: unique_id_response_body"},{"line_number":70,"context_line":"   - id: id_user_body"},{"line_number":71,"context_line":"   - links: links_user"},{"line_number":72,"context_line":"   - name: user_name_response_body"}],"source_content_type":"text/x-c++src","patch_set":14,"id":"5a3905b3_57c09ae0","line":69,"range":{"start_line":65,"start_character":2,"end_line":69,"end_character":39},"in_reply_to":"5a3905b3_9784c3d4","updated":"2017-01-20 18:51:14.000000000","message":"whoops, got tunnel vision with the other federated stuff I am working on which will need this in the future","commit_id":"9128a4143eed2bf8a1043f0659eb8ea4237b0104"}],"keystone/identity/core.py":[{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"b80a3cb33c3348831a83bcd78e5b8d75bee27c13","unresolved":false,"context_lines":[{"line_number":958,"context_line":"        return self._set_domain_id_and_mapping("},{"line_number":959,"context_line":"            ref, domain_id, driver, mapping.EntityType.USER)"},{"line_number":960,"context_line":""},{"line_number":961,"context_line":"    def _check_for_federated_attributes(self, hints):"},{"line_number":962,"context_line":"        idp_id \u003d None"},{"line_number":963,"context_line":"        protocol_id \u003d None"},{"line_number":964,"context_line":"        unique_id \u003d None"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba5201f7_a2c8ca75","line":961,"range":{"start_line":961,"start_character":8,"end_line":961,"end_character":39},"updated":"2017-01-10 14:47:05.000000000","message":"This is doing more than just checking for federated attributes, so needs a better name.","commit_id":"30f4fb0330bdcf4a45426a272f05e9cf87af8360"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"b80a3cb33c3348831a83bcd78e5b8d75bee27c13","unresolved":false,"context_lines":[{"line_number":970,"context_line":"            if \u0027unique_id\u0027 \u003d\u003d filter_[\u0027name\u0027]:"},{"line_number":971,"context_line":"                unique_id \u003d filter_[\u0027value\u0027]"},{"line_number":972,"context_line":""},{"line_number":973,"context_line":"        if idp_id and protocol_id and unique_id:"},{"line_number":974,"context_line":"            return self.shadow_users_api.get_federated_object("},{"line_number":975,"context_line":"                hints, idp_id, protocol_id, unique_id)"},{"line_number":976,"context_line":"        elif unique_id:"},{"line_number":977,"context_line":"            return self.shadow_users_api.get_federated_users(hints, unique_id)"},{"line_number":978,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ba5201f7_a2db6a1a","line":975,"range":{"start_line":973,"start_character":8,"end_line":975,"end_character":54},"updated":"2017-01-10 14:47:05.000000000","message":"We\u0027ll need to think through this one, as far returning a single user with a federated object from a list_users call. It makes sense, I\u0027m just a concerned about the inconsistency of the response... It may make more sense to have a separate API instead.","commit_id":"30f4fb0330bdcf4a45426a272f05e9cf87af8360"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"b80a3cb33c3348831a83bcd78e5b8d75bee27c13","unresolved":false,"context_lines":[{"line_number":993,"context_line":"            # driver selection, so remove any such filter."},{"line_number":994,"context_line":"            self._mark_domain_id_filter_satisfied(hints)"},{"line_number":995,"context_line":"        ref_list \u003d self._check_for_federated_attributes(hints)"},{"line_number":996,"context_line":"        if not ref_list:"},{"line_number":997,"context_line":"            ref_list \u003d driver.list_users(hints)"},{"line_number":998,"context_line":"        return self._set_domain_id_and_mapping("},{"line_number":999,"context_line":"            ref_list, domain_scope, driver, mapping.EntityType.USER)"},{"line_number":1000,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ba5201f7_e2d2d233","line":997,"range":{"start_line":996,"start_character":8,"end_line":997,"end_character":47},"updated":"2017-01-10 14:47:05.000000000","message":"Why make this driver call? If there are federated attribute in hints and no users were found, then you would return None; not do a second query.","commit_id":"30f4fb0330bdcf4a45426a272f05e9cf87af8360"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"87f26b06087b45e7be2e6e398b45b77717790110","unresolved":false,"context_lines":[{"line_number":968,"context_line":"            if \u0027protocol_id\u0027 \u003d\u003d filter_[\u0027name\u0027]:"},{"line_number":969,"context_line":"                protocol_id \u003d filter_[\u0027value\u0027]"},{"line_number":970,"context_line":"            if \u0027unique_id\u0027 \u003d\u003d filter_[\u0027name\u0027]:"},{"line_number":971,"context_line":"                unique_id \u003d filter_[\u0027value\u0027]"},{"line_number":972,"context_line":""},{"line_number":973,"context_line":"        if idp_id or protocol_id or unique_id:"},{"line_number":974,"context_line":"            return self.shadow_users_api.get_federated_users("}],"source_content_type":"text/x-python","patch_set":9,"id":"7a3c09a3_7cd95b83","line":971,"updated":"2017-01-18 22:42:36.000000000","message":"We seem to pull these federated attributes out - but we don\u0027t really use them right away. We tend to pass them around to a couple methods in the shadow user API before we actually care about their values. What if we just detected if they existed in the filters, and if so then we can call the shadow user API? \n\n  def _filter_hints_for_federated_users(self, driver, hints):\n      \"\"\"Conditionally call the shadow user backend based on filter values.\"\"\"\n      federated_attributes \u003d [\u0027idp_id\u0027, \u0027protocol_id\u0027, \u0027unique_id\u0027]\n      for filter_ in hints.filters:\n          if filter_[\u0027name\u0027] in federated_attributes:\n              return self.shadow_users_api.get_federated_users(hints)\n          return driver.list_users(hints)","commit_id":"6e9f1d89206a85931563ed294b62becbe4dd1269"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"e27e93441b69d814ee87466c896fc751e4352584","unresolved":false,"context_lines":[{"line_number":958,"context_line":"        return self._set_domain_id_and_mapping("},{"line_number":959,"context_line":"            ref, domain_id, driver, mapping.EntityType.USER)"},{"line_number":960,"context_line":""},{"line_number":961,"context_line":"    def _filter_hints_for_federated_users(self, driver, hints):"},{"line_number":962,"context_line":"        federated_attributes \u003d [\u0027idp_id\u0027, \u0027protocol_id\u0027, \u0027unique_id\u0027]"},{"line_number":963,"context_line":"        for filter_ in hints.filters:"},{"line_number":964,"context_line":"            if filter_[\u0027name\u0027] in federated_attributes:"}],"source_content_type":"text/x-python","patch_set":10,"id":"5a3905b3_3d41840c","line":961,"range":{"start_line":961,"start_character":8,"end_line":961,"end_character":41},"updated":"2017-01-19 13:20:19.000000000","message":"Lance gave you a nice docstring to use in PS9 :)","commit_id":"f70aabba67e3c735a21a7cd1962042762c188097"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"3a7f2f43c103f374810dc4ba7ab95b7040020586","unresolved":false,"context_lines":[{"line_number":958,"context_line":"        return self._set_domain_id_and_mapping("},{"line_number":959,"context_line":"            ref, domain_id, driver, mapping.EntityType.USER)"},{"line_number":960,"context_line":""},{"line_number":961,"context_line":"    def _filter_hints_for_federated_users(self, driver, hints):"},{"line_number":962,"context_line":"        federated_attributes \u003d [\u0027idp_id\u0027, \u0027protocol_id\u0027, \u0027unique_id\u0027]"},{"line_number":963,"context_line":"        for filter_ in hints.filters:"},{"line_number":964,"context_line":"            if filter_[\u0027name\u0027] in federated_attributes:"}],"source_content_type":"text/x-python","patch_set":14,"id":"5a3905b3_9713e365","line":961,"range":{"start_line":961,"start_character":8,"end_line":961,"end_character":41},"updated":"2017-01-20 18:32:20.000000000","message":"nit: I don\u0027t like the name as its not only filtering hints for federated users... Maybe \"handle_federated_hints_and_return_users\" or something. Or, you could break this up. I can be picky about names, so I\u0027m okay as is.","commit_id":"9128a4143eed2bf8a1043f0659eb8ea4237b0104"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"bb02ced508cd347885cbf4dd6c3b7724c4c4c117","unresolved":false,"context_lines":[{"line_number":958,"context_line":"        return self._set_domain_id_and_mapping("},{"line_number":959,"context_line":"            ref, domain_id, driver, mapping.EntityType.USER)"},{"line_number":960,"context_line":""},{"line_number":961,"context_line":"    def _filter_hints_for_federated_users(self, driver, hints):"},{"line_number":962,"context_line":"        federated_attributes \u003d [\u0027idp_id\u0027, \u0027protocol_id\u0027, \u0027unique_id\u0027]"},{"line_number":963,"context_line":"        for filter_ in hints.filters:"},{"line_number":964,"context_line":"            if filter_[\u0027name\u0027] in federated_attributes:"}],"source_content_type":"text/x-python","patch_set":14,"id":"5a3905b3_f707c619","line":961,"range":{"start_line":961,"start_character":8,"end_line":961,"end_character":41},"in_reply_to":"5a3905b3_9713e365","updated":"2017-01-20 18:51:14.000000000","message":"Done","commit_id":"9128a4143eed2bf8a1043f0659eb8ea4237b0104"}],"keystone/identity/shadow_backends/sql.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"fbec0afbe0b4531954d80686924f31b32f8bdf80","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        query \u003d query.filter(sqlalchemy.and_("},{"line_number":47,"context_line":"            model.User.id \u003d\u003d model.FederatedUser.user_id,"},{"line_number":48,"context_line":"            model.FederatedUser.unique_id \u003d\u003d unique_id))"},{"line_number":49,"context_line":"        hints.filters \u003d [x for x in hints.filters if x[\u0027name\u0027] !\u003d \u0027unique_id\u0027]"},{"line_number":50,"context_line":"        return query"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def get_federated_users(self, hints, unique_id):"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba5201f7_f56a4a80","line":49,"updated":"2017-01-04 21:09:31.000000000","message":"Is hints needed here? I looks like we\u0027re generating a list of something from the filters, but not using it for anything.","commit_id":"8ff8ef7ee68e981f66574e3ed5a19d3bd5f1b55e"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"bb87c90cab5303c32367710d0f6a1370b12f9fe0","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        query \u003d query.filter(sqlalchemy.and_("},{"line_number":47,"context_line":"            model.User.id \u003d\u003d model.FederatedUser.user_id,"},{"line_number":48,"context_line":"            model.FederatedUser.unique_id \u003d\u003d unique_id))"},{"line_number":49,"context_line":"        hints.filters \u003d [x for x in hints.filters if x[\u0027name\u0027] !\u003d \u0027unique_id\u0027]"},{"line_number":50,"context_line":"        return query"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def get_federated_users(self, hints, unique_id):"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba5201f7_1956085c","line":49,"in_reply_to":"ba5201f7_f56a4a80","updated":"2017-01-05 16:33:32.000000000","message":"It is needed for filter_limit_query, otherwise, the whole thing does not return the expected query. Inside filter_limit_query it uses hints to check any remaining filters. If it is None then there are no filter limits that it needs to still apply. Basically, we remove the unique_id filter so that it does not use that in the filter_limit_query and mistakenly try to satisfy filters we have already satisfied in the custom query above.","commit_id":"8ff8ef7ee68e981f66574e3ed5a19d3bd5f1b55e"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"5f73e2db0a60699372524bb63e85f48adcc5ecf8","unresolved":false,"context_lines":[{"line_number":49,"context_line":"            model.FederatedUser.idp_id \u003d\u003d idp_id,"},{"line_number":50,"context_line":"            model.FederatedUser.protocol_id \u003d\u003d protocol_id,"},{"line_number":51,"context_line":"            model.FederatedUser.unique_id \u003d\u003d unique_id))"},{"line_number":52,"context_line":"        hints.filters \u003d []"},{"line_number":53,"context_line":"        return query"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def get_federated_object(self, hints, idp_id, protocol_id, unique_id):"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba5201f7_339e1508","line":52,"updated":"2017-01-10 02:27:26.000000000","message":"Since we are removing all remaining filters from the hints object, we\u0027re an ensuring that the query we get back from filter_limit_query on line 60 is the same as the query we passed in. In the future we will need to address this behavior *if* we want to be able to query both federated attributes and local user attributes.","commit_id":"30f4fb0330bdcf4a45426a272f05e9cf87af8360"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"5f73e2db0a60699372524bb63e85f48adcc5ecf8","unresolved":false,"context_lines":[{"line_number":57,"context_line":"            query \u003d session.query(model.User).outerjoin(model.LocalUser)"},{"line_number":58,"context_line":"            query \u003d self._get_federated_object("},{"line_number":59,"context_line":"                hints, query, idp_id, protocol_id, unique_id)"},{"line_number":60,"context_line":"            user_refs \u003d sql.filter_limit_query(model.User, query, hints)"},{"line_number":61,"context_line":"            return [identity_base.filter_user(x.to_dict()) for x in user_refs]"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def _get_unique_id(self, hints, query, unique_id):"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba5201f7_73241dc6","line":60,"updated":"2017-01-10 02:27:26.000000000","message":"user_refs is actually a query here correct? Not a list of results from the sql backend? What if we used `user_query` instead.\n\n  user_query \u003d sql.filter_limit_query(model.User, query, hints)\n  user_refs \u003d identity_base.filter_user(user_query)","commit_id":"30f4fb0330bdcf4a45426a272f05e9cf87af8360"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"87f26b06087b45e7be2e6e398b45b77717790110","unresolved":false,"context_lines":[{"line_number":43,"context_line":"            return identity_base.filter_user(user_ref.to_dict())"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def _get_federated_users("},{"line_number":46,"context_line":"            self, hints, query, idp_id, protocol_id, unique_id):"},{"line_number":47,"context_line":"        statements \u003d [model.User.id \u003d\u003d model.FederatedUser.user_id]"},{"line_number":48,"context_line":"        if idp_id:"},{"line_number":49,"context_line":"            statements.append(model.FederatedUser.idp_id \u003d\u003d idp_id)"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a3c09a3_3c5ef376","line":46,"updated":"2017-01-18 22:42:36.000000000","message":"ditto:\n\n  def _get_federated_users(self, hints, query):\n      statements \u003d [model.User.id \u003d\u003d model.FederatedUser.user_id]\n      for filter_ in hints.filters:\n          if filter_[\u0027name\u0027] \u003d\u003d \u0027idp_id\u0027:\n              statements.append(model.FederatedUser.idp_id \u003d\u003d filter_[\u0027value\u0027])\n              # pop the filter with idp_id out of hints.filters","commit_id":"6e9f1d89206a85931563ed294b62becbe4dd1269"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"87f26b06087b45e7be2e6e398b45b77717790110","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        query \u003d query.filter(sqlalchemy.and_(*statements))"},{"line_number":62,"context_line":"        return query"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def get_federated_users(self, hints, idp_id, protocol_id, unique_id):"},{"line_number":65,"context_line":"        with sql.session_for_read() as session:"},{"line_number":66,"context_line":"            query \u003d session.query(model.User).outerjoin(model.LocalUser)"},{"line_number":67,"context_line":"            query \u003d self._get_federated_users("}],"source_content_type":"text/x-python","patch_set":9,"id":"7a3c09a3_bc9bc371","line":64,"updated":"2017-01-18 22:42:36.000000000","message":"Then we could shorten this method signature to only the hints, too:\n\n  def get_federated_users(self, hints):\n      ...","commit_id":"6e9f1d89206a85931563ed294b62becbe4dd1269"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"e27e93441b69d814ee87466c896fc751e4352584","unresolved":false,"context_lines":[{"line_number":48,"context_line":"            if filter_[\u0027name\u0027] \u003d\u003d \u0027idp_id\u0027:"},{"line_number":49,"context_line":"                statements.append("},{"line_number":50,"context_line":"                    model.FederatedUser.idp_id \u003d\u003d filter_[\u0027value\u0027])"},{"line_number":51,"context_line":"                hints.filters \u003d ["},{"line_number":52,"context_line":"                    x for x in hints.filters if x[\u0027name\u0027] !\u003d \u0027idp_id\u0027]"},{"line_number":53,"context_line":"            if filter_[\u0027name\u0027] \u003d\u003d \u0027protocol_id\u0027:"},{"line_number":54,"context_line":"                statements.append("},{"line_number":55,"context_line":"                    model.FederatedUser.protocol_id \u003d\u003d filter_[\u0027value\u0027])"}],"source_content_type":"text/x-python","patch_set":10,"id":"5a3905b3_7dd14cfb","line":52,"range":{"start_line":51,"start_character":16,"end_line":52,"end_character":70},"updated":"2017-01-19 13:20:19.000000000","message":"why are we re-building hints.filters every time? we loop it in the beginning\n\nadd a comment about why you\u0027re doing this","commit_id":"f70aabba67e3c735a21a7cd1962042762c188097"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"a796794d36b6e9491ccd4da2d357a07933c5f81d","unresolved":false,"context_lines":[{"line_number":48,"context_line":"            if filter_[\u0027name\u0027] \u003d\u003d \u0027idp_id\u0027:"},{"line_number":49,"context_line":"                statements.append("},{"line_number":50,"context_line":"                    model.FederatedUser.idp_id \u003d\u003d filter_[\u0027value\u0027])"},{"line_number":51,"context_line":"                hints.filters \u003d ["},{"line_number":52,"context_line":"                    x for x in hints.filters if x[\u0027name\u0027] !\u003d \u0027idp_id\u0027]"},{"line_number":53,"context_line":"            if filter_[\u0027name\u0027] \u003d\u003d \u0027protocol_id\u0027:"},{"line_number":54,"context_line":"                statements.append("},{"line_number":55,"context_line":"                    model.FederatedUser.protocol_id \u003d\u003d filter_[\u0027value\u0027])"}],"source_content_type":"text/x-python","patch_set":10,"id":"5a3905b3_dff861e8","line":52,"range":{"start_line":51,"start_character":16,"end_line":52,"end_character":70},"in_reply_to":"5a3905b3_7dd14cfb","updated":"2017-01-19 18:11:36.000000000","message":"Done","commit_id":"f70aabba67e3c735a21a7cd1962042762c188097"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"e27e93441b69d814ee87466c896fc751e4352584","unresolved":false,"context_lines":[{"line_number":54,"context_line":"                statements.append("},{"line_number":55,"context_line":"                    model.FederatedUser.protocol_id \u003d\u003d filter_[\u0027value\u0027])"},{"line_number":56,"context_line":"                hints.filters \u003d ["},{"line_number":57,"context_line":"                    x for x in hints.filters if x[\u0027name\u0027] !\u003d \u0027idp_id\u0027]"},{"line_number":58,"context_line":"            if filter_[\u0027name\u0027] \u003d\u003d \u0027unique_id\u0027:"},{"line_number":59,"context_line":"                statements.append("},{"line_number":60,"context_line":"                    model.FederatedUser.unique_id \u003d\u003d filter_[\u0027value\u0027])"}],"source_content_type":"text/x-python","patch_set":10,"id":"5a3905b3_3d350446","line":57,"range":{"start_line":57,"start_character":62,"end_line":57,"end_character":68},"updated":"2017-01-19 13:20:19.000000000","message":"i think you\u0027re trying to re-build with the previous filter removed? should this be protocol_id?","commit_id":"f70aabba67e3c735a21a7cd1962042762c188097"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"a796794d36b6e9491ccd4da2d357a07933c5f81d","unresolved":false,"context_lines":[{"line_number":54,"context_line":"                statements.append("},{"line_number":55,"context_line":"                    model.FederatedUser.protocol_id \u003d\u003d filter_[\u0027value\u0027])"},{"line_number":56,"context_line":"                hints.filters \u003d ["},{"line_number":57,"context_line":"                    x for x in hints.filters if x[\u0027name\u0027] !\u003d \u0027idp_id\u0027]"},{"line_number":58,"context_line":"            if filter_[\u0027name\u0027] \u003d\u003d \u0027unique_id\u0027:"},{"line_number":59,"context_line":"                statements.append("},{"line_number":60,"context_line":"                    model.FederatedUser.unique_id \u003d\u003d filter_[\u0027value\u0027])"}],"source_content_type":"text/x-python","patch_set":10,"id":"5a3905b3_1fdbc97d","line":57,"range":{"start_line":57,"start_character":62,"end_line":57,"end_character":68},"in_reply_to":"5a3905b3_3d350446","updated":"2017-01-19 18:11:36.000000000","message":"Done","commit_id":"f70aabba67e3c735a21a7cd1962042762c188097"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"3a7f2f43c103f374810dc4ba7ab95b7040020586","unresolved":false,"context_lines":[{"line_number":42,"context_line":"            session.add(user_ref)"},{"line_number":43,"context_line":"            return identity_base.filter_user(user_ref.to_dict())"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def _get_federated_users(self, hints, query):"},{"line_number":46,"context_line":"        statements \u003d [model.User.id \u003d\u003d model.FederatedUser.user_id]"},{"line_number":47,"context_line":"        for filter_ in hints.filters:"},{"line_number":48,"context_line":"            if filter_[\u0027name\u0027] \u003d\u003d \u0027idp_id\u0027:"}],"source_content_type":"text/x-python","patch_set":14,"id":"5a3905b3_57ba5ac1","line":45,"range":{"start_line":45,"start_character":8,"end_line":45,"end_character":28},"updated":"2017-01-20 18:32:20.000000000","message":"This is not really getting federated users, it\u0027s updating the query filter for the federated attributes. Needs a better name.","commit_id":"9128a4143eed2bf8a1043f0659eb8ea4237b0104"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"bb02ced508cd347885cbf4dd6c3b7724c4c4c117","unresolved":false,"context_lines":[{"line_number":42,"context_line":"            session.add(user_ref)"},{"line_number":43,"context_line":"            return identity_base.filter_user(user_ref.to_dict())"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def _get_federated_users(self, hints, query):"},{"line_number":46,"context_line":"        statements \u003d [model.User.id \u003d\u003d model.FederatedUser.user_id]"},{"line_number":47,"context_line":"        for filter_ in hints.filters:"},{"line_number":48,"context_line":"            if filter_[\u0027name\u0027] \u003d\u003d \u0027idp_id\u0027:"}],"source_content_type":"text/x-python","patch_set":14,"id":"5a3905b3_1a8d577b","line":45,"range":{"start_line":45,"start_character":8,"end_line":45,"end_character":28},"in_reply_to":"5a3905b3_57ba5ac1","updated":"2017-01-20 18:51:14.000000000","message":"Done","commit_id":"9128a4143eed2bf8a1043f0659eb8ea4237b0104"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"3a7f2f43c103f374810dc4ba7ab95b7040020586","unresolved":false,"context_lines":[{"line_number":43,"context_line":"            return identity_base.filter_user(user_ref.to_dict())"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def _get_federated_users(self, hints, query):"},{"line_number":46,"context_line":"        statements \u003d [model.User.id \u003d\u003d model.FederatedUser.user_id]"},{"line_number":47,"context_line":"        for filter_ in hints.filters:"},{"line_number":48,"context_line":"            if filter_[\u0027name\u0027] \u003d\u003d \u0027idp_id\u0027:"},{"line_number":49,"context_line":"                statements.append("}],"source_content_type":"text/x-python","patch_set":14,"id":"5a3905b3_37a22eaf","line":46,"range":{"start_line":46,"start_character":8,"end_line":46,"end_character":67},"updated":"2017-01-20 18:32:20.000000000","message":"instead of joining this way, I think it would be more straight forward to do this after line 63:\nquery \u003d query.join(model.FederatedUser)","commit_id":"9128a4143eed2bf8a1043f0659eb8ea4237b0104"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"bb02ced508cd347885cbf4dd6c3b7724c4c4c117","unresolved":false,"context_lines":[{"line_number":43,"context_line":"            return identity_base.filter_user(user_ref.to_dict())"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def _get_federated_users(self, hints, query):"},{"line_number":46,"context_line":"        statements \u003d [model.User.id \u003d\u003d model.FederatedUser.user_id]"},{"line_number":47,"context_line":"        for filter_ in hints.filters:"},{"line_number":48,"context_line":"            if filter_[\u0027name\u0027] \u003d\u003d \u0027idp_id\u0027:"},{"line_number":49,"context_line":"                statements.append("}],"source_content_type":"text/x-python","patch_set":14,"id":"5a3905b3_5aed1f24","line":46,"range":{"start_line":46,"start_character":8,"end_line":46,"end_character":67},"in_reply_to":"5a3905b3_37a22eaf","updated":"2017-01-20 18:51:14.000000000","message":"Done","commit_id":"9128a4143eed2bf8a1043f0659eb8ea4237b0104"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"3a7f2f43c103f374810dc4ba7ab95b7040020586","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def _get_federated_users(self, hints, query):"},{"line_number":46,"context_line":"        statements \u003d [model.User.id \u003d\u003d model.FederatedUser.user_id]"},{"line_number":47,"context_line":"        for filter_ in hints.filters:"},{"line_number":48,"context_line":"            if filter_[\u0027name\u0027] \u003d\u003d \u0027idp_id\u0027:"},{"line_number":49,"context_line":"                statements.append("},{"line_number":50,"context_line":"                    model.FederatedUser.idp_id \u003d\u003d filter_[\u0027value\u0027])"}],"source_content_type":"text/x-python","patch_set":14,"id":"5a3905b3_77a67611","line":47,"range":{"start_line":47,"start_character":18,"end_line":47,"end_character":19},"updated":"2017-01-20 18:32:20.000000000","message":"What\u0027s with the underscore?","commit_id":"9128a4143eed2bf8a1043f0659eb8ea4237b0104"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"bb02ced508cd347885cbf4dd6c3b7724c4c4c117","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def _get_federated_users(self, hints, query):"},{"line_number":46,"context_line":"        statements \u003d [model.User.id \u003d\u003d model.FederatedUser.user_id]"},{"line_number":47,"context_line":"        for filter_ in hints.filters:"},{"line_number":48,"context_line":"            if filter_[\u0027name\u0027] \u003d\u003d \u0027idp_id\u0027:"},{"line_number":49,"context_line":"                statements.append("},{"line_number":50,"context_line":"                    model.FederatedUser.idp_id \u003d\u003d filter_[\u0027value\u0027])"}],"source_content_type":"text/x-python","patch_set":14,"id":"5a3905b3_ba97e38e","line":47,"range":{"start_line":47,"start_character":18,"end_line":47,"end_character":19},"in_reply_to":"5a3905b3_77a67611","updated":"2017-01-20 18:51:14.000000000","message":"filter is already a keyword","commit_id":"9128a4143eed2bf8a1043f0659eb8ea4237b0104"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"d75b942d2137d6d00071bdc82d9cf3ff2a8be136","unresolved":false,"context_lines":[{"line_number":48,"context_line":"            if filter_[\u0027name\u0027] \u003d\u003d \u0027idp_id\u0027:"},{"line_number":49,"context_line":"                statements.append("},{"line_number":50,"context_line":"                    model.FederatedUser.idp_id \u003d\u003d filter_[\u0027value\u0027])"},{"line_number":51,"context_line":"                # Necessary to remove federated attributes from filter after we"},{"line_number":52,"context_line":"                # update the query since hints.filters will be used again in"},{"line_number":53,"context_line":"                # filter_limit_query and we don\u0027t want to pass over the same"},{"line_number":54,"context_line":"                # thing twice."},{"line_number":55,"context_line":"                hints.filters \u003d ["},{"line_number":56,"context_line":"                    x for x in hints.filters if x[\u0027name\u0027] !\u003d filter_[\u0027name\u0027]]"},{"line_number":57,"context_line":"            if filter_[\u0027name\u0027] \u003d\u003d \u0027protocol_id\u0027:"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a3905b3_20df340e","line":54,"range":{"start_line":51,"start_character":16,"end_line":54,"end_character":30},"updated":"2017-01-21 05:34:41.000000000","message":"this still seems funny to me, i feel like we can come up with a better way to do this, why not remove the federation hints if they appear at the end of the loop? in one shot.\n\nanyway, i appreciate the comment.","commit_id":"2084208ea56eabf5a3722dab76ba9063dc995131"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"6f43b943d84e859b808072c120cbafcde758faba","unresolved":false,"context_lines":[{"line_number":48,"context_line":"            if filter_[\u0027name\u0027] \u003d\u003d \u0027idp_id\u0027:"},{"line_number":49,"context_line":"                statements.append("},{"line_number":50,"context_line":"                    model.FederatedUser.idp_id \u003d\u003d filter_[\u0027value\u0027])"},{"line_number":51,"context_line":"                # Necessary to remove federated attributes from filter after we"},{"line_number":52,"context_line":"                # update the query since hints.filters will be used again in"},{"line_number":53,"context_line":"                # filter_limit_query and we don\u0027t want to pass over the same"},{"line_number":54,"context_line":"                # thing twice."},{"line_number":55,"context_line":"                hints.filters \u003d ["},{"line_number":56,"context_line":"                    x for x in hints.filters if x[\u0027name\u0027] !\u003d filter_[\u0027name\u0027]]"},{"line_number":57,"context_line":"            if filter_[\u0027name\u0027] \u003d\u003d \u0027protocol_id\u0027:"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a3905b3_23cd3185","line":54,"range":{"start_line":51,"start_character":16,"end_line":54,"end_character":30},"in_reply_to":"5a3905b3_20df340e","updated":"2017-01-23 22:17:03.000000000","message":"Done","commit_id":"2084208ea56eabf5a3722dab76ba9063dc995131"}],"keystone/tests/unit/identity/test_backends.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"e27e93441b69d814ee87466c896fc751e4352584","unresolved":false,"context_lines":[{"line_number":467,"context_line":"        self.assertEqual(expected_user_ids, user_ids)"},{"line_number":468,"context_line":""},{"line_number":469,"context_line":"    def _build_hints(self, hints, filters, fed_dict):"},{"line_number":470,"context_line":"        if filters and fed_dict:"},{"line_number":471,"context_line":"            for key in filters:"},{"line_number":472,"context_line":"                hints.add_filter(key,"},{"line_number":473,"context_line":"                                 fed_dict[key],"}],"source_content_type":"text/x-python","patch_set":10,"id":"5a3905b3_3d442473","line":470,"range":{"start_line":470,"start_character":8,"end_line":470,"end_character":32},"updated":"2017-01-19 13:20:19.000000000","message":"these are always passed in, and required in the method signature, why check here?","commit_id":"f70aabba67e3c735a21a7cd1962042762c188097"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"a796794d36b6e9491ccd4da2d357a07933c5f81d","unresolved":false,"context_lines":[{"line_number":467,"context_line":"        self.assertEqual(expected_user_ids, user_ids)"},{"line_number":468,"context_line":""},{"line_number":469,"context_line":"    def _build_hints(self, hints, filters, fed_dict):"},{"line_number":470,"context_line":"        if filters and fed_dict:"},{"line_number":471,"context_line":"            for key in filters:"},{"line_number":472,"context_line":"                hints.add_filter(key,"},{"line_number":473,"context_line":"                                 fed_dict[key],"}],"source_content_type":"text/x-python","patch_set":10,"id":"5a3905b3_e993acf8","line":470,"range":{"start_line":470,"start_character":8,"end_line":470,"end_character":32},"in_reply_to":"5a3905b3_3d442473","updated":"2017-01-19 18:11:36.000000000","message":"Done","commit_id":"f70aabba67e3c735a21a7cd1962042762c188097"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"e27e93441b69d814ee87466c896fc751e4352584","unresolved":false,"context_lines":[{"line_number":477,"context_line":"    def _test_list_users_with_attribute(self, filters, federated_dict):"},{"line_number":478,"context_line":"        # Call list_users while no match exists for the federated user"},{"line_number":479,"context_line":"        hints \u003d driver_hints.Hints()"},{"line_number":480,"context_line":"        hints \u003d self._build_hints(hints, filters, federated_dict)"},{"line_number":481,"context_line":"        users \u003d self.identity_api.list_users(hints\u003dhints)"},{"line_number":482,"context_line":"        self.assertEqual(0, len(users))"},{"line_number":483,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"5a3905b3_5d401057","line":480,"range":{"start_line":480,"start_character":50,"end_line":480,"end_character":64},"updated":"2017-01-19 13:20:19.000000000","message":"this is always unit.new_federated_user_ref() why are you passing it around?","commit_id":"f70aabba67e3c735a21a7cd1962042762c188097"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"a796794d36b6e9491ccd4da2d357a07933c5f81d","unresolved":false,"context_lines":[{"line_number":477,"context_line":"    def _test_list_users_with_attribute(self, filters, federated_dict):"},{"line_number":478,"context_line":"        # Call list_users while no match exists for the federated user"},{"line_number":479,"context_line":"        hints \u003d driver_hints.Hints()"},{"line_number":480,"context_line":"        hints \u003d self._build_hints(hints, filters, federated_dict)"},{"line_number":481,"context_line":"        users \u003d self.identity_api.list_users(hints\u003dhints)"},{"line_number":482,"context_line":"        self.assertEqual(0, len(users))"},{"line_number":483,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"5a3905b3_a4138b5b","line":480,"range":{"start_line":480,"start_character":50,"end_line":480,"end_character":64},"in_reply_to":"5a3905b3_5d401057","updated":"2017-01-19 18:11:36.000000000","message":"unique_id isn\u0027t consistent every time unit.new_federated_user_ref() is called.","commit_id":"f70aabba67e3c735a21a7cd1962042762c188097"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"e27e93441b69d814ee87466c896fc751e4352584","unresolved":false,"context_lines":[{"line_number":483,"context_line":""},{"line_number":484,"context_line":"        # list_users with a new relational user and federated user"},{"line_number":485,"context_line":"        hints \u003d self._build_hints(hints, filters, federated_dict)"},{"line_number":486,"context_line":"        self.shadow_users_api.create_federated_user(federated_dict)"},{"line_number":487,"context_line":"        users \u003d self.identity_api.list_users(hints\u003dhints)"},{"line_number":488,"context_line":"        self.assertEqual(1, len(users))"},{"line_number":489,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"5a3905b3_b81d8268","line":486,"range":{"start_line":486,"start_character":8,"end_line":486,"end_character":67},"updated":"2017-01-19 13:20:19.000000000","message":"you need additional testing here, more than one user with various idps and other filters","commit_id":"f70aabba67e3c735a21a7cd1962042762c188097"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"a796794d36b6e9491ccd4da2d357a07933c5f81d","unresolved":false,"context_lines":[{"line_number":483,"context_line":""},{"line_number":484,"context_line":"        # list_users with a new relational user and federated user"},{"line_number":485,"context_line":"        hints \u003d self._build_hints(hints, filters, federated_dict)"},{"line_number":486,"context_line":"        self.shadow_users_api.create_federated_user(federated_dict)"},{"line_number":487,"context_line":"        users \u003d self.identity_api.list_users(hints\u003dhints)"},{"line_number":488,"context_line":"        self.assertEqual(1, len(users))"},{"line_number":489,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"5a3905b3_e41d9367","line":486,"range":{"start_line":486,"start_character":8,"end_line":486,"end_character":67},"in_reply_to":"5a3905b3_b81d8268","updated":"2017-01-19 18:11:36.000000000","message":"Done","commit_id":"f70aabba67e3c735a21a7cd1962042762c188097"}],"keystone/tests/unit/test_v3_identity.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"4d05885dadb17bf512048dba045f5b25ecf218da","unresolved":false,"context_lines":[{"line_number":340,"context_line":"        hints.add_filter(\u0027unique_id\u0027, fed_dict[\u0027unique_id\u0027],"},{"line_number":341,"context_line":"                         comparator\u003d\u0027equals\u0027)"},{"line_number":342,"context_line":"        users \u003d self.identity_api.list_users(hints\u003dhints)"},{"line_number":343,"context_line":"        self.assertEqual(1, len(users))"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"        # Set the resource url and assert valid response"},{"line_number":346,"context_line":"        resource_url \u003d (\u0027/users?unique_id\u003d\\\u0027%s\\\u0027\u0027 % fed_dict[\u0027unique_id\u0027])"}],"source_content_type":"text/x-python","patch_set":14,"id":"5a3905b3_17aff381","line":343,"updated":"2017-01-20 18:08:48.000000000","message":"You could make several additional assertions here to ensure the user returned in the `users` variable is exactly the user we\u0027re expecting.","commit_id":"9128a4143eed2bf8a1043f0659eb8ea4237b0104"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"3a7f2f43c103f374810dc4ba7ab95b7040020586","unresolved":false,"context_lines":[{"line_number":340,"context_line":"        hints.add_filter(\u0027unique_id\u0027, fed_dict[\u0027unique_id\u0027],"},{"line_number":341,"context_line":"                         comparator\u003d\u0027equals\u0027)"},{"line_number":342,"context_line":"        users \u003d self.identity_api.list_users(hints\u003dhints)"},{"line_number":343,"context_line":"        self.assertEqual(1, len(users))"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"        # Set the resource url and assert valid response"},{"line_number":346,"context_line":"        resource_url \u003d (\u0027/users?unique_id\u003d\\\u0027%s\\\u0027\u0027 % fed_dict[\u0027unique_id\u0027])"}],"source_content_type":"text/x-python","patch_set":14,"id":"5a3905b3_77e836b5","line":343,"in_reply_to":"5a3905b3_17aff381","updated":"2017-01-20 18:32:20.000000000","message":"++","commit_id":"9128a4143eed2bf8a1043f0659eb8ea4237b0104"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"0387c3f2f6272e3bbfcfa3473e832435e13f542d","unresolved":false,"context_lines":[{"line_number":340,"context_line":"        hints.add_filter(\u0027unique_id\u0027, fed_dict[\u0027unique_id\u0027],"},{"line_number":341,"context_line":"                         comparator\u003d\u0027equals\u0027)"},{"line_number":342,"context_line":"        users \u003d self.identity_api.list_users(hints\u003dhints)"},{"line_number":343,"context_line":"        self.assertEqual(1, len(users))"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"        # Set the resource url and assert valid response"},{"line_number":346,"context_line":"        resource_url \u003d (\u0027/users?unique_id\u003d\\\u0027%s\\\u0027\u0027 % fed_dict[\u0027unique_id\u0027])"}],"source_content_type":"text/x-python","patch_set":14,"id":"5a3905b3_77e91680","line":343,"in_reply_to":"5a3905b3_17aff381","updated":"2017-01-20 18:36:55.000000000","message":"Done","commit_id":"9128a4143eed2bf8a1043f0659eb8ea4237b0104"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"0387c3f2f6272e3bbfcfa3473e832435e13f542d","unresolved":false,"context_lines":[{"line_number":340,"context_line":"        hints.add_filter(\u0027unique_id\u0027, fed_dict[\u0027unique_id\u0027],"},{"line_number":341,"context_line":"                         comparator\u003d\u0027equals\u0027)"},{"line_number":342,"context_line":"        users \u003d self.identity_api.list_users(hints\u003dhints)"},{"line_number":343,"context_line":"        self.assertEqual(1, len(users))"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"        # Set the resource url and assert valid response"},{"line_number":346,"context_line":"        resource_url \u003d (\u0027/users?unique_id\u003d\\\u0027%s\\\u0027\u0027 % fed_dict[\u0027unique_id\u0027])"}],"source_content_type":"text/x-python","patch_set":14,"id":"5a3905b3_b7037e41","line":343,"in_reply_to":"5a3905b3_77e836b5","updated":"2017-01-20 18:36:55.000000000","message":"Done","commit_id":"9128a4143eed2bf8a1043f0659eb8ea4237b0104"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"d75b942d2137d6d00071bdc82d9cf3ff2a8be136","unresolved":false,"context_lines":[{"line_number":310,"context_line":""},{"line_number":311,"context_line":"    def test_list_users_with_federated_attributes(self):"},{"line_number":312,"context_line":"        # Create the idp"},{"line_number":313,"context_line":"        self.idp \u003d {"},{"line_number":314,"context_line":"            \u0027id\u0027: uuid.uuid4().hex,"},{"line_number":315,"context_line":"            \u0027enabled\u0027: True,"},{"line_number":316,"context_line":"            \u0027description\u0027: uuid.uuid4().hex"},{"line_number":317,"context_line":"        }"},{"line_number":318,"context_line":"        self.federation_api.create_idp(self.idp[\u0027id\u0027], self.idp)"},{"line_number":319,"context_line":"        # Create the mapping"},{"line_number":320,"context_line":"        self.mapping \u003d mapping_fixtures.MAPPING_EPHEMERAL_USER"},{"line_number":321,"context_line":"        self.mapping[\u0027id\u0027] \u003d uuid.uuid4().hex"},{"line_number":322,"context_line":"        self.federation_api.create_mapping(self.mapping[\u0027id\u0027], self.mapping)"},{"line_number":323,"context_line":"        # Create the protocol"},{"line_number":324,"context_line":"        protocol \u003d {"},{"line_number":325,"context_line":"            \u0027id\u0027: uuid.uuid4().hex,"},{"line_number":326,"context_line":"            \u0027mapping_id\u0027: self.mapping[\u0027id\u0027]"},{"line_number":327,"context_line":"        }"},{"line_number":328,"context_line":"        self.federation_api.create_protocol(self.idp[\u0027id\u0027], protocol[\u0027id\u0027],"},{"line_number":329,"context_line":"                                            protocol)"},{"line_number":330,"context_line":"        # Create the federated object"},{"line_number":331,"context_line":"        fed_dict \u003d unit.new_federated_user_ref()"},{"line_number":332,"context_line":"        fed_dict[\u0027idp_id\u0027] \u003d self.idp[\u0027id\u0027]"},{"line_number":333,"context_line":"        fed_dict[\u0027protocol_id\u0027] \u003d protocol[\u0027id\u0027]"},{"line_number":334,"context_line":"        fed_dict[\u0027unique_id\u0027] \u003d \"jdoe\""},{"line_number":335,"context_line":"        # Create the domain_id, user, and federated_user relationship"},{"line_number":336,"context_line":"        domain \u003d unit.new_domain_ref()"},{"line_number":337,"context_line":"        self.resource_api.create_domain(domain[\u0027id\u0027], domain)"},{"line_number":338,"context_line":"        user \u003d unit.new_user_ref(domain_id\u003ddomain[\u0027id\u0027])"},{"line_number":339,"context_line":"        with sql.session_for_write() as session:"},{"line_number":340,"context_line":"            federated_ref \u003d model.FederatedUser.from_dict(fed_dict)"},{"line_number":341,"context_line":"            user_ref \u003d model.User.from_dict(user)"},{"line_number":342,"context_line":"            user_ref.created_at \u003d datetime.datetime.utcnow()"},{"line_number":343,"context_line":"            user_ref.federated_users.append(federated_ref)"},{"line_number":344,"context_line":"            session.add(user_ref)"},{"line_number":345,"context_line":"            user \u003d identity_base.filter_user(user_ref.to_dict())"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"        # Verify the user was created"},{"line_number":348,"context_line":"        user_ref \u003d self.identity_api.get_user(user[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a3905b3_60fcdc72","line":345,"range":{"start_line":313,"start_character":8,"end_line":345,"end_character":64},"updated":"2017-01-21 05:34:41.000000000","message":"create a new test class and turn this into setupClass","commit_id":"2084208ea56eabf5a3722dab76ba9063dc995131"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"6f43b943d84e859b808072c120cbafcde758faba","unresolved":false,"context_lines":[{"line_number":310,"context_line":""},{"line_number":311,"context_line":"    def test_list_users_with_federated_attributes(self):"},{"line_number":312,"context_line":"        # Create the idp"},{"line_number":313,"context_line":"        self.idp \u003d {"},{"line_number":314,"context_line":"            \u0027id\u0027: uuid.uuid4().hex,"},{"line_number":315,"context_line":"            \u0027enabled\u0027: True,"},{"line_number":316,"context_line":"            \u0027description\u0027: uuid.uuid4().hex"},{"line_number":317,"context_line":"        }"},{"line_number":318,"context_line":"        self.federation_api.create_idp(self.idp[\u0027id\u0027], self.idp)"},{"line_number":319,"context_line":"        # Create the mapping"},{"line_number":320,"context_line":"        self.mapping \u003d mapping_fixtures.MAPPING_EPHEMERAL_USER"},{"line_number":321,"context_line":"        self.mapping[\u0027id\u0027] \u003d uuid.uuid4().hex"},{"line_number":322,"context_line":"        self.federation_api.create_mapping(self.mapping[\u0027id\u0027], self.mapping)"},{"line_number":323,"context_line":"        # Create the protocol"},{"line_number":324,"context_line":"        protocol \u003d {"},{"line_number":325,"context_line":"            \u0027id\u0027: uuid.uuid4().hex,"},{"line_number":326,"context_line":"            \u0027mapping_id\u0027: self.mapping[\u0027id\u0027]"},{"line_number":327,"context_line":"        }"},{"line_number":328,"context_line":"        self.federation_api.create_protocol(self.idp[\u0027id\u0027], protocol[\u0027id\u0027],"},{"line_number":329,"context_line":"                                            protocol)"},{"line_number":330,"context_line":"        # Create the federated object"},{"line_number":331,"context_line":"        fed_dict \u003d unit.new_federated_user_ref()"},{"line_number":332,"context_line":"        fed_dict[\u0027idp_id\u0027] \u003d self.idp[\u0027id\u0027]"},{"line_number":333,"context_line":"        fed_dict[\u0027protocol_id\u0027] \u003d protocol[\u0027id\u0027]"},{"line_number":334,"context_line":"        fed_dict[\u0027unique_id\u0027] \u003d \"jdoe\""},{"line_number":335,"context_line":"        # Create the domain_id, user, and federated_user relationship"},{"line_number":336,"context_line":"        domain \u003d unit.new_domain_ref()"},{"line_number":337,"context_line":"        self.resource_api.create_domain(domain[\u0027id\u0027], domain)"},{"line_number":338,"context_line":"        user \u003d unit.new_user_ref(domain_id\u003ddomain[\u0027id\u0027])"},{"line_number":339,"context_line":"        with sql.session_for_write() as session:"},{"line_number":340,"context_line":"            federated_ref \u003d model.FederatedUser.from_dict(fed_dict)"},{"line_number":341,"context_line":"            user_ref \u003d model.User.from_dict(user)"},{"line_number":342,"context_line":"            user_ref.created_at \u003d datetime.datetime.utcnow()"},{"line_number":343,"context_line":"            user_ref.federated_users.append(federated_ref)"},{"line_number":344,"context_line":"            session.add(user_ref)"},{"line_number":345,"context_line":"            user \u003d identity_base.filter_user(user_ref.to_dict())"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"        # Verify the user was created"},{"line_number":348,"context_line":"        user_ref \u003d self.identity_api.get_user(user[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a3905b3_63c3b957","line":345,"range":{"start_line":313,"start_character":8,"end_line":345,"end_character":64},"in_reply_to":"5a3905b3_60fcdc72","updated":"2017-01-23 22:17:03.000000000","message":"Done","commit_id":"2084208ea56eabf5a3722dab76ba9063dc995131"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"d75b942d2137d6d00071bdc82d9cf3ff2a8be136","unresolved":false,"context_lines":[{"line_number":344,"context_line":"            session.add(user_ref)"},{"line_number":345,"context_line":"            user \u003d identity_base.filter_user(user_ref.to_dict())"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"        # Verify the user was created"},{"line_number":348,"context_line":"        user_ref \u003d self.identity_api.get_user(user[\u0027id\u0027])"},{"line_number":349,"context_line":"        self.assertDictEqual(user, user_ref)"},{"line_number":350,"context_line":"        # Verify a list_users can use the fed hint to return the matching user"},{"line_number":351,"context_line":"        hints \u003d driver_hints.Hints()"},{"line_number":352,"context_line":"        hints.add_filter(\u0027unique_id\u0027, fed_dict[\u0027unique_id\u0027],"},{"line_number":353,"context_line":"                         comparator\u003d\u0027equals\u0027)"},{"line_number":354,"context_line":"        users \u003d self.identity_api.list_users(hints\u003dhints)"},{"line_number":355,"context_line":"        self.assertEqual(1, len(users))"},{"line_number":356,"context_line":"        # Verify that the user created from create_federated_user and the"},{"line_number":357,"context_line":"        # single user in list_users are the same"},{"line_number":358,"context_line":"        self.assertDictEqual(user, users[0])"},{"line_number":359,"context_line":"        # Verify that we can get a federated user from the federated_dict to"},{"line_number":360,"context_line":"        # ensure that a federated_user was created and there is a corresponding"},{"line_number":361,"context_line":"        # user that exists. Then verify that the user matches the single user"},{"line_number":362,"context_line":"        # returned from list_users"},{"line_number":363,"context_line":"        fed_user \u003d self.shadow_users_api.get_federated_user("},{"line_number":364,"context_line":"            fed_dict[\u0027idp_id\u0027], fed_dict[\u0027protocol_id\u0027], fed_dict[\u0027unique_id\u0027])"},{"line_number":365,"context_line":"        self.assertDictEqual(fed_user, users[0])"},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"        # Set the resource url and assert valid response"},{"line_number":368,"context_line":"        resource_url \u003d (\u0027/users?unique_id\u003d%s\u0027 % str(fed_dict[\u0027unique_id\u0027]))"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a3905b3_e0d9ac23","line":365,"range":{"start_line":347,"start_character":0,"end_line":365,"end_character":48},"updated":"2017-01-21 05:34:41.000000000","message":"this is all testing the backend and can be removed or moved to test_backends.py","commit_id":"2084208ea56eabf5a3722dab76ba9063dc995131"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"6f43b943d84e859b808072c120cbafcde758faba","unresolved":false,"context_lines":[{"line_number":344,"context_line":"            session.add(user_ref)"},{"line_number":345,"context_line":"            user \u003d identity_base.filter_user(user_ref.to_dict())"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"        # Verify the user was created"},{"line_number":348,"context_line":"        user_ref \u003d self.identity_api.get_user(user[\u0027id\u0027])"},{"line_number":349,"context_line":"        self.assertDictEqual(user, user_ref)"},{"line_number":350,"context_line":"        # Verify a list_users can use the fed hint to return the matching user"},{"line_number":351,"context_line":"        hints \u003d driver_hints.Hints()"},{"line_number":352,"context_line":"        hints.add_filter(\u0027unique_id\u0027, fed_dict[\u0027unique_id\u0027],"},{"line_number":353,"context_line":"                         comparator\u003d\u0027equals\u0027)"},{"line_number":354,"context_line":"        users \u003d self.identity_api.list_users(hints\u003dhints)"},{"line_number":355,"context_line":"        self.assertEqual(1, len(users))"},{"line_number":356,"context_line":"        # Verify that the user created from create_federated_user and the"},{"line_number":357,"context_line":"        # single user in list_users are the same"},{"line_number":358,"context_line":"        self.assertDictEqual(user, users[0])"},{"line_number":359,"context_line":"        # Verify that we can get a federated user from the federated_dict to"},{"line_number":360,"context_line":"        # ensure that a federated_user was created and there is a corresponding"},{"line_number":361,"context_line":"        # user that exists. Then verify that the user matches the single user"},{"line_number":362,"context_line":"        # returned from list_users"},{"line_number":363,"context_line":"        fed_user \u003d self.shadow_users_api.get_federated_user("},{"line_number":364,"context_line":"            fed_dict[\u0027idp_id\u0027], fed_dict[\u0027protocol_id\u0027], fed_dict[\u0027unique_id\u0027])"},{"line_number":365,"context_line":"        self.assertDictEqual(fed_user, users[0])"},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"        # Set the resource url and assert valid response"},{"line_number":368,"context_line":"        resource_url \u003d (\u0027/users?unique_id\u003d%s\u0027 % str(fed_dict[\u0027unique_id\u0027]))"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a3905b3_c3aaad84","line":365,"range":{"start_line":347,"start_character":0,"end_line":365,"end_character":48},"in_reply_to":"5a3905b3_e0d9ac23","updated":"2017-01-23 22:17:03.000000000","message":"Done","commit_id":"2084208ea56eabf5a3722dab76ba9063dc995131"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"d75b942d2137d6d00071bdc82d9cf3ff2a8be136","unresolved":false,"context_lines":[{"line_number":365,"context_line":"        self.assertDictEqual(fed_user, users[0])"},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"        # Set the resource url and assert valid response"},{"line_number":368,"context_line":"        resource_url \u003d (\u0027/users?unique_id\u003d%s\u0027 % str(fed_dict[\u0027unique_id\u0027]))"},{"line_number":369,"context_line":"        r \u003d self.get(resource_url)"},{"line_number":370,"context_line":"        self.assertValidUserListResponse(r, ref\u003duser,"},{"line_number":371,"context_line":"                                         resource_url\u003dresource_url)"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a3905b3_20065486","line":368,"range":{"start_line":368,"start_character":8,"end_line":368,"end_character":75},"updated":"2017-01-21 05:34:41.000000000","message":"yes, more of these please, where the query string is idp and protocol, and a combination of them, and a correct value with an incorrect value.\n\nalso, add more than one user and one idp and one protocol","commit_id":"2084208ea56eabf5a3722dab76ba9063dc995131"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"6f43b943d84e859b808072c120cbafcde758faba","unresolved":false,"context_lines":[{"line_number":365,"context_line":"        self.assertDictEqual(fed_user, users[0])"},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"        # Set the resource url and assert valid response"},{"line_number":368,"context_line":"        resource_url \u003d (\u0027/users?unique_id\u003d%s\u0027 % str(fed_dict[\u0027unique_id\u0027]))"},{"line_number":369,"context_line":"        r \u003d self.get(resource_url)"},{"line_number":370,"context_line":"        self.assertValidUserListResponse(r, ref\u003duser,"},{"line_number":371,"context_line":"                                         resource_url\u003dresource_url)"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a3905b3_e3ade99b","line":368,"range":{"start_line":368,"start_character":8,"end_line":368,"end_character":75},"in_reply_to":"5a3905b3_20065486","updated":"2017-01-23 22:17:03.000000000","message":"Done","commit_id":"2084208ea56eabf5a3722dab76ba9063dc995131"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"6eb7774fd427967f2aa9ea85a69588c50fb43177","unresolved":false,"context_lines":[{"line_number":992,"context_line":"                             expected_status\u003dhttp_client.BAD_REQUEST)"},{"line_number":993,"context_line":""},{"line_number":994,"context_line":""},{"line_number":995,"context_line":"class UserAPITests(test_v3.RestfulTestCase):"},{"line_number":996,"context_line":"    def _create_federated_attributes(self):"},{"line_number":997,"context_line":"        # Create the idp"},{"line_number":998,"context_line":"        idp \u003d {"}],"source_content_type":"text/x-python","patch_set":29,"id":"5a3905b3_ef8782b2","line":995,"range":{"start_line":995,"start_character":6,"end_line":995,"end_character":18},"updated":"2017-01-24 04:11:44.000000000","message":"This is very generic, should be something like:\n\n  ListUserFederatedAttributeTests","commit_id":"19c6530b1a95634f6cd399c98127fca60687f0ca"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"cc7fb0d64d5d570721bd7e19292bb4d70610c6a8","unresolved":false,"context_lines":[{"line_number":992,"context_line":"                             expected_status\u003dhttp_client.BAD_REQUEST)"},{"line_number":993,"context_line":""},{"line_number":994,"context_line":""},{"line_number":995,"context_line":"class UserAPITests(test_v3.RestfulTestCase):"},{"line_number":996,"context_line":"    def _create_federated_attributes(self):"},{"line_number":997,"context_line":"        # Create the idp"},{"line_number":998,"context_line":"        idp \u003d {"}],"source_content_type":"text/x-python","patch_set":29,"id":"5a3905b3_a2111106","line":995,"range":{"start_line":995,"start_character":6,"end_line":995,"end_character":18},"in_reply_to":"5a3905b3_ef8782b2","updated":"2017-01-24 04:30:47.000000000","message":"++","commit_id":"19c6530b1a95634f6cd399c98127fca60687f0ca"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"6eb7774fd427967f2aa9ea85a69588c50fb43177","unresolved":false,"context_lines":[{"line_number":1085,"context_line":"            self.assertValidUserListResponse(r, ref\u003dself.fed_user2,"},{"line_number":1086,"context_line":"                                             resource_url\u003dresource_url)"},{"line_number":1087,"context_line":""},{"line_number":1088,"context_line":"    def test_list_user_with_all_possible_federated_queries(self):"},{"line_number":1089,"context_line":"        # Create a permutation to test every possible combination of federated"},{"line_number":1090,"context_line":"        # attributes in the list users query"},{"line_number":1091,"context_line":"        attributes \u003d [\u0027idp_id\u0027, \u0027protocol_id\u0027, \u0027unique_id\u0027]"},{"line_number":1092,"context_line":"        for attr in range(1, len(attributes) + 1):"},{"line_number":1093,"context_line":"            for param in list(itertools.combinations(attributes, attr)):"},{"line_number":1094,"context_line":"                self._test_list_users_with_federated_parameter(param)"}],"source_content_type":"text/x-python","patch_set":29,"id":"5a3905b3_8f435e6b","line":1094,"range":{"start_line":1088,"start_character":8,"end_line":1094,"end_character":69},"updated":"2017-01-24 04:11:44.000000000","message":"i think, for tests, its probably better to be verbose and list the 7 combinations, but can be done in another patch","commit_id":"19c6530b1a95634f6cd399c98127fca60687f0ca"}],"releasenotes/notes/extending_federated_attributes_to_list_users.yaml":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"d75b942d2137d6d00071bdc82d9cf3ff2a8be136","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"upgrade:"},{"line_number":3,"context_line":"  - Adds the ability for a user to include the parameters idp_id, protocol_id,"},{"line_number":4,"context_line":"    and/or unique_id to the API GET call to /v3/users for list_users"}],"source_content_type":"text/x-yaml","patch_set":23,"id":"5a3905b3_00eeb8b3","line":4,"range":{"start_line":3,"start_character":4,"end_line":4,"end_character":68},"updated":"2017-01-21 05:34:41.000000000","message":"Close...\n\n - Added new filters (``idp_id``, ``protocol_id``, and ``unique_id``) for the list user API (``GET /v3/users``).","commit_id":"2084208ea56eabf5a3722dab76ba9063dc995131"}]}
