)]}'
{"openstack_dashboard/dashboards/identity/users/forms.py":[{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"c491d1066ed92bd15c4abfd169a575a599ecb369","unresolved":false,"context_lines":[{"line_number":315,"context_line":"        user \u003d api.keystone.user_get(self.request, user_id, admin\u003dFalse)"},{"line_number":316,"context_line":"        options \u003d getattr(user, \"options\", {})"},{"line_number":317,"context_line":"        lock_password \u003d options.get(\"lock_password\", None)"},{"line_number":318,"context_line":"        if lock_password:"},{"line_number":319,"context_line":"            self.api_error(_(\u0027Password is locked.\u0027))"},{"line_number":320,"context_line":"            return False"},{"line_number":321,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_65d8657a","line":318,"range":{"start_line":318,"start_character":11,"end_line":318,"end_character":24},"updated":"2019-01-31 10:46:06.000000000","message":"Why don\u0027t we check if lock_password is True? What is a default value i keystone?","commit_id":"703757b61c234a2a117a4f7c287d1a3a71042872"},{"author":{"_account_id":27838,"name":"Vadym Markov","email":"vmarkov@mirantis.com","username":"vmarkov"},"change_message_id":"2045cf2b7bdd1d0c90590a58d1e4b53abb09a4ea","unresolved":false,"context_lines":[{"line_number":315,"context_line":"        user \u003d api.keystone.user_get(self.request, user_id, admin\u003dFalse)"},{"line_number":316,"context_line":"        options \u003d getattr(user, \"options\", {})"},{"line_number":317,"context_line":"        lock_password \u003d options.get(\"lock_password\", None)"},{"line_number":318,"context_line":"        if lock_password:"},{"line_number":319,"context_line":"            self.api_error(_(\u0027Password is locked.\u0027))"},{"line_number":320,"context_line":"            return False"},{"line_number":321,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_ad293d37","line":318,"range":{"start_line":318,"start_character":11,"end_line":318,"end_character":24},"in_reply_to":"9fdfeff1_65d8657a","updated":"2019-02-01 14:28:06.000000000","message":"Default is False","commit_id":"703757b61c234a2a117a4f7c287d1a3a71042872"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"c491d1066ed92bd15c4abfd169a575a599ecb369","unresolved":false,"context_lines":[{"line_number":316,"context_line":"        options \u003d getattr(user, \"options\", {})"},{"line_number":317,"context_line":"        lock_password \u003d options.get(\"lock_password\", None)"},{"line_number":318,"context_line":"        if lock_password:"},{"line_number":319,"context_line":"            self.api_error(_(\u0027Password is locked.\u0027))"},{"line_number":320,"context_line":"            return False"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"        # Throw away the password confirmation, we\u0027re done with it."}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_057dd96c","line":319,"range":{"start_line":319,"start_character":30,"end_line":319,"end_character":48},"updated":"2019-01-31 10:46:06.000000000","message":"Please, specify more user-friendly message","commit_id":"703757b61c234a2a117a4f7c287d1a3a71042872"},{"author":{"_account_id":27838,"name":"Vadym Markov","email":"vmarkov@mirantis.com","username":"vmarkov"},"change_message_id":"2045cf2b7bdd1d0c90590a58d1e4b53abb09a4ea","unresolved":false,"context_lines":[{"line_number":316,"context_line":"        options \u003d getattr(user, \"options\", {})"},{"line_number":317,"context_line":"        lock_password \u003d options.get(\"lock_password\", None)"},{"line_number":318,"context_line":"        if lock_password:"},{"line_number":319,"context_line":"            self.api_error(_(\u0027Password is locked.\u0027))"},{"line_number":320,"context_line":"            return False"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"        # Throw away the password confirmation, we\u0027re done with it."}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_0d0169af","line":319,"range":{"start_line":319,"start_character":30,"end_line":319,"end_character":48},"in_reply_to":"9fdfeff1_057dd96c","updated":"2019-02-01 14:28:06.000000000","message":"Done","commit_id":"703757b61c234a2a117a4f7c287d1a3a71042872"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"09c54ac70cee17b8ff8ad447b2338df1243901c5","unresolved":false,"context_lines":[{"line_number":320,"context_line":"        if lock_password:"},{"line_number":321,"context_line":"            self.api_error("},{"line_number":322,"context_line":"                _(\u0027User is not allowed to change password via self-service\u0027))"},{"line_number":323,"context_line":"            return False"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"        # Throw away the password confirmation, we\u0027re done with it."},{"line_number":326,"context_line":"        data.pop(\u0027confirm_password\u0027, None)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_b5449a75","line":323,"updated":"2020-04-02 10:49:36.000000000","message":"We already have a guard for lock_password True case in the table action. Do we really need this? If you consider a race condition, can\u0027t we defer it to the keystone API?","commit_id":"ab5d9393c23cdc04e4ff4a97b394631243f00ba2"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"8325c8364300d0c11a23114f3325dbbe16ad29af","unresolved":false,"context_lines":[{"line_number":320,"context_line":"        if lock_password:"},{"line_number":321,"context_line":"            self.api_error("},{"line_number":322,"context_line":"                _(\u0027User is not allowed to change password via self-service\u0027))"},{"line_number":323,"context_line":"            return False"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"        # Throw away the password confirmation, we\u0027re done with it."},{"line_number":326,"context_line":"        data.pop(\u0027confirm_password\u0027, None)"}],"source_content_type":"text/x-python","patch_set":3,"id":"df33271e_c630c6a1","line":323,"in_reply_to":"9fdfeff1_b5449a75","updated":"2020-04-08 15:24:39.000000000","message":"I prefer to have validation as early as possible. Also, this behaviour provides us with code consistency with other checks","commit_id":"ab5d9393c23cdc04e4ff4a97b394631243f00ba2"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"48597e86039d347fdf89a988042f29e912dd5422","unresolved":false,"context_lines":[{"line_number":320,"context_line":"        if lock_password:"},{"line_number":321,"context_line":"            self.api_error("},{"line_number":322,"context_line":"                _(\u0027User is not allowed to change password via self-service\u0027))"},{"line_number":323,"context_line":"            return False"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"        # Throw away the password confirmation, we\u0027re done with it."},{"line_number":326,"context_line":"        data.pop(\u0027confirm_password\u0027, None)"}],"source_content_type":"text/x-python","patch_set":3,"id":"df33271e_58ae4fe7","line":323,"in_reply_to":"df33271e_c630c6a1","updated":"2020-04-08 16:31:12.000000000","message":"The code adds one more API calls (L.317). If no additional API call, this check makes sense. We already check if a user can use lock_password in the table action, so this check is only for race condition. One additional API call sounds too much to cover only the race condition.\n\nFor the consistency of validations (perhaps you talk about L.333 below), in case of admin_password below, it verify user input. This case discussed is a validation for a hidden field (except the race condition), so a question hit me....","commit_id":"ab5d9393c23cdc04e4ff4a97b394631243f00ba2"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"8e85a3400fafcb9c0c3f73d806eeaeb1d72ce391","unresolved":false,"context_lines":[{"line_number":326,"context_line":"        if lock_password:"},{"line_number":327,"context_line":"            self.api_error("},{"line_number":328,"context_line":"                _(\u0027User is not allowed to change password via self-service\u0027))"},{"line_number":329,"context_line":"            return False"},{"line_number":330,"context_line":""},{"line_number":331,"context_line":"        # Throw away the password confirmation, we\u0027re done with it."},{"line_number":332,"context_line":"        data.pop(\u0027confirm_password\u0027, None)"}],"source_content_type":"text/x-python","patch_set":8,"id":"df33271e_2b74c5ce","line":329,"updated":"2020-04-09 02:08:34.000000000","message":"Please check my reply comment in patch set 3.\n\nhttps://review.opendev.org/#/c/630663/3/openstack_dashboard/dashboards/identity/users/forms.py@323","commit_id":"9236f30e7518c36acd932898e7c975c4fc038080"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"4e2e8976d9e2f3cd6073afa699ab4e73093ae88a","unresolved":false,"context_lines":[{"line_number":326,"context_line":"        if lock_password:"},{"line_number":327,"context_line":"            self.api_error("},{"line_number":328,"context_line":"                _(\u0027User is not allowed to change password via self-service\u0027))"},{"line_number":329,"context_line":"            return False"},{"line_number":330,"context_line":""},{"line_number":331,"context_line":"        # Throw away the password confirmation, we\u0027re done with it."},{"line_number":332,"context_line":"        data.pop(\u0027confirm_password\u0027, None)"}],"source_content_type":"text/x-python","patch_set":8,"id":"df33271e_e1f94280","line":329,"in_reply_to":"df33271e_2b74c5ce","updated":"2020-04-10 10:13:46.000000000","message":"Done","commit_id":"9236f30e7518c36acd932898e7c975c4fc038080"}],"openstack_dashboard/dashboards/identity/users/tables.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"8e85a3400fafcb9c0c3f73d806eeaeb1d72ce391","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    def allowed(self, request, user):"},{"line_number":67,"context_line":"        options \u003d getattr(user, \"options\", {})"},{"line_number":68,"context_line":"        lock_password \u003d options.get(\"lock_password\", False)"},{"line_number":69,"context_line":"        return (not lock_password) and api.keystone.keystone_can_edit_user()"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"class ToggleEnabled(policy.PolicyTargetMixin, tables.BatchAction):"}],"source_content_type":"text/x-python","patch_set":8,"id":"df33271e_0bce212c","line":69,"range":{"start_line":69,"start_character":15,"end_line":69,"end_character":34},"updated":"2020-04-09 02:08:34.000000000","message":"Parentheses are unnencessary.","commit_id":"9236f30e7518c36acd932898e7c975c4fc038080"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"4e2e8976d9e2f3cd6073afa699ab4e73093ae88a","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    def allowed(self, request, user):"},{"line_number":67,"context_line":"        options \u003d getattr(user, \"options\", {})"},{"line_number":68,"context_line":"        lock_password \u003d options.get(\"lock_password\", False)"},{"line_number":69,"context_line":"        return (not lock_password) and api.keystone.keystone_can_edit_user()"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"class ToggleEnabled(policy.PolicyTargetMixin, tables.BatchAction):"}],"source_content_type":"text/x-python","patch_set":8,"id":"df33271e_c1f6be8f","line":69,"range":{"start_line":69,"start_character":15,"end_line":69,"end_character":34},"in_reply_to":"df33271e_0bce212c","updated":"2020-04-10 10:13:46.000000000","message":"Done","commit_id":"9236f30e7518c36acd932898e7c975c4fc038080"}],"openstack_dashboard/dashboards/identity/users/templates/users/_detail_overview.html":[{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"c491d1066ed92bd15c4abfd169a575a599ecb369","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    \u003cdd\u003e{{ user.enabled|yesno|capfirst }}\u003c/dd\u003e"},{"line_number":25,"context_line":"    \u003cdt\u003e{% trans \"Password Expires At\" %}\u003c/dt\u003e"},{"line_number":26,"context_line":"    \u003cdd\u003e{{ user.password_expires_at }}\u003c/dd\u003e"},{"line_number":27,"context_line":"    \u003cdt\u003e{% trans \"Password lock\" %}\u003c/dt\u003e"},{"line_number":28,"context_line":"    \u003cdd\u003e{{ lock_password|yesno:\"yes,no,not implemented\"|capfirst }}\u003c/dd\u003e"},{"line_number":29,"context_line":"    \u003cdt\u003e{% trans \"Primary Project ID\" %}\u003c/dt\u003e"},{"line_number":30,"context_line":"    \u003cdd\u003e{{ user.project_id }}\u003c/dd\u003e"}],"source_content_type":"text/html","patch_set":1,"id":"9fdfeff1_e5c3f587","line":27,"range":{"start_line":27,"start_character":18,"end_line":27,"end_character":31},"updated":"2019-01-31 10:46:06.000000000","message":"nit: \"Lock Password\" could be better","commit_id":"703757b61c234a2a117a4f7c287d1a3a71042872"},{"author":{"_account_id":27838,"name":"Vadym Markov","email":"vmarkov@mirantis.com","username":"vmarkov"},"change_message_id":"2045cf2b7bdd1d0c90590a58d1e4b53abb09a4ea","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    \u003cdd\u003e{{ user.enabled|yesno|capfirst }}\u003c/dd\u003e"},{"line_number":25,"context_line":"    \u003cdt\u003e{% trans \"Password Expires At\" %}\u003c/dt\u003e"},{"line_number":26,"context_line":"    \u003cdd\u003e{{ user.password_expires_at }}\u003c/dd\u003e"},{"line_number":27,"context_line":"    \u003cdt\u003e{% trans \"Password lock\" %}\u003c/dt\u003e"},{"line_number":28,"context_line":"    \u003cdd\u003e{{ lock_password|yesno:\"yes,no,not implemented\"|capfirst }}\u003c/dd\u003e"},{"line_number":29,"context_line":"    \u003cdt\u003e{% trans \"Primary Project ID\" %}\u003c/dt\u003e"},{"line_number":30,"context_line":"    \u003cdd\u003e{{ user.project_id }}\u003c/dd\u003e"}],"source_content_type":"text/html","patch_set":1,"id":"9fdfeff1_0def29e9","line":27,"range":{"start_line":27,"start_character":18,"end_line":27,"end_character":31},"in_reply_to":"9fdfeff1_e5c3f587","updated":"2019-02-01 14:28:06.000000000","message":"Done","commit_id":"703757b61c234a2a117a4f7c287d1a3a71042872"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"8e85a3400fafcb9c0c3f73d806eeaeb1d72ce391","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    \u003cdt\u003e{% trans \"Password Expires At\" %}\u003c/dt\u003e"},{"line_number":22,"context_line":"    \u003cdd\u003e{{ user.password_expires_at }}\u003c/dd\u003e"},{"line_number":23,"context_line":"    \u003cdt\u003e{% trans \"Lock password\" %}\u003c/dt\u003e"},{"line_number":24,"context_line":"    \u003cdd\u003e{{ lock_password|yesno:\"yes,no,not implemented\"|capfirst }}\u003c/dd\u003e"},{"line_number":25,"context_line":"    \u003cdt\u003e{% trans \"Primary Project\" %}\u003c/dt\u003e"},{"line_number":26,"context_line":"    {% if user.project_id %}"},{"line_number":27,"context_line":"      \u003cdd class\u003d\"word-wrap\"\u003e"}],"source_content_type":"text/html","patch_set":8,"id":"df33271e_eb0f7d85","line":24,"range":{"start_line":24,"start_character":38,"end_line":24,"end_character":53},"updated":"2020-04-09 02:08:34.000000000","message":"Looking at DetailView.get_context_data(), False is returned when \"options\" attribute does not exist, so I think lock_password is never \"None\". Thus, \"not implemented\" here looks unnecessary.","commit_id":"9236f30e7518c36acd932898e7c975c4fc038080"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"4e2e8976d9e2f3cd6073afa699ab4e73093ae88a","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    \u003cdt\u003e{% trans \"Password Expires At\" %}\u003c/dt\u003e"},{"line_number":22,"context_line":"    \u003cdd\u003e{{ user.password_expires_at }}\u003c/dd\u003e"},{"line_number":23,"context_line":"    \u003cdt\u003e{% trans \"Lock password\" %}\u003c/dt\u003e"},{"line_number":24,"context_line":"    \u003cdd\u003e{{ lock_password|yesno:\"yes,no,not implemented\"|capfirst }}\u003c/dd\u003e"},{"line_number":25,"context_line":"    \u003cdt\u003e{% trans \"Primary Project\" %}\u003c/dt\u003e"},{"line_number":26,"context_line":"    {% if user.project_id %}"},{"line_number":27,"context_line":"      \u003cdd class\u003d\"word-wrap\"\u003e"}],"source_content_type":"text/html","patch_set":8,"id":"df33271e_01ed46b6","line":24,"range":{"start_line":24,"start_character":38,"end_line":24,"end_character":53},"in_reply_to":"df33271e_eb0f7d85","updated":"2020-04-10 10:13:46.000000000","message":"Good catch!","commit_id":"9236f30e7518c36acd932898e7c975c4fc038080"}],"openstack_dashboard/dashboards/identity/users/tests.py":[{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"c491d1066ed92bd15c4abfd169a575a599ecb369","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        kwargs \u003d {\u0027phone_num\u0027: phone_number}"},{"line_number":149,"context_line":"        self.mock_user_create.assert_called_once_with("},{"line_number":150,"context_line":"            test.IsHttpRequest(), name\u003duser.name,"},{"line_number":151,"context_line":"            options\u003d{\u0027lock_password\u0027: False}, description\u003duser.description,"},{"line_number":152,"context_line":"            email\u003duser.email, password\u003duser.password, project\u003dself.tenant.id,"},{"line_number":153,"context_line":"            enabled\u003dTrue, domain\u003ddomain_id, **kwargs)"},{"line_number":154,"context_line":"        self.mock_role_list.assert_called_once_with(test.IsHttpRequest())"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_4563e1b2","line":151,"range":{"start_line":151,"start_character":12,"end_line":151,"end_character":44},"updated":"2019-01-31 10:46:06.000000000","message":"These changes mean that we changed current behavior. Is it expected or not?","commit_id":"703757b61c234a2a117a4f7c287d1a3a71042872"},{"author":{"_account_id":27838,"name":"Vadym Markov","email":"vmarkov@mirantis.com","username":"vmarkov"},"change_message_id":"2045cf2b7bdd1d0c90590a58d1e4b53abb09a4ea","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        kwargs \u003d {\u0027phone_num\u0027: phone_number}"},{"line_number":149,"context_line":"        self.mock_user_create.assert_called_once_with("},{"line_number":150,"context_line":"            test.IsHttpRequest(), name\u003duser.name,"},{"line_number":151,"context_line":"            options\u003d{\u0027lock_password\u0027: False}, description\u003duser.description,"},{"line_number":152,"context_line":"            email\u003duser.email, password\u003duser.password, project\u003dself.tenant.id,"},{"line_number":153,"context_line":"            enabled\u003dTrue, domain\u003ddomain_id, **kwargs)"},{"line_number":154,"context_line":"        self.mock_role_list.assert_called_once_with(test.IsHttpRequest())"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_edf50558","line":151,"range":{"start_line":151,"start_character":12,"end_line":151,"end_character":44},"in_reply_to":"9fdfeff1_4563e1b2","updated":"2019-02-01 14:28:06.000000000","message":"Lock password is False by default. Form handler passes value to Keystone API in any case","commit_id":"703757b61c234a2a117a4f7c287d1a3a71042872"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"8e2bf477c6429116e5683360d258f962ab992f8f","unresolved":false,"context_lines":[{"line_number":415,"context_line":"        ])"},{"line_number":416,"context_line":"        self.assertEqual(2, self.mock_get_default_domain.call_count)"},{"line_number":417,"context_line":""},{"line_number":418,"context_line":"        if api.keystone.VERSIONS.active \u003e\u003d 3:"},{"line_number":419,"context_line":"            self.mock_tenant_list.assert_called_once_with("},{"line_number":420,"context_line":"                test.IsHttpRequest(), domain\u003ddomain.id)"},{"line_number":421,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_cbe4b6e2","line":418,"range":{"start_line":418,"start_character":0,"end_line":418,"end_character":45},"updated":"2019-02-15 13:54:32.000000000","message":"Do we really need this?","commit_id":"ab5d9393c23cdc04e4ff4a97b394631243f00ba2"},{"author":{"_account_id":27838,"name":"Vadym Markov","email":"vmarkov@mirantis.com","username":"vmarkov"},"change_message_id":"5bdc8d5d116cf847e7143e2d14fa7d051858c72b","unresolved":false,"context_lines":[{"line_number":415,"context_line":"        ])"},{"line_number":416,"context_line":"        self.assertEqual(2, self.mock_get_default_domain.call_count)"},{"line_number":417,"context_line":""},{"line_number":418,"context_line":"        if api.keystone.VERSIONS.active \u003e\u003d 3:"},{"line_number":419,"context_line":"            self.mock_tenant_list.assert_called_once_with("},{"line_number":420,"context_line":"                test.IsHttpRequest(), domain\u003ddomain.id)"},{"line_number":421,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_160b882b","line":418,"range":{"start_line":418,"start_character":0,"end_line":418,"end_character":45},"in_reply_to":"9fdfeff1_cbe4b6e2","updated":"2019-02-19 14:22:00.000000000","message":"This code is introduced to keep the same style with other tests","commit_id":"ab5d9393c23cdc04e4ff4a97b394631243f00ba2"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"8e85a3400fafcb9c0c3f73d806eeaeb1d72ce391","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        kwargs \u003d {\u0027phone_num\u0027: phone_number}"},{"line_number":154,"context_line":"        self.mock_user_create.assert_called_once_with("},{"line_number":155,"context_line":"            test.IsHttpRequest(), name\u003duser.name,"},{"line_number":156,"context_line":"            options\u003d{\u0027lock_password\u0027: False}, description\u003duser.description,"},{"line_number":157,"context_line":"            email\u003duser.email, password\u003duser.password, project\u003dself.tenant.id,"},{"line_number":158,"context_line":"            enabled\u003dTrue, domain\u003ddomain_id, **kwargs)"},{"line_number":159,"context_line":"        self.mock_role_list.assert_called_once_with(test.IsHttpRequest())"}],"source_content_type":"text/x-python","patch_set":8,"id":"df33271e_cb79d9fc","line":156,"range":{"start_line":156,"start_character":12,"end_line":156,"end_character":44},"updated":"2020-04-09 02:08:34.000000000","message":"It looks better to add this to the last (before kwargs). I see no reason to insert it here.\n\nIt applies to all similar cases.","commit_id":"9236f30e7518c36acd932898e7c975c4fc038080"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"4e2e8976d9e2f3cd6073afa699ab4e73093ae88a","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        kwargs \u003d {\u0027phone_num\u0027: phone_number}"},{"line_number":154,"context_line":"        self.mock_user_create.assert_called_once_with("},{"line_number":155,"context_line":"            test.IsHttpRequest(), name\u003duser.name,"},{"line_number":156,"context_line":"            options\u003d{\u0027lock_password\u0027: False}, description\u003duser.description,"},{"line_number":157,"context_line":"            email\u003duser.email, password\u003duser.password, project\u003dself.tenant.id,"},{"line_number":158,"context_line":"            enabled\u003dTrue, domain\u003ddomain_id, **kwargs)"},{"line_number":159,"context_line":"        self.mock_role_list.assert_called_once_with(test.IsHttpRequest())"}],"source_content_type":"text/x-python","patch_set":8,"id":"df33271e_21732a18","line":156,"range":{"start_line":156,"start_character":12,"end_line":156,"end_character":44},"in_reply_to":"df33271e_cb79d9fc","updated":"2020-04-10 10:13:46.000000000","message":"Done","commit_id":"9236f30e7518c36acd932898e7c975c4fc038080"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"8e85a3400fafcb9c0c3f73d806eeaeb1d72ce391","unresolved":false,"context_lines":[{"line_number":225,"context_line":"        self.mock_user_create.assert_called_once_with("},{"line_number":226,"context_line":"            test.IsHttpRequest(),"},{"line_number":227,"context_line":"            name\u003duser.name,"},{"line_number":228,"context_line":"            options\u003d{\u0027lock_password\u0027: False},"},{"line_number":229,"context_line":"            description\u003duser.description,"},{"line_number":230,"context_line":"            email\u003duser.email,"},{"line_number":231,"context_line":"            password\u003duser.password,"}],"source_content_type":"text/x-python","patch_set":8,"id":"df33271e_0b80e1be","line":228,"updated":"2020-04-09 02:08:34.000000000","message":"ditto","commit_id":"9236f30e7518c36acd932898e7c975c4fc038080"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"4e2e8976d9e2f3cd6073afa699ab4e73093ae88a","unresolved":false,"context_lines":[{"line_number":225,"context_line":"        self.mock_user_create.assert_called_once_with("},{"line_number":226,"context_line":"            test.IsHttpRequest(),"},{"line_number":227,"context_line":"            name\u003duser.name,"},{"line_number":228,"context_line":"            options\u003d{\u0027lock_password\u0027: False},"},{"line_number":229,"context_line":"            description\u003duser.description,"},{"line_number":230,"context_line":"            email\u003duser.email,"},{"line_number":231,"context_line":"            password\u003duser.password,"}],"source_content_type":"text/x-python","patch_set":8,"id":"df33271e_a158da89","line":228,"in_reply_to":"df33271e_0b80e1be","updated":"2020-04-10 10:13:46.000000000","message":"Done","commit_id":"9236f30e7518c36acd932898e7c975c4fc038080"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"8e85a3400fafcb9c0c3f73d806eeaeb1d72ce391","unresolved":false,"context_lines":[{"line_number":441,"context_line":"        ])"},{"line_number":442,"context_line":"        self.assertEqual(2, self.mock_get_default_domain.call_count)"},{"line_number":443,"context_line":""},{"line_number":444,"context_line":"        if api.keystone.VERSIONS.active \u003e\u003d 3:"},{"line_number":445,"context_line":"            self.mock_tenant_list.assert_called_once_with("},{"line_number":446,"context_line":"                test.IsHttpRequest(), domain\u003ddomain.id)"},{"line_number":447,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":8,"id":"df33271e_8b735116","line":444,"range":{"start_line":444,"start_character":8,"end_line":444,"end_character":45},"updated":"2020-04-09 02:08:34.000000000","message":"This is no longer needed. We dropped keystone v2 support.","commit_id":"9236f30e7518c36acd932898e7c975c4fc038080"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"4e2e8976d9e2f3cd6073afa699ab4e73093ae88a","unresolved":false,"context_lines":[{"line_number":441,"context_line":"        ])"},{"line_number":442,"context_line":"        self.assertEqual(2, self.mock_get_default_domain.call_count)"},{"line_number":443,"context_line":""},{"line_number":444,"context_line":"        if api.keystone.VERSIONS.active \u003e\u003d 3:"},{"line_number":445,"context_line":"            self.mock_tenant_list.assert_called_once_with("},{"line_number":446,"context_line":"                test.IsHttpRequest(), domain\u003ddomain.id)"},{"line_number":447,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":8,"id":"df33271e_e155c251","line":444,"range":{"start_line":444,"start_character":8,"end_line":444,"end_character":45},"in_reply_to":"df33271e_8b735116","updated":"2020-04-10 10:13:46.000000000","message":"Done","commit_id":"9236f30e7518c36acd932898e7c975c4fc038080"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"8e85a3400fafcb9c0c3f73d806eeaeb1d72ce391","unresolved":false,"context_lines":[{"line_number":622,"context_line":"                                                   admin\u003dTrue)"},{"line_number":623,"context_line":"        self.mock_domain_get.assert_called_once_with(test.IsHttpRequest(),"},{"line_number":624,"context_line":"                                                     domain_id)"},{"line_number":625,"context_line":"        if api.keystone.VERSIONS.active \u003e\u003d 3:"},{"line_number":626,"context_line":"            self.mock_tenant_list.assert_called_once_with("},{"line_number":627,"context_line":"                test.IsHttpRequest(), domain\u003ddomain.id)"},{"line_number":628,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":8,"id":"df33271e_0b59018d","line":625,"range":{"start_line":625,"start_character":8,"end_line":625,"end_character":45},"updated":"2020-04-09 02:08:34.000000000","message":"This check is no longer needed. we only support keystone v3.","commit_id":"9236f30e7518c36acd932898e7c975c4fc038080"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"4e2e8976d9e2f3cd6073afa699ab4e73093ae88a","unresolved":false,"context_lines":[{"line_number":622,"context_line":"                                                   admin\u003dTrue)"},{"line_number":623,"context_line":"        self.mock_domain_get.assert_called_once_with(test.IsHttpRequest(),"},{"line_number":624,"context_line":"                                                     domain_id)"},{"line_number":625,"context_line":"        if api.keystone.VERSIONS.active \u003e\u003d 3:"},{"line_number":626,"context_line":"            self.mock_tenant_list.assert_called_once_with("},{"line_number":627,"context_line":"                test.IsHttpRequest(), domain\u003ddomain.id)"},{"line_number":628,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":8,"id":"df33271e_41cc6e34","line":625,"range":{"start_line":625,"start_character":8,"end_line":625,"end_character":45},"in_reply_to":"df33271e_0b59018d","updated":"2020-04-10 10:13:46.000000000","message":"Done","commit_id":"9236f30e7518c36acd932898e7c975c4fc038080"}],"openstack_dashboard/dashboards/identity/users/views.py":[{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"c491d1066ed92bd15c4abfd169a575a599ecb369","unresolved":false,"context_lines":[{"line_number":157,"context_line":"                \u0027project\u0027: user.project_id,"},{"line_number":158,"context_line":"                \u0027email\u0027: getattr(user, \u0027email\u0027, None),"},{"line_number":159,"context_line":"                \u0027description\u0027: getattr(user, \u0027description\u0027, None),"},{"line_number":160,"context_line":"                \u0027lock_password\u0027: options.get(\"lock_password\", False)}"},{"line_number":161,"context_line":"        if api.keystone.VERSIONS.active \u003e\u003d 3:"},{"line_number":162,"context_line":"            for key in getattr(settings, \u0027USER_TABLE_EXTRA_INFO\u0027, {}):"},{"line_number":163,"context_line":"                data[key] \u003d getattr(user, key, None)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_255c9deb","line":160,"range":{"start_line":160,"start_character":33,"end_line":160,"end_character":68},"updated":"2019-01-31 10:46:06.000000000","message":"Let\u0027s keep consistency and return False everywhere. Sometimes you return None as a default value","commit_id":"703757b61c234a2a117a4f7c287d1a3a71042872"},{"author":{"_account_id":27838,"name":"Vadym Markov","email":"vmarkov@mirantis.com","username":"vmarkov"},"change_message_id":"2045cf2b7bdd1d0c90590a58d1e4b53abb09a4ea","unresolved":false,"context_lines":[{"line_number":157,"context_line":"                \u0027project\u0027: user.project_id,"},{"line_number":158,"context_line":"                \u0027email\u0027: getattr(user, \u0027email\u0027, None),"},{"line_number":159,"context_line":"                \u0027description\u0027: getattr(user, \u0027description\u0027, None),"},{"line_number":160,"context_line":"                \u0027lock_password\u0027: options.get(\"lock_password\", False)}"},{"line_number":161,"context_line":"        if api.keystone.VERSIONS.active \u003e\u003d 3:"},{"line_number":162,"context_line":"            for key in getattr(settings, \u0027USER_TABLE_EXTRA_INFO\u0027, {}):"},{"line_number":163,"context_line":"                data[key] \u003d getattr(user, key, None)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_fca4d44c","line":160,"range":{"start_line":160,"start_character":33,"end_line":160,"end_character":68},"in_reply_to":"9fdfeff1_255c9deb","updated":"2019-02-01 14:28:06.000000000","message":"Get rid of None everywhere","commit_id":"703757b61c234a2a117a4f7c287d1a3a71042872"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"8e85a3400fafcb9c0c3f73d806eeaeb1d72ce391","unresolved":false,"context_lines":[{"line_number":209,"context_line":"        user \u003d self.get_data()"},{"line_number":210,"context_line":"        table \u003d project_tables.UsersTable(self.request)"},{"line_number":211,"context_line":"        context[\"user\"] \u003d user"},{"line_number":212,"context_line":"        options \u003d getattr(user, \"options\", {})"},{"line_number":213,"context_line":"        context[\"url\"] \u003d self.get_redirect_url()"},{"line_number":214,"context_line":"        context[\"actions\"] \u003d table.render_row_actions(user)"},{"line_number":215,"context_line":"        context[\"lock_password\"] \u003d options.get(\"lock_password\", False)"}],"source_content_type":"text/x-python","patch_set":8,"id":"df33271e_6bdecdda","line":212,"updated":"2020-04-09 02:08:34.000000000","message":"It looks better to move this just before L.215. \"options\" is only used there.","commit_id":"9236f30e7518c36acd932898e7c975c4fc038080"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"4e2e8976d9e2f3cd6073afa699ab4e73093ae88a","unresolved":false,"context_lines":[{"line_number":209,"context_line":"        user \u003d self.get_data()"},{"line_number":210,"context_line":"        table \u003d project_tables.UsersTable(self.request)"},{"line_number":211,"context_line":"        context[\"user\"] \u003d user"},{"line_number":212,"context_line":"        options \u003d getattr(user, \"options\", {})"},{"line_number":213,"context_line":"        context[\"url\"] \u003d self.get_redirect_url()"},{"line_number":214,"context_line":"        context[\"actions\"] \u003d table.render_row_actions(user)"},{"line_number":215,"context_line":"        context[\"lock_password\"] \u003d options.get(\"lock_password\", False)"}],"source_content_type":"text/x-python","patch_set":8,"id":"df33271e_c1d7debe","line":212,"in_reply_to":"df33271e_6bdecdda","updated":"2020-04-10 10:13:46.000000000","message":"Done","commit_id":"9236f30e7518c36acd932898e7c975c4fc038080"}],"openstack_dashboard/dashboards/settings/password/tests.py":[{"author":{"_account_id":27822,"name":"pengyuesheng","email":"pengyuesheng@gohighsec.com","username":"pengyuesheng"},"change_message_id":"4feeb52396f807491eaed90430c58822224bd36c","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        self.assertFormError(res, \"form\", None, [\u0027Passwords do not match.\u0027])"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    @test.create_mocks({"},{"line_number":91,"context_line":"        api.keystone: [\u0027user_update_own_password\u0027, \u0027user_get\u0027]})"},{"line_number":92,"context_line":"    def test_lock_password(self):"},{"line_number":93,"context_line":"        self.mock_user_get.return_value \u003d Mock_user("},{"line_number":94,"context_line":"            options\u003d{\u0027lock_password\u0027: True})"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_306bc885","line":91,"range":{"start_line":91,"start_character":24,"end_line":91,"end_character":48},"updated":"2019-07-12 06:59:56.000000000","message":"User_update_own_password is not being used, should it be removed?","commit_id":"9c4b9e96300001789fd73fe0b66b31c816ae9bcc"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"1f42dad318d603fce8d994f66d0a2d45b63b2f87","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        self.assertFormError(res, \"form\", None, [\u0027Passwords do not match.\u0027])"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    @test.create_mocks({"},{"line_number":91,"context_line":"        api.keystone: [\u0027user_update_own_password\u0027, \u0027user_get\u0027]})"},{"line_number":92,"context_line":"    def test_lock_password(self):"},{"line_number":93,"context_line":"        self.mock_user_get.return_value \u003d Mock_user("},{"line_number":94,"context_line":"            options\u003d{\u0027lock_password\u0027: True})"}],"source_content_type":"text/x-python","patch_set":4,"id":"df33271e_3c7cf181","line":91,"range":{"start_line":91,"start_character":24,"end_line":91,"end_character":48},"in_reply_to":"7faddb67_306bc885","updated":"2020-03-31 08:22:31.000000000","message":"Actually, it\u0027s  used on line #103","commit_id":"9c4b9e96300001789fd73fe0b66b31c816ae9bcc"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"391be01638926fc84ac44e8c7f12a1e4a4d1e113","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from unittest import mock"},{"line_number":16,"context_line":"from urllib.parse import urlsplit"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from django.conf import settings"}],"source_content_type":"text/x-python","patch_set":7,"id":"df33271e_78e945e4","line":15,"updated":"2020-04-01 11:11:54.000000000","message":"F401 \u0027unittest.mock\u0027 imported but unused","commit_id":"1f3d88bac239e9b28ba2e5827542361f8a0bec4c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"8e85a3400fafcb9c0c3f73d806eeaeb1d72ce391","unresolved":false,"context_lines":[{"line_number":26,"context_line":"INDEX_URL \u003d reverse(\u0027horizon:settings:password:index\u0027)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class Mock_user(object):"},{"line_number":30,"context_line":"    def __init__(self, **kwargs):"},{"line_number":31,"context_line":"        for key, value in kwargs.items():"},{"line_number":32,"context_line":"            setattr(self, key, value)"}],"source_content_type":"text/x-python","patch_set":8,"id":"df33271e_cb8a7919","line":29,"range":{"start_line":29,"start_character":6,"end_line":29,"end_character":15},"updated":"2020-04-09 02:08:34.000000000","message":"According to the convention in python and the horizon repo, we use a camel case for a class name.\n\n  class MockUser(object):\n\nbut according to my comment below this class looks unnecessary.","commit_id":"9236f30e7518c36acd932898e7c975c4fc038080"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"4e2e8976d9e2f3cd6073afa699ab4e73093ae88a","unresolved":false,"context_lines":[{"line_number":26,"context_line":"INDEX_URL \u003d reverse(\u0027horizon:settings:password:index\u0027)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class Mock_user(object):"},{"line_number":30,"context_line":"    def __init__(self, **kwargs):"},{"line_number":31,"context_line":"        for key, value in kwargs.items():"},{"line_number":32,"context_line":"            setattr(self, key, value)"}],"source_content_type":"text/x-python","patch_set":8,"id":"df33271e_a1e61aaf","line":29,"range":{"start_line":29,"start_character":6,"end_line":29,"end_character":15},"in_reply_to":"df33271e_cb8a7919","updated":"2020-04-10 10:13:46.000000000","message":"Done","commit_id":"9236f30e7518c36acd932898e7c975c4fc038080"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"8e85a3400fafcb9c0c3f73d806eeaeb1d72ce391","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        api.keystone: [\u0027user_update_own_password\u0027, \u0027user_get\u0027]})"},{"line_number":39,"context_line":"    def test_change_password(self):"},{"line_number":40,"context_line":"        self.mock_user_update_own_password.return_value \u003d None"},{"line_number":41,"context_line":"        self.mock_user_get.return_value \u003d Mock_user(options\u003d{})"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        formData \u003d {\u0027method\u0027: \u0027PasswordForm\u0027,"},{"line_number":44,"context_line":"                    \u0027current_password\u0027: \u0027oldpwd\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"df33271e_eb85bd08","line":41,"range":{"start_line":41,"start_character":41,"end_line":41,"end_character":63},"updated":"2020-04-09 02:08:34.000000000","message":"Consider using mock library\n\n  mock.Mock(options\u003d{})","commit_id":"9236f30e7518c36acd932898e7c975c4fc038080"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"4e2e8976d9e2f3cd6073afa699ab4e73093ae88a","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        api.keystone: [\u0027user_update_own_password\u0027, \u0027user_get\u0027]})"},{"line_number":39,"context_line":"    def test_change_password(self):"},{"line_number":40,"context_line":"        self.mock_user_update_own_password.return_value \u003d None"},{"line_number":41,"context_line":"        self.mock_user_get.return_value \u003d Mock_user(options\u003d{})"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        formData \u003d {\u0027method\u0027: \u0027PasswordForm\u0027,"},{"line_number":44,"context_line":"                    \u0027current_password\u0027: \u0027oldpwd\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"df33271e_61f09268","line":41,"range":{"start_line":41,"start_character":41,"end_line":41,"end_character":63},"in_reply_to":"df33271e_eb85bd08","updated":"2020-04-10 10:13:46.000000000","message":"Done","commit_id":"9236f30e7518c36acd932898e7c975c4fc038080"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"8e85a3400fafcb9c0c3f73d806eeaeb1d72ce391","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    def test_change_password_sets_logout_reason(self):"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        self.mock_user_update_own_password.return_value \u003d None"},{"line_number":60,"context_line":"        self.mock_user_get.return_value \u003d Mock_user(options\u003d{})"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        formData \u003d {\u0027method\u0027: \u0027PasswordForm\u0027,"},{"line_number":63,"context_line":"                    \u0027current_password\u0027: \u0027oldpwd\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"df33271e_cb8f1921","line":60,"range":{"start_line":60,"start_character":42,"end_line":60,"end_character":63},"updated":"2020-04-09 02:08:34.000000000","message":"same as above","commit_id":"9236f30e7518c36acd932898e7c975c4fc038080"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"8e85a3400fafcb9c0c3f73d806eeaeb1d72ce391","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        self.assertFormError(res, \"form\", None, [\u0027Passwords do not match.\u0027])"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    @test.create_mocks({"},{"line_number":93,"context_line":"        api.keystone: [\u0027user_update_own_password\u0027, \u0027user_get\u0027]})"},{"line_number":94,"context_line":"    def test_lock_password(self):"},{"line_number":95,"context_line":"        self.mock_user_get.return_value \u003d Mock_user("},{"line_number":96,"context_line":"            options\u003d{\u0027lock_password\u0027: True})"}],"source_content_type":"text/x-python","patch_set":8,"id":"df33271e_abbd75b8","line":93,"range":{"start_line":93,"start_character":23,"end_line":93,"end_character":49},"updated":"2020-04-09 02:08:34.000000000","message":"If it is not called (L.105), I don\u0027t think you need to mock it.","commit_id":"9236f30e7518c36acd932898e7c975c4fc038080"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"4e2e8976d9e2f3cd6073afa699ab4e73093ae88a","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        self.assertFormError(res, \"form\", None, [\u0027Passwords do not match.\u0027])"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    @test.create_mocks({"},{"line_number":93,"context_line":"        api.keystone: [\u0027user_update_own_password\u0027, \u0027user_get\u0027]})"},{"line_number":94,"context_line":"    def test_lock_password(self):"},{"line_number":95,"context_line":"        self.mock_user_get.return_value \u003d Mock_user("},{"line_number":96,"context_line":"            options\u003d{\u0027lock_password\u0027: True})"}],"source_content_type":"text/x-python","patch_set":8,"id":"df33271e_01f7065b","line":93,"range":{"start_line":93,"start_character":23,"end_line":93,"end_character":49},"in_reply_to":"df33271e_abbd75b8","updated":"2020-04-10 10:13:46.000000000","message":"Done","commit_id":"9236f30e7518c36acd932898e7c975c4fc038080"}],"releasenotes/notes/lock-password-d87b63f361d4bdc1.yaml":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"8e85a3400fafcb9c0c3f73d806eeaeb1d72ce391","unresolved":false,"context_lines":[{"line_number":5,"context_line":"    own password using the self-service password change API. By default, users"},{"line_number":6,"context_line":"    are unlocked and can change their own passwords. In case of older Keystone"},{"line_number":7,"context_line":"    not supporting this feature, all users treated as unlocked."},{"line_number":8,"context_line":"fixes:"},{"line_number":9,"context_line":"  - |"},{"line_number":10,"context_line":"    [:bug:`1766485`]"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"df33271e_ebac9da0","line":10,"range":{"start_line":8,"start_character":0,"end_line":10,"end_character":20},"updated":"2020-04-09 02:08:34.000000000","message":"This bug is a feature request, so I don\u0027t think we need to have it as a release note.","commit_id":"9236f30e7518c36acd932898e7c975c4fc038080"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"4e2e8976d9e2f3cd6073afa699ab4e73093ae88a","unresolved":false,"context_lines":[{"line_number":5,"context_line":"    own password using the self-service password change API. By default, users"},{"line_number":6,"context_line":"    are unlocked and can change their own passwords. In case of older Keystone"},{"line_number":7,"context_line":"    not supporting this feature, all users treated as unlocked."},{"line_number":8,"context_line":"fixes:"},{"line_number":9,"context_line":"  - |"},{"line_number":10,"context_line":"    [:bug:`1766485`]"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"df33271e_a19bba14","line":10,"range":{"start_line":8,"start_character":0,"end_line":10,"end_character":20},"in_reply_to":"df33271e_ebac9da0","updated":"2020-04-10 10:13:46.000000000","message":"Done","commit_id":"9236f30e7518c36acd932898e7c975c4fc038080"}]}
