Skip to content

Commit a4acb50

Browse files
12589 move user and group admin from admin (#12877)
Move admin views for users, groups, and object permissions from the admin site to the NetBox frontend --------- Co-authored-by: Jeremy Stretch <jstretch@netboxlabs.com>
1 parent 96ea0ac commit a4acb50

32 files changed

+1545
-421
lines changed

netbox/netbox/navigation/menu.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from django.utils.translation import gettext as _
22

33
from netbox.registry import registry
4+
from utilities.choices import ButtonColorChoices
45
from . import *
56

67
#
@@ -351,6 +352,56 @@
351352
label=_('Admin'),
352353
icon_class='mdi mdi-account-multiple',
353354
groups=(
355+
MenuGroup(
356+
label=_('Users'),
357+
items=(
358+
# Proxy model for auth.User
359+
MenuItem(
360+
link=f'users:netboxuser_list',
361+
link_text=_('Users'),
362+
permissions=[f'auth.view_user'],
363+
buttons=(
364+
MenuItemButton(
365+
link=f'users:netboxuser_add',
366+
title='Add',
367+
icon_class='mdi mdi-plus-thick',
368+
permissions=[f'auth.add_user'],
369+
color=ButtonColorChoices.GREEN
370+
),
371+
MenuItemButton(
372+
link=f'users:netboxuser_import',
373+
title='Import',
374+
icon_class='mdi mdi-upload',
375+
permissions=[f'auth.add_user'],
376+
color=ButtonColorChoices.CYAN
377+
)
378+
)
379+
),
380+
# Proxy model for auth.Group
381+
MenuItem(
382+
link=f'users:netboxgroup_list',
383+
link_text=_('Groups'),
384+
permissions=[f'auth.view_group'],
385+
buttons=(
386+
MenuItemButton(
387+
link=f'users:netboxgroup_add',
388+
title='Add',
389+
icon_class='mdi mdi-plus-thick',
390+
permissions=[f'auth.add_group'],
391+
color=ButtonColorChoices.GREEN
392+
),
393+
MenuItemButton(
394+
link=f'users:netboxgroup_import',
395+
title='Import',
396+
icon_class='mdi mdi-upload',
397+
permissions=[f'auth.add_group'],
398+
color=ButtonColorChoices.CYAN
399+
)
400+
)
401+
),
402+
get_model_item('users', 'objectpermission', _('Permissions'), actions=['add']),
403+
),
404+
),
354405
MenuGroup(
355406
label=_('Configuration'),
356407
items=(

netbox/netbox/views/generic/mixins.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ def get_permitted_actions(self, user, model=None):
2222
Return a tuple of actions for which the given user is permitted to do.
2323
"""
2424
model = model or self.queryset.model
25+
2526
return [
2627
action for action in self.actions if user.has_perms([
2728
get_permission_for_model(model, name) for name in self.action_perms[action]
File renamed without changes.

netbox/templates/users/api_tokens.html renamed to netbox/templates/users/account/api_tokens.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
{% extends 'users/base.html' %}
1+
{% extends 'users/account/base.html' %}
22
{% load helpers %}
33
{% load render_table from django_tables2 %}
44

netbox/templates/users/base.html renamed to netbox/templates/users/account/base.html

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,24 @@
11
{% extends 'base/layout.html' %}
2+
{% load i18n %}
23

34
{% block tabs %}
45
<ul class="nav nav-tabs px-3">
56
<li role="presentation" class="nav-item">
6-
<a class="nav-link{% if active_tab == 'profile' %} active{% endif %}" href="{% url 'users:profile' %}">Profile</a>
7+
<a class="nav-link{% if active_tab == 'profile' %} active{% endif %}" href="{% url 'users:profile' %}">{% trans "Profile" %}</a>
78
</li>
89
<li role="presentation" class="nav-item">
9-
<a class="nav-link{% if active_tab == 'bookmarks' %} active{% endif %}" href="{% url 'users:bookmarks' %}">Bookmarks</a>
10+
<a class="nav-link{% if active_tab == 'bookmarks' %} active{% endif %}" href="{% url 'users:bookmarks' %}">{% trans "Bookmarks" %}</a>
1011
</li>
1112
<li role="presentation" class="nav-item">
12-
<a class="nav-link{% if active_tab == 'preferences' %} active{% endif %}" href="{% url 'users:preferences' %}">Preferences</a>
13+
<a class="nav-link{% if active_tab == 'preferences' %} active{% endif %}" href="{% url 'users:preferences' %}">{% trans "Preferences" %}</a>
1314
</li>
1415
{% if not request.user.ldap_username %}
1516
<li role="presentation" class="nav-item">
16-
<a class="nav-link{% if active_tab == 'password' %} active{% endif %}" href="{% url 'users:change_password' %}">Password</a>
17+
<a class="nav-link{% if active_tab == 'password' %} active{% endif %}" href="{% url 'users:change_password' %}">{% trans "Password" %}</a>
1718
</li>
1819
{% endif %}
1920
<li role="presentation" class="nav-item">
20-
<a class="nav-link{% if active_tab == 'api-tokens' %} active{% endif %}" href="{% url 'users:token_list' %}">API Tokens</a>
21+
<a class="nav-link{% if active_tab == 'api-tokens' %} active{% endif %}" href="{% url 'users:token_list' %}">{% trans "API Tokens" %}</a>
2122
</li>
2223
</ul>
2324
{% endblock %}

netbox/templates/users/bookmarks.html renamed to netbox/templates/users/account/bookmarks.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
{% extends 'users/base.html' %}
1+
{% extends 'users/account/base.html' %}
22
{% load buttons %}
33
{% load helpers %}
44
{% load render_table from django_tables2 %}

netbox/templates/users/password.html renamed to netbox/templates/users/account/password.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
{% extends 'users/base.html' %}
1+
{% extends 'users/account/base.html' %}
22
{% load form_helpers %}
33

44
{% block title %}Change Password{% endblock %}

netbox/templates/users/preferences.html renamed to netbox/templates/users/account/preferences.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
{% extends 'users/base.html' %}
1+
{% extends 'users/account/base.html' %}
22
{% load helpers %}
33
{% load form_helpers %}
44

netbox/templates/users/profile.html renamed to netbox/templates/users/account/profile.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
{% extends 'users/base.html' %}
1+
{% extends 'users/account/base.html' %}
22
{% load helpers %}
33
{% load render_table from django_tables2 %}
44

netbox/templates/users/group.html

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
{% extends 'generic/object.html' %}
2+
{% load i18n %}
3+
{% load helpers %}
4+
{% load render_table from django_tables2 %}
5+
6+
{% block title %}{% trans "Group" %} {{ object.name }}{% endblock %}
7+
8+
{% block subtitle %}{% endblock %}
9+
10+
{% block content %}
11+
<div class="row mb-3">
12+
<div class="col-md-6">
13+
<div class="card">
14+
<h5 class="card-header">{% trans "Group" %}</h5>
15+
<div class="card-body">
16+
<table class="table table-hover attr-table">
17+
<tr>
18+
<th scope="row">{% trans "Name" %}</th>
19+
<td>{{ object.name }}</td>
20+
</tr>
21+
</table>
22+
</div>
23+
</div>
24+
</div>
25+
<div class="col-md-6">
26+
<div class="card">
27+
<h5 class="card-header">{% trans "Users" %}</h5>
28+
<div class="list-group list-group-flush">
29+
{% for user in object.user_set.all %}
30+
<a href="{% url 'users:netboxuser' pk=user.pk %}" class="list-group-item list-group-item-action">{{ user }}</a>
31+
{% empty %}
32+
<div class="list-group-item text-muted">{% trans "None" %}</div>
33+
{% endfor %}
34+
</div>
35+
</div>
36+
<div class="card">
37+
<h5 class="card-header">{% trans "Assigned Permissions" %}</h5>
38+
<div class="list-group list-group-flush">
39+
{% for perm in object.object_permissions.all %}
40+
<a href="{% url 'users:objectpermission' pk=perm.pk %}" class="list-group-item list-group-item-action">{{ perm }}</a>
41+
{% empty %}
42+
<div class="list-group-item text-muted">{% trans "None" %}</div>
43+
{% endfor %}
44+
</div>
45+
</div>
46+
</div>
47+
</div>
48+
{% endblock %}

0 commit comments

Comments
 (0)