Add filter to User Credentials table

Change-Id: I4f1bff57fc87736f702601323bfb8258282f7b41
This commit is contained in:
Tatiana Ovchinnikova
2025-03-20 14:18:06 -05:00
parent a14d7ab3f4
commit 41cc293b65
9 changed files with 48 additions and 16 deletions

View File

@@ -518,9 +518,12 @@ def credential_get(request, credential_id, admin=True):
@profiler.trace @profiler.trace
def credentials_list(request, user=None): def credentials_list(request, user_id=None, filters=None):
manager = keystoneclient(request).credentials 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 @profiler.trace

View File

@@ -62,6 +62,13 @@ class DeleteCredentialAction(tables.DeleteAction):
keystone.credential_delete(request, obj_id) 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): def get_user_link(datum):
if datum.user_id is not None: if datum.user_id is not None:
return urls.reverse("horizon:identity:users:detail", return urls.reverse("horizon:identity:users:detail",
@@ -77,6 +84,7 @@ def get_project_link(datum, request):
class CredentialsTable(tables.DataTable): class CredentialsTable(tables.DataTable):
user_id = tables.WrappingColumn('user_id', verbose_name=_('User ID'))
user_name = tables.WrappingColumn('user_name', user_name = tables.WrappingColumn('user_name',
verbose_name=_('User'), verbose_name=_('User'),
link=get_user_link) link=get_user_link)
@@ -97,7 +105,8 @@ class CredentialsTable(tables.DataTable):
class Meta(object): class Meta(object):
name = "credentialstable" name = "credentialstable"
verbose_name = _("User Credentials") verbose_name = _("User Credentials")
table_actions = (CreateCredentialAction, table_actions = (CredentialFilterAction,
CreateCredentialAction,
DeleteCredentialAction) DeleteCredentialAction)
row_actions = (UpdateCredentialAction, row_actions = (UpdateCredentialAction,
DeleteCredentialAction) DeleteCredentialAction)

View File

@@ -21,9 +21,9 @@ INDEX_VIEW_TEMPLATE = 'horizon/common/_data_table_view.html'
class UserCredentialsViewTests(test.TestCase): class UserCredentialsViewTests(test.TestCase):
def _get_credentials(self, user): def _get_credentials(self, user_id):
credentials = [cred for cred in self.credentials.list() credentials = [cred for cred in self.credentials.list()
if cred.user_id == user.id] if cred.user_id == user_id]
return credentials return credentials
@test.create_mocks({api.keystone: ('credentials_list', @test.create_mocks({api.keystone: ('credentials_list',
@@ -31,7 +31,7 @@ class UserCredentialsViewTests(test.TestCase):
def test_index(self): def test_index(self):
user = self.users.list()[0] user = self.users.list()[0]
self.mock_user_get.return_value = user 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 self.mock_credentials_list.return_value = credentials
res = self.client.get(INDEX_URL) res = self.client.get(INDEX_URL)

View File

@@ -43,14 +43,31 @@ def get_user_name(request, user_id):
return None 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): class CredentialsView(tables.DataTableView):
table_class = credential_tables.CredentialsTable table_class = credential_tables.CredentialsTable
page_title = _("User Credentials") page_title = _("User Credentials")
policy_rules = (("identity", "identity:list_credentials"),) policy_rules = (("identity", "identity:list_credentials"),)
def get_data(self): 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: try:
credentials = keystone.credentials_list(self.request) credentials = keystone.credentials_list(
self.request, filters=filters)
for cred in credentials: for cred in credentials:
cred.project_name = get_project_name( cred.project_name = get_project_name(
self.request, cred.project_id) self.request, cred.project_id)

View File

@@ -19,6 +19,7 @@ from openstack_dashboard.dashboards.identity.credentials \
class CredentialsTable(credentials_tables.CredentialsTable): class CredentialsTable(credentials_tables.CredentialsTable):
user_id = tables.WrappingColumn('user_id', hidden=True)
user_name = tables.WrappingColumn('user_name', hidden=True) user_name = tables.WrappingColumn('user_name', hidden=True)
class Meta(object): class Meta(object):

View File

@@ -155,10 +155,11 @@ class GroupsTab(tabs.TableTab):
return user_groups return user_groups
def get_credentials(request, user): def get_credentials(request, user_id):
user_credentials = [] user_credentials = []
try: 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: for cred in user_credentials:
cred.project_name = get_project_name(request, cred.project_id) cred.project_name = get_project_name(request, cred.project_id)
except Exception: except Exception:
@@ -178,8 +179,8 @@ class CredentialsTab(tabs.TableTab):
policy_rules = (("identity", "identity:list_credentials"),) policy_rules = (("identity", "identity:list_credentials"),)
def get_credentialstable_data(self): def get_credentialstable_data(self):
user = self.tab_group.kwargs['user'] user_id = self.tab_group.kwargs['user'].id
return get_credentials(self.request, user) return get_credentials(self.request, user_id)
class UserDetailTabs(tabs.DetailTabsGroup): class UserDetailTabs(tabs.DetailTabsGroup):

View File

@@ -31,6 +31,7 @@ class DeleteCredentialAction(credentials_tables.DeleteCredentialAction):
class CredentialsTable(credentials_tables.CredentialsTable): class CredentialsTable(credentials_tables.CredentialsTable):
user_id = tables.WrappingColumn('user_id', hidden=True)
user_name = tables.WrappingColumn('user_name', hidden=True) user_name = tables.WrappingColumn('user_name', hidden=True)
class Meta(object): class Meta(object):

View File

@@ -21,9 +21,9 @@ INDEX_VIEW_TEMPLATE = 'horizon/common/_data_table_view.html'
class CredentialsViewTests(test.TestCase): class CredentialsViewTests(test.TestCase):
def _get_credentials(self, user): def _get_credentials(self, user_id):
credentials = [cred for cred in self.credentials.list() credentials = [cred for cred in self.credentials.list()
if cred.user_id == user.id] if cred.user_id == user_id]
return credentials return credentials
@test.create_mocks({api.keystone: ('credentials_list', @test.create_mocks({api.keystone: ('credentials_list',
@@ -31,7 +31,7 @@ class CredentialsViewTests(test.TestCase):
def test_index(self): def test_index(self):
user = self.users.list()[0] user = self.users.list()[0]
self.mock_user_get.return_value = user 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 self.mock_credentials_list.return_value = credentials
res = self.client.get(INDEX_URL) res = self.client.get(INDEX_URL)

View File

@@ -31,8 +31,8 @@ class CredentialsView(tables.DataTableView):
policy_rules = (("identity", "identity:list_credentials"),) policy_rules = (("identity", "identity:list_credentials"),)
def get_data(self): def get_data(self):
user = self.request.user user_id = self.request.user.id
return get_credentials(self.request, user) return get_credentials(self.request, user_id)
class UpdateView(credential_views.UpdateView): class UpdateView(credential_views.UpdateView):