Skip to content

Commit f7704e8

Browse files
authored
Introduce "Send Slack message" in application builder. (baserow#4239)
* Adding the builder workflow action for the new Slack send message service. * Lint fix; tweaks * Add the issue_origin
1 parent c8932d6 commit f7704e8

File tree

16 files changed

+143
-7
lines changed

16 files changed

+143
-7
lines changed

backend/src/baserow/contrib/builder/apps.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,7 @@ def ready(self):
286286
NotificationWorkflowActionType,
287287
OpenPageWorkflowActionType,
288288
RefreshDataSourceWorkflowActionType,
289+
SlackWriteMessageWorkflowActionType,
289290
UpdateRowWorkflowActionType,
290291
)
291292

@@ -301,6 +302,9 @@ def ready(self):
301302
builder_workflow_action_type_registry.register(CoreHttpRequestActionType())
302303
builder_workflow_action_type_registry.register(CoreSMTPEmailActionType())
303304
builder_workflow_action_type_registry.register(AIAgentWorkflowActionType())
305+
builder_workflow_action_type_registry.register(
306+
SlackWriteMessageWorkflowActionType()
307+
)
304308

305309
from .elements.collection_field_types import (
306310
BooleanCollectionFieldType,
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
# Generated by Django 5.0.14 on 2025-11-13 11:57
2+
3+
import django.db.models.deletion
4+
from django.db import migrations, models
5+
6+
7+
class Migration(migrations.Migration):
8+
dependencies = [
9+
("builder", "0066_element_visibility_condition"),
10+
("core", "0107_twofactorauthprovidermodel_totpauthprovidermodel_and_more"),
11+
]
12+
13+
operations = [
14+
migrations.CreateModel(
15+
name="SlackWriteMessageWorkflowAction",
16+
fields=[
17+
(
18+
"builderworkflowaction_ptr",
19+
models.OneToOneField(
20+
auto_created=True,
21+
on_delete=django.db.models.deletion.CASCADE,
22+
parent_link=True,
23+
primary_key=True,
24+
serialize=False,
25+
to="builder.builderworkflowaction",
26+
),
27+
),
28+
(
29+
"service",
30+
models.ForeignKey(
31+
help_text="The service which this action is associated with.",
32+
on_delete=django.db.models.deletion.CASCADE,
33+
to="core.service",
34+
),
35+
),
36+
],
37+
options={
38+
"abstract": False,
39+
},
40+
bases=("builder.builderworkflowaction",),
41+
),
42+
]

backend/src/baserow/contrib/builder/workflow_actions/models.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,3 +125,7 @@ class CoreSMTPEmailWorkflowAction(BuilderWorkflowServiceAction):
125125

126126
class AIAgentWorkflowAction(BuilderWorkflowServiceAction):
127127
...
128+
129+
130+
class SlackWriteMessageWorkflowAction(BuilderWorkflowServiceAction):
131+
...

backend/src/baserow/contrib/builder/workflow_actions/workflow_action_types.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
NotificationWorkflowAction,
2727
OpenPageWorkflowAction,
2828
RefreshDataSourceWorkflowAction,
29+
SlackWriteMessageWorkflowAction,
2930
)
3031
from baserow.contrib.builder.workflow_actions.registries import (
3132
BuilderWorkflowActionType,
@@ -40,6 +41,9 @@
4041
LocalBaserowDeleteRowServiceType,
4142
LocalBaserowUpsertRowServiceType,
4243
)
44+
from baserow.contrib.integrations.slack.service_types import (
45+
SlackWriteMessageServiceType,
46+
)
4347
from baserow.core.db import specific_queryset
4448
from baserow.core.formula.field import BASEROW_FORMULA_VERSION_INITIAL
4549
from baserow.core.formula.serializers import FormulaSerializerField
@@ -493,3 +497,13 @@ class AIAgentWorkflowActionType(BuilderWorkflowServiceActionType):
493497
def get_pytest_params(self, pytest_data_fixture) -> Dict[str, int]:
494498
service = pytest_data_fixture.create_ai_agent_service()
495499
return {"service": service}
500+
501+
502+
class SlackWriteMessageWorkflowActionType(BuilderWorkflowServiceActionType):
503+
type = "slack_write_message"
504+
model_class = SlackWriteMessageWorkflowAction
505+
service_type = SlackWriteMessageServiceType.type
506+
507+
def get_pytest_params(self, pytest_data_fixture) -> Dict[str, int]:
508+
service = pytest_data_fixture.create_slack_write_message_service()
509+
return {"service": service}

