From 73409d175aa8e3a25b900dd977b96a168e7f3864 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Madis=20M=C3=A4gi?= Date: Sun, 13 Aug 2023 06:50:57 +0300 Subject: [PATCH] Add doorboy admin view --- inventory-app/doorboy.py | 31 ++++++++++- inventory-app/templates/base.html | 3 + inventory-app/templates/doorboy_admin.html | 65 ++++++++++++++++++++++ 3 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 inventory-app/templates/doorboy_admin.html diff --git a/inventory-app/doorboy.py b/inventory-app/doorboy.py index 6039d43..651376f 100644 --- a/inventory-app/doorboy.py +++ b/inventory-app/doorboy.py @@ -9,7 +9,7 @@ from wtforms import StringField, IntegerField, SelectField, BooleanField, DateTi from wtforms.validators import DataRequired import const -from common import spam, users_lookup, User +from common import spam, users_lookup, users, User from oidc import login_required, read_user page_doorboy = Blueprint("doorboy", __name__) @@ -194,6 +194,35 @@ def view_doorboy(): latest_swipes = db.inventory.find({"component": "doorboy", "type":"token"}).sort([("last_seen", -1)]).limit(10); return render_template("doorboy.html", **locals()) +@page_doorboy.route("/m/doorboy/admin") +@login_required(groups=["k-space:admins"]) +def view_doorboy_admin(): + results = db.inventory.aggregate([ + { "$match": {"component": "doorboy", "type": "token"} }, + { + "$group": { + "_id": "$inventory.owner.username", + "cards": { + "$push" : {"$mergeObjects": [ + "$token", + {"last_seen": "$last_seen"}, + {"_id": "$_id"} + ]} + } + } + }, + { "$sort": { "_id" : 1 } } + ]) + user_keyfobs = {r["_id"] : r["cards"] for r in results} + + orphaned_keyfobs = user_keyfobs.pop(None) + no_keyfobs = [u for u in users if not user_keyfobs.get(u.username)] + last_seen = {key : max(card.get("last_seen") for card in value) for key, value in user_keyfobs.items()} + + orphaned_keyfobs = sorted(orphaned_keyfobs, key = lambda o : (not bool(o.get("comment")), o.get("comment", ""))) + no_keyfobs = sorted(no_keyfobs, key = lambda u : u.display_name or u.username) + last_seen = dict(sorted(last_seen.items(), key = lambda item: item[1], reverse=True)) + return render_template("doorboy_admin.html", **locals()) @page_doorboy.route("/m/doorboy/swipes") @login_required diff --git a/inventory-app/templates/base.html b/inventory-app/templates/base.html index 59c43e1..dbfc5a2 100644 --- a/inventory-app/templates/base.html +++ b/inventory-app/templates/base.html @@ -99,6 +99,9 @@ body { var elems = document.querySelectorAll('.materialboxed'); var instances = M.Materialbox.init(elems, {}); + + var elems = document.querySelectorAll('.collapsible.expandable'); + var instances = M.Collapsible.init(elems, {accordion: false}); }); diff --git a/inventory-app/templates/doorboy_admin.html b/inventory-app/templates/doorboy_admin.html new file mode 100644 index 0000000..a8dfbe5 --- /dev/null +++ b/inventory-app/templates/doorboy_admin.html @@ -0,0 +1,65 @@ +{% extends 'base.html' %} + +{% block content %} + + + + + +{% endblock %}