Skip to content

Commit 8d41ae1

Browse files
authored
fix(backend): allow negative numbers in rollup field filter input (baserow#5429)
* fix(backend): include number_negative in rollup field response (baserow#3925) The rollup field's API response was missing the `number_negative` key because `RollupFieldType.serializer_field_names` was built from `BASEROW_FORMULA_TYPE_ALLOWED_FIELDS`, which does not include it (unlike `BASEROW_FORMULA_TYPE_SERIALIZER_FIELD_NAMES` used by `LookupFieldType`). As a result, the frontend filter input's `isValidChar` check (`numberField.js`) silently dropped the `-` keypress, making it impossible to type negative numbers when filtering a rollup field. Add `number_negative` explicitly to Rollup's serializer field list and overrides as a read-only boolean defaulting to True. Formula-backed number fields never enforce a 'no negatives' restriction, so the default is always correct, and `read_only=True` keeps the write API unchanged. * fix(backend): align Rollup field similar to lookup
1 parent 412763d commit 8d41ae1

3 files changed

Lines changed: 58 additions & 10 deletions

File tree

backend/src/baserow/contrib/database/fields/field_types.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6229,13 +6229,22 @@ class RollupFieldType(FormulaFieldType):
62296229
"target_field_id",
62306230
"rollup_function",
62316231
]
6232-
serializer_field_names = BASEROW_FORMULA_TYPE_ALLOWED_FIELDS + [
6232+
request_serializer_field_names = (
6233+
BASEROW_FORMULA_TYPE_REQUEST_SERIALIZER_FIELD_NAMES
6234+
+ [
6235+
"through_field_id",
6236+
"target_field_id",
6237+
"rollup_function",
6238+
"formula_type",
6239+
]
6240+
)
6241+
serializer_field_names = BASEROW_FORMULA_TYPE_SERIALIZER_FIELD_NAMES + [
62336242
"through_field_id",
62346243
"target_field_id",
62356244
"rollup_function",
62366245
"formula_type",
62376246
]
6238-
serializer_field_overrides = {
6247+
request_serializer_field_overrides = {
62396248
"through_field_id": serializers.IntegerField(
62406249
required=False,
62416250
allow_null=True,
@@ -6252,14 +6261,6 @@ class RollupFieldType(FormulaFieldType):
62526261
"nullable": serializers.BooleanField(required=False, read_only=True),
62536262
}
62546263

6255-
@property
6256-
def request_serializer_field_names(self):
6257-
return self.serializer_field_names
6258-
6259-
@property
6260-
def request_serializer_field_overrides(self):
6261-
return self.serializer_field_overrides
6262-
62636264
def before_create(
62646265
self, table, primary, allowed_field_values, order, user, field_kwargs
62656266
):

backend/tests/baserow/contrib/database/field/test_rollup_field_type.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -736,3 +736,41 @@ def test_remove_dependent_count_rollup_field_through_field(
736736
test_field.refresh_from_db()
737737
assert test_field.through_field_id is None
738738
assert test_field.error == "references the deleted or unknown field "
739+
740+
741+
@pytest.mark.django_db
742+
def test_rollup_field_api_response_includes_number_negative(data_fixture, api_client):
743+
user, token = data_fixture.create_user_and_token()
744+
table = data_fixture.create_database_table(user=user)
745+
table2 = data_fixture.create_database_table(user=user, database=table.database)
746+
data_fixture.create_text_field(name="tableprimary", table=table, primary=True)
747+
data_fixture.create_text_field(name="table2primary", table=table2, primary=True)
748+
rolled_up_field = data_fixture.create_number_field(
749+
name="number", table=table2, number_negative=True
750+
)
751+
link_row_field = FieldHandler().create_field(
752+
user,
753+
table,
754+
"link_row",
755+
name="linkrowfield",
756+
link_row_table=table2,
757+
)
758+
rollup_field = FieldHandler().create_field(
759+
user,
760+
table,
761+
"rollup",
762+
name="rollup_field",
763+
through_field_id=link_row_field.id,
764+
target_field_id=rolled_up_field.id,
765+
rollup_function="sum",
766+
)
767+
768+
response = api_client.get(
769+
reverse("api:database:fields:item", kwargs={"field_id": rollup_field.id}),
770+
format="json",
771+
HTTP_AUTHORIZATION=f"JWT {token}",
772+
)
773+
assert response.status_code == HTTP_200_OK
774+
response_json = response.json()
775+
assert response_json["type"] == "rollup"
776+
assert response_json["number_negative"] is True
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"type": "bug",
3+
"message": "Lets you type negative numbers when filtering by rollup field",
4+
"issue_origin": "github",
5+
"issue_number": 3925,
6+
"domain": "database",
7+
"bullet_points": [],
8+
"created_at": "2026-05-28"
9+
}

0 commit comments

Comments
 (0)