chore: added basic teplating [wip]

This commit is contained in:
surtur 2020-08-11 15:12:22 +02:00
parent d33d8a4c71
commit 29058a2b26
Signed by: wanderer
GPG Key ID: 19CE1EC1D9E0486D
5 changed files with 145 additions and 1 deletions

@ -4,8 +4,9 @@
import asyncio
from typing import List, Optional
from fastapi import FastAPI, Depends, Security, HTTPException
from fastapi import FastAPI, Depends, Security, HTTPException, Request
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from fastapi.templating import Jinja2Templates
from sqlalchemy.orm import Session
from app import crud, models, schemas, auth
@ -15,6 +16,7 @@ from app.database import SessionLocal, engine
models.Base.metadata.create_all(bind=engine)
oauth2_scheme = OAuth2PasswordBearer(tokenUrl='/api/v1/auth/get_token')
templates=Jinja2Templates(directory="app/templates")
app = FastAPI(title="Statuspage API",description="This documentation describes the Statuspage API.",version="0.0.1")
@ -155,3 +157,15 @@ async def get_metrics(skip: int = 0, limit: int = 90, db: Session = Depends(get_
async def get_urls(skip: int = 0, limit: int = 90, db: Session = Depends(get_db)):
return crud.get_urls(db=db, skip=skip, limit=limit)
"""
webpage routes
"""
@app.get("/")
def status_dashboard(request:Request):
"""
Serves the main page
"""
#return {"Dashboard": "Home page"}
return templates.TemplateResponse("dashboard.html.j2", {"request": request})

@ -40,6 +40,7 @@ class UserBase(BaseModel):
name: str
full_name: Optional[str] = None
is_active: bool = True
is_superuser: bool = False
class User(BaseModel):
created_unix: float
@ -54,6 +55,7 @@ class UserUpdate(UserBase):
full_name: Optional[str]
password: Optional[str]
is_active: Optional[bool]
is_superuser: Optional[bool]
class User(UserBase):
pass
@ -63,6 +65,25 @@ class User(UserBase):
class MetricBase(BaseModel):
service_id: int
http_response_code: int
class Metric(BaseModel):
request_unix: float
response_unix: float
class MetricCreate(UserBase):
status: int
class Metric(MetricBase):
pass
class Config:
orm_mode = True
class APISimpleSuccessResponse(BaseModel):
success: bool = True
@ -74,3 +95,6 @@ class Token(BaseModel):
access_token: str
token_type: str
class TokenPayload(BaseModel):
sub: str = None

@ -1,5 +1,6 @@
from pathlib import Path
from typing import Optional
from pydantic import AnyHttpUrl
from starlette.config import Config
@ -7,6 +8,10 @@ from starlette.config import Config
p: Path = Path(__file__).parents[2] / "statuspagerc"
config: Config = Config(p if p.exists() else None)
SERVER_NAME: Optional[str]
SERVER_HOST: Optional[AnyHttpUrl]
DATABASE: str = config("DATABASE", cast=str)
ALEMBIC_CONFIG: str = (

@ -0,0 +1,70 @@
{% extends "layout.html" %}
{% block content %}
<h1>Dashboard</h1>
<div class="ui stackable inverted menu">
<a class="item active">
Services
</a>
<a class="item">
Incidents
</a>
</div>
<table class="ui celled structured table">
<thead>
<tr>
<th rowspan="2">owner</th>
<th rowspan="2">name</th>
<th rowspan="2">pinged times</th>
<th colspan="3">Metrics</th>
</tr>
<tr>
<th>15min</th>
<th>10min</th>
<th>5min</th>
</tr>
</thead>
<tbody>
<tr>
<td>Alpha</td>
<td>service 1</td>
<td class="right aligned">2</td>
<td class="center aligned">
<i class="large green checkmark icon"></i>
</td>
<td></td>
<td></td>
</tr>
<tr>
<td rowspan="3">Beta</td>
<td>service 1</td>
<td class="right aligned">52</td>
<td class="center aligned">
<i class="large green checkmark icon"></i>
</td>
<td></td>
<td></td>
</tr>
<tr>
<td>service 2</td>
<td class="right aligned">12</td>
<td></td>
<td class="center aligned">
<i class="large green checkmark icon"></i>
</td>
<td></td>
</tr>
<tr>
<td>service 3</td>
<td class="right aligned">21</td>
<td class="center aligned">
<i class="large green checkmark icon"></i>
</td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
{% endblock %}

31
app/templates/layout.html Normal file

@ -0,0 +1,31 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Statuspage</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/semantic-ui@2.4.2/dist/semantic.min.css">
<script
src="https://code.jquery.com/jquery-3.1.1.min.js"
integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8="
crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/semantic-ui@2.4.2/dist/semantic.min.js"></script>
</head>
<body>
<div class="ui container">
<div class="ui menu">
<div class="header item">Statuspage</div>
<a class="item">
About
</a>
<a class="item">
status
</a>
</div>
<h2>Status page</h2>
{% block content %}
{% endblock %}
</div>
</body>
</html>