diff --git a/.gitignore b/.gitignore index e3ebff7..70c86fd 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ +.direnv + **/**.pyc diff --git a/folkugat_web/api/tema/editor.py b/folkugat_web/api/tema/editor.py index a456f10..054e3a6 100644 --- a/folkugat_web/api/tema/editor.py +++ b/folkugat_web/api/tema/editor.py @@ -13,11 +13,31 @@ def title_editor( return tema.title_editor(request=request, logged_in=logged_in, tema_id=tema_id) -@router.get("/api/tema/{tema_id}/editor/lyric/{lyric_idx}") +@router.get("/api/tema/{tema_id}/editor/lyric/{lyric_id}") def lyric_editor( request: Request, logged_in: auth.RequireLogin, tema_id: int, - lyric_idx: int, + lyric_id: int, ): - return tema.lyric_editor(request=request, logged_in=logged_in, tema_id=tema_id, lyric_idx=lyric_idx) + return tema.lyric_editor( + request=request, + logged_in=logged_in, + tema_id=tema_id, + lyric_id=lyric_id, + ) + + +@router.get("/api/tema/{tema_id}/editor/link/{link_id}") +def link_editor( + request: Request, + logged_in: auth.RequireLogin, + tema_id: int, + link_id: int, +): + return tema.link_editor( + request=request, + logged_in=logged_in, + tema_id=tema_id, + link_id=link_id, + ) diff --git a/folkugat_web/api/tema/index.py b/folkugat_web/api/tema/index.py index f735999..3edaca6 100644 --- a/folkugat_web/api/tema/index.py +++ b/folkugat_web/api/tema/index.py @@ -1,13 +1,14 @@ from typing import Annotated from fastapi import Request -from fastapi.params import Form +from fastapi.params import Form, Param from fastapi.responses import HTMLResponse from folkugat_web.api import router from folkugat_web.fragments import tema, temes from folkugat_web.model import temes as model from folkugat_web.services import auth from folkugat_web.services.temes import write as temes_w +from folkugat_web.services.temes.links import guess_link_type from folkugat_web.templates import templates @@ -45,23 +46,23 @@ def set_title( return tema.title(request=request, tema=new_tema, logged_in=logged_in) -@router.get("/api/tema/{tema_id}/lyric/{lyric_idx}") -def lyric(request: Request, logged_in: auth.LoggedIn, tema_id: int, lyric_idx: int): - return tema.lyric(request=request, logged_in=logged_in, tema_id=tema_id, lyric_idx=lyric_idx) +@router.get("/api/tema/{tema_id}/lyric/{lyric_id}") +def lyric(request: Request, logged_in: auth.LoggedIn, tema_id: int, lyric_id: int): + return tema.lyric(request=request, logged_in=logged_in, tema_id=tema_id, lyric_id=lyric_id) -@router.put("/api/tema/{tema_id}/lyric/{lyric_idx}") +@router.put("/api/tema/{tema_id}/lyric/{lyric_id}") def set_lyric( request: Request, logged_in: auth.RequireLogin, tema_id: int, - lyric_idx: int, + lyric_id: int, title: Annotated[str, Form()], lyric: Annotated[str, Form()], ): - new_lyric = model.Lyrics(title=title, content=lyric.strip()) - temes_w.update_lyric(tema_id=tema_id, lyric_idx=lyric_idx, lyric=new_lyric) - return tema.lyric(request=request, logged_in=logged_in, tema_id=tema_id, lyric_idx=lyric_idx) + new_lyric = model.Lyrics(id=lyric_id, title=title, content=lyric.strip()) + temes_w.update_lyric(tema_id=tema_id, lyric_id=lyric_id, lyric=new_lyric) + return tema.lyric(request=request, logged_in=logged_in, tema_id=tema_id, lyric_id=lyric_id) @router.post("/api/tema/{tema_id}/lyric") @@ -71,14 +72,95 @@ def add_lyric( tema_id: int, ): new_tema = temes_w.add_lyric(tema_id=tema_id) - lyric_idx = len(new_tema.lyrics) - 1 - return tema.lyric_editor(request=request, logged_in=logged_in, tema_id=tema_id, lyric_idx=lyric_idx) + lyric_id = new_tema.lyrics[-1].id + if lyric_id is None: + raise RuntimeError("Invalid lyric_id on newly created lyric!") + return tema.lyric_editor( + request=request, + logged_in=logged_in, + tema_id=tema_id, + lyric_id=lyric_id, + ) -@router.delete("/api/tema/{tema_id}/lyric/{lyric_idx}") +@router.delete("/api/tema/{tema_id}/lyric/{lyric_id}") def delete_lyric( tema_id: int, - lyric_idx: int, + lyric_id: int, ): - temes_w.delete_lyric(tema_id=tema_id, lyric_idx=lyric_idx) + temes_w.delete_lyric(tema_id=tema_id, lyric_id=lyric_id) return HTMLResponse() + + +@router.get("/api/tema/{tema_id}/link/{link_id}") +def link(request: Request, logged_in: auth.LoggedIn, tema_id: int, link_id: int): + return tema.link(request=request, logged_in=logged_in, tema_id=tema_id, link_id=link_id) + + +@router.put("/api/tema/{tema_id}/link/{link_id}") +def set_link( + request: Request, + logged_in: auth.RequireLogin, + tema_id: int, + link_id: int, + content_type: Annotated[model.ContentType, Form()], + url: Annotated[str, Form()] = "", + title: Annotated[str, Form()] = "", +): + link_type = guess_link_type(url) + new_link = model.Link( + id=link_id, + content_type=content_type, + link_type=link_type, + url=url, + title=title, + ) + temes_w.update_link(tema_id=tema_id, link_id=link_id, link=new_link) + return tema.link(request=request, logged_in=logged_in, tema_id=tema_id, link_id=link_id) + + +@router.post("/api/tema/{tema_id}/link") +def add_link( + request: Request, + logged_in: auth.RequireLogin, + tema_id: int, +): + new_tema = temes_w.add_link(tema_id=tema_id) + link_id = new_tema.links[-1].id + if link_id is None: + raise RuntimeError("Invalid link_id on newly created link!") + return tema.link_editor( + request=request, + logged_in=logged_in, + tema_id=tema_id, + link_id=link_id, + ) + + +@router.delete("/api/tema/{tema_id}/link/{link_id}") +def delete_link( + _: auth.RequireLogin, + tema_id: int, + link_id: int, +): + temes_w.delete_link(tema_id=tema_id, link_id=link_id) + return HTMLResponse() + + +@router.get("/api/tema/{tema_id}/link/{link_id}/icon") +def link_icon( + request: Request, + logged_in: auth.LoggedIn, + tema_id: int, + link_id: int, + content_type: Annotated[model.ContentType, Param()], + url: Annotated[str, Param()], +): + return tema.link_icon( + request=request, + logged_in=logged_in, + tema_id=tema_id, + link_id=link_id, + url=url, + content_type=content_type, + ) diff --git a/folkugat_web/assets/templates/fragments/tema/editor/link.html b/folkugat_web/assets/templates/fragments/tema/editor/link.html new file mode 100644 index 0000000..05058db --- /dev/null +++ b/folkugat_web/assets/templates/fragments/tema/editor/link.html @@ -0,0 +1,66 @@ +