fix tag search

This commit is contained in:
Jann Stute
2024-11-28 12:50:12 +01:00
parent 6eab426183
commit 0d4afd47c8
5 changed files with 27 additions and 16 deletions

View File

@@ -59,6 +59,17 @@ class ItemType(enum.Enum):
TAG_GROUP = 2
@dataclass
class TagFilterState:
search: str | None = None
page_index: int | None = 0
page_size: int | None = 500
def __post_init__(self):
if self.search is not None:
self.search = self.search.strip()
@dataclass
class FilterState:
"""Represent a state of the Library grid view."""

View File

@@ -39,7 +39,7 @@ from ...constants import (
from ...enums import LibraryPrefs
from ...media_types import MediaCategories
from .db import make_tables
from .enums import FieldTypeEnum, FilterState, TagColor
from .enums import FieldTypeEnum, FilterState, TagColor, TagFilterState
from .fields import (
BaseField,
DatetimeField,
@@ -512,7 +512,7 @@ class Library:
def search_tags(
self,
search: FilterState, # TODO TSQLANG move this to str
filter_state: TagFilterState,
) -> list[Tag]:
"""Return a list of Tag records matching the query."""
with Session(self.engine) as session:
@@ -522,11 +522,11 @@ class Library:
selectinload(Tag.aliases),
)
if search.tag:
if filter_state.search:
query = query.where(
or_(
Tag.name.icontains(search.tag),
Tag.shorthand.icontains(search.tag),
Tag.name.icontains(filter_state.search),
Tag.shorthand.icontains(filter_state.search),
)
)
@@ -536,7 +536,7 @@ class Library:
logger.info(
"searching tags",
search=search,
search=filter_state,
statement=str(query),
results=len(res),
)

View File

@@ -12,7 +12,7 @@ from PySide6.QtWidgets import (
QWidget,
)
from src.core.library import Library, Tag
from src.core.library.alchemy.enums import FilterState
from src.core.library.alchemy.enums import TagFilterState
from src.qt.modals.build_tag import BuildTagPanel
from src.qt.widgets.panel import PanelModal, PanelWidget
from src.qt.widgets.tag import TagWidget
@@ -70,7 +70,7 @@ class TagDatabasePanel(PanelWidget):
while self.scroll_layout.itemAt(0):
self.scroll_layout.takeAt(0).widget().deleteLater()
tags = self.lib.search_tags(FilterState(path=query, page_size=self.tag_limit))
tags = self.lib.search_tags(TagFilterState(search=query, page_size=self.tag_limit))
for tag in tags:
container = QWidget()

View File

@@ -17,7 +17,7 @@ from PySide6.QtWidgets import (
QWidget,
)
from src.core.library import Library
from src.core.library.alchemy.enums import FilterState
from src.core.library.alchemy.enums import TagFilterState
from src.core.palette import ColorType, get_tag_color
from src.qt.widgets.panel import PanelWidget
from src.qt.widgets.tag import TagWidget
@@ -78,8 +78,8 @@ class TagSearchPanel(PanelWidget):
self.scroll_layout.takeAt(0).widget().deleteLater()
found_tags = self.lib.search_tags(
FilterState(
path=name,
TagFilterState(
search=name,
page_size=self.tag_limit,
)
)

View File

@@ -4,7 +4,7 @@ from tempfile import TemporaryDirectory
import pytest
from src.core.enums import DefaultEnum, LibraryPrefs
from src.core.library.alchemy import Entry, Library
from src.core.library.alchemy.enums import FilterState
from src.core.library.alchemy.enums import FilterState, TagFilterState
from src.core.library.alchemy.fields import TextField, _FieldID
from src.core.library.alchemy.models import Tag
@@ -133,17 +133,17 @@ def test_tag_search(library):
tag = library.tags[0]
assert library.search_tags(
FilterState(tag=tag.name.lower()),
TagFilterState(search=tag.name.lower()),
)
assert library.search_tags(
FilterState(tag=tag.name.upper()),
TagFilterState(search=tag.name.upper()),
)
assert library.search_tags(FilterState(tag=tag.name[2:-2]))
assert library.search_tags(TagFilterState(search=tag.name[2:-2]))
assert not library.search_tags(
FilterState(tag=tag.name * 2),
TagFilterState(search=tag.name * 2),
)