add parent filter

This commit is contained in:
maxime 2026-02-25 00:27:33 +01:00
parent 44c5fbf284
commit 204362eac2
3 changed files with 50 additions and 3 deletions

View File

@ -4,7 +4,7 @@
<h1>Cat list ({{ cat_list | length }})</h1>
<div class="cat_header cat"
hx-get="/hx/cat_list"
hx-include="input[name='sortby'], input[name='state_filters']"
hx-include="#catlist .cat_header input, #catlist .cat_header select"
hx-target="#catlist_data"
hx-trigger="load, reloadCatList from:document, change, htmx:after-request from:(#cat-form form) queue: last"
>
@ -29,10 +29,14 @@
<div>
Parent A
<input type="radio" name="sortby" value="parent_a" />
<select name="fltr_parent" hx-get="/hx/get_parent_cat_options" hx-trigger="load, reloadCatList from:document", hhx-swap="innerHTML">
</select>
</div>
<div>
Parent B
<input type="radio" name="sortby" value="parent_b" />
<select name="fltr_parent" hx-get="/hx/get_parent_cat_options" hx-trigger="load, reloadCatList from:document", hhx-swap="innerHTML">
</select>
</div>
<div>
Stats
@ -50,4 +54,4 @@
id="catlist_data"
>
</div>
-</div>
</div>

View File

@ -4,6 +4,7 @@ from litestar.plugins.htmx import HTMXPlugin
from litestar.contrib.jinja import JinjaTemplateEngine
from litestar.template.config import TemplateConfig
from litestar.static_files import create_static_files_router
from advanced_alchemy.extensions.litestar import EngineConfig
from pathlib import Path
from .config import config
from .controllers import CatController, FrontendController, GenerationController

View File

@ -1,9 +1,11 @@
from uuid import UUID
import itertools
from litestar import Controller, get, post
from litestar.di import Provide
from litestar.response import Template
from litestar.plugins.htmx import HTMXRequest, HTMXTemplate
from advanced_alchemy.filters import OrderBy, LimitOffset, CollectionFilter
from advanced_alchemy.filters import OrderBy, LimitOffset, CollectionFilter, ComparisonFilter, FilterGroup, LogicalOperatorMap
from sqlalchemy import or_
from pprint import pprint
from ..models import Cat, CatRepository, StateEnum, SexEnum
@ -40,6 +42,7 @@ class FrontendController(Controller):
async def cat_list(
self,
cats_repo: CatRepository,
fltr_parent: list[str] | None = None,
state_filters: list[str] | None = None,
sortby: str = 'name',
sortorder: str = 'asc',
@ -58,6 +61,18 @@ class FrontendController(Controller):
)
)
if fltr_parent:
for parent_id in map(UUID, filter(bool, fltr_parent)):
filters.append(
FilterGroup(
or_,
[
ComparisonFilter(Cat.parent_a, 'eq', parent_id),
ComparisonFilter(Cat.parent_b, 'eq', parent_id),
]
)
)
elts = await cats_repo.list(
*filters,
OrderBy(sortby, sortorder)
@ -77,6 +92,33 @@ class FrontendController(Controller):
}
)
@get(path='/hx/get_parent_cat_options')
async def get_parent_cat_options(
self,
cats_repo: CatRepository,
) -> Template:
all_cats = await cats_repo.list()
parent_ids = set(itertools.chain.from_iterable([ (cat.parent_a, cat.parent_b) for cat in all_cats ]))
parent_cats = list(
filter(
lambda elt: elt.id in parent_ids,
all_cats
)
)
return HTMXTemplate(
template_name='templates/cat_options.html.j2',
context={
'cat_list': parent_cats
},
re_target="this",
after="receive"
)
"""
@get(path='/hx/cat_form')
async def get_hx_cat_form(self,