class MyTestQuery(Query): foo_name = Filter(attr='foo', freetext=True, field__include=True) bar_name = Filter.case_sensitive(attr='bar', freetext=True, field__include=True) baz_name = Filter(attr='baz', field__include=True)
class ShowQuery(Query): foo = Filter() bar = Filter( include=lambda query, filter, **_: query.get_request().GET['foo'] == 'include' and filter.extra.foo == 'include2', extra__foo='include2', )
def test_invalid_filter(): q = Query(filters__bazaar=Filter(), ).bind(request=req('get')) query2 = Query(filters__bazaar=Filter(), ).bind( request=req('get', **{q.get_advanced_query_param(): 'not_bazaar=asd'})) with pytest.raises(QueryException) as e: query2.get_q() assert 'Unknown filter "not_bazaar"' in str(e)
def test_invalid_value(): q = Query( filters__bazaar=Filter.integer(value_to_q=lambda filter, op, value_string_or_f: None), ).bind(request=req('get')) request = req('get', **{q.get_advanced_query_param(): 'bazaar=asd'}) query2 = Query( filters__bazaar=Filter.integer(value_to_q=lambda filter, op, value_string_or_f: None), ).bind(request=request) with pytest.raises(QueryException) as e: query2.get_q() assert 'Unknown value "asd" for filter "bazaar"' in str(e)
def test_choice_queryset_value_to_q_misc(): assert choice_queryset_value_to_q(Filter(attr=None), op='=', value_string_or_f=None) == Q() assert choice_queryset_value_to_q(Filter(attr='foo'), op='=', value_string_or_f='null') == Q(foo=None) foo = Foo.objects.create(foo=1) assert choice_queryset_value_to_q(Filter(attr='foo', search_fields=['foo'], choices=Foo.objects.all()), op='=', value_string_or_f='1') == Q(foo__pk=foo.pk) Foo.objects.create(foo=1) with pytest.raises(QueryException) as e: choice_queryset_value_to_q(Filter(attr='foo', search_fields=['foo'], choices=Foo.objects.all()), op='=', value_string_or_f='1') assert str(e.value) == 'Found more than one object for name "1"'
def test_none_attr(): # pragma: no cover with pytest.raises(AssertionError) as e: Query( filters__bazaar=Filter(attr=None, field__include=True), ).bind(request=req('get', bazaar='foo')) assert str(e.value) == "bazaar cannot be a part of a query, it has no attr or value_to_q so we don't know what to search for. If you want to include it anyway set check_filterable=False (filter__check_filterable=False for a Column)"
def test_none_attr(): with pytest.raises(AssertionError) as e: Query( filters__bazaar=Filter(attr=None, field__include=True), ).bind(request=req('get', bazaar='foo')) assert str(e.value) == "bazaar cannot be a part of a query, it has no attr or value_to_q so we don't know what to search for"
def test_build_query_expression_for_model_with_search_fields(): old_search_fields_by_model = dict(from_model._search_fields_by_model) register_search_fields(model=Foo, search_fields=['foo', 'pk'], allow_non_unique=True) foo = Foo.objects.create(foo=17) assert ( build_query_expression(filter=Filter(query_name='bar', search_fields=['foo']), value=foo) == f'bar="{foo.foo}"' # Vanilla case with only one serach field ) assert ( build_query_expression(filter=Filter(query_name='bar', search_fields=['foo', 'pk']), value=foo) == f'bar="{foo.pk}"' # If more than one, assume the last one is the one that is unique ) from_model._search_fields_by_model = old_search_fields_by_model
def test_invalid_form_data(): query2 = Query( filters__bazaar=Filter.integer(attr='quux__bar__bazaar', field__include=True), ).bind(request=req('get', bazaar='asds')) assert query2.get_query_string() == '' assert repr(query2.get_q()) == repr(Q())
def test_nice_error_message(): with pytest.raises(NoRegisteredSearchFieldException) as e: value_to_str_for_query(Filter(search_fields=['custom_name_field']), NonStandardName(non_standard_name='foo')) assert ( str(e.value) == "NonStandardName has no attribute custom_name_field. Please register search fields with register_search_fields or specify search_fields." )
def test_none_attr_with_value_to_q(): q = Query(filters__bazaar=Filter( attr=None, value_to_q=lambda filter, op, value_string_or_f: Q(bazonk= value_string_or_f), field__include=True, ), ).bind(request=req('get', bazaar='foo')) assert q.get_q() == Q(bazonk='foo')
class MyQuery(Query): foo = Filter.choice_queryset( field__include=True, field__attr='name', choices=EndPointDispatchModel.objects.all().order_by('id'), )
class Query2(Query): foo = Filter.multi_choice_queryset( choices=Foo.objects.all(), field__include=True, search_fields=['foo'], )
class MyTestQuery(Query): foo = Filter.date()
class Query2(Query): foo = Filter()
class MyQuery(Query): foo = Filter(freetext=True)
def test_value_to_str_for_query_dunder_path(): bar = Bar.objects.create(foo=Foo.objects.create(foo=1)) value_to_str_for_query(Filter(search_fields=['foo__foo']), bar)
class AQuery(Query): foo = Filter( include=False, )
def test_build_query_expression_for_model_with_no_search_fields(): foo = Foo.objects.create(foo=17) assert build_query_expression(filter=Filter(query_name='bar'), value=foo) == f'bar.pk={foo.pk}'
class MyQuery(Query): foo = Filter.choice( field__include=True, field__attr='name', choices=('a', 'b'), )
class MyQuery(Query): foo = Filter.integer()
def test_filter_repr(): assert repr(Filter(_name='foo')) == '<iommi.query.Filter foo>'
def test_base_value_to_q_misc(): assert Filter.value_to_q(Filter(attr=None), op='=', value_string_or_f=None) == Q()
class MyQuery(Query): foo = Filter(field__include=True)
class Query2(MyTestQuery): bazaar = Filter.boolean(attr='quux__bar__bazaar', field__include=True)
class MyTestQuery(Query): foo_name = Filter(attr='foo')
class MyQuery(Query): foo = Filter.boolean()