Search by properties

This commit is contained in:
marc
2025-05-04 22:10:10 +02:00
parent 4911935cdf
commit 47d18400c3
13 changed files with 245 additions and 68 deletions

View File

@@ -128,6 +128,7 @@ def busca_tema(
):
results = search_service.busca_temes(
query=query,
properties=[],
hidden=True,
limit=4,
offset=0,

View File

@@ -29,13 +29,14 @@ async def pagina(request: Request, session_id: int, set_id: int, logged_in: bool
)
def live(request: Request, logged_in: bool):
async def live(request: Request, logged_in: bool):
session = sessions_service.get_live_session()
set_ = None
if session and session.id:
playlist = playlists_service.get_playlist(session_id=session.id)
if playlist.sets:
set_ = playlists_service.add_temes_to_set(playlist.sets[-1])
set_ = await playlists_service.add_set_score_to_set(set_)
return templates.TemplateResponse(
"fragments/sessio/set/pagina.html",
{
@@ -51,13 +52,14 @@ def live(request: Request, logged_in: bool):
)
def live_set(request: Request, logged_in: bool):
async def live_set(request: Request, logged_in: bool):
session = sessions_service.get_live_session()
set_ = None
if session and session.id:
playlist = playlists_service.get_playlist(session_id=session.id)
if playlist.sets:
set_ = playlists_service.add_temes_to_set(playlist.sets[-1])
set_ = await playlists_service.add_set_score_to_set(set_)
return templates.TemplateResponse(
"fragments/sessio/set/set_page.html",
{

View File

@@ -1,9 +1,11 @@
import json
import urllib.parse
from fastapi import Request
from folkugat_web.model import temes as model
from folkugat_web.model.lilypond.processing import RenderError
from folkugat_web.model.pagines import Pages
from folkugat_web.services import sessions as sessions_service
from folkugat_web.services.temes import properties as properties_service
from folkugat_web.services.temes import query as temes_q
from folkugat_web.services.temes import scores as scores_service
from folkugat_web.services.temes import search as temes_s
@@ -11,22 +13,46 @@ from folkugat_web.templates import templates
from folkugat_web.utils import FnChain
def temes_pagina(request: Request, logged_in: bool, query: str):
def build_temes_params(query: str, properties: list[str]) -> str:
content_params = [
("query", query),
*[("properties", prop) for prop in properties or []]
]
return urllib.parse.urlencode(content_params)
def build_property_str(properties: list[str]) -> str:
return json.dumps(properties).replace("'", "\\'").replace('"', "'")
def temes_pagina(request: Request, logged_in: bool, query: str, properties: list[str]):
properties_str = build_property_str(properties)
return templates.TemplateResponse(
"fragments/temes/pagina.html",
{
"request": request,
"logged_in": logged_in,
"query": query,
"properties": properties,
"properties_str": properties_str,
"property_results": [],
"Pages": Pages,
"menu_selected_id": Pages.Temes,
}
)
def temes_busca(request: Request, logged_in: bool, query: str, offset: int = 0, limit: int = 10):
def temes_busca(
request: Request,
logged_in: bool,
query: str,
properties: list[str],
offset: int = 0,
limit: int = 10,
):
temes = temes_s.busca_temes(
query=query,
properties=properties,
hidden=logged_in,
limit=limit + 1,
offset=offset,
@@ -42,11 +68,26 @@ def temes_busca(request: Request, logged_in: bool, query: str, offset: int = 0,
temes = (
FnChain.transform(temes) |
temes_q.temes_compute_stats |
properties_service.add_properties_to_temes |
scores_service.add_scores_to_temes |
# No properties added because search already does that
list
).result()
property_results = [
prop for prop in temes_s.busca_properties(query=query, limit=5)
if prop not in properties
]
temes_url = f"/temes?{build_temes_params(query, properties)}"
def _add_property_str(prop: str) -> str:
properties_dedup = list(set(properties + [prop]))
return build_property_str(properties_dedup)
def _remove_property_str(prop: str) -> str:
properties_clean = [p for p in properties if p.lower() != prop.lower()]
return build_property_str(properties_clean)
return templates.TemplateResponse(
"fragments/temes/results.html",
{
@@ -54,11 +95,16 @@ def temes_busca(request: Request, logged_in: bool, query: str, offset: int = 0,
"logged_in": logged_in,
"temes": temes,
"query": query,
"properties": properties,
"property_results": property_results,
"prev_offset": prev_offset,
"next_offset": next_offset,
"LinkType": model.LinkType,
"ContentType": model.ContentType,
}
"add_property_str": _add_property_str,
"remove_property_str": _remove_property_str,
},
headers={"HX-Replace-Url": temes_url},
)