admin: add basic audit display
This commit is contained in:
parent
258d59ef1b
commit
a373054e90
|
@ -0,0 +1,84 @@
|
||||||
|
{% extends "administration/base.html" %}
|
||||||
|
|
||||||
|
{% load i18n %}
|
||||||
|
{% load utils %}
|
||||||
|
|
||||||
|
{% block title %}
|
||||||
|
{% title %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div class="container">
|
||||||
|
<h1>{% trans "Audit Log" %}</h1>
|
||||||
|
<div id="pf-list-standard" class="list-group list-view-pf list-view-pf-view">
|
||||||
|
{% for entry in object_list %}
|
||||||
|
<div class="list-group-item">
|
||||||
|
<div class="list-view-pf-main-info">
|
||||||
|
<div class="list-view-pf-left">
|
||||||
|
<span class="fa fa-plane list-view-pf-icon-sm"></span>
|
||||||
|
</div>
|
||||||
|
<div class="list-view-pf-body">
|
||||||
|
<div class="list-view-pf-description">
|
||||||
|
<div class="list-group-item-heading">
|
||||||
|
{{ entry.action }}
|
||||||
|
</div>
|
||||||
|
<div class="list-group-item-text">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="list-view-pf-additional-info">
|
||||||
|
<div class="list-view-pf-additional-info-item">
|
||||||
|
<span class="pficon pficon-user"></span>
|
||||||
|
<strong>{{ entry.user }}</strong>
|
||||||
|
</div>
|
||||||
|
<div class="list-view-pf-additional-info-item">
|
||||||
|
<span class="pficon pficon-screen"></span>
|
||||||
|
<strong>{{ entry.request_ip }}</strong>
|
||||||
|
</div>
|
||||||
|
<div class="list-view-pf-additional-info-item">
|
||||||
|
<span class="pficon pficon-cluster"></span>
|
||||||
|
<strong>{{ entry.app|default:'-' }}</strong>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
<script>
|
||||||
|
$(document).ready(function () {
|
||||||
|
// Row Checkbox Selection
|
||||||
|
$("#pf-list-standard input[type='checkbox']").change(function (e) {
|
||||||
|
if ($(this).is(":checked")) {
|
||||||
|
$(this).closest('.list-group-item').addClass("active");
|
||||||
|
} else {
|
||||||
|
$(this).closest('.list-group-item').removeClass("active");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// toggle dropdown menu
|
||||||
|
$('#pf-list-standard .list-view-pf-actions').on('show.bs.dropdown', function () {
|
||||||
|
var $this = $(this);
|
||||||
|
var $dropdown = $this.find('.dropdown');
|
||||||
|
var space = $(window).height() - $dropdown[0].getBoundingClientRect().top - $this.find('.dropdown-menu').outerHeight(true);
|
||||||
|
$dropdown.toggleClass('dropup', space < 10);
|
||||||
|
});
|
||||||
|
// allow users to select multiple list items with shift key
|
||||||
|
$('#pf-list-standard .list-group').on('click', '.list-view-pf-checkbox>input', function (event) {
|
||||||
|
var $list = $('.list-group');
|
||||||
|
var prevIndex = $list.data('preIndex');
|
||||||
|
var $listItems = $list.children('.list-group-item');
|
||||||
|
var $currentItem = $(this).closest('.list-group-item');
|
||||||
|
if (event.shiftKey && prevIndex > -1 && this.checked) {
|
||||||
|
var currentIndex = $listItems.index($currentItem);
|
||||||
|
var $selectScope = currentIndex - prevIndex > 0
|
||||||
|
? $currentItem.prevAll().not($listItems.eq(prevIndex).prevAll().addBack())
|
||||||
|
: $listItems.eq(prevIndex).prevAll().not($currentItem.prevAll().addBack());
|
||||||
|
$selectScope.addClass('active').find('.list-view-pf-checkbox').children('input').prop('checked', true);
|
||||||
|
}
|
||||||
|
$list.data('preIndex', this.checked ? $listItems.index($currentItem) : -1);
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
{% include 'partials/pagination.html' %}
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
|
@ -26,6 +26,9 @@
|
||||||
<li>
|
<li>
|
||||||
<a href="#">{% trans 'Users' %}</a>
|
<a href="#">{% trans 'Users' %}</a>
|
||||||
</li>
|
</li>
|
||||||
|
<li class="{% is_active 'passbook_admin:audit-log' %}">
|
||||||
|
<a href="{% url 'passbook_admin:audit-log' %}">{% trans 'Audit Log' %}</a>
|
||||||
|
</li>
|
||||||
<li class="{% is_active_app 'admin' %}">
|
<li class="{% is_active_app 'admin' %}">
|
||||||
<a href="{% url 'admin:index' %}">{% trans 'Django' %}</a>
|
<a href="{% url 'admin:index' %}">{% trans 'Django' %}</a>
|
||||||
</li>
|
</li>
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
"""passbook URL Configuration"""
|
"""passbook URL Configuration"""
|
||||||
from django.urls import path
|
from django.urls import path
|
||||||
|
|
||||||
from passbook.admin.views import (applications, invitations, overview,
|
from passbook.admin.views import (applications, audit, invitations, overview,
|
||||||
providers, rules, sources)
|
providers, rules, sources)
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
|
@ -40,5 +40,7 @@ urlpatterns = [
|
||||||
invitations.InvitationCreateView.as_view(), name='invitation-create'),
|
invitations.InvitationCreateView.as_view(), name='invitation-create'),
|
||||||
path('invitations/<uuid:pk>/delete/',
|
path('invitations/<uuid:pk>/delete/',
|
||||||
invitations.InvitationDeleteView.as_view(), name='invitation-delete'),
|
invitations.InvitationDeleteView.as_view(), name='invitation-delete'),
|
||||||
|
# Audit Log
|
||||||
|
path('audit/', audit.AuditEntryListView.as_view(), name='audit-log'),
|
||||||
# path('api/v1/', include('passbook.admin.api.v1.urls'))
|
# path('api/v1/', include('passbook.admin.api.v1.urls'))
|
||||||
]
|
]
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
"""passbook AuditEntry administration"""
|
||||||
|
from django.views.generic import ListView
|
||||||
|
|
||||||
|
from passbook.admin.mixins import AdminRequiredMixin
|
||||||
|
from passbook.audit.models import AuditEntry
|
||||||
|
|
||||||
|
|
||||||
|
class AuditEntryListView(AdminRequiredMixin, ListView):
|
||||||
|
"""Show list of all invitations"""
|
||||||
|
|
||||||
|
model = AuditEntry
|
||||||
|
template_name = 'administration/audit/list.html'
|
||||||
|
paginate_by = 10
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
return AuditEntry.objects.all().order_by('-created')
|
|
@ -0,0 +1,22 @@
|
||||||
|
{% load i18n %}
|
||||||
|
|
||||||
|
<div class="btn-group">
|
||||||
|
{% with param=get_param|default:'page' %}
|
||||||
|
{% if page_obj.has_previous %}
|
||||||
|
<a class="btn btn-default" href="?{{ param }}={{ page_obj.previous_page_number }}"><span class="fa fa-angle-left"></span></a>
|
||||||
|
{% else %}
|
||||||
|
<a class="btn btn-default disabled" href=""><span class="fa fa-angle-left"></span></a>
|
||||||
|
{% endif %}
|
||||||
|
<span class="btn btn-default">
|
||||||
|
{% blocktrans with current=page_obj.number total=page_obj.paginator.num_pages %}
|
||||||
|
Page {{ current }} of {{ total }}
|
||||||
|
{% endblocktrans %}
|
||||||
|
</span>
|
||||||
|
{% if page_obj.has_next %}
|
||||||
|
<a class="btn btn-default" href="?{{ param }}={{ page_obj.next_page_number }}"><span class="fa fa-angle-right"></span></a>
|
||||||
|
{% else %}
|
||||||
|
<a class="btn btn-default disabled" href=""><span class="fa fa-angle-right"></span></a>
|
||||||
|
{% endif %}
|
||||||
|
{% endwith %}
|
||||||
|
</div>
|
||||||
|
<hr>
|
Reference in New Issue