Clean up token tables

This commit is contained in:
Jeremy Stretch 2025-10-03 09:53:44 -04:00
parent f6290dd7af
commit d69042f26e
4 changed files with 41 additions and 64 deletions

View File

@ -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 = """<samp><span id="token_{{ record.pk }}">{{ record }}</span></samp>"""
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',
)

View File

@ -26,8 +26,9 @@ from extras.tables import BookmarkTable, NotificationTable, SubscriptionTable
from netbox.authentication import get_auth_backend_display, get_saml_idps from netbox.authentication import get_auth_backend_display, get_saml_idps
from netbox.config import get_config from netbox.config import get_config
from netbox.views import generic from netbox.views import generic
from users import forms, tables from users import forms
from users.models import UserConfig from users.models import UserConfig
from users.tables import TokenTable
from utilities.request import safe_for_redirect from utilities.request import safe_for_redirect
from utilities.string import remove_linebreaks from utilities.string import remove_linebreaks
from utilities.views import register_model_view from utilities.views import register_model_view
@ -328,7 +329,8 @@ class UserTokenListView(LoginRequiredMixin, View):
def get(self, request): def get(self, request):
tokens = UserToken.objects.filter(user=request.user) tokens = UserToken.objects.filter(user=request.user)
table = tables.UserTokenTable(tokens) table = TokenTable(tokens)
table.columns.hide('user')
table.configure(request) table.configure(request)
return render(request, 'account/token_list.html', { return render(request, 'account/token_list.html', {

View File

@ -270,7 +270,7 @@ class ActionsColumn(tables.Column):
if not (self.actions or self.extra_buttons): if not (self.actions or self.extra_buttons):
return '' return ''
# Skip dummy records (e.g. available VLANs or IP ranges replacing individual IPs) # 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 '' return ''
if request := getattr(table, 'context', {}).get('request'): if request := getattr(table, 'context', {}).get('request'):

View File

@ -1,7 +1,6 @@
import django_tables2 as tables import django_tables2 as tables
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from account.tables import UserTokenTable
from netbox.tables import NetBoxTable, columns from netbox.tables import NetBoxTable, columns
from users.models import Group, ObjectPermission, Token, User from users.models import Group, ObjectPermission, Token, User
@ -12,19 +11,53 @@ __all__ = (
'UserTable', 'UserTable',
) )
TOKEN = """<samp><span id="token_{{ record.pk }}">{{ record }}</span></samp>"""
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( user = tables.Column(
linkify=True, linkify=True,
verbose_name=_('User') 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): class Meta(NetBoxTable.Meta):
model = Token model = Token
fields = ( 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', 'last_used', 'allowed_ips',
) )
default_columns = ('token', 'version', 'user', 'write_enabled', 'description', 'allowed_ips')
class UserTable(NetBoxTable): class UserTable(NetBoxTable):