mirror of
https://gitlab.com/bramw/baserow.git
synced 2025-04-11 07:51:20 +00:00
Merge branch '2819-lookup-filters-url-email' into 'develop'
Extend array filters to support lookups of URL, email, phone number, and UUID fields Closes #2819 See merge request baserow/baserow!2559
This commit is contained in:
commit
b663a5a575
5 changed files with 933 additions and 18 deletions
backend
src/baserow/contrib/database/views
tests/baserow/contrib/database/view
changelog/entries/unreleased/feature
web-frontend
|
@ -10,6 +10,10 @@ from baserow.contrib.database.fields.filter_support import (
|
|||
)
|
||||
from baserow.contrib.database.fields.registries import field_type_registry
|
||||
from baserow.contrib.database.formula import BaserowFormulaTextType
|
||||
from baserow.contrib.database.formula.types.formula_types import (
|
||||
BaserowFormulaCharType,
|
||||
BaserowFormulaURLType,
|
||||
)
|
||||
|
||||
from .registries import ViewFilterType
|
||||
from .view_filters import NotViewFilterTypeMixin
|
||||
|
@ -25,6 +29,8 @@ class HasEmptyValueViewFilterType(ViewFilterType):
|
|||
compatible_field_types = [
|
||||
FormulaFieldType.compatible_with_formula_types(
|
||||
FormulaFieldType.array_of(BaserowFormulaTextType.type),
|
||||
FormulaFieldType.array_of(BaserowFormulaCharType.type),
|
||||
FormulaFieldType.array_of(BaserowFormulaURLType.type),
|
||||
),
|
||||
]
|
||||
|
||||
|
@ -56,6 +62,8 @@ class HasValueEqualViewFilterType(ViewFilterType):
|
|||
compatible_field_types = [
|
||||
FormulaFieldType.compatible_with_formula_types(
|
||||
FormulaFieldType.array_of(BaserowFormulaTextType.type),
|
||||
FormulaFieldType.array_of(BaserowFormulaCharType.type),
|
||||
FormulaFieldType.array_of(BaserowFormulaURLType.type),
|
||||
),
|
||||
]
|
||||
|
||||
|
@ -89,6 +97,8 @@ class HasValueContainsViewFilterType(ViewFilterType):
|
|||
compatible_field_types = [
|
||||
FormulaFieldType.compatible_with_formula_types(
|
||||
FormulaFieldType.array_of(BaserowFormulaTextType.type),
|
||||
FormulaFieldType.array_of(BaserowFormulaCharType.type),
|
||||
FormulaFieldType.array_of(BaserowFormulaURLType.type),
|
||||
),
|
||||
]
|
||||
|
||||
|
@ -122,6 +132,8 @@ class HasValueContainsWordViewFilterType(ViewFilterType):
|
|||
compatible_field_types = [
|
||||
FormulaFieldType.compatible_with_formula_types(
|
||||
FormulaFieldType.array_of(BaserowFormulaTextType.type),
|
||||
FormulaFieldType.array_of(BaserowFormulaCharType.type),
|
||||
FormulaFieldType.array_of(BaserowFormulaURLType.type),
|
||||
),
|
||||
]
|
||||
|
||||
|
@ -155,6 +167,8 @@ class HasValueLengthIsLowerThanViewFilterType(ViewFilterType):
|
|||
compatible_field_types = [
|
||||
FormulaFieldType.compatible_with_formula_types(
|
||||
FormulaFieldType.array_of(BaserowFormulaTextType.type),
|
||||
FormulaFieldType.array_of(BaserowFormulaCharType.type),
|
||||
FormulaFieldType.array_of(BaserowFormulaURLType.type),
|
||||
),
|
||||
]
|
||||
|
||||
|
|
|
@ -33,6 +33,22 @@ def long_text_field_factory(data_fixture, table, user):
|
|||
return data_fixture.create_long_text_field(name="target", user=user, table=table)
|
||||
|
||||
|
||||
def url_field_factory(data_fixture, table, user):
|
||||
return data_fixture.create_url_field(name="target", user=user, table=table)
|
||||
|
||||
|
||||
def email_field_factory(data_fixture, table, user):
|
||||
return data_fixture.create_email_field(name="target", user=user, table=table)
|
||||
|
||||
|
||||
def phone_number_field_factory(data_fixture, table, user):
|
||||
return data_fixture.create_phone_number_field(name="target", user=user, table=table)
|
||||
|
||||
|
||||
def uuid_field_factory(data_fixture, table, user):
|
||||
return data_fixture.create_uuid_field(name="target", user=user, table=table)
|
||||
|
||||
|
||||
def setup(data_fixture, target_field_factory):
|
||||
user = data_fixture.create_user()
|
||||
database = data_fixture.create_database_application(user=user)
|
||||
|
@ -70,7 +86,14 @@ def setup(data_fixture, target_field_factory):
|
|||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"target_field_factory", [text_field_factory, long_text_field_factory]
|
||||
"target_field_factory",
|
||||
[
|
||||
text_field_factory,
|
||||
long_text_field_factory,
|
||||
email_field_factory,
|
||||
phone_number_field_factory,
|
||||
url_field_factory,
|
||||
],
|
||||
)
|
||||
@pytest.mark.django_db
|
||||
def test_has_empty_value_filter_text_field_types(data_fixture, target_field_factory):
|
||||
|
@ -122,8 +145,58 @@ def test_has_empty_value_filter_text_field_types(data_fixture, target_field_fact
|
|||
assert row_1.id in ids
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_has_empty_value_filter_uuid_field_types(data_fixture):
|
||||
test_setup = setup(data_fixture, uuid_field_factory)
|
||||
|
||||
other_row_1 = test_setup.other_table_model.objects.create()
|
||||
other_row_2 = test_setup.other_table_model.objects.create()
|
||||
other_row_3 = test_setup.other_table_model.objects.create()
|
||||
row_1 = test_setup.row_handler.create_row(
|
||||
user=test_setup.user,
|
||||
table=test_setup.table,
|
||||
values={
|
||||
f"field_{test_setup.link_row_field.id}": [
|
||||
other_row_1.id,
|
||||
other_row_3.id,
|
||||
]
|
||||
},
|
||||
)
|
||||
row_2 = test_setup.row_handler.create_row(
|
||||
user=test_setup.user,
|
||||
table=test_setup.table,
|
||||
values={f"field_{test_setup.link_row_field.id}": []},
|
||||
)
|
||||
row_3 = test_setup.row_handler.create_row(
|
||||
user=test_setup.user,
|
||||
table=test_setup.table,
|
||||
values={f"field_{test_setup.link_row_field.id}": [other_row_2.id]},
|
||||
)
|
||||
view_filter = data_fixture.create_view_filter(
|
||||
view=test_setup.grid_view,
|
||||
field=test_setup.lookup_field,
|
||||
type="has_empty_value",
|
||||
value="",
|
||||
)
|
||||
|
||||
ids = [
|
||||
r.id
|
||||
for r in test_setup.view_handler.apply_filters(
|
||||
test_setup.grid_view, test_setup.model.objects.all()
|
||||
).all()
|
||||
]
|
||||
assert len(ids) == 0
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"target_field_factory", [text_field_factory, long_text_field_factory]
|
||||
"target_field_factory",
|
||||
[
|
||||
text_field_factory,
|
||||
long_text_field_factory,
|
||||
email_field_factory,
|
||||
phone_number_field_factory,
|
||||
url_field_factory,
|
||||
],
|
||||
)
|
||||
@pytest.mark.django_db
|
||||
def test_has_not_empty_value_filter_text_field_types(
|
||||
|
@ -178,8 +251,58 @@ def test_has_not_empty_value_filter_text_field_types(
|
|||
assert row_3.id in ids
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_has_not_empty_value_filter_uuid_field_types(data_fixture):
|
||||
test_setup = setup(data_fixture, uuid_field_factory)
|
||||
|
||||
other_row_1 = test_setup.other_table_model.objects.create()
|
||||
other_row_2 = test_setup.other_table_model.objects.create()
|
||||
other_row_3 = test_setup.other_table_model.objects.create()
|
||||
row_1 = test_setup.row_handler.create_row(
|
||||
user=test_setup.user,
|
||||
table=test_setup.table,
|
||||
values={
|
||||
f"field_{test_setup.link_row_field.id}": [
|
||||
other_row_1.id,
|
||||
other_row_3.id,
|
||||
]
|
||||
},
|
||||
)
|
||||
row_2 = test_setup.row_handler.create_row(
|
||||
user=test_setup.user,
|
||||
table=test_setup.table,
|
||||
values={f"field_{test_setup.link_row_field.id}": []},
|
||||
)
|
||||
row_3 = test_setup.row_handler.create_row(
|
||||
user=test_setup.user,
|
||||
table=test_setup.table,
|
||||
values={f"field_{test_setup.link_row_field.id}": [other_row_2.id]},
|
||||
)
|
||||
view_filter = data_fixture.create_view_filter(
|
||||
view=test_setup.grid_view,
|
||||
field=test_setup.lookup_field,
|
||||
type="has_not_empty_value",
|
||||
value="",
|
||||
)
|
||||
|
||||
ids = [
|
||||
r.id
|
||||
for r in test_setup.view_handler.apply_filters(
|
||||
test_setup.grid_view, test_setup.model.objects.all()
|
||||
).all()
|
||||
]
|
||||
assert len(ids) == 3
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"target_field_factory", [text_field_factory, long_text_field_factory]
|
||||
"target_field_factory",
|
||||
[
|
||||
text_field_factory,
|
||||
long_text_field_factory,
|
||||
email_field_factory,
|
||||
phone_number_field_factory,
|
||||
url_field_factory,
|
||||
],
|
||||
)
|
||||
@pytest.mark.django_db
|
||||
def test_has_value_equal_filter_text_field_types(data_fixture, target_field_factory):
|
||||
|
@ -265,8 +388,104 @@ def test_has_value_equal_filter_text_field_types(data_fixture, target_field_fact
|
|||
assert len(ids) == 3
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_has_value_equal_filter_uuid_field_types(data_fixture):
|
||||
test_setup = setup(data_fixture, uuid_field_factory)
|
||||
|
||||
other_row_A = test_setup.other_table_model.objects.create(
|
||||
**{
|
||||
f"field_{test_setup.target_field.id}": "77545CE8-cbc0-4748-ba17-668b099a1ef8"
|
||||
}
|
||||
)
|
||||
other_row_B = test_setup.other_table_model.objects.create(
|
||||
**{
|
||||
f"field_{test_setup.target_field.id}": "188e1076-6c88-4bcc-893a-d0903c4169db"
|
||||
}
|
||||
)
|
||||
other_row_C = test_setup.other_table_model.objects.create(
|
||||
**{
|
||||
f"field_{test_setup.target_field.id}": "720a3d55-6aac-4d86-a0ce-6049001a4f64"
|
||||
}
|
||||
)
|
||||
other_row_a = test_setup.other_table_model.objects.create(
|
||||
**{
|
||||
f"field_{test_setup.target_field.id}": "77545CE8-cbc0-4748-ba17-668b099a1ef8"
|
||||
}
|
||||
)
|
||||
row_1 = test_setup.row_handler.create_row(
|
||||
user=test_setup.user,
|
||||
table=test_setup.table,
|
||||
values={
|
||||
f"field_{test_setup.link_row_field.id}": [other_row_A.id, other_row_B.id]
|
||||
},
|
||||
)
|
||||
row_2 = test_setup.row_handler.create_row(
|
||||
user=test_setup.user,
|
||||
table=test_setup.table,
|
||||
values={f"field_{test_setup.link_row_field.id}": [other_row_a.id]},
|
||||
)
|
||||
row_3 = test_setup.row_handler.create_row(
|
||||
user=test_setup.user,
|
||||
table=test_setup.table,
|
||||
values={
|
||||
f"field_{test_setup.link_row_field.id}": [other_row_B.id, other_row_a.id]
|
||||
},
|
||||
)
|
||||
|
||||
view_filter = data_fixture.create_view_filter(
|
||||
view=test_setup.grid_view,
|
||||
field=test_setup.lookup_field,
|
||||
type="has_value_equal",
|
||||
value="77545ce8-cbc0-4748-ba17-668b099a1ef8",
|
||||
)
|
||||
ids = [
|
||||
r.id
|
||||
for r in test_setup.view_handler.apply_filters(
|
||||
test_setup.grid_view, test_setup.model.objects.all()
|
||||
).all()
|
||||
]
|
||||
assert len(ids) == 3
|
||||
|
||||
view_filter.value = "77545CE8-cbc0-4748-ba17-668b099a1ef8" # upper case
|
||||
view_filter.save()
|
||||
ids = [
|
||||
r.id
|
||||
for r in test_setup.view_handler.apply_filters(
|
||||
test_setup.grid_view, test_setup.model.objects.all()
|
||||
).all()
|
||||
]
|
||||
assert len(ids) == 0
|
||||
|
||||
view_filter.value = "720a3d55-6aac-4d86-a0ce-6049001a4f64"
|
||||
view_filter.save()
|
||||
ids = [
|
||||
r.id
|
||||
for r in test_setup.view_handler.apply_filters(
|
||||
test_setup.grid_view, test_setup.model.objects.all()
|
||||
).all()
|
||||
]
|
||||
assert len(ids) == 0
|
||||
|
||||
view_filter.value = ""
|
||||
view_filter.save()
|
||||
ids = [
|
||||
r.id
|
||||
for r in test_setup.view_handler.apply_filters(
|
||||
test_setup.grid_view, test_setup.model.objects.all()
|
||||
).all()
|
||||
]
|
||||
assert len(ids) == 3
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"target_field_factory", [text_field_factory, long_text_field_factory]
|
||||
"target_field_factory",
|
||||
[
|
||||
text_field_factory,
|
||||
long_text_field_factory,
|
||||
email_field_factory,
|
||||
phone_number_field_factory,
|
||||
url_field_factory,
|
||||
],
|
||||
)
|
||||
@pytest.mark.django_db
|
||||
def test_has_not_value_equal_filter_text_field_types(
|
||||
|
@ -348,8 +567,104 @@ def test_has_not_value_equal_filter_text_field_types(
|
|||
assert len(ids) == 3
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_has_not_value_equal_filter_uuid_field_types(data_fixture):
|
||||
test_setup = setup(data_fixture, uuid_field_factory)
|
||||
|
||||
other_row_A = test_setup.other_table_model.objects.create(
|
||||
**{
|
||||
f"field_{test_setup.target_field.id}": "77545CE8-cbc0-4748-ba17-668b099a1ef8"
|
||||
}
|
||||
)
|
||||
other_row_B = test_setup.other_table_model.objects.create(
|
||||
**{
|
||||
f"field_{test_setup.target_field.id}": "188e1076-6c88-4bcc-893a-d0903c4169db"
|
||||
}
|
||||
)
|
||||
other_row_C = test_setup.other_table_model.objects.create(
|
||||
**{
|
||||
f"field_{test_setup.target_field.id}": "720a3d55-6aac-4d86-a0ce-6049001a4f64"
|
||||
}
|
||||
)
|
||||
other_row_a = test_setup.other_table_model.objects.create(
|
||||
**{
|
||||
f"field_{test_setup.target_field.id}": "77545CE8-cbc0-4748-ba17-668b099a1ef8"
|
||||
}
|
||||
)
|
||||
row_1 = test_setup.row_handler.create_row(
|
||||
user=test_setup.user,
|
||||
table=test_setup.table,
|
||||
values={
|
||||
f"field_{test_setup.link_row_field.id}": [other_row_A.id, other_row_B.id]
|
||||
},
|
||||
)
|
||||
row_2 = test_setup.row_handler.create_row(
|
||||
user=test_setup.user,
|
||||
table=test_setup.table,
|
||||
values={f"field_{test_setup.link_row_field.id}": [other_row_a.id]},
|
||||
)
|
||||
row_3 = test_setup.row_handler.create_row(
|
||||
user=test_setup.user,
|
||||
table=test_setup.table,
|
||||
values={
|
||||
f"field_{test_setup.link_row_field.id}": [other_row_B.id, other_row_a.id]
|
||||
},
|
||||
)
|
||||
|
||||
view_filter = data_fixture.create_view_filter(
|
||||
view=test_setup.grid_view,
|
||||
field=test_setup.lookup_field,
|
||||
type="has_not_value_equal",
|
||||
value="77545ce8-cbc0-4748-ba17-668b099a1ef8",
|
||||
)
|
||||
ids = [
|
||||
r.id
|
||||
for r in test_setup.view_handler.apply_filters(
|
||||
test_setup.grid_view, test_setup.model.objects.all()
|
||||
).all()
|
||||
]
|
||||
assert len(ids) == 0
|
||||
|
||||
view_filter.value = "77545CE8-cbc0-4748-ba17-668b099a1ef8" # upper case
|
||||
view_filter.save()
|
||||
ids = [
|
||||
r.id
|
||||
for r in test_setup.view_handler.apply_filters(
|
||||
test_setup.grid_view, test_setup.model.objects.all()
|
||||
).all()
|
||||
]
|
||||
assert len(ids) == 3
|
||||
|
||||
view_filter.value = "720a3d55-6aac-4d86-a0ce-6049001a4f64"
|
||||
view_filter.save()
|
||||
ids = [
|
||||
r.id
|
||||
for r in test_setup.view_handler.apply_filters(
|
||||
test_setup.grid_view, test_setup.model.objects.all()
|
||||
).all()
|
||||
]
|
||||
assert len(ids) == 3
|
||||
|
||||
view_filter.value = ""
|
||||
view_filter.save()
|
||||
ids = [
|
||||
r.id
|
||||
for r in test_setup.view_handler.apply_filters(
|
||||
test_setup.grid_view, test_setup.model.objects.all()
|
||||
).all()
|
||||
]
|
||||
assert len(ids) == 3
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"target_field_factory", [text_field_factory, long_text_field_factory]
|
||||
"target_field_factory",
|
||||
[
|
||||
text_field_factory,
|
||||
long_text_field_factory,
|
||||
email_field_factory,
|
||||
phone_number_field_factory,
|
||||
url_field_factory,
|
||||
],
|
||||
)
|
||||
@pytest.mark.django_db
|
||||
def test_has_value_contains_filter_text_field_types(data_fixture, target_field_factory):
|
||||
|
@ -424,8 +739,116 @@ def test_has_value_contains_filter_text_field_types(data_fixture, target_field_f
|
|||
assert len(ids) == 4
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_has_value_contains_filter_uuid_field_types(data_fixture):
|
||||
test_setup = setup(data_fixture, uuid_field_factory)
|
||||
|
||||
other_row_A = test_setup.other_table_model.objects.create(
|
||||
**{
|
||||
f"field_{test_setup.target_field.id}": "77545CE8-cbc0-4748-ba17-668b099a1ef8"
|
||||
}
|
||||
)
|
||||
other_row_B = test_setup.other_table_model.objects.create(
|
||||
**{
|
||||
f"field_{test_setup.target_field.id}": "188e1076-6c88-4bcc-893a-d0903c4169db"
|
||||
}
|
||||
)
|
||||
other_row_C = test_setup.other_table_model.objects.create(
|
||||
**{
|
||||
f"field_{test_setup.target_field.id}": "720a3d55-6aac-4d86-a0ce-6049001a4f64"
|
||||
}
|
||||
)
|
||||
other_row_a = test_setup.other_table_model.objects.create(
|
||||
**{
|
||||
f"field_{test_setup.target_field.id}": "77545CE8-cbc0-4748-ba17-668b099a1ef8"
|
||||
}
|
||||
)
|
||||
row_1 = test_setup.row_handler.create_row(
|
||||
user=test_setup.user,
|
||||
table=test_setup.table,
|
||||
values={
|
||||
f"field_{test_setup.link_row_field.id}": [other_row_A.id, other_row_B.id]
|
||||
},
|
||||
)
|
||||
row_2 = test_setup.row_handler.create_row(
|
||||
user=test_setup.user,
|
||||
table=test_setup.table,
|
||||
values={f"field_{test_setup.link_row_field.id}": [other_row_a.id]},
|
||||
)
|
||||
row_3 = test_setup.row_handler.create_row(
|
||||
user=test_setup.user,
|
||||
table=test_setup.table,
|
||||
values={
|
||||
f"field_{test_setup.link_row_field.id}": [other_row_B.id, other_row_a.id]
|
||||
},
|
||||
)
|
||||
|
||||
view_filter = data_fixture.create_view_filter(
|
||||
view=test_setup.grid_view,
|
||||
field=test_setup.lookup_field,
|
||||
type="has_value_contains",
|
||||
value="b099a1",
|
||||
)
|
||||
ids = [
|
||||
r.id
|
||||
for r in test_setup.view_handler.apply_filters(
|
||||
test_setup.grid_view, test_setup.model.objects.all()
|
||||
).all()
|
||||
]
|
||||
assert len(ids) == 3
|
||||
|
||||
view_filter.value = "B099a1" # upper case
|
||||
view_filter.save()
|
||||
ids = [
|
||||
r.id
|
||||
for r in test_setup.view_handler.apply_filters(
|
||||
test_setup.grid_view, test_setup.model.objects.all()
|
||||
).all()
|
||||
]
|
||||
assert len(ids) == 3
|
||||
|
||||
view_filter.value = "69db"
|
||||
view_filter.save()
|
||||
ids = [
|
||||
r.id
|
||||
for r in test_setup.view_handler.apply_filters(
|
||||
test_setup.grid_view, test_setup.model.objects.all()
|
||||
).all()
|
||||
]
|
||||
assert len(ids) == 2
|
||||
assert row_1.id in ids
|
||||
assert row_3.id in ids
|
||||
|
||||
view_filter.value = "xxx"
|
||||
view_filter.save()
|
||||
ids = [
|
||||
r.id
|
||||
for r in test_setup.view_handler.apply_filters(
|
||||
test_setup.grid_view, test_setup.model.objects.all()
|
||||
).all()
|
||||
]
|
||||
assert len(ids) == 0
|
||||
|
||||
view_filter.value = ""
|
||||
view_filter.save()
|
||||
ids = [
|
||||
r.id
|
||||
for r in test_setup.view_handler.apply_filters(
|
||||
test_setup.grid_view, test_setup.model.objects.all()
|
||||
).all()
|
||||
]
|
||||
assert len(ids) == 3
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"target_field_factory", [text_field_factory, long_text_field_factory]
|
||||
"target_field_factory",
|
||||
[
|
||||
text_field_factory,
|
||||
long_text_field_factory,
|
||||
email_field_factory,
|
||||
phone_number_field_factory,
|
||||
url_field_factory,
|
||||
],
|
||||
)
|
||||
@pytest.mark.django_db
|
||||
def test_has_not_value_contains_filter_text_field_types(
|
||||
|
@ -502,8 +925,115 @@ def test_has_not_value_contains_filter_text_field_types(
|
|||
assert len(ids) == 4
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_has_not_value_contains_filter_uuid_field_types(data_fixture):
|
||||
test_setup = setup(data_fixture, uuid_field_factory)
|
||||
|
||||
other_row_A = test_setup.other_table_model.objects.create(
|
||||
**{
|
||||
f"field_{test_setup.target_field.id}": "77545CE8-cbc0-4748-ba17-668b099a1ef8"
|
||||
}
|
||||
)
|
||||
other_row_B = test_setup.other_table_model.objects.create(
|
||||
**{
|
||||
f"field_{test_setup.target_field.id}": "188e1076-6c88-4bcc-893a-d0903c4169db"
|
||||
}
|
||||
)
|
||||
other_row_C = test_setup.other_table_model.objects.create(
|
||||
**{
|
||||
f"field_{test_setup.target_field.id}": "720a3d55-6aac-4d86-a0ce-6049001a4f64"
|
||||
}
|
||||
)
|
||||
other_row_a = test_setup.other_table_model.objects.create(
|
||||
**{
|
||||
f"field_{test_setup.target_field.id}": "77545CE8-cbc0-4748-ba17-668b099a1ef8"
|
||||
}
|
||||
)
|
||||
row_1 = test_setup.row_handler.create_row(
|
||||
user=test_setup.user,
|
||||
table=test_setup.table,
|
||||
values={
|
||||
f"field_{test_setup.link_row_field.id}": [other_row_A.id, other_row_B.id]
|
||||
},
|
||||
)
|
||||
row_2 = test_setup.row_handler.create_row(
|
||||
user=test_setup.user,
|
||||
table=test_setup.table,
|
||||
values={f"field_{test_setup.link_row_field.id}": [other_row_a.id]},
|
||||
)
|
||||
row_3 = test_setup.row_handler.create_row(
|
||||
user=test_setup.user,
|
||||
table=test_setup.table,
|
||||
values={
|
||||
f"field_{test_setup.link_row_field.id}": [other_row_B.id, other_row_a.id]
|
||||
},
|
||||
)
|
||||
|
||||
view_filter = data_fixture.create_view_filter(
|
||||
view=test_setup.grid_view,
|
||||
field=test_setup.lookup_field,
|
||||
type="has_not_value_contains",
|
||||
value="b099a1",
|
||||
)
|
||||
ids = [
|
||||
r.id
|
||||
for r in test_setup.view_handler.apply_filters(
|
||||
test_setup.grid_view, test_setup.model.objects.all()
|
||||
).all()
|
||||
]
|
||||
assert len(ids) == 0
|
||||
|
||||
view_filter.value = "B099a1" # upper case
|
||||
view_filter.save()
|
||||
ids = [
|
||||
r.id
|
||||
for r in test_setup.view_handler.apply_filters(
|
||||
test_setup.grid_view, test_setup.model.objects.all()
|
||||
).all()
|
||||
]
|
||||
assert len(ids) == 0
|
||||
|
||||
view_filter.value = "69db"
|
||||
view_filter.save()
|
||||
ids = [
|
||||
r.id
|
||||
for r in test_setup.view_handler.apply_filters(
|
||||
test_setup.grid_view, test_setup.model.objects.all()
|
||||
).all()
|
||||
]
|
||||
assert len(ids) == 1
|
||||
assert row_2.id in ids
|
||||
|
||||
view_filter.value = "xxx"
|
||||
view_filter.save()
|
||||
ids = [
|
||||
r.id
|
||||
for r in test_setup.view_handler.apply_filters(
|
||||
test_setup.grid_view, test_setup.model.objects.all()
|
||||
).all()
|
||||
]
|
||||
assert len(ids) == 3
|
||||
|
||||
view_filter.value = ""
|
||||
view_filter.save()
|
||||
ids = [
|
||||
r.id
|
||||
for r in test_setup.view_handler.apply_filters(
|
||||
test_setup.grid_view, test_setup.model.objects.all()
|
||||
).all()
|
||||
]
|
||||
assert len(ids) == 3
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"target_field_factory", [text_field_factory, long_text_field_factory]
|
||||
"target_field_factory",
|
||||
[
|
||||
text_field_factory,
|
||||
long_text_field_factory,
|
||||
email_field_factory,
|
||||
phone_number_field_factory,
|
||||
url_field_factory,
|
||||
],
|
||||
)
|
||||
@pytest.mark.django_db
|
||||
def test_has_value_contains_word_filter_text_field_types(
|
||||
|
@ -582,8 +1112,114 @@ def test_has_value_contains_word_filter_text_field_types(
|
|||
assert len(ids) == 4
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_has_value_contains_word_filter_uuid_field_types(data_fixture):
|
||||
test_setup = setup(data_fixture, uuid_field_factory)
|
||||
|
||||
other_row_A = test_setup.other_table_model.objects.create(
|
||||
**{
|
||||
f"field_{test_setup.target_field.id}": "77545ce8-cbc0-4748-ba17-668b099a1ef8"
|
||||
}
|
||||
)
|
||||
other_row_B = test_setup.other_table_model.objects.create(
|
||||
**{
|
||||
f"field_{test_setup.target_field.id}": "188e1076-6c88-4bcc-893a-d0903c4169db"
|
||||
}
|
||||
)
|
||||
other_row_C = test_setup.other_table_model.objects.create(
|
||||
**{
|
||||
f"field_{test_setup.target_field.id}": "720a3d55-6aac-4d86-a0ce-6049001a4f64"
|
||||
}
|
||||
)
|
||||
other_row_a = test_setup.other_table_model.objects.create(
|
||||
**{
|
||||
f"field_{test_setup.target_field.id}": "77545CE8-cbc0-4748-ba17-668b099a1ef8"
|
||||
}
|
||||
)
|
||||
row_1 = test_setup.row_handler.create_row(
|
||||
user=test_setup.user,
|
||||
table=test_setup.table,
|
||||
values={
|
||||
f"field_{test_setup.link_row_field.id}": [other_row_A.id, other_row_B.id]
|
||||
},
|
||||
)
|
||||
row_2 = test_setup.row_handler.create_row(
|
||||
user=test_setup.user,
|
||||
table=test_setup.table,
|
||||
values={f"field_{test_setup.link_row_field.id}": [other_row_a.id]},
|
||||
)
|
||||
row_3 = test_setup.row_handler.create_row(
|
||||
user=test_setup.user,
|
||||
table=test_setup.table,
|
||||
values={
|
||||
f"field_{test_setup.link_row_field.id}": [other_row_B.id, other_row_a.id]
|
||||
},
|
||||
)
|
||||
|
||||
view_filter = data_fixture.create_view_filter(
|
||||
view=test_setup.grid_view,
|
||||
field=test_setup.lookup_field,
|
||||
type="has_value_contains_word",
|
||||
value="77545CE8",
|
||||
)
|
||||
ids = [
|
||||
r.id
|
||||
for r in test_setup.view_handler.apply_filters(
|
||||
test_setup.grid_view, test_setup.model.objects.all()
|
||||
).all()
|
||||
]
|
||||
assert len(ids) == 3
|
||||
|
||||
view_filter.value = "77545ce8" # lower case
|
||||
view_filter.save()
|
||||
ids = [
|
||||
r.id
|
||||
for r in test_setup.view_handler.apply_filters(
|
||||
test_setup.grid_view, test_setup.model.objects.all()
|
||||
).all()
|
||||
]
|
||||
assert len(ids) == 3
|
||||
|
||||
view_filter.value = "69db"
|
||||
view_filter.save()
|
||||
ids = [
|
||||
r.id
|
||||
for r in test_setup.view_handler.apply_filters(
|
||||
test_setup.grid_view, test_setup.model.objects.all()
|
||||
).all()
|
||||
]
|
||||
assert len(ids) == 0
|
||||
|
||||
view_filter.value = "xxx"
|
||||
view_filter.save()
|
||||
ids = [
|
||||
r.id
|
||||
for r in test_setup.view_handler.apply_filters(
|
||||
test_setup.grid_view, test_setup.model.objects.all()
|
||||
).all()
|
||||
]
|
||||
assert len(ids) == 0
|
||||
|
||||
view_filter.value = ""
|
||||
view_filter.save()
|
||||
ids = [
|
||||
r.id
|
||||
for r in test_setup.view_handler.apply_filters(
|
||||
test_setup.grid_view, test_setup.model.objects.all()
|
||||
).all()
|
||||
]
|
||||
assert len(ids) == 3
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"target_field_factory", [text_field_factory, long_text_field_factory]
|
||||
"target_field_factory",
|
||||
[
|
||||
text_field_factory,
|
||||
long_text_field_factory,
|
||||
email_field_factory,
|
||||
phone_number_field_factory,
|
||||
url_field_factory,
|
||||
],
|
||||
)
|
||||
@pytest.mark.django_db
|
||||
def test_has_not_value_contains_word_filter_text_field_types(
|
||||
|
@ -662,8 +1298,114 @@ def test_has_not_value_contains_word_filter_text_field_types(
|
|||
assert len(ids) == 4
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_has_not_value_contains_word_filter_uuid_field_types(data_fixture):
|
||||
test_setup = setup(data_fixture, uuid_field_factory)
|
||||
|
||||
other_row_A = test_setup.other_table_model.objects.create(
|
||||
**{
|
||||
f"field_{test_setup.target_field.id}": "77545ce8-cbc0-4748-ba17-668b099a1ef8"
|
||||
}
|
||||
)
|
||||
other_row_B = test_setup.other_table_model.objects.create(
|
||||
**{
|
||||
f"field_{test_setup.target_field.id}": "188e1076-6c88-4bcc-893a-d0903c4169db"
|
||||
}
|
||||
)
|
||||
other_row_C = test_setup.other_table_model.objects.create(
|
||||
**{
|
||||
f"field_{test_setup.target_field.id}": "720a3d55-6aac-4d86-a0ce-6049001a4f64"
|
||||
}
|
||||
)
|
||||
other_row_a = test_setup.other_table_model.objects.create(
|
||||
**{
|
||||
f"field_{test_setup.target_field.id}": "77545CE8-cbc0-4748-ba17-668b099a1ef8"
|
||||
}
|
||||
)
|
||||
row_1 = test_setup.row_handler.create_row(
|
||||
user=test_setup.user,
|
||||
table=test_setup.table,
|
||||
values={
|
||||
f"field_{test_setup.link_row_field.id}": [other_row_A.id, other_row_B.id]
|
||||
},
|
||||
)
|
||||
row_2 = test_setup.row_handler.create_row(
|
||||
user=test_setup.user,
|
||||
table=test_setup.table,
|
||||
values={f"field_{test_setup.link_row_field.id}": [other_row_a.id]},
|
||||
)
|
||||
row_3 = test_setup.row_handler.create_row(
|
||||
user=test_setup.user,
|
||||
table=test_setup.table,
|
||||
values={
|
||||
f"field_{test_setup.link_row_field.id}": [other_row_B.id, other_row_a.id]
|
||||
},
|
||||
)
|
||||
|
||||
view_filter = data_fixture.create_view_filter(
|
||||
view=test_setup.grid_view,
|
||||
field=test_setup.lookup_field,
|
||||
type="has_not_value_contains_word",
|
||||
value="77545CE8",
|
||||
)
|
||||
ids = [
|
||||
r.id
|
||||
for r in test_setup.view_handler.apply_filters(
|
||||
test_setup.grid_view, test_setup.model.objects.all()
|
||||
).all()
|
||||
]
|
||||
assert len(ids) == 0
|
||||
|
||||
view_filter.value = "77545ce8" # lower case
|
||||
view_filter.save()
|
||||
ids = [
|
||||
r.id
|
||||
for r in test_setup.view_handler.apply_filters(
|
||||
test_setup.grid_view, test_setup.model.objects.all()
|
||||
).all()
|
||||
]
|
||||
assert len(ids) == 0
|
||||
|
||||
view_filter.value = "69db"
|
||||
view_filter.save()
|
||||
ids = [
|
||||
r.id
|
||||
for r in test_setup.view_handler.apply_filters(
|
||||
test_setup.grid_view, test_setup.model.objects.all()
|
||||
).all()
|
||||
]
|
||||
assert len(ids) == 3
|
||||
|
||||
view_filter.value = "xxx"
|
||||
view_filter.save()
|
||||
ids = [
|
||||
r.id
|
||||
for r in test_setup.view_handler.apply_filters(
|
||||
test_setup.grid_view, test_setup.model.objects.all()
|
||||
).all()
|
||||
]
|
||||
assert len(ids) == 3
|
||||
|
||||
view_filter.value = ""
|
||||
view_filter.save()
|
||||
ids = [
|
||||
r.id
|
||||
for r in test_setup.view_handler.apply_filters(
|
||||
test_setup.grid_view, test_setup.model.objects.all()
|
||||
).all()
|
||||
]
|
||||
assert len(ids) == 3
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"target_field_factory", [text_field_factory, long_text_field_factory]
|
||||
"target_field_factory",
|
||||
[
|
||||
text_field_factory,
|
||||
long_text_field_factory,
|
||||
email_field_factory,
|
||||
phone_number_field_factory,
|
||||
url_field_factory,
|
||||
],
|
||||
)
|
||||
@pytest.mark.django_db
|
||||
def test_has_value_length_is_lower_than_text_field_types(
|
||||
|
@ -752,3 +1494,69 @@ def test_has_value_length_is_lower_than_text_field_types(
|
|||
).all()
|
||||
]
|
||||
assert len(ids) == 4
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_has_value_length_is_lower_than_uuid_field_types(data_fixture):
|
||||
test_setup = setup(data_fixture, uuid_field_factory)
|
||||
other_row_1 = test_setup.other_table_model.objects.create()
|
||||
other_row_2 = test_setup.other_table_model.objects.create()
|
||||
row_1 = test_setup.row_handler.create_row(
|
||||
user=test_setup.user,
|
||||
table=test_setup.table,
|
||||
values={f"field_{test_setup.link_row_field.id}": [other_row_1.id]},
|
||||
)
|
||||
row_2 = test_setup.row_handler.create_row(
|
||||
user=test_setup.user,
|
||||
table=test_setup.table,
|
||||
values={
|
||||
f"field_{test_setup.link_row_field.id}": [other_row_1.id, other_row_2.id]
|
||||
},
|
||||
)
|
||||
row_3 = test_setup.row_handler.create_row(
|
||||
user=test_setup.user,
|
||||
table=test_setup.table,
|
||||
values={f"field_{test_setup.link_row_field.id}": [other_row_2.id]},
|
||||
)
|
||||
row_4 = test_setup.row_handler.create_row(
|
||||
user=test_setup.user,
|
||||
table=test_setup.table,
|
||||
values={f"field_{test_setup.link_row_field.id}": []},
|
||||
)
|
||||
|
||||
view_filter = data_fixture.create_view_filter(
|
||||
view=test_setup.grid_view,
|
||||
field=test_setup.lookup_field,
|
||||
type="has_value_length_is_lower_than",
|
||||
value="37",
|
||||
)
|
||||
ids = [
|
||||
r.id
|
||||
for r in test_setup.view_handler.apply_filters(
|
||||
test_setup.grid_view, test_setup.model.objects.all()
|
||||
).all()
|
||||
]
|
||||
assert len(ids) == 3
|
||||
assert row_1.id in ids
|
||||
assert row_2.id in ids
|
||||
assert row_3.id in ids
|
||||
|
||||
view_filter.value = "36"
|
||||
view_filter.save()
|
||||
ids = [
|
||||
r.id
|
||||
for r in test_setup.view_handler.apply_filters(
|
||||
test_setup.grid_view, test_setup.model.objects.all()
|
||||
).all()
|
||||
]
|
||||
assert len(ids) == 0
|
||||
|
||||
view_filter.value = ""
|
||||
view_filter.save()
|
||||
ids = [
|
||||
r.id
|
||||
for r in test_setup.view_handler.apply_filters(
|
||||
test_setup.grid_view, test_setup.model.objects.all()
|
||||
).all()
|
||||
]
|
||||
assert len(ids) == 4
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
"type": "feature",
|
||||
"message": "Extend array filters to support lookups of URL, email, phone number, and UUID fields",
|
||||
"issue_number": 2819,
|
||||
"bullet_points": [],
|
||||
"created_at": "2024-07-18"
|
||||
}
|
|
@ -14,7 +14,11 @@ export class HasEmptyValueViewFilterType extends ViewFilterType {
|
|||
}
|
||||
|
||||
getCompatibleFieldTypes() {
|
||||
return [FormulaFieldType.compatibleWithFormulaTypes('array(text)')]
|
||||
return [
|
||||
FormulaFieldType.compatibleWithFormulaTypes('array(text)'),
|
||||
FormulaFieldType.compatibleWithFormulaTypes('array(char)'),
|
||||
FormulaFieldType.compatibleWithFormulaTypes('array(url)'),
|
||||
]
|
||||
}
|
||||
|
||||
matches(cellValue, filterValue, field, fieldType) {
|
||||
|
@ -33,7 +37,11 @@ export class HasNotEmptyValueViewFilterType extends ViewFilterType {
|
|||
}
|
||||
|
||||
getCompatibleFieldTypes() {
|
||||
return [FormulaFieldType.compatibleWithFormulaTypes('array(text)')]
|
||||
return [
|
||||
FormulaFieldType.compatibleWithFormulaTypes('array(text)'),
|
||||
FormulaFieldType.compatibleWithFormulaTypes('array(char)'),
|
||||
FormulaFieldType.compatibleWithFormulaTypes('array(url)'),
|
||||
]
|
||||
}
|
||||
|
||||
matches(cellValue, filterValue, field, fieldType) {
|
||||
|
@ -56,7 +64,11 @@ export class HasValueEqualViewFilterType extends ViewFilterType {
|
|||
}
|
||||
|
||||
getCompatibleFieldTypes() {
|
||||
return [FormulaFieldType.compatibleWithFormulaTypes('array(text)')]
|
||||
return [
|
||||
FormulaFieldType.compatibleWithFormulaTypes('array(text)'),
|
||||
FormulaFieldType.compatibleWithFormulaTypes('array(char)'),
|
||||
FormulaFieldType.compatibleWithFormulaTypes('array(url)'),
|
||||
]
|
||||
}
|
||||
|
||||
matches(cellValue, filterValue, field, fieldType) {
|
||||
|
@ -79,7 +91,11 @@ export class HasNotValueEqualViewFilterType extends ViewFilterType {
|
|||
}
|
||||
|
||||
getCompatibleFieldTypes() {
|
||||
return [FormulaFieldType.compatibleWithFormulaTypes('array(text)')]
|
||||
return [
|
||||
FormulaFieldType.compatibleWithFormulaTypes('array(text)'),
|
||||
FormulaFieldType.compatibleWithFormulaTypes('array(char)'),
|
||||
FormulaFieldType.compatibleWithFormulaTypes('array(url)'),
|
||||
]
|
||||
}
|
||||
|
||||
matches(cellValue, filterValue, field, fieldType) {
|
||||
|
@ -102,7 +118,11 @@ export class HasValueContainsViewFilterType extends ViewFilterType {
|
|||
}
|
||||
|
||||
getCompatibleFieldTypes() {
|
||||
return [FormulaFieldType.compatibleWithFormulaTypes('array(text)')]
|
||||
return [
|
||||
FormulaFieldType.compatibleWithFormulaTypes('array(text)'),
|
||||
FormulaFieldType.compatibleWithFormulaTypes('array(char)'),
|
||||
FormulaFieldType.compatibleWithFormulaTypes('array(url)'),
|
||||
]
|
||||
}
|
||||
|
||||
matches(cellValue, filterValue, field, fieldType) {
|
||||
|
@ -125,7 +145,11 @@ export class HasNotValueContainsViewFilterType extends ViewFilterType {
|
|||
}
|
||||
|
||||
getCompatibleFieldTypes() {
|
||||
return [FormulaFieldType.compatibleWithFormulaTypes('array(text)')]
|
||||
return [
|
||||
FormulaFieldType.compatibleWithFormulaTypes('array(text)'),
|
||||
FormulaFieldType.compatibleWithFormulaTypes('array(char)'),
|
||||
FormulaFieldType.compatibleWithFormulaTypes('array(url)'),
|
||||
]
|
||||
}
|
||||
|
||||
matches(cellValue, filterValue, field, fieldType) {
|
||||
|
@ -148,7 +172,11 @@ export class HasValueContainsWordViewFilterType extends ViewFilterType {
|
|||
}
|
||||
|
||||
getCompatibleFieldTypes() {
|
||||
return [FormulaFieldType.compatibleWithFormulaTypes('array(text)')]
|
||||
return [
|
||||
FormulaFieldType.compatibleWithFormulaTypes('array(text)'),
|
||||
FormulaFieldType.compatibleWithFormulaTypes('array(char)'),
|
||||
FormulaFieldType.compatibleWithFormulaTypes('array(url)'),
|
||||
]
|
||||
}
|
||||
|
||||
matches(cellValue, filterValue, field, fieldType) {
|
||||
|
@ -171,7 +199,11 @@ export class HasNotValueContainsWordViewFilterType extends ViewFilterType {
|
|||
}
|
||||
|
||||
getCompatibleFieldTypes() {
|
||||
return [FormulaFieldType.compatibleWithFormulaTypes('array(text)')]
|
||||
return [
|
||||
FormulaFieldType.compatibleWithFormulaTypes('array(text)'),
|
||||
FormulaFieldType.compatibleWithFormulaTypes('array(char)'),
|
||||
FormulaFieldType.compatibleWithFormulaTypes('array(url)'),
|
||||
]
|
||||
}
|
||||
|
||||
matches(cellValue, filterValue, field, fieldType) {
|
||||
|
@ -198,7 +230,11 @@ export class HasValueLengthIsLowerThanViewFilterType extends ViewFilterType {
|
|||
}
|
||||
|
||||
getCompatibleFieldTypes() {
|
||||
return [FormulaFieldType.compatibleWithFormulaTypes('array(text)')]
|
||||
return [
|
||||
FormulaFieldType.compatibleWithFormulaTypes('array(text)'),
|
||||
FormulaFieldType.compatibleWithFormulaTypes('array(char)'),
|
||||
FormulaFieldType.compatibleWithFormulaTypes('array(url)'),
|
||||
]
|
||||
}
|
||||
|
||||
matches(cellValue, filterValue, field, fieldType) {
|
||||
|
|
|
@ -52,6 +52,16 @@ describe('Text-based array view filters', () => {
|
|||
formula_type: 'array',
|
||||
array_formula_type: 'text',
|
||||
},
|
||||
{
|
||||
TestFieldType: FormulaFieldType,
|
||||
formula_type: 'array',
|
||||
array_formula_type: 'char',
|
||||
},
|
||||
{
|
||||
TestFieldType: FormulaFieldType,
|
||||
formula_type: 'array',
|
||||
array_formula_type: 'url',
|
||||
},
|
||||
]
|
||||
|
||||
describe.each(hasValueEqualSupportedFields)(
|
||||
|
@ -129,6 +139,16 @@ describe('Text-based array view filters', () => {
|
|||
formula_type: 'array',
|
||||
array_formula_type: 'text',
|
||||
},
|
||||
{
|
||||
TestFieldType: FormulaFieldType,
|
||||
formula_type: 'array',
|
||||
array_formula_type: 'char',
|
||||
},
|
||||
{
|
||||
TestFieldType: FormulaFieldType,
|
||||
formula_type: 'array',
|
||||
array_formula_type: 'url',
|
||||
},
|
||||
]
|
||||
|
||||
describe.each(hasValueContainsSupportedFields)(
|
||||
|
@ -211,6 +231,16 @@ describe('Text-based array view filters', () => {
|
|||
formula_type: 'array',
|
||||
array_formula_type: 'text',
|
||||
},
|
||||
{
|
||||
TestFieldType: FormulaFieldType,
|
||||
formula_type: 'array',
|
||||
array_formula_type: 'char',
|
||||
},
|
||||
{
|
||||
TestFieldType: FormulaFieldType,
|
||||
formula_type: 'array',
|
||||
array_formula_type: 'url',
|
||||
},
|
||||
]
|
||||
|
||||
describe.each(hasValueContainsWordSupportedFields)(
|
||||
|
@ -284,6 +314,16 @@ describe('Text-based array view filters', () => {
|
|||
formula_type: 'array',
|
||||
array_formula_type: 'text',
|
||||
},
|
||||
{
|
||||
TestFieldType: FormulaFieldType,
|
||||
formula_type: 'array',
|
||||
array_formula_type: 'char',
|
||||
},
|
||||
{
|
||||
TestFieldType: FormulaFieldType,
|
||||
formula_type: 'array',
|
||||
array_formula_type: 'url',
|
||||
},
|
||||
]
|
||||
|
||||
describe.each(hasEmptyValueSupportedFields)(
|
||||
|
@ -361,6 +401,16 @@ describe('Text-based array view filters', () => {
|
|||
formula_type: 'array',
|
||||
array_formula_type: 'text',
|
||||
},
|
||||
{
|
||||
TestFieldType: FormulaFieldType,
|
||||
formula_type: 'array',
|
||||
array_formula_type: 'char',
|
||||
},
|
||||
{
|
||||
TestFieldType: FormulaFieldType,
|
||||
formula_type: 'array',
|
||||
array_formula_type: 'url',
|
||||
},
|
||||
]
|
||||
|
||||
describe.each(hasLengthLowerThanSupportedFields)(
|
||||
|
|
Loading…
Add table
Reference in a new issue