🎨 — Use a POST request for automatic refresh

This commit is contained in:
Luc Didry 2024-03-27 16:22:46 +01:00
parent 8fd45302d2
commit 24e7778fa5
No known key found for this signature in database
GPG key ID: EA868E12D0257E3C
4 changed files with 31 additions and 13 deletions

View file

@ -1,9 +1,11 @@
"""Web interface for humans""" """Web interface for humans"""
from collections import defaultdict from collections import defaultdict
from functools import cmp_to_key from functools import cmp_to_key
from typing import Annotated
from urllib.parse import urlparse from urllib.parse import urlparse
from fastapi import APIRouter, Depends, Request from fastapi import APIRouter, Cookie, Depends, Form, Request, status
from fastapi.responses import RedirectResponse
from fastapi.templating import Jinja2Templates from fastapi.templating import Jinja2Templates
from sqlalchemy import func from sqlalchemy import func
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
@ -23,8 +25,8 @@ SEVERITY_LEVELS = {"ok": 1, "warning": 2, "critical": 3, "unknown": 4}
async def get_severity_counts_view( async def get_severity_counts_view(
request: Request, request: Request,
db: Session = Depends(get_db), db: Session = Depends(get_db),
refresh: bool = False, auto_refresh_enabled: Annotated[bool, Cookie()] = False,
delay: int = 15, auto_refresh_seconds: Annotated[int, Cookie()] = 15,
): ):
"""Shows the number of results per severity""" """Shows the number of results per severity"""
counts_dict = await queries.get_severity_counts(db) counts_dict = await queries.get_severity_counts(db)
@ -37,8 +39,8 @@ async def get_severity_counts_view(
"request": request, "request": request,
"counts_dict": counts_dict, "counts_dict": counts_dict,
"agents": agents, "agents": agents,
"refresh": refresh, "auto_refresh_enabled": auto_refresh_enabled,
"delay": delay, "auto_refresh_seconds": auto_refresh_seconds,
}, },
) )
@ -151,3 +153,18 @@ async def get_agents_view(request: Request, db: Session = Depends(get_db)):
return templates.TemplateResponse( return templates.TemplateResponse(
"agents.html", {"request": request, "last_seen": last_seen} "agents.html", {"request": request, "last_seen": last_seen}
) )
@route.post("/refresh")
async def set_refresh_cookies_view(
request: Request,
auto_refresh_enabled: Annotated[bool, Form()] = False,
auto_refresh_seconds: Annotated[int, Form()] = 15,
):
response = RedirectResponse(
request.url_for("get_severity_counts_view"),
status_code=status.HTTP_303_SEE_OTHER,
)
response.set_cookie(key="auto_refresh_enabled", value=auto_refresh_enabled)
response.set_cookie(key="auto_refresh_seconds", value=int(auto_refresh_seconds))
return response

View file

@ -9,9 +9,9 @@
content="width=device-width, initial-scale=1.0"> content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" <meta http-equiv="X-UA-Compatible"
content="IE=Edge"> content="IE=Edge">
{% if refresh %} {% if auto_refresh_enabled %}
<meta http-equiv="refresh" <meta http-equiv="refresh"
content="{{ delay }}"> content="{{ auto_refresh_seconds }}">
{% endif %} {% endif %}
<link rel="stylesheet" <link rel="stylesheet"
href="{{ url_for('static', path='/styles.css') }}"> href="{{ url_for('static', path='/styles.css') }}">

View file

@ -13,27 +13,27 @@
<ul> <ul>
<li> <li>
<input id="auto-refresh" <input id="auto-refresh"
name="refresh" name="auto_refresh_enabled"
type="checkbox" type="checkbox"
form="refresh-form" form="refresh-form"
{{ 'checked' if refresh }}> {{ 'checked' if auto_refresh_enabled }}>
<label for="auto-refresh" class="inline-label">Auto-refresh</label> <label for="auto-refresh" class="inline-label">Auto-refresh</label>
</li> </li>
<li> <li>
<label class="inline-label"> <label class="inline-label">
Every <input id="refresh-delay" Every <input id="refresh-delay"
class="initial-width" class="initial-width"
name="delay" name="auto_refresh_seconds"
type="number" type="number"
form="refresh-form" form="refresh-form"
min="1" min="1"
value="{{ delay }}"> seconds value="{{ auto_refresh_seconds }}"> seconds
</label> </label>
</li> </li>
<li> <li>
<form id="refresh-form" <form id="refresh-form"
method="get" method="post"
action="{{ url_for('get_severity_counts_view') }}"> action="{{ url_for('set_refresh_cookies_view') }}">
<input type="Submit"> <input type="Submit">
</form> </form>
</li> </li>

View file

@ -24,6 +24,7 @@ dependencies = [
"Jinja2>=3.0,<4", "Jinja2>=3.0,<4",
"pydantic[email]>=2.4,<3", "pydantic[email]>=2.4,<3",
"pydantic-settings>=2.0,<3", "pydantic-settings>=2.0,<3",
"python-multipart>=0.0.9,<1",
"pyyaml>=6.0,<7", "pyyaml>=6.0,<7",
"pyyaml-include>=1.3,<2", "pyyaml-include>=1.3,<2",
"sqlalchemy[asyncio]>=2.0,<3", "sqlalchemy[asyncio]>=2.0,<3",