🔀 Merge branch 'improve-refresh-workflow' into 'main'

🎨 — Use a POST request and cookies for automatic refresh

See merge request framasoft/framaspace/argos!39
This commit is contained in:
Luc Didry 2024-04-02 10:55:38 +00:00
commit d7a68b8618
4 changed files with 31 additions and 13 deletions

View file

@ -1,9 +1,11 @@
"""Web interface for humans"""
from collections import defaultdict
from functools import cmp_to_key
from typing import Annotated
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 sqlalchemy import func
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(
request: Request,
db: Session = Depends(get_db),
refresh: bool = False,
delay: int = 15,
auto_refresh_enabled: Annotated[bool, Cookie()] = False,
auto_refresh_seconds: Annotated[int, Cookie()] = 15,
):
"""Shows the number of results per severity"""
counts_dict = await queries.get_severity_counts(db)
@ -37,8 +39,8 @@ async def get_severity_counts_view(
"request": request,
"counts_dict": counts_dict,
"agents": agents,
"refresh": refresh,
"delay": delay,
"auto_refresh_enabled": auto_refresh_enabled,
"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(
"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">
<meta http-equiv="X-UA-Compatible"
content="IE=Edge">
{% if refresh %}
{% if auto_refresh_enabled %}
<meta http-equiv="refresh"
content="{{ delay }}">
content="{{ auto_refresh_seconds }}">
{% endif %}
<link rel="stylesheet"
href="{{ url_for('static', path='/styles.css') }}">

View file

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

View file

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