13044 move token from admin to netbox ui

This commit is contained in:
Arthur 2023-07-06 12:11:04 +07:00
parent 6e222f8dce
commit cb2cb4500d
10 changed files with 165 additions and 12 deletions

View File

@ -360,6 +360,16 @@ ADMIN_MENU = Menu(
),
),
),
MenuGroup(
label=_('Users'),
items=(
MenuItem(
link='users:user_token_list',
link_text=_('Tokens'),
permissions=['users.view_token']
),
),
),
),
)

View File

@ -0,0 +1,4 @@
from .bulk_edit import *
from .bulk_import import *
from .filtersets import *
from .model_forms import *

View File

@ -0,0 +1,22 @@
from django import forms
from django.utils.translation import gettext as _
from users.models import *
from utilities.forms import BulkEditForm, add_blank_choice
__all__ = (
'TokenBulkEditForm',
)
class TokenBulkEditForm(BulkEditForm):
pk = forms.ModelMultipleChoiceField(
queryset=Token.objects.all(),
widget=forms.MultipleHiddenInput
)
description = forms.CharField(
max_length=200,
required=False
)
nullable_fields = ('description',)

View File

@ -0,0 +1,14 @@
from users.models import *
from utilities.forms import CSVModelForm
__all__ = (
'TokenImportForm',
)
class TokenImportForm(CSVModelForm):
class Meta:
model = Token
fields = ('description', )

View File

@ -0,0 +1,12 @@
from django import forms
from extras.forms.mixins import SavedFiltersMixin
from utilities.forms import FilterForm
from users.models import Token
__all__ = (
'TokenFilterForm',
)
class TokenFilterForm(SavedFiltersMixin, FilterForm):
model = Token

View File

@ -11,7 +11,7 @@ from netbox.preferences import PREFERENCES
from utilities.forms import BootstrapMixin
from utilities.forms.widgets import DateTimePicker
from utilities.utils import flatten_dict
from .models import Token, UserConfig
from users.models import Token, UserConfig
class LoginForm(BootstrapMixin, AuthenticationForm):

View File

@ -0,0 +1,23 @@
# Generated by Django 4.2.2 on 2023-07-06 05:10
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('users', '0003_token_allowed_ips_last_used'),
]
operations = [
migrations.CreateModel(
name='UserToken',
fields=[],
options={
'verbose_name': 'Token',
'proxy': True,
'indexes': [],
'constraints': [],
},
bases=('users.token',),
),
]

View File

@ -272,6 +272,18 @@ class Token(models.Model):
return False
class UserToken(Token):
"""
Proxy Token for NetBox admin UI
"""
class Meta:
verbose_name = 'Token'
proxy = True
def get_absolute_url(self):
return reverse('users:usertoken', args=[self.pk])
#
# Permissions
#

View File

@ -17,4 +17,12 @@ urlpatterns = [
path('api-tokens/add/', views.TokenEditView.as_view(), name='token_add'),
path('api-tokens/<int:pk>/', include(get_model_urls('users', 'token'))),
# Tokens
path('user-tokens/', views.UserTokenListView.as_view(), name='user_token_list'),
path('user-tokens/add/', views.UserTokenEditView.as_view(), name='user_token_add'),
path('user-tokens/import/', views.UserTokenBulkImportView.as_view(), name='user_token_import'),
path('user-tokens/edit/', views.UserTokenBulkEditView.as_view(), name='user_token_bulk_edit'),
path('user-tokens/delete/', views.UserTokenBulkDeleteView.as_view(), name='user_token_bulk_delete'),
path('user-tokens/<int:pk>/', include(get_model_urls('users', 'user_token'))),
]

View File

