-
Notifications
You must be signed in to change notification settings - Fork 1
/
main.py
134 lines (91 loc) · 4.16 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
from typing import Any, List, Optional, Type, ForwardRef
import uuid, os
from fastapi import FastAPI, Request, Response, HTTPException
from fastapi.responses import RedirectResponse
from fastapi.params import Depends
from fastapi.responses import HTMLResponse
from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates
from pydantic import BaseModel
from pydantic.fields import ModelField
from fastapi.security import OAuth2PasswordBearer
from pydantic.types import UUID1
app = FastAPI()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
app.mount("/static", StaticFiles(directory="static"), name="static")
templates = Jinja2Templates(directory="templates")
OwnerPetModel = ForwardRef("Owner")
class Pet(BaseModel):
id: int
name: str
owner: Optional[OwnerPetModel] = None
class OwnerCreate(BaseModel):
name: str
pets: Optional[List[Pet]] = []
class Owner(OwnerCreate):
id: int
owners = [Owner(id=1, name="Sam", pets=[Pet(id=0, name="Chicca")]),
Owner(id=2, name="Max")]
def find_owner(id: int):
for i, e in enumerate(owners):
if e.id == id:
return i
pets = []
VERY_SECRET_TOKEN = "alone in the world"
async def get_current_user(token: str = Depends(oauth2_scheme)):
if token == VERY_SECRET_TOKEN:
user = "admin"
return user
else:
raise HTTPException(status_code=403,detail="Invalid token")
def _display_owners(request, headers):
return templates.TemplateResponse(
"owners.html", {"request": request, "owners": owners}, headers= headers
)
@app.get("/login/")
async def login(request: Request):
return templates.TemplateResponse("login_form.html", {"request": request})
@app.post("/login/",response_class=HTMLResponse)
async def authenticate(request: Request,response: Response):
headers_S = {"Authorization-Token": VERY_SECRET_TOKEN}
return _display_owners(request,headers=headers_S)
@app.get("/login/")
async def login(request: Request):
return templates.TemplateResponse("login_form.html", {"request": request})
@app.post("/login/",response_class=HTMLResponse)
async def authenticate(request: Request,response: Response):
headers = {"Authorization-Token": VERY_SECRET_TOKEN}
return _display_owners(request,headers=headers)
@app.get("/", response_class=HTMLResponse)
async def index(request: Request):
fa_code = os.environ.get("FA_CODE")
print(fa_code)
return templates.TemplateResponse("index.html", {"request": request, "fa_code": fa_code })
@app.get("/owners/", response_class=HTMLResponse)
async def get_owners_list(request: Request):
return _display_owners(request)
@app.get("/owners/new", response_class=HTMLResponse,)
async def new_owner(request: Request, current_user: str = Depends(get_current_user)):
print("current_user", current_user)
return templates.TemplateResponse("owner_form.html", {"request": request, "owner": Owner(id=0, name=""),})
@app.post("/owners/", response_class=HTMLResponse)
async def new_owner_save(request: Request, form_data: OwnerCreate):
new_owner = Owner(id=1 + len(owners), name=form_data.name)
owners.append(new_owner)
return _display_owners(request, headers = {"Authorization-Token": VERY_SECRET_TOKEN})
@app.delete("/owners/{id}", response_class=HTMLResponse)
async def delete_owner(request: Request, id: int):
owner = owners[find_owner(id)]
owners.remove(owner)
return _display_owners(request, headers = {"Authorization-Token": VERY_SECRET_TOKEN})
@app.get("/owners/{id}", response_class=HTMLResponse)
async def get_owner_detail(request: Request, id: int):
owner = owners[find_owner(id)]
return templates.TemplateResponse("owner_form.html", {"request": request, "owner": owner})
@app.post("/owners/{id}", response_class=HTMLResponse)
async def update_owner_detail(request: Request, id: int, form_data: Owner, ):
owners[find_owner(id)] = form_data
return _display_owners(request, headers = {"Authorization-Token": VERY_SECRET_TOKEN})
@app.get("/pets/new_row", response_class=HTMLResponse)
async def new_pet_detail(request: Request):
return templates.TemplateResponse("pet_new_row.html", {"request": request, "tmp_id": uuid.uuid1()})