1
0
Fork 0
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 

See merge request 
This commit is contained in:
Petr Stribny 2024-07-22 11:01:45 +00:00
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
modules/database
test/unit/database

View file

@ -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),
),
]

View file

@ -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

View file

@ -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"
}

View file

@ -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) {

View file

@ -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)(