mirror of
https://github.com/netbox-community/netbox.git
synced 2025-08-25 16:56:10 -06:00
125890 fix group permission views
This commit is contained in:
parent
4da0b835fd
commit
2fdd834a66
43
netbox/templates/users/group.html
Normal file
43
netbox/templates/users/group.html
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
{% extends 'users/base.html' %}
|
||||||
|
{% load helpers %}
|
||||||
|
{% load render_table from django_tables2 %}
|
||||||
|
|
||||||
|
{% block title %}Group Detail{% endblock %}
|
||||||
|
|
||||||
|
{% block tabs %}
|
||||||
|
<ul class="nav nav-tabs px-3">
|
||||||
|
<li role="presentation" class="nav-item">
|
||||||
|
<a class="nav-link{% if active_tab == 'group' %} active{% endif %}" href="{% url 'users:netboxgroup' pk=object.pk %}">Group</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
{% endblock tabs %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div class="row mb-3">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="card">
|
||||||
|
<h5 class="card-header">Account Details</h5>
|
||||||
|
<div class="card-body">
|
||||||
|
<table class="table table-hover attr-table">
|
||||||
|
<tr>
|
||||||
|
<th scope="row">Name</th>
|
||||||
|
<td>{{ object.name }}</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="card">
|
||||||
|
<h5 class="card-header">Assigned Groups</h5>
|
||||||
|
<ul class="list-group list-group-flush">
|
||||||
|
{% for group in request.user.groups.all %}
|
||||||
|
<li class="list-group-item">{{ group }}</li>
|
||||||
|
{% empty %}
|
||||||
|
<li class="list-group-item text-muted">None</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
43
netbox/templates/users/objectpermission.html
Normal file
43
netbox/templates/users/objectpermission.html
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
{% extends 'users/base.html' %}
|
||||||
|
{% load helpers %}
|
||||||
|
{% load render_table from django_tables2 %}
|
||||||
|
|
||||||
|
{% block title %}Permission Detail{% endblock %}
|
||||||
|
|
||||||
|
{% block tabs %}
|
||||||
|
<ul class="nav nav-tabs px-3">
|
||||||
|
<li role="presentation" class="nav-item">
|
||||||
|
<a class="nav-link{% if active_tab == 'objectpermission' %} active{% endif %}" href="{% url 'users:objectpermission' pk=object.pk %}">Permission</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
{% endblock tabs %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div class="row mb-3">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="card">
|
||||||
|
<h5 class="card-header">Account Details</h5>
|
||||||
|
<div class="card-body">
|
||||||
|
<table class="table table-hover attr-table">
|
||||||
|
<tr>
|
||||||
|
<th scope="row">Name</th>
|
||||||
|
<td>{{ object.name }}</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="card">
|
||||||
|
<h5 class="card-header">Assigned Groups</h5>
|
||||||
|
<ul class="list-group list-group-flush">
|
||||||
|
{% for group in request.user.groups.all %}
|
||||||
|
<li class="list-group-item">{{ group }}</li>
|
||||||
|
{% empty %}
|
||||||
|
<li class="list-group-item text-muted">None</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
81
netbox/templates/users/user.html
Normal file
81
netbox/templates/users/user.html
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
{% extends 'users/base.html' %}
|
||||||
|
{% load helpers %}
|
||||||
|
{% load render_table from django_tables2 %}
|
||||||
|
|
||||||
|
{% block title %}User Detail{% endblock %}
|
||||||
|
|
||||||
|
{% block tabs %}
|
||||||
|
<ul class="nav nav-tabs px-3">
|
||||||
|
<li role="presentation" class="nav-item">
|
||||||
|
<a class="nav-link{% if active_tab == 'user' %} active{% endif %}" href="{% url 'users:netboxuser' pk=object.pk %}">User</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
{% endblock tabs %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div class="row mb-3">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="card">
|
||||||
|
<h5 class="card-header">Account Details</h5>
|
||||||
|
<div class="card-body">
|
||||||
|
<table class="table table-hover attr-table">
|
||||||
|
<tr>
|
||||||
|
<th scope="row">Username</th>
|
||||||
|
<td>{{ object.username }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th scope="row">Full Name</th>
|
||||||
|
<td>
|
||||||
|
{% if object.first_name or object.last_name %}
|
||||||
|
{{ object.first_name }} {{ object.last_name }}
|
||||||
|
{% else %}
|
||||||
|
{{ ''|placeholder }}
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th scope="row">Email</th>
|
||||||
|
<td>{{ object.email|placeholder }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th scope="row">Account Created</th>
|
||||||
|
<td>{{ object.date_joined|annotated_date }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th scope="row">Superuser</th>
|
||||||
|
<td>{% checkmark object.is_superuser %}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th scope="row">Admin Access</th>
|
||||||
|
<td>{% checkmark object.is_staff %}</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="card">
|
||||||
|
<h5 class="card-header">Assigned Groups</h5>
|
||||||
|
<ul class="list-group list-group-flush">
|
||||||
|
{% for group in object.groups.all %}
|
||||||
|
<li class="list-group-item">{{ group }}</li>
|
||||||
|
{% empty %}
|
||||||
|
<li class="list-group-item text-muted">None</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% if perms.extras.view_objectchange %}
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-12">
|
||||||
|
<div class="card">
|
||||||
|
<h5 class="card-header text-center">Recent Activity</h5>
|
||||||
|
<div class="card-body table-responsive">
|
||||||
|
{% render_table changelog_table 'inc/table.html' %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% endblock %}
|
@ -49,7 +49,7 @@ class UserFilterSet(BaseFilterSet):
|
|||||||
)
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = NetBoxUser
|
model = get_user_model()
|
||||||
fields = ['id', 'username', 'first_name', 'last_name', 'email', 'is_staff', 'is_active']
|
fields = ['id', 'username', 'first_name', 'last_name', 'email', 'is_staff', 'is_active']
|
||||||
|
|
||||||
def search(self, queryset, name, value):
|
def search(self, queryset, name, value):
|
||||||
|
@ -146,34 +146,52 @@ class TokenForm(BootstrapMixin, forms.ModelForm):
|
|||||||
|
|
||||||
class UserForm(BootstrapMixin, forms.ModelForm):
|
class UserForm(BootstrapMixin, forms.ModelForm):
|
||||||
groups = DynamicModelMultipleChoiceField(
|
groups = DynamicModelMultipleChoiceField(
|
||||||
|
required=False,
|
||||||
queryset=Group.objects.all()
|
queryset=Group.objects.all()
|
||||||
)
|
)
|
||||||
|
object_permissions = DynamicModelMultipleChoiceField(
|
||||||
|
required=False,
|
||||||
|
label=_('Permissions'),
|
||||||
|
queryset=ObjectPermission.objects.all()
|
||||||
|
)
|
||||||
|
|
||||||
fieldsets = (
|
fieldsets = (
|
||||||
('User', ('username', 'first_name', 'last_name', 'email', )),
|
('User', ('username', 'first_name', 'last_name', 'email', )),
|
||||||
('Groups', ('groups', )),
|
('Groups', ('groups', )),
|
||||||
('Status', ('is_active', 'is_staff', 'is_superuser', )),
|
('Status', ('is_active', 'is_staff', 'is_superuser', )),
|
||||||
('Important Dates', ('last_login', 'date_joined', )),
|
('Important Dates', ('last_login', 'date_joined', )),
|
||||||
|
('Permissions', ('object_permissions', )),
|
||||||
)
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = NetBoxUser
|
model = NetBoxUser
|
||||||
fields = [
|
fields = [
|
||||||
'username', 'first_name', 'last_name', 'email', 'groups',
|
'username', 'first_name', 'last_name', 'email', 'groups', 'object_permissions',
|
||||||
'is_active', 'is_staff', 'is_superuser', 'last_login', 'date_joined',
|
'is_active', 'is_staff', 'is_superuser', 'last_login', 'date_joined',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
class GroupForm(BootstrapMixin, forms.ModelForm):
|
class GroupForm(BootstrapMixin, forms.ModelForm):
|
||||||
|
users = DynamicModelMultipleChoiceField(
|
||||||
|
required=False,
|
||||||
|
queryset=get_user_model().objects.all()
|
||||||
|
)
|
||||||
|
object_permissions = DynamicModelMultipleChoiceField(
|
||||||
|
required=False,
|
||||||
|
label=_('Permissions'),
|
||||||
|
queryset=ObjectPermission.objects.all()
|
||||||
|
)
|
||||||
|
|
||||||
fieldsets = (
|
fieldsets = (
|
||||||
('name', ),
|
('', ('name', )),
|
||||||
|
('Users', ('users', )),
|
||||||
|
('Permissions', ('object_permissions', )),
|
||||||
)
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = NetBoxGroup
|
model = NetBoxGroup
|
||||||
fields = [
|
fields = [
|
||||||
'name',
|
'name', 'users', 'object_permissions',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@ import django_tables2 as tables
|
|||||||
from django_tables2.utils import A
|
from django_tables2.utils import A
|
||||||
from .models import Token
|
from .models import Token
|
||||||
from netbox.tables import NetBoxTable, columns
|
from netbox.tables import NetBoxTable, columns
|
||||||
from users.models import NetBoxUser
|
from users.models import NetBoxGroup, NetBoxUser
|
||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
'GroupTable',
|
'GroupTable',
|
||||||
@ -73,21 +73,21 @@ class UserTable(NetBoxTable):
|
|||||||
|
|
||||||
|
|
||||||
class GroupTable(NetBoxTable):
|
class GroupTable(NetBoxTable):
|
||||||
username = tables.LinkColumn('users:netboxuser', args=[A('pk')])
|
name = tables.LinkColumn('users:netboxgroup', args=[A('pk')])
|
||||||
actions = columns.ActionsColumn(
|
actions = columns.ActionsColumn(
|
||||||
actions=('edit', 'delete'),
|
actions=('edit', 'delete'),
|
||||||
)
|
)
|
||||||
|
|
||||||
class Meta(NetBoxTable.Meta):
|
class Meta(NetBoxTable.Meta):
|
||||||
model = NetBoxUser
|
model = NetBoxGroup
|
||||||
fields = (
|
fields = (
|
||||||
'pk', 'id', 'username', 'email', 'first_name', 'last_name', 'is_superuser', 'is_staff', 'is_active'
|
'pk', 'id', 'name', 'users_count',
|
||||||
)
|
)
|
||||||
default_columns = ('pk', 'username', 'email', 'first_name', 'last_name', 'is_superuser')
|
default_columns = ('pk', 'name', 'users_count', )
|
||||||
|
|
||||||
|
|
||||||
class ObjectPermissionTable(NetBoxTable):
|
class ObjectPermissionTable(NetBoxTable):
|
||||||
username = tables.LinkColumn('users:netboxuser', args=[A('pk')])
|
name = tables.LinkColumn('users:objectpermission', args=[A('pk')])
|
||||||
actions = columns.ActionsColumn(
|
actions = columns.ActionsColumn(
|
||||||
actions=('edit', 'delete'),
|
actions=('edit', 'delete'),
|
||||||
)
|
)
|
||||||
@ -95,6 +95,6 @@ class ObjectPermissionTable(NetBoxTable):
|
|||||||
class Meta(NetBoxTable.Meta):
|
class Meta(NetBoxTable.Meta):
|
||||||
model = NetBoxUser
|
model = NetBoxUser
|
||||||
fields = (
|
fields = (
|
||||||
'pk', 'id', 'username', 'email', 'first_name', 'last_name', 'is_superuser', 'is_staff', 'is_active'
|
'pk', 'id', 'name', 'enabled', 'actions', 'constraints',
|
||||||
)
|
)
|
||||||
default_columns = ('pk', 'username', 'email', 'first_name', 'last_name', 'is_superuser')
|
default_columns = ('pk', 'name', 'enabled', 'actions', 'constraints',)
|
||||||
|
@ -6,6 +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.mixins import LoginRequiredMixin
|
||||||
from django.contrib.auth.models import update_last_login
|
from django.contrib.auth.models import update_last_login
|
||||||
from django.contrib.auth.signals import user_logged_in
|
from django.contrib.auth.signals import user_logged_in
|
||||||
|
from django.db.models import Count
|
||||||
from django.http import HttpResponseRedirect
|
from django.http import HttpResponseRedirect
|
||||||
from django.shortcuts import get_object_or_404, redirect, render, resolve_url
|
from django.shortcuts import get_object_or_404, redirect, render, resolve_url
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
@ -398,7 +399,7 @@ class NetBoxUserBulkDeleteView(generic.BulkDeleteView):
|
|||||||
|
|
||||||
|
|
||||||
class NetBoxGroupListView(generic.ObjectListView):
|
class NetBoxGroupListView(generic.ObjectListView):
|
||||||
queryset = NetBoxGroup.objects.all()
|
queryset = NetBoxGroup.objects.all().annotate(users_count=Count('user'))
|
||||||
filterset = filtersets.GroupFilterSet
|
filterset = filtersets.GroupFilterSet
|
||||||
filterset_form = forms.GroupFilterForm
|
filterset_form = forms.GroupFilterForm
|
||||||
table = tables.GroupTable
|
table = tables.GroupTable
|
||||||
@ -409,6 +410,11 @@ class NetBoxGroupView(generic.ObjectView):
|
|||||||
queryset = NetBoxGroup.objects.all()
|
queryset = NetBoxGroup.objects.all()
|
||||||
template_name = 'users/group.html'
|
template_name = 'users/group.html'
|
||||||
|
|
||||||
|
def get_extra_context(self, request, instance):
|
||||||
|
return {
|
||||||
|
'active_tab': 'group',
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@register_model_view(NetBoxGroup, 'edit')
|
@register_model_view(NetBoxGroup, 'edit')
|
||||||
class NetBoxGroupEditView(generic.ObjectEditView):
|
class NetBoxGroupEditView(generic.ObjectEditView):
|
||||||
@ -455,6 +461,11 @@ class ObjectPermissionView(generic.ObjectView):
|
|||||||
queryset = NetBoxGroup.objects.all()
|
queryset = NetBoxGroup.objects.all()
|
||||||
template_name = 'users/objectpermission.html'
|
template_name = 'users/objectpermission.html'
|
||||||
|
|
||||||
|
def get_extra_context(self, request, instance):
|
||||||
|
return {
|
||||||
|
'active_tab': 'objectpermission',
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@register_model_view(ObjectPermission, 'edit')
|
@register_model_view(ObjectPermission, 'edit')
|
||||||
class ObjectPermissionEditView(generic.ObjectEditView):
|
class ObjectPermissionEditView(generic.ObjectEditView):
|
||||||
|
Loading…
Reference in New Issue
Block a user