From 47d18400c3dfbf08afbe3f028a1f89ce953a3db7 Mon Sep 17 00:00:00 2001 From: marc Date: Sun, 4 May 2025 22:10:10 +0200 Subject: [PATCH] Search by properties --- folkugat_web/api/sessio/index.py | 25 ------ folkugat_web/api/sessio/live.py | 8 +- folkugat_web/api/temes/index.py | 33 ++++++- folkugat_web/assets/static/css/main.css | 10 +-- .../templates/fragments/temes/pagina.html | 1 + .../templates/fragments/temes/result.html | 12 ++- .../templates/fragments/temes/results.html | 32 +++++++ folkugat_web/dal/sql/temes/properties.py | 35 +++++++- folkugat_web/fragments/sessio.py | 1 + folkugat_web/fragments/set_page.py | 6 +- folkugat_web/fragments/temes.py | 56 ++++++++++-- folkugat_web/model/search.py | 7 +- folkugat_web/services/temes/search.py | 87 +++++++++++++++---- 13 files changed, 245 insertions(+), 68 deletions(-) diff --git a/folkugat_web/api/sessio/index.py b/folkugat_web/api/sessio/index.py index afcb52a..17249f6 100644 --- a/folkugat_web/api/sessio/index.py +++ b/folkugat_web/api/sessio/index.py @@ -197,28 +197,3 @@ def set_tema_new( entry_id=entry_id, tema_id=new_tema.id, ) - - -# @router.get("/api/sessio/{session_id}/set/{set_id}/score") -# async def render( -# request: Request, -# _: auth.RequireLogin, -# session_id: int, -# set_id: int, -# ): -# set_entry = playlists_service.get_set(session_id=session_id, set_id=set_id) -# if not set_entry: -# raise HTTPException(status_code=404, detail="Could not find set!") -# set_entry = playlists_service.add_temes_to_set(set_entry) -# tune_set = lilypond_build.set_from_set(set_entry=set_entry) -# set_source = lilypond_source.set_source(tune_set=tune_set) -# pdf_result = await lilypond_render.render( -# source=set_source, -# output=lilypond_render.RenderOutput.PDF, -# ) -# if output_filename := pdf_result.result: -# score_render_url = files.get_db_file_path(output_filename) -# # return temes.score_render(request=request, score_id=score_id, score_render_url=score_render_url) -# return HTMLResponse(content=score_render_url) -# else: -# return HTMLResponse() diff --git a/folkugat_web/api/sessio/live.py b/folkugat_web/api/sessio/live.py index 70e09dc..3aa1ef1 100644 --- a/folkugat_web/api/sessio/live.py +++ b/folkugat_web/api/sessio/live.py @@ -22,16 +22,16 @@ def page( @router.get("/api/content/live") -def contingut( +async def contingut( request: Request, logged_in: auth.LoggedIn, ): - return set_page.live(request, logged_in) + return await set_page.live(request, logged_in) @router.get("/api/content/live/set") -def get_set_page( +async def get_set_page( request: Request, logged_in: auth.LoggedIn, ): - return set_page.live_set(request, logged_in) + return await set_page.live_set(request, logged_in) diff --git a/folkugat_web/api/temes/index.py b/folkugat_web/api/temes/index.py index ce37fe5..a17722b 100644 --- a/folkugat_web/api/temes/index.py +++ b/folkugat_web/api/temes/index.py @@ -1,3 +1,4 @@ +import urllib.parse from typing import Annotated from fastapi import Request @@ -13,13 +14,16 @@ def page( request: Request, logged_in: auth.LoggedIn, query: Annotated[str, Param()] = "", + properties: Annotated[list[str] | None, Param()] = None, ): + properties = properties or [] + content_url = f"/api/content/temes?{temes.build_temes_params(query=query, properties=properties)}" return templates.TemplateResponse( "index.html", { "request": request, "page_title": "Folkugat", - "content": f"/api/content/temes?query={query}", + "content": content_url, "logged_in": logged_in, "animate": False, } @@ -31,10 +35,31 @@ def content( request: Request, logged_in: auth.LoggedIn, query: Annotated[str, Param()] = "", + properties: Annotated[list[str] | None, Param()] = None, ): - return temes.temes_pagina(request, logged_in, query) + properties = properties or [] + return temes.temes_pagina( + request=request, + logged_in=logged_in, + query=query, + properties=properties, + ) @router.get("/api/temes/busca") -def busca(request: Request, query: str, logged_in: auth.LoggedIn, limit: int = 10, offset: int = 0): - return temes.temes_busca(request, query=query, limit=limit, offset=offset, logged_in=logged_in) +def busca( + request: Request, + logged_in: auth.LoggedIn, + query: Annotated[str, Param()], + properties: Annotated[list[str] | None, Param()] = None, + limit: int = 10, + offset: int = 0, +): + return temes.temes_busca( + request=request, + query=query, + properties=properties or [], + limit=limit, + offset=offset, + logged_in=logged_in, + ) diff --git a/folkugat_web/assets/static/css/main.css b/folkugat_web/assets/static/css/main.css index 8a566bb..5ea8b8e 100644 --- a/folkugat_web/assets/static/css/main.css +++ b/folkugat_web/assets/static/css/main.css @@ -649,6 +649,11 @@ video { margin-bottom: 0.75rem; } +.my-4 { + margin-top: 1rem; + margin-bottom: 1rem; +} + .mb-3 { margin-bottom: 0.75rem; } @@ -944,11 +949,6 @@ video { padding: 1rem; } -.px-1 { - padding-left: 0.25rem; - padding-right: 0.25rem; -} - .px-10 { padding-left: 2.5rem; padding-right: 2.5rem; diff --git a/folkugat_web/assets/templates/fragments/temes/pagina.html b/folkugat_web/assets/templates/fragments/temes/pagina.html index 6859b51..d356930 100644 --- a/folkugat_web/assets/templates/fragments/temes/pagina.html +++ b/folkugat_web/assets/templates/fragments/temes/pagina.html @@ -11,6 +11,7 @@ hx-get="/api/temes/busca" hx-trigger="revealed, keyup delay:500ms changed" hx-target="#search-results" + hx-vars="properties:{{ properties_str }}" hx-swap="outerHTML">
diff --git a/folkugat_web/assets/templates/fragments/temes/result.html b/folkugat_web/assets/templates/fragments/temes/result.html index 0026d2c..1741c40 100644 --- a/folkugat_web/assets/templates/fragments/temes/result.html +++ b/folkugat_web/assets/templates/fragments/temes/result.html @@ -18,10 +18,16 @@ {% endif %} diff --git a/folkugat_web/assets/templates/fragments/temes/results.html b/folkugat_web/assets/templates/fragments/temes/results.html index 2d44e71..a0f7387 100644 --- a/folkugat_web/assets/templates/fragments/temes/results.html +++ b/folkugat_web/assets/templates/fragments/temes/results.html @@ -12,6 +12,38 @@ {{ query }} {% endif %} + +