Files
liederwahl/app/main.py
Matthias Weber 566183dc4a
All checks were successful
release-tag / release-image (push) Successful in 6m27s
make somewhat anonymous, improve evaluation
2024-07-10 21:31:55 +02:00

129 lines
4.0 KiB
Python

from fastapi import FastAPI, Request, Depends, Security
from app.routers import admin, songs, session
from fastapi.staticfiles import StaticFiles
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates
from app.database import engine, Base, get_db, SessionLocal
from app.crud import get_songs_and_vote_for_session, get_setting
from sqlalchemy.orm import Session
from app.schemas import Song
import os
import asyncio
from app.security import get_current_user
from starlette.middleware import Middleware
from starlette_context import plugins
from starlette_context.middleware import RawContextMiddleware
from hashlib import sha384
Base.metadata.create_all(engine)
if os.path.isfile("/tmp/first_run") and (os.environ.get("RELOAD_ON_FIRST_RUN", "").lower() == "true"):
print("First run ... load data")
with SessionLocal() as db:
asyncio.run(admin.create_upload_file(include_non_singable=True, db=db))
os.remove("/tmp/first_run")
middleware = [
Middleware(
RawContextMiddleware,
plugins=(
plugins.ForwardedForPlugin(),
plugins.UserAgentPlugin()
)
)
]
app = FastAPI(middleware=middleware)
app.include_router(admin.router)
app.include_router(songs.router)
app.include_router(session.router)
app.mount("/static", StaticFiles(directory="static"), name="static")
templates = Jinja2Templates(directory="templates")
#@app.get("/")
#async def root(request: Request) -> HTMLResponse:
# return templates.TemplateResponse(
# request=request, name="landing.html"
# )
@app.get("/")
async def vote(request: Request, session_id: str | None = None , unordered: bool = False, user=Security(get_current_user, scopes=[]),
db: Session = Depends(get_db)) -> HTMLResponse:
if not session_id:
session_id = sha384(str.encode(user["sub"])).hexdigest() #CryptContext(schemes=["bcrypt"], deprecated="auto").hash(user["sub"])
#print(user)
veto_mode = get_setting(db, "veto_mode")
songs = [Song(**s.__dict__, vote=v, vote_comment=c)
for s, v, c in get_songs_and_vote_for_session(db, session_id)]
if unordered:
songs_by_category = {"Alle Lieder": songs}
all_categories = {"Alle Lieder"}
for song in songs:
all_categories.update(song.categories.keys())
else:
songs_by_category = {}
all_categories = set()
wildcard_songs = []
current_songs = []
other_songs = []
for song in songs:
if (not song.singable) and (not veto_mode):
continue
if song.is_current:
current_songs.append(song)
continue
if not song.is_aca:
wildcard_songs.append(song)
continue
if not song.main_category:
other_songs.append(song)
continue
if song.main_category not in songs_by_category:
songs_by_category[song.main_category] = []
songs_by_category[song.main_category].append(song)
all_categories.update(song.categories.keys())
songs_by_category["Sonstige"] = other_songs
songs_by_category["Wildcard (nicht a cappella)"] = wildcard_songs
songs_by_category["Aktuelles Programm"] = current_songs
all_categories = list(all_categories)
all_categories.sort()
all_categories.append("Sonstige")
all_categories.append("Wildcard (nicht a cappella)")
all_categories.append("Aktuelles Programm")
# print(all_categories)
# with open('/data/songs_by_cat.json', 'w') as f:
# json.dump({cat : [s.__dict__ for s in songs] for cat, songs in songs_by_category.items()}, f)
return templates.TemplateResponse(
request=request, name="voting.html", context={
"songs_by_category": songs_by_category,
"all_categories": {c: i+1 for i, c in enumerate(all_categories)},
"session_id": session_id,
"veto_mode": veto_mode
}
)