Filtres i ordres als resultats de cerca
This commit is contained in:
@@ -5,7 +5,9 @@ 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.model.search import Order, OrderBy, OrderParams
|
||||
from folkugat_web.services import sessions as sessions_service
|
||||
from folkugat_web.services.sessions import get_date_names
|
||||
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
|
||||
@@ -13,20 +15,48 @@ from folkugat_web.templates import templates
|
||||
from folkugat_web.utils import FnChain
|
||||
|
||||
|
||||
def build_temes_params(query: str, properties: list[str]) -> str:
|
||||
def build_temes_params(
|
||||
query: str,
|
||||
properties: list[str],
|
||||
order_params: OrderParams | None = None,
|
||||
) -> str:
|
||||
content_params = [
|
||||
("query", query),
|
||||
*[("properties", prop) for prop in properties or []]
|
||||
]
|
||||
if order_params:
|
||||
content_params.append(("order_by", order_params.order_by.value))
|
||||
content_params.append(("order", order_params.order.value))
|
||||
return urllib.parse.urlencode(content_params)
|
||||
|
||||
|
||||
def build_hx_vars(*vars_dicts: dict[str, str]) -> str:
|
||||
result = ",".join(f"{var}:{value}" for hx_vars in vars_dicts for var, value in hx_vars.items())
|
||||
return result
|
||||
|
||||
|
||||
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]):
|
||||
def build_order_params_dict(order_params: OrderParams | None) -> dict[str, str]:
|
||||
if not order_params:
|
||||
return {}
|
||||
return {
|
||||
"order_by": f"'{order_params.order_by.value}'",
|
||||
"order": f"'{order_params.order.value}'",
|
||||
}
|
||||
|
||||
|
||||
def temes_pagina(
|
||||
request: Request,
|
||||
logged_in: bool,
|
||||
query: str,
|
||||
properties: list[str],
|
||||
order_params: OrderParams | None,
|
||||
):
|
||||
properties_str = build_property_str(properties)
|
||||
order_params_dict = build_order_params_dict(order_params)
|
||||
return templates.TemplateResponse(
|
||||
"fragments/temes/pagina.html",
|
||||
{
|
||||
@@ -35,8 +65,14 @@ def temes_pagina(request: Request, logged_in: bool, query: str, properties: list
|
||||
"query": query,
|
||||
"properties": properties,
|
||||
"properties_str": properties_str,
|
||||
"order_params": order_params,
|
||||
"order_params_dict": order_params_dict,
|
||||
"build_hx_vars": build_hx_vars,
|
||||
"property_results": [],
|
||||
"Order": Order,
|
||||
"OrderBy": OrderBy,
|
||||
"Pages": Pages,
|
||||
"get_date_names": get_date_names,
|
||||
"menu_selected_id": Pages.Temes,
|
||||
}
|
||||
)
|
||||
@@ -47,12 +83,14 @@ def temes_busca(
|
||||
logged_in: bool,
|
||||
query: str,
|
||||
properties: list[str],
|
||||
order_params: OrderParams | None = None,
|
||||
offset: int = 0,
|
||||
limit: int = 10,
|
||||
):
|
||||
temes = temes_s.busca_temes(
|
||||
query=query,
|
||||
properties=properties,
|
||||
order_params=order_params,
|
||||
hidden=logged_in,
|
||||
limit=limit + 1,
|
||||
offset=offset,
|
||||
@@ -78,7 +116,12 @@ def temes_busca(
|
||||
if prop not in properties
|
||||
]
|
||||
|
||||
temes_url = f"/temes?{build_temes_params(query, properties)}"
|
||||
temes_params = build_temes_params(
|
||||
query=query,
|
||||
properties=properties,
|
||||
order_params=order_params,
|
||||
)
|
||||
temes_url = f"/temes?{temes_params}"
|
||||
|
||||
def _add_property_str(prop: str) -> str:
|
||||
properties_dedup = list(set(properties + [prop]))
|
||||
@@ -97,13 +140,19 @@ def temes_busca(
|
||||
"query": query,
|
||||
"properties": properties,
|
||||
"properties_str": build_property_str(properties),
|
||||
"order_params": order_params,
|
||||
"order_params_dict": build_order_params_dict(order_params),
|
||||
"property_results": property_results,
|
||||
"prev_offset": prev_offset,
|
||||
"next_offset": next_offset,
|
||||
"LinkType": model.LinkType,
|
||||
"ContentType": model.ContentType,
|
||||
"Order": Order,
|
||||
"OrderBy": OrderBy,
|
||||
"get_date_names": get_date_names,
|
||||
"add_property_str": _add_property_str,
|
||||
"remove_property_str": _remove_property_str,
|
||||
"build_hx_vars": build_hx_vars,
|
||||
},
|
||||
headers={"HX-Replace-Url": temes_url},
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user