@ -19,11 +19,12 @@ from extras.models import Bookmark, ObjectChange
from extras.tables import BookmarkTable, ObjectChangeTable
from netbox.authentication import get_auth_backend_display, get_saml_idps
from netbox.config import get_config
from netbox.views.generic import ObjectListView
from netbox.views import generic
from utilities.forms import ConfirmationForm
from utilities.views import register_model_view
from .forms import LoginForm, PasswordChangeForm, TokenForm, UserConfigForm
from .models import Token, UserConfig
from .filtersets import TokenFilterSet
from . import forms
from .models import Token, UserConfig, UserToken
from .tables import TokenTable
@ -70,7 +71,7 @@ class LoginView(View):
return auth_backends
def get(self, request):
form = LoginForm(request)
form = forms.LoginForm(request)
if request.user.is_authenticated:
logger = logging.getLogger('netbox.auth.login')
@ -83,7 +84,7 @@ class LoginView(View):
def post(self, request):
logger = logging.getLogger('netbox.auth.login')
form = LoginForm(request, data=request.POST)
form = forms.LoginForm(request, data=request.POST)
if form.is_valid():
logger.debug("Login form validation was successful")
@ -208,7 +209,7 @@ class ChangePasswordView(LoginRequiredMixin, View):
messages.warning(request, "LDAP-authenticated user credentials cannot be changed within NetBox.")
return redirect('users:profile')
form = PasswordChangeForm(user=request.user)
form = forms.PasswordChangeForm(user=request.user)
return render(request, self.template_name, {
'form': form,
@ -216,7 +217,7 @@ class ChangePasswordView(LoginRequiredMixin, View):
})
def post(self, request):
form = PasswordChangeForm(user=request.user, data=request.POST)
form = forms.PasswordChangeForm(user=request.user, data=request.POST)
if form.is_valid():
form.save()
update_session_auth_hash(request, form.user)
@ -233,7 +234,7 @@ class ChangePasswordView(LoginRequiredMixin, View):
# Bookmarks
#
class BookmarkListView(LoginRequiredMixin, ObjectListView):
class BookmarkListView(LoginRequiredMixin, generic.ObjectListView):
table = BookmarkTable
template_name = 'users/bookmarks.html'
@ -275,7 +276,7 @@ class TokenEditView(LoginRequiredMixin, View):
else:
token = Token(user=request.user)
form = TokenForm(instance=token)
form = forms.TokenForm(instance=token)
return render(request, 'generic/object_edit.html', {
'object': token,
@ -287,10 +288,10 @@ class TokenEditView(LoginRequiredMixin, View):
if pk:
token = get_object_or_404(Token.objects.filter(user=request.user), pk=pk)
form = TokenForm(request.POST, instance=token)
form = forms.TokenForm(request.POST, instance=token)
else:
token = Token(user=request.user)
form = TokenForm(request.POST)
form = forms.TokenForm(request.POST)
if form.is_valid():
@ -351,3 +352,50 @@ class TokenDeleteView(LoginRequiredMixin, View):
'form': form,
'return_url': reverse('users:token_list'),
})
#
# User Token
#
class UserTokenListView(generic.ObjectListView):
queryset = UserToken.objects.all()
filterset = TokenFilterSet
filterset_form = forms.TokenFilterForm
table = TokenTable
@register_model_view(UserToken)
class UserTokenView(generic.ObjectView):
queryset = UserToken.objects.all()
def get_extra_context(self, request, instance):
return {}
@register_model_view(UserToken, 'edit')
class UserTokenEditView(generic.ObjectEditView):
queryset = UserToken.objects.all()
form = forms.TokenForm
@register_model_view(UserToken, 'delete')
class UserTokenDeleteView(generic.ObjectDeleteView):
queryset = UserToken.objects.all()
class UserTokenBulkImportView(generic.BulkImportView):
queryset = UserToken.objects.all()
model_form = forms.TokenImportForm
class UserTokenBulkEditView(generic.BulkEditView):
queryset = UserToken.objects.all()
table = TokenTable
form = forms.TokenBulkEditForm
class UserTokenBulkDeleteView(generic.BulkDeleteView):
queryset = UserToken.objects.all()
table = TokenTable