Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ existing tools and performs at any scale.
[![Deploy to Heroku](https://www.herokucdn.com/deploy/button.svg)](https://www.heroku.com/deploy/?template=https://github.com/baserow/baserow/tree/master)

```bash
docker run -v baserow_data:/baserow/data -p 80:80 -p 443:443 baserow/baserow:2.3.2
docker run -v baserow_data:/baserow/data -p 80:80 -p 443:443 baserow/baserow:2.3.3
```

![Baserow database screenshot](docs/assets/screenshot.png "Baserow database screenshot")
Expand Down Expand Up @@ -108,7 +108,7 @@ Created by Baserow B.V. - bram@baserow.io.

Distributes under the MIT license. See `LICENSE` for more information.

Version: 2.3.2
Version: 2.3.3

The official repository can be found at https://github.com/baserow/baserow.

Expand Down
2 changes: 1 addition & 1 deletion backend/docker/docker-entrypoint.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ set -euo pipefail
# ENVIRONMENT VARIABLES USED DIRECTLY BY THIS ENTRYPOINT
# ======================================================

export BASEROW_VERSION="2.3.2"
export BASEROW_VERSION="2.3.3"

# Used by docker-entrypoint.sh to start the dev server
# If not configured you'll receive this: CommandError: "0.0.0.0:" is not a valid port number or address:port pair.
Expand Down
2 changes: 1 addition & 1 deletion backend/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ dependencies = [
"websockets==16.0.0",
"requests==2.34.2",
"itsdangerous==2.2.0",
"Pillow==12.2.0",
"Pillow==12.3.0",
"drf-spectacular==0.29.0",
"asgiref==3.11.0",
"channels[daphne]==4.3.2",
Expand Down
31 changes: 29 additions & 2 deletions backend/src/baserow/config/settings/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -494,7 +494,7 @@
"name": "MIT",
"url": "https://github.com/baserow/baserow/blob/develop/LICENSE",
},
"VERSION": "2.3.2",
"VERSION": "2.3.3",
"SERVE_INCLUDE_SCHEMA": False,
"TAGS": [
{"name": "Settings"},
Expand Down Expand Up @@ -1469,6 +1469,7 @@ def __setitem__(self, key, value):
import sentry_sdk
import sentry_sdk.integrations as _sentry_integrations
from loguru import logger
from sentry_sdk.integrations.celery import CeleryIntegration
from sentry_sdk.integrations.django import DjangoIntegration
from sentry_sdk.scrubber import DEFAULT_DENYLIST, EventScrubber

Expand Down Expand Up @@ -1504,9 +1505,35 @@ def __setitem__(self, key, value):
0 if sentry_transport else float(os.getenv("SENTRY_TRACES_SAMPLE_RATE", 0.01))
)

# Auto-create Sentry cron monitors for celery beat tasks. Beat dispatches tasks
# with sentry-monitor-* headers and workers send the check-ins, so both processes
# need this integration; they all load these settings. Disabled with the console
# transport (fake DSN in dev) to avoid spamming check-in envelopes to the console.
sentry_monitor_beat_tasks = not sentry_transport and str_to_bool(
os.getenv("SENTRY_MONITOR_BEAT_TASKS") or "true"
)
# Validate patterns here: sentry-sdk matches them unguarded on every beat
# dispatch, so one invalid regex would stop all periodic tasks from being sent.
sentry_exclude_beat_tasks = []
for task in (os.getenv("SENTRY_EXCLUDE_BEAT_TASKS") or "").split(","):
task = task.strip()
if not task:
continue
try:
re.compile(task)
sentry_exclude_beat_tasks.append(task)
except re.error:
logger.warning(f"[SENTRY] Ignoring invalid exclude beat task: {task}")

sentry_sdk.init(
dsn=SENTRY_DSN,
integrations=[DjangoIntegration(signals_spans=False, middleware_spans=False)],
integrations=[
DjangoIntegration(signals_spans=False, middleware_spans=False),
CeleryIntegration(
monitor_beat_tasks=sentry_monitor_beat_tasks,
exclude_beat_tasks=sentry_exclude_beat_tasks,
),
],
traces_sample_rate=sentry_traces_sample_rate,
send_default_pii=False,
before_send=drop_expected_asyncio_websocket_disconnect_events,
Expand Down
13 changes: 2 additions & 11 deletions backend/src/baserow/contrib/integrations/core/service_types.py
Original file line number Diff line number Diff line change
Expand Up @@ -1604,9 +1604,9 @@ class CoreHTTPTriggerServiceType(TriggerServiceTypeMixin, ServiceType):
type = "http_trigger"
model_class = CoreHTTPTriggerService

allowed_fields = ["uid", "exclude_get", "is_public"]
allowed_fields = ["exclude_get", "is_public"]
serializer_field_names = ["uid", "exclude_get", "is_public"]
request_serializer_field_names = ["uid", "exclude_get"]
request_serializer_field_names = ["exclude_get"]

class SerializedDict(ServiceDict):
uid: str
Expand Down Expand Up @@ -1797,15 +1797,6 @@ def import_serialized(
**kwargs,
)

def export_prepared_values(
self, instance: CoreHTTPTriggerService
) -> dict[str, Any]:
values = super().export_prepared_values(instance)

values["uid"] = str(values["uid"])

return values


class CoreManualTriggerServiceType(TriggerServiceTypeMixin, CoreServiceType):
type = "manual"
Expand Down
2 changes: 1 addition & 1 deletion backend/src/baserow/version.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
VERSION = "2.3.2"
VERSION = "2.3.3"
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from unittest.mock import patch
from uuid import uuid4

from django.urls import reverse

Expand Down Expand Up @@ -425,6 +426,34 @@ def test_updating_node_with_invalid_formula_arguments_throws_error(
}


@pytest.mark.django_db
def test_update_http_trigger_node_ignores_uid(api_client, data_fixture):
user, token = data_fixture.create_user_and_token()
workflow = data_fixture.create_automation_workflow(user, create_trigger=False)
node = data_fixture.create_http_trigger_node(user=user, workflow=workflow)
service = node.service
original_uid = service.uid

api_kwargs = get_api_kwargs(token)
update_url = reverse(API_URL_ITEM, kwargs={"node_id": node.id})
payload = {
"service": {
"type": service.get_type().type,
"uid": str(uuid4()),
"exclude_get": True,
}
}
response = api_client.patch(update_url, payload, **api_kwargs)

assert response.status_code == HTTP_200_OK
assert response.json()["service"]["uid"] == str(original_uid)

service.refresh_from_db()
assert service.uid == original_uid
# A field which is allowed to be updated is still applied.
assert service.exclude_get is True


@pytest.mark.django_db
def test_update_node_invalid_node(api_client, data_fixture):
_, token = data_fixture.create_user_and_token()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from unittest.mock import MagicMock
from uuid import UUID, uuid4
from uuid import uuid4

import pytest

Expand Down Expand Up @@ -177,15 +177,3 @@ def test_import_serialized_sets_is_public(data_fixture, is_publishing):
)

assert instance.is_public is is_publishing


@pytest.mark.django_db
def test_export_prepared_values_casts_uid_to_str(data_fixture):
trigger_node = data_fixture.create_http_trigger_node()
service = trigger_node.service

assert isinstance(service.uid, UUID)

values = CoreHTTPTriggerServiceType().export_prepared_values(service)

assert values["uid"] == str(service.uid)
Loading
Loading