diff --git a/docs/release-notes/version-2.10.md b/docs/release-notes/version-2.10.md
index 7031f7fb8..2b47faec0 100644
--- a/docs/release-notes/version-2.10.md
+++ b/docs/release-notes/version-2.10.md
@@ -1,5 +1,13 @@
# NetBox v2.10
+## v2.10.9 (FUTURE)
+
+### Bug Fixes
+
+* [#6073](https://github.com/netbox-community/netbox/issues/6073) - Permit users to manage their own REST API tokens without needing explicit permission
+
+---
+
## v2.10.8 (2021-03-26)
### Bug Fixes
diff --git a/netbox/templates/users/api_tokens.html b/netbox/templates/users/api_tokens.html
index 04e7cb23d..f14773293 100644
--- a/netbox/templates/users/api_tokens.html
+++ b/netbox/templates/users/api_tokens.html
@@ -11,12 +11,8 @@
Copy
- {% if perms.users.change_token %}
-
Edit
- {% endif %}
- {% if perms.users.delete_token %}
-
Delete
- {% endif %}
+
Edit
+
Delete
{{ token.key }}
@@ -55,16 +51,10 @@
{% empty %}
You do not have any API tokens.
{% endfor %}
- {% if perms.users.add_token %}
-
-
- Add a token
-
- {% else %}
-
- You do not have permission to create new API tokens. If needed, ask an administrator to enable token creation for your account or an assigned group.
-
- {% endif %}
+
+
+ Add a token
+
{% endblock %}
diff --git a/netbox/users/views.py b/netbox/users/views.py
index a6d28ecd2..cf7ed6430 100644
--- a/netbox/users/views.py
+++ b/netbox/users/views.py
@@ -6,7 +6,7 @@ from django.contrib.auth import login as auth_login, logout as auth_logout, upda
from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.auth.models import update_last_login
from django.contrib.auth.signals import user_logged_in
-from django.http import HttpResponseForbidden, HttpResponseRedirect
+from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404, redirect, render
from django.urls import reverse
from django.utils.decorators import method_decorator
@@ -282,13 +282,9 @@ class TokenEditView(LoginRequiredMixin, View):
def get(self, request, pk=None):
- if pk is not None:
- if not request.user.has_perm('users.change_token'):
- return HttpResponseForbidden()
+ if pk:
token = get_object_or_404(Token.objects.filter(user=request.user), pk=pk)
else:
- if not request.user.has_perm('users.add_token'):
- return HttpResponseForbidden()
token = Token(user=request.user)
form = TokenForm(instance=token)
@@ -302,11 +298,11 @@ class TokenEditView(LoginRequiredMixin, View):
def post(self, request, pk=None):
- if pk is not None:
+ if pk:
token = get_object_or_404(Token.objects.filter(user=request.user), pk=pk)
form = TokenForm(request.POST, instance=token)
else:
- token = Token()
+ token = Token(user=request.user)
form = TokenForm(request.POST)
if form.is_valid():
@@ -314,7 +310,7 @@ class TokenEditView(LoginRequiredMixin, View):
token.user = request.user
token.save()
- msg = "Modified token {}".format(token) if pk else "Created token {}".format(token)
+ msg = f"Modified token {token}" if pk else f"Created token {token}"
messages.success(request, msg)
if '_addanother' in request.POST: