diff --git a/pyproject.toml b/pyproject.toml index 5a24139..7fe2ea4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -69,8 +69,8 @@ includes = ["src/materia"] [tool.pdm.scripts] start.cmd = "python ./src/materia/main.py {args:start --app-mode development --log-level debug}" -upgrade.cmd = "alembic -c ./src/materia/alembic.ini upgrade {args:head}" -downgrade.shell = "alembic -c ./src/materia/alembic.ini downgrade {args:base}" +upgrade.cmd = "alembic upgrade {args:head}" +downgrade.cmd = "alembic downgrade {args:base}" rev.cmd = "alembic revision {args:--autogenerate}" rm-revs.shell = "rm -v ./src/materia/models/migrations/versions/*.py" diff --git a/src/materia/app/app.py b/src/materia/app/app.py index f119037..60a8b25 100644 --- a/src/materia/app/app.py +++ b/src/materia/app/app.py @@ -66,6 +66,13 @@ def make_lifespan(config: Config, logger: Logger): def make_application(config: Config, logger: Logger): + try: + import materia_frontend + except ModuleNotFoundError: + logger.warning( + "`materia_frontend` is not installed. No user interface will be served." + ) + app = FastAPI( title="materia", version="0.1.0", diff --git a/src/materia/routers/resources.py b/src/materia/routers/resources.py index 3be7816..1fc9b31 100644 --- a/src/materia/routers/resources.py +++ b/src/materia/routers/resources.py @@ -1,5 +1,4 @@ from fastapi import APIRouter, Depends, HTTPException, status, Response -from fastapi.staticfiles import StaticFiles from PIL import Image import io from pathlib import Path @@ -7,7 +6,6 @@ import mimetypes from materia.routers import middleware from materia.config import Config -import materia_frontend router = APIRouter(tags=["resources"], prefix="/resources") @@ -41,16 +39,22 @@ async def avatar( return Response(content=buffer.getvalue(), media_type=Image.MIME[format]) -@router.get("/assets/{filename}") -async def assets(filename: str): - path = Path(materia_frontend.__path__[0]).joinpath( - "dist", "resources", "assets", filename - ) +try: + import materia_frontend +except ModuleNotFoundError: + pass +else: - if not path.exists(): - return Response(status_code=status.HTTP_404_NOT_FOUND) + @router.get("/assets/{filename}") + async def assets(filename: str): + path = Path(materia_frontend.__path__[0]).joinpath( + "dist", "resources", "assets", filename + ) - content = path.read_bytes() - mime = mimetypes.guess_type(path)[0] + if not path.exists(): + return Response(status_code=status.HTTP_404_NOT_FOUND) - return Response(content, media_type=mime) + content = path.read_bytes() + mime = mimetypes.guess_type(path)[0] + + return Response(content, media_type=mime) diff --git a/src/materia/routers/root.py b/src/materia/routers/root.py index dfa1654..6b26ac2 100644 --- a/src/materia/routers/root.py +++ b/src/materia/routers/root.py @@ -2,13 +2,19 @@ from pathlib import Path from fastapi import APIRouter, Request from fastapi.responses import HTMLResponse from fastapi.templating import Jinja2Templates -import materia_frontend - router = APIRouter(tags=["root"]) -templates = Jinja2Templates(directory=Path(materia_frontend.__path__[0]) / "dist") +try: + import materia_frontend +except ModuleNotFoundError: + pass +else: -@router.get("/{spa:path}", response_class=HTMLResponse) -async def root(request: Request): - return templates.TemplateResponse("base.html", {"request": request, "view": "app"}) + templates = Jinja2Templates(directory=Path(materia_frontend.__path__[0]) / "dist") + + @router.get("/{spa:path}", response_class=HTMLResponse) + async def root(request: Request): + return templates.TemplateResponse( + "base.html", {"request": request, "view": "app"} + )