From 20db25afdd478e3af3f24076d8d928cd04a9ae15 Mon Sep 17 00:00:00 2001
From: Tanner Collin
Date: Thu, 12 Oct 2023 21:26:13 +0900
Subject: [PATCH] Add database history to each admin member page
---
apiserver/apiserver/api/views.py | 8 +++++++-
webclient/src/Admin.js | 21 ++++++++++++++-------
webclient/src/Members.js | 24 +++++++++++-------------
3 files changed, 32 insertions(+), 21 deletions(-)
diff --git a/apiserver/apiserver/api/views.py b/apiserver/apiserver/api/views.py
index 4e1d8ae..c847197 100644
--- a/apiserver/apiserver/api/views.py
+++ b/apiserver/apiserver/api/views.py
@@ -1128,9 +1128,15 @@ class HistoryViewSet(Base, List, Retrieve):
def get_queryset(self):
queryset = models.HistoryIndex.objects
- if 'exclude_system' in self.request.query_params:
+ exclude_system = self.request.query_params.get('exclude_system', '') == 'true'
+ member_id = self.request.query_params.get('member_id', '')
+
+ if exclude_system:
queryset = queryset.filter(is_system=False)
+ if member_id:
+ queryset = queryset.filter(owner_id=member_id)
+
return queryset.order_by('-history_date')[:50]
diff --git a/webclient/src/Admin.js b/webclient/src/Admin.js
index 4454ac2..075443a 100644
--- a/webclient/src/Admin.js
+++ b/webclient/src/Admin.js
@@ -118,7 +118,7 @@ export function AdminVetting(props) {
}
export function AdminHistory(props) {
- const { token } = props;
+ const { token, filterMember } = props;
const [history, setHistory] = useState(historyCache);
const [excludeSystem, setExcludeSystem] = useState(excludeSystemCache);
const [focus, setFocus] = useState(focusCache);
@@ -131,7 +131,11 @@ export function AdminHistory(props) {
};
useEffect(() => {
- const extra = excludeSystem ? '?exclude_system' : '';
+ let extra = '?exclude_system=' + excludeSystem;
+ if (filterMember) {
+ extra += '&member_id=' + filterMember;
+ }
+
requester('/history/'+extra, 'GET', token)
.then(res => {
setHistory(res.results);
@@ -148,6 +152,9 @@ export function AdminHistory(props) {
{!error ?
history ?
<>
+
+ Last 50 database changes:
+
Date
Username
Type
- Owner
+ {!filterMember && Owner}
Object
Changed Fields
}
+ {!history.length && None
}
+
{history.map(x =>
@@ -177,7 +186,7 @@ export function AdminHistory(props) {
{isMobile && 'User: '}{x.is_system ? 'System' : (x.history_user || 'Deleted User')}
{isMobile && 'Type: '}{x.history_type}
- {isMobile && 'Owner: '}{x.owner_name}
+ {!filterMember && {isMobile && 'Owner: '}{x.owner_name}}
{isMobile && 'Object: '}{x.object_name}
{isMobile && 'Changed: '}{x.changes.map(x => x.field).join(', ')}
@@ -357,9 +366,7 @@ export function Admin(props) {
All times are in Mountain time.
-
-
- Last 50 database changes:
+
diff --git a/webclient/src/Members.js b/webclient/src/Members.js
index 1372fe3..0a96f44 100644
--- a/webclient/src/Members.js
+++ b/webclient/src/Members.js
@@ -6,6 +6,7 @@ import { statusColor, isAdmin, isInstructor, BasicTable, staticUrl, requester }
import { NotFound } from './Misc.js';
import { AdminMemberInfo, AdminMemberPause, AdminMemberForm, AdminMemberCards, AdminMemberTraining, AdminMemberCertifications } from './AdminMembers.js';
import { AdminMemberTransactions } from './AdminTransactions.js';
+import { AdminHistory } from './Admin.js';
import { StorageButton } from './Storage.js';
import AbortController from 'abort-controller';
@@ -341,7 +342,8 @@ export function MemberDetail(props) {
Cards{' - '}
Lockouts{' - '}
Training{' - '}
- Transactions
+ Transactions{' - '}
+ History
}
@@ -365,27 +367,23 @@ export function MemberDetail(props) {
}
{isAdmin(user) &&
-
-
-
+
}
{isAdmin(user) &&
-
-
-
+
}
{isAdmin(user) &&
-
-
-
+
}
{isAdmin(user) &&
-
-
-
+
+ }
+
+ {isAdmin(user) &&
+
}