backend/src/baserow/contrib/integrations/slack/service_types.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class SlackWriteMessageServiceType(ServiceType):
2828

2929
allowed_fields = ["integration_id", "channel", "text"]
3030
serializer_field_names = ["integration_id", "channel", "text"]
31+
public_serializer_field_names = ["integration_id", "channel", "text"]
3132
simple_formula_fields = ["text"]
3233

3334
class SerializedDict(ServiceDict):
@@ -55,6 +56,12 @@ def serializer_field_overrides(self):
5556
),
5657
}
5758

59+
@property
60+
def public_serializer_field_overrides(self):
61+
# When we're exposing this service type via a "public" serializer,
62+
# use the same overrides as usual.
63+
return self.serializer_field_overrides
64+
5865
def formulas_to_resolve(
5966
self, service: SlackWriteMessageService
6067
) -> list[FormulaToResolve]:

backend/src/baserow/test_utils/fixtures/service.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
LocalBaserowTableServiceSort,
2121
LocalBaserowUpsertRow,
2222
)
23+
from baserow.contrib.integrations.slack.models import SlackWriteMessageService
2324
from baserow.core.services.registries import service_type_registry
2425

2526

@@ -104,6 +105,9 @@ def create_core_smtp_email_service(self, **kwargs) -> CoreSMTPEmailService:
104105
def create_ai_agent_service(self, **kwargs):
105106
return self.create_service(AIAgentService, **kwargs)
106107

108+
def create_slack_write_message_service(self, **kwargs):
109+
return self.create_service(SlackWriteMessageService, **kwargs)
110+
107111
def create_core_iterator_service(self, **kwargs):
108112
return self.create_service(CoreIteratorService, **kwargs)
109113

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"type": "feature",
3+
"message": "Introduced the new 'Slack send message' workflow action.",
4+
"domain": "builder",
5+
"issue_number": 4237,
6+
"issue_origin": "github",
7+
"bullet_points": [],
8+
"created_at": "2025-11-13"
9+
}

web-frontend/modules/builder/components/event/Event.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
:key="workflowActionType.getType()"
3535
:value="workflowActionType.getType()"
3636
:icon="workflowActionType.icon"
37+
:image="workflowActionType.image"
3738
type="primary"
3839
size="small"
3940
@click="addWorkflowAction(workflowActionType.getType())"

web-frontend/modules/builder/components/event/WorkflowAction.vue

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
<template>
22
<SidebarExpandable :force-expanded="expanded" @toggle="$emit('toggle')">
33
<template #title>
4-
<Icon :icon="workflowActionType.icon" />
4+
<Icon v-if="workflowActionType.icon" :icon="workflowActionType.icon" />
5+
<img
6+
v-else-if="workflowActionType.image"
7+
alt=""
8+
class="workflow-action__image"
9+
:src="workflowActionType.image"
10+
/>
511
<span>{{ workflowActionType.label }}</span>
612
<Icon
713
v-if="errorMessage"

web-frontend/modules/builder/plugin.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ import {
121121
CoreHTTPRequestWorkflowActionType,
122122
CoreSMTPEmailWorkflowActionType,
123123
AIAgentWorkflowActionType,
124+
SlackWriteMessageWorkflowActionType,
124125
} from '@baserow/modules/builder/workflowActionTypes'
125126

126127
import {
@@ -389,6 +390,10 @@ export default (context) => {
389390
'workflowAction',
390391
new DeleteRowWorkflowActionType(context)
391392
)
393+
app.$registry.register(
394+
'workflowAction',
395+
new SlackWriteMessageWorkflowActionType(context)
396+
)
392397

393398
app.$registry.register(
394399
'collectionField',

0 commit comments

Comments
 (0)