Search by properties
This commit is contained in:
@@ -128,6 +128,7 @@ def busca_tema(
|
||||
):
|
||||
results = search_service.busca_temes(
|
||||
query=query,
|
||||
properties=[],
|
||||
hidden=True,
|
||||
limit=4,
|
||||
offset=0,
|
||||
|
||||
@@ -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",
|
||||
{
|
||||
|
||||
@@ -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},
|
||||
)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user