diff --git a/netbox/account/tables.py b/netbox/account/tables.py
deleted file mode 100644
index 02dce8bdc..000000000
--- a/netbox/account/tables.py
+++ /dev/null
@@ -1,58 +0,0 @@
-from django.utils.translation import gettext as _
-
-from account.models import UserToken
-from netbox.tables import NetBoxTable, columns
-
-__all__ = (
- 'UserTokenTable',
-)
-
-
-TOKEN = """{{ record }}"""
-
-ALLOWED_IPS = """{{ value|join:", " }}"""
-
-COPY_BUTTON = """
-{% if settings.ALLOW_TOKEN_RETRIEVAL %}
- {% copy_content record.pk prefix="token_" color="success" %}
-{% endif %}
-"""
-
-
-class UserTokenTable(NetBoxTable):
- """
- Table for users to manager their own API tokens under account views.
- """
- key = columns.TemplateColumn(
- verbose_name=_('Key'),
- template_code=TOKEN,
- )
- write_enabled = columns.BooleanColumn(
- verbose_name=_('Write Enabled')
- )
- created = columns.DateTimeColumn(
- timespec='minutes',
- verbose_name=_('Created'),
- )
- expires = columns.DateTimeColumn(
- timespec='minutes',
- verbose_name=_('Expires'),
- )
- last_used = columns.DateTimeColumn(
- verbose_name=_('Last Used'),
- )
- allowed_ips = columns.TemplateColumn(
- verbose_name=_('Allowed IPs'),
- template_code=ALLOWED_IPS
- )
- actions = columns.ActionsColumn(
- actions=('edit', 'delete'),
- extra_buttons=COPY_BUTTON
- )
-
- class Meta(NetBoxTable.Meta):
- model = UserToken
- fields = (
- 'pk', 'id', 'version', 'key', 'pepper_id', 'description', 'write_enabled', 'created', 'expires',
- 'last_used', 'allowed_ips',
- )
diff --git a/netbox/account/views.py b/netbox/account/views.py
index b513f04e4..2b1d64fe3 100644
--- a/netbox/account/views.py
+++ b/netbox/account/views.py
@@ -26,8 +26,9 @@ from extras.tables import BookmarkTable, NotificationTable, SubscriptionTable
from netbox.authentication import get_auth_backend_display, get_saml_idps
from netbox.config import get_config
from netbox.views import generic
-from users import forms, tables
+from users import forms
from users.models import UserConfig
+from users.tables import TokenTable
from utilities.request import safe_for_redirect
from utilities.string import remove_linebreaks
from utilities.views import register_model_view
@@ -328,7 +329,8 @@ class UserTokenListView(LoginRequiredMixin, View):
def get(self, request):
tokens = UserToken.objects.filter(user=request.user)
- table = tables.UserTokenTable(tokens)
+ table = TokenTable(tokens)
+ table.columns.hide('user')
table.configure(request)
return render(request, 'account/token_list.html', {
diff --git a/netbox/netbox/tables/columns.py b/netbox/netbox/tables/columns.py
index f480c2085..12b781cf4 100644
--- a/netbox/netbox/tables/columns.py
+++ b/netbox/netbox/tables/columns.py
@@ -270,7 +270,7 @@ class ActionsColumn(tables.Column):
if not (self.actions or self.extra_buttons):
return ''
# Skip dummy records (e.g. available VLANs or IP ranges replacing individual IPs)
- if type(record) is not model or not getattr(record, 'pk', None):
+ if not isinstance(record, model) or not getattr(record, 'pk', None):
return ''
if request := getattr(table, 'context', {}).get('request'):
diff --git a/netbox/users/tables.py b/netbox/users/tables.py
index 249803840..c4b561164 100644
--- a/netbox/users/tables.py
+++ b/netbox/users/tables.py
@@ -1,7 +1,6 @@
import django_tables2 as tables
from django.utils.translation import gettext as _
-from account.tables import UserTokenTable
from netbox.tables import NetBoxTable, columns
from users.models import Group, ObjectPermission, Token, User
@@ -12,19 +11,53 @@ __all__ = (
'UserTable',
)
+TOKEN = """{{ record }}"""
-class TokenTable(UserTokenTable):
+COPY_BUTTON = """
+{% if settings.ALLOW_TOKEN_RETRIEVAL %}
+ {% copy_content record.pk prefix="token_" color="success" %}
+{% endif %}
+"""
+
+
+class TokenTable(NetBoxTable):
user = tables.Column(
linkify=True,
verbose_name=_('User')
)
+ token = columns.TemplateColumn(
+ verbose_name=_('token'),
+ template_code=TOKEN,
+ )
+ write_enabled = columns.BooleanColumn(
+ verbose_name=_('Write Enabled')
+ )
+ created = columns.DateTimeColumn(
+ timespec='minutes',
+ verbose_name=_('Created'),
+ )
+ expires = columns.DateTimeColumn(
+ timespec='minutes',
+ verbose_name=_('Expires'),
+ )
+ last_used = columns.DateTimeColumn(
+ verbose_name=_('Last Used'),
+ )
+ allowed_ips = columns.ArrayColumn(
+ verbose_name=_('Allowed IPs'),
+ )
+ actions = columns.ActionsColumn(
+ actions=('edit', 'delete'),
+ extra_buttons=COPY_BUTTON
+ )
class Meta(NetBoxTable.Meta):
model = Token
fields = (
- 'pk', 'id', 'version', 'key', 'pepper_id', 'user', 'description', 'write_enabled', 'created', 'expires',
+ 'pk', 'id', 'token', 'version', 'pepper_id', 'user', 'description', 'write_enabled', 'created', 'expires',
'last_used', 'allowed_ips',
)
+ default_columns = ('token', 'version', 'user', 'write_enabled', 'description', 'allowed_ips')
class UserTable(NetBoxTable):