Filtering Data Grid with MultiSelectDropDown

I think the brand query should be something like

if brand:
    brand_queries = (q.ilike(f"%{a}%") for a in brand)
    queries.append(
        q.any_of(brand=q.any_of(*brand_queries))
    )

I think you can also simplify the query code somewhat, maybe something like:

from collections import defaultdict

@anvil.server.callable
def search_table(query=None, brand=None, country=None, language=None, from_date=None, to_date=None):
    queries = defaultdict(list)

    if query:
        query = q.ilike(f"%{query}%")
        queries["subject"].append(query)
        queries["brand"].append(query)
        queries["country"].append(query)
        queries["language"].append(query)
    if brand:
        queries["brand"].extend(q.ilike(f"%{a}%") for a in brand)
    if country:
        queries["country"].append(q.ilike(f'%{country}%'))
    if language:
        queries["language"].append(q.ilike(f'%{language}%'))

    queries = {col: q.any_of(*query_list) for col, query_list in queries.items()}

    # handle dates
    if from_date and to_date:
        queries["email_date"] = q.between(from_date, to_date)
    elif from_date:
        queries["email_date"] = q.greater_than_or_equal_to(from_date)
    elif to_date:
        queries["email_date"] = q.less_than_or_equal_to(to_date)

    result = app_tables.email.search(**queries)

    return result
1 Like