diff --git a/netbox/templates/users/_user.html b/netbox/templates/users/_user.html index 01978a59e..535a14cf2 100644 --- a/netbox/templates/users/_user.html +++ b/netbox/templates/users/_user.html @@ -11,6 +11,7 @@ diff --git a/netbox/templates/users/api_tokens.html b/netbox/templates/users/api_tokens.html new file mode 100644 index 000000000..2dd4d9813 --- /dev/null +++ b/netbox/templates/users/api_tokens.html @@ -0,0 +1,44 @@ +{% extends 'users/_user.html' %} +{% load helpers %} + +{% block title %}API Tokens{% endblock %} + +{% block usercontent %} +
+
+ {% for token in tokens %} +
+
+ {% if token.is_expired %} +
+ Expired +
+ {% endif %} + {{ token.key }} +
+
+
+
+ Created: {{ token.created|date }} +
+
+ Expires: {{ token.expires|default:"Never" }} +
+
+ Write operations: + {% if token.write_enabled %} + Enabled + {% else %} + Disabled + {% endif %} +
+
+ {% if token.description %} +
{{ token.description }} + {% endif %} +
+
+ {% endfor %} +
+
+{% endblock %} diff --git a/netbox/users/urls.py b/netbox/users/urls.py index d33d14beb..31ff11830 100644 --- a/netbox/users/urls.py +++ b/netbox/users/urls.py @@ -8,6 +8,7 @@ urlpatterns = [ # User profiles url(r'^profile/$', views.profile, name='profile'), url(r'^profile/password/$', views.change_password, name='change_password'), + url(r'^profile/api-tokens/$', views.TokenList.as_view(), name='api_tokens'), url(r'^profile/user-key/$', views.userkey, name='userkey'), url(r'^profile/user-key/edit/$', views.userkey_edit, name='userkey_edit'), url(r'^profile/recent-activity/$', views.recent_activity, name='recent_activity'), diff --git a/netbox/users/views.py b/netbox/users/views.py index 95f5f3bfc..76e73f568 100644 --- a/netbox/users/views.py +++ b/netbox/users/views.py @@ -1,15 +1,17 @@ from django.contrib import messages from django.contrib.auth import login as auth_login, logout as auth_logout, update_session_auth_hash from django.contrib.auth.decorators import login_required +from django.contrib.auth.mixins import LoginRequiredMixin from django.core.urlresolvers import reverse from django.http import HttpResponseRedirect from django.shortcuts import redirect, render from django.utils.http import is_safe_url +from django.views.generic import View from secrets.forms import UserKeyForm from secrets.models import UserKey - from .forms import LoginForm, PasswordChangeForm +from .models import Token # @@ -128,3 +130,19 @@ def recent_activity(request): 'recent_activity': request.user.actions.all()[:50], 'active_tab': 'recent_activity', }) + + +# +# API tokens +# + +class TokenList(LoginRequiredMixin, View): + + def get(self, request): + + tokens = Token.objects.filter(user=request.user) + + return render(request, 'users/api_tokens.html', { + 'tokens': tokens, + 'active_tab': 'api_tokens', + })