Add user cards view
All checks were successful
ci/woodpecker/manual/woodpecker Pipeline was successful

This commit is contained in:
Madis Mägi 2023-08-14 04:35:27 +03:00
parent a2af2162f9
commit 83d72f355e
4 changed files with 69 additions and 3 deletions

View File

@ -2,7 +2,7 @@ from datetime import datetime, timedelta
from dateutil.parser import parse, ParserError
from bson.objectid import ObjectId
from flask import Blueprint, g, redirect, render_template, request
from flask import Blueprint, g, redirect, render_template, request, abort
from flask_wtf import FlaskForm
from pymongo import MongoClient
from wtforms import StringField, IntegerField, SelectField, BooleanField, DateTimeField, validators
@ -195,6 +195,30 @@ 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/user/<username>/cards")
@login_required(groups=["k-space:board", "k-space:kubernetes:admins"])
def view_user_cards(username):
return view_user_cards_inner(username)
@page_doorboy.route("/m/doorboy/me")
@login_required
def view_own_cards():
user = read_user()
return view_user_cards_inner(user["username"])
def view_user_cards_inner(username):
user = read_user()
subject_user = users_lookup.get(username)
if not subject_user:
return abort(404)
is_self = user["username"] == subject_user["username"]
cards = db.inventory.find({
"component": "doorboy",
"type":"token",
"inventory.owner.username": username
}).sort([("last_seen", -1)])
return render_template("doorboy_user.html", **locals())
@page_doorboy.route("/m/doorboy/admin")
@login_required(groups=["k-space:board", "k-space:kubernetes:admins"])
def view_doorboy_admin():

View File

@ -14,6 +14,9 @@
-->
</ul>
<p>Manage your keycards or keyfobs here:</p>
<a href="/m/doorboy/me" class="waves-effect waves-light btn"><i class="material-icons left">person</i>My cards</a>
<p>Recent door open requests via Slack or the buttons above</p>
<table>

View File

@ -13,8 +13,10 @@
<ul class="collapsible-body collection collapsible-collection">
{% for u, t in last_seen.items() %}
<li class="collection-item">
<i class="material-icons tiny">person</i>
{{u | display_name}}
<a href="/m/doorboy/user/{{u}}/cards">
<i class="material-icons tiny">person</i>
{{u | display_name}}
</a>
<div class="secondary-content black-text">
<i class="material-icons tiny">access_time</i>
{{t | timeago}}

View File

@ -0,0 +1,37 @@
{% extends 'base.html' %}
{% block content %}
<div class="container">
<h4>Doorboy info for {{subject_user.username | display_name}}</h4>
<br/>
<h5>Users cards:</h5>
<table class="striped">
<thead>
<tr>
<th>Enabled</th>
<th>Comment</th>
<th>UID hash tail</th>
<th>Last seen</th>
<th>&nbsp;</th>
</tr>
</thead>
<tbody>
{% for c in cards %}
<tr>
<td>{% if c.token.enabled %}<i class="material-icons">check_circle</i>{% else %}&nbsp;{% endif %}</td>
<td>{{ c.token.comment }}</td>
<td><a href="/m/doorboy/{{ c._id }}/events">{{ c.token.uid_hash[-6:] }}</a></td>
<td>{{ c.last_seen | timeago }}</td>
<td>
{% if is_self %}
<a href="/m/doorboy/{{ c._id }}/edit" class="waves-effect waves-light btn"><i class="material-icons left">edit</i>Edit</a>
{% else %}
&nbsp;
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endblock %}