Skip to content

Commit 7771563

Browse files
authored
fix: allow inserting rows in restricted views (baserow#5345)
1 parent d0019d2 commit 7771563

3 files changed

Lines changed: 41 additions & 13 deletions

File tree

backend/src/baserow/contrib/database/api/rows/views.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -599,16 +599,16 @@ def post(self, request: Request, table_id: int, query_params) -> Response:
599599
validation_serializer, request_data, partial=True, return_validated=True
600600
)
601601

602+
view_id = query_params.get("view")
603+
view = ViewHandler().get_view(view_id) if view_id else None
604+
602605
before_id = query_params.get("before")
603606
before_row = (
604-
RowHandler().get_row(request.user, table, before_id, model)
607+
RowHandler().get_row(request.user, table, before_id, model, view=view)
605608
if before_id
606609
else None
607610
)
608611

609-
view_id = query_params.get("view")
610-
view = ViewHandler().get_view(view_id) if view_id else None
611-
612612
try:
613613
row = action_type_registry.get_by_type(CreateRowActionType).do(
614614
request.user,
@@ -1366,18 +1366,18 @@ def post(self, request: Request, table_id: int, query_params) -> Response:
13661366
model = table.get_model()
13671367
request_data = deepcopy(request.data)
13681368

1369+
view_id = query_params.get("view")
1370+
view = ViewHandler().get_view(view_id) if view_id else None
1371+
13691372
user_field_names = extract_user_field_names_from_params(request.GET)
13701373
send_webhook_events = extract_send_webhook_events_from_params(request.GET)
13711374
before_id = query_params.get("before")
13721375
before_row = (
1373-
RowHandler().get_row(request.user, table, before_id, model)
1376+
RowHandler().get_row(request.user, table, before_id, model, view=view)
13741377
if before_id
13751378
else None
13761379
)
13771380

1378-
view_id = query_params.get("view")
1379-
view = ViewHandler().get_view(view_id) if view_id else None
1380-
13811381
row_validation_serializer = get_row_serializer_class(
13821382
model, user_field_names=user_field_names
13831383
)
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"type": "bug",
3+
"message": "Fixes inserting rows above or below in restricted views",
4+
"issue_origin": "github",
5+
"issue_number": 5344,
6+
"domain": "database",
7+
"bullet_points": [],
8+
"created_at": "2026-05-11"
9+
}

enterprise/backend/tests/baserow_enterprise_tests/api/views/test_enterprise_view_views.py

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,16 @@ def test_cannot_get_row_outside_of_restricted_view(api_client, enterprise_data_f
282282

283283
@pytest.mark.django_db
284284
@override_settings(DEBUG=True)
285-
def test_create_row_with_only_view_permissions(api_client, enterprise_data_fixture):
285+
@pytest.mark.parametrize(
286+
"url_name, prepare_payload",
287+
[
288+
("api:database:rows:list", lambda row: row),
289+
("api:database:rows:batch", lambda row: {"items": [row]}),
290+
],
291+
)
292+
def test_create_row_with_only_view_permissions(
293+
api_client, enterprise_data_fixture, url_name, prepare_payload
294+
):
286295
enterprise_data_fixture.enable_enterprise()
287296

288297
user, token = enterprise_data_fixture.create_user_and_token()
@@ -318,13 +327,13 @@ def test_create_row_with_only_view_permissions(api_client, enterprise_data_fixtu
318327
scope=View.objects.get(id=normal_view.id),
319328
)
320329

321-
url = reverse("api:database:rows:list", kwargs={"table_id": table.id})
330+
url = reverse(url_name, kwargs={"table_id": table.id})
322331

323332
# Expect permission denied when trying to create a row in the table because the
324333
# user does not have access to the table.
325334
response = api_client.post(
326335
url,
327-
{f"field_{text_field.id}": "Test 1"},
336+
prepare_payload({f"field_{text_field.id}": "Test 1"}),
328337
format="json",
329338
HTTP_AUTHORIZATION=f"JWT {token2}",
330339
)
@@ -335,7 +344,7 @@ def test_create_row_with_only_view_permissions(api_client, enterprise_data_fixtu
335344
# view ownership type does not allow a user to create a row.
336345
response = api_client.post(
337346
url + f"?view={normal_view.id}",
338-
{f"field_{text_field.id}": "Test 1"},
347+
prepare_payload({f"field_{text_field.id}": "Test 1"}),
339348
format="json",
340349
HTTP_AUTHORIZATION=f"JWT {token2}",
341350
)
@@ -345,7 +354,17 @@ def test_create_row_with_only_view_permissions(api_client, enterprise_data_fixtu
345354
# Should come through because the user has access to the view.
346355
response = api_client.post(
347356
url + f"?view={restricted_view.id}",
348-
{f"field_{text_field.id}": "Test 1"},
357+
prepare_payload({f"field_{text_field.id}": "Test 1"}),
358+
format="json",
359+
HTTP_AUTHORIZATION=f"JWT {token2}",
360+
)
361+
assert response.status_code == HTTP_200_OK
362+
created_row_id = table.get_model().objects.first().id
363+
364+
# Should also be possible to reference another row as before_row
365+
response = api_client.post(
366+
url + f"?view={restricted_view.id}&before={created_row_id}",
367+
prepare_payload({f"field_{text_field.id}": "Test 1"}),
349368
format="json",
350369
HTTP_AUTHORIZATION=f"JWT {token2}",
351370
)

0 commit comments

Comments
 (0)