From 41cc293b65a73066aa75b8ff285600028675b820 Mon Sep 17 00:00:00 2001 From: Tatiana Ovchinnikova Date: Thu, 20 Mar 2025 14:18:06 -0500 Subject: [PATCH] Add filter to User Credentials table Change-Id: I4f1bff57fc87736f702601323bfb8258282f7b41 --- openstack_dashboard/api/keystone.py | 7 +++++-- .../dashboards/identity/credentials/tables.py | 11 ++++++++++- .../dashboards/identity/credentials/tests.py | 6 +++--- .../dashboards/identity/credentials/views.py | 19 ++++++++++++++++++- .../identity/users/credentials/tables.py | 1 + .../dashboards/identity/users/tabs.py | 9 +++++---- .../dashboards/settings/credentials/tables.py | 1 + .../dashboards/settings/credentials/tests.py | 6 +++--- .../dashboards/settings/credentials/views.py | 4 ++-- 9 files changed, 48 insertions(+), 16 deletions(-) diff --git a/openstack_dashboard/api/keystone.py b/openstack_dashboard/api/keystone.py index 3eafafa740..4507a62a93 100644 --- a/openstack_dashboard/api/keystone.py +++ b/openstack_dashboard/api/keystone.py @@ -518,9 +518,12 @@ def credential_get(request, credential_id, admin=True): @profiler.trace -def credentials_list(request, user=None): +def credentials_list(request, user_id=None, filters=None): manager = keystoneclient(request).credentials - return manager.list(user=user) + kwargs = {"user_id": user_id} + if filters: + kwargs.update(filters) + return manager.list(**kwargs) @profiler.trace diff --git a/openstack_dashboard/dashboards/identity/credentials/tables.py b/openstack_dashboard/dashboards/identity/credentials/tables.py index 45a21fcf5c..ff43bfc6a5 100644 --- a/openstack_dashboard/dashboards/identity/credentials/tables.py +++ b/openstack_dashboard/dashboards/identity/credentials/tables.py @@ -62,6 +62,13 @@ class DeleteCredentialAction(tables.DeleteAction): keystone.credential_delete(request, obj_id) +class CredentialFilterAction(tables.FilterAction): + filter_type = "server" + filter_choices = (("user_name", _("User Name ="), True), + ("user_id", _("User ID ="), True), + ("type", _("Type ="), True),) + + def get_user_link(datum): if datum.user_id is not None: return urls.reverse("horizon:identity:users:detail", @@ -77,6 +84,7 @@ def get_project_link(datum, request): class CredentialsTable(tables.DataTable): + user_id = tables.WrappingColumn('user_id', verbose_name=_('User ID')) user_name = tables.WrappingColumn('user_name', verbose_name=_('User'), link=get_user_link) @@ -97,7 +105,8 @@ class CredentialsTable(tables.DataTable): class Meta(object): name = "credentialstable" verbose_name = _("User Credentials") - table_actions = (CreateCredentialAction, + table_actions = (CredentialFilterAction, + CreateCredentialAction, DeleteCredentialAction) row_actions = (UpdateCredentialAction, DeleteCredentialAction) diff --git a/openstack_dashboard/dashboards/identity/credentials/tests.py b/openstack_dashboard/dashboards/identity/credentials/tests.py index 916438a811..09eee23a2c 100644 --- a/openstack_dashboard/dashboards/identity/credentials/tests.py +++ b/openstack_dashboard/dashboards/identity/credentials/tests.py @@ -21,9 +21,9 @@ INDEX_VIEW_TEMPLATE = 'horizon/common/_data_table_view.html' class UserCredentialsViewTests(test.TestCase): - def _get_credentials(self, user): + def _get_credentials(self, user_id): credentials = [cred for cred in self.credentials.list() - if cred.user_id == user.id] + if cred.user_id == user_id] return credentials @test.create_mocks({api.keystone: ('credentials_list', @@ -31,7 +31,7 @@ class UserCredentialsViewTests(test.TestCase): def test_index(self): user = self.users.list()[0] self.mock_user_get.return_value = user - credentials = self._get_credentials(user) + credentials = self._get_credentials(user.id) self.mock_credentials_list.return_value = credentials res = self.client.get(INDEX_URL) diff --git a/openstack_dashboard/dashboards/identity/credentials/views.py b/openstack_dashboard/dashboards/identity/credentials/views.py index d377838304..9e029a3f40 100644 --- a/openstack_dashboard/dashboards/identity/credentials/views.py +++ b/openstack_dashboard/dashboards/identity/credentials/views.py @@ -43,14 +43,31 @@ def get_user_name(request, user_id): return None +@memoized.memoized +def get_user_names(request): + users = keystone.user_list(request) + return {u.name: u.id for u in users} + + class CredentialsView(tables.DataTableView): table_class = credential_tables.CredentialsTable page_title = _("User Credentials") policy_rules = (("identity", "identity:list_credentials"),) def get_data(self): + filters = self.get_filters() + + if 'user_name' in filters: + users = get_user_names(self.request) + user_id = users.get(filters['user_name']) + if user_id is not None: + filters = {'user_id': user_id} + else: + return [] + try: - credentials = keystone.credentials_list(self.request) + credentials = keystone.credentials_list( + self.request, filters=filters) for cred in credentials: cred.project_name = get_project_name( self.request, cred.project_id) diff --git a/openstack_dashboard/dashboards/identity/users/credentials/tables.py b/openstack_dashboard/dashboards/identity/users/credentials/tables.py index f32ff02d73..ef9b308166 100644 --- a/openstack_dashboard/dashboards/identity/users/credentials/tables.py +++ b/openstack_dashboard/dashboards/identity/users/credentials/tables.py @@ -19,6 +19,7 @@ from openstack_dashboard.dashboards.identity.credentials \ class CredentialsTable(credentials_tables.CredentialsTable): + user_id = tables.WrappingColumn('user_id', hidden=True) user_name = tables.WrappingColumn('user_name', hidden=True) class Meta(object): diff --git a/openstack_dashboard/dashboards/identity/users/tabs.py b/openstack_dashboard/dashboards/identity/users/tabs.py index 94aa2ee5ba..31b1d20461 100644 --- a/openstack_dashboard/dashboards/identity/users/tabs.py +++ b/openstack_dashboard/dashboards/identity/users/tabs.py @@ -155,10 +155,11 @@ class GroupsTab(tabs.TableTab): return user_groups -def get_credentials(request, user): +def get_credentials(request, user_id): user_credentials = [] try: - user_credentials = api.keystone.credentials_list(request, user=user) + user_credentials = api.keystone.credentials_list( + request, user_id=user_id) for cred in user_credentials: cred.project_name = get_project_name(request, cred.project_id) except Exception: @@ -178,8 +179,8 @@ class CredentialsTab(tabs.TableTab): policy_rules = (("identity", "identity:list_credentials"),) def get_credentialstable_data(self): - user = self.tab_group.kwargs['user'] - return get_credentials(self.request, user) + user_id = self.tab_group.kwargs['user'].id + return get_credentials(self.request, user_id) class UserDetailTabs(tabs.DetailTabsGroup): diff --git a/openstack_dashboard/dashboards/settings/credentials/tables.py b/openstack_dashboard/dashboards/settings/credentials/tables.py index 45e9eb28a7..08aa680912 100644 --- a/openstack_dashboard/dashboards/settings/credentials/tables.py +++ b/openstack_dashboard/dashboards/settings/credentials/tables.py @@ -31,6 +31,7 @@ class DeleteCredentialAction(credentials_tables.DeleteCredentialAction): class CredentialsTable(credentials_tables.CredentialsTable): + user_id = tables.WrappingColumn('user_id', hidden=True) user_name = tables.WrappingColumn('user_name', hidden=True) class Meta(object): diff --git a/openstack_dashboard/dashboards/settings/credentials/tests.py b/openstack_dashboard/dashboards/settings/credentials/tests.py index 219273d90a..720e14e22b 100644 --- a/openstack_dashboard/dashboards/settings/credentials/tests.py +++ b/openstack_dashboard/dashboards/settings/credentials/tests.py @@ -21,9 +21,9 @@ INDEX_VIEW_TEMPLATE = 'horizon/common/_data_table_view.html' class CredentialsViewTests(test.TestCase): - def _get_credentials(self, user): + def _get_credentials(self, user_id): credentials = [cred for cred in self.credentials.list() - if cred.user_id == user.id] + if cred.user_id == user_id] return credentials @test.create_mocks({api.keystone: ('credentials_list', @@ -31,7 +31,7 @@ class CredentialsViewTests(test.TestCase): def test_index(self): user = self.users.list()[0] self.mock_user_get.return_value = user - credentials = self._get_credentials(user) + credentials = self._get_credentials(user.id) self.mock_credentials_list.return_value = credentials res = self.client.get(INDEX_URL) diff --git a/openstack_dashboard/dashboards/settings/credentials/views.py b/openstack_dashboard/dashboards/settings/credentials/views.py index 7bbded7904..2208b1ed22 100644 --- a/openstack_dashboard/dashboards/settings/credentials/views.py +++ b/openstack_dashboard/dashboards/settings/credentials/views.py @@ -31,8 +31,8 @@ class CredentialsView(tables.DataTableView): policy_rules = (("identity", "identity:list_credentials"),) def get_data(self): - user = self.request.user - return get_credentials(self.request, user) + user_id = self.request.user.id + return get_credentials(self.request, user_id) class UpdateView(credential_views.UpdateView):