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
6 changes: 3 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -399,6 +399,7 @@ jobs:
with:
files: reports/report.xml
check_name: Backend Tests (Group ${{ matrix.group }})
comment_mode: off

test-frontend:
name: Web-Frontend Tests (Shard ${{ matrix.shard }})
Expand Down Expand Up @@ -451,6 +452,7 @@ jobs:
with:
files: reports/junit.xml
check_name: Web-Frontend Tests (Shard ${{ matrix.shard }})
comment_mode: off

test-zapier:
name: Zapier Integration Tests
Expand Down Expand Up @@ -518,8 +520,7 @@ jobs:
name: E2E Tests (Shard ${{ matrix.shard }})
timeout-minutes: 60
runs-on: ubuntu-latest
# Only run E2E tests on PRs, not on develop/master branches
if: github.event_name == 'pull_request'
if: needs.detect-changes.outputs.backend == 'true' || needs.detect-changes.outputs.frontend == 'true' || needs.detect-changes.outputs.dockerfiles == 'true' || github.ref_name == 'develop' || github.ref_name == 'master'
needs:
- build-backend
- build-frontend
Expand Down Expand Up @@ -678,7 +679,6 @@ jobs:
collect-e2e-reports:
name: Collect E2E Test Reports
runs-on: ubuntu-latest
if: github.event_name == 'pull_request' && always()
needs: [test-e2e]
permissions:
contents: read
Expand Down
9 changes: 9 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
## Baserow is an open-source no-code platform and the best alternative to Airtable

### 🚨 Repository Migration Notice

Baserow has moved from GitLab to GitHub. All issues have been successfully migrated,
but merged and closed merge requests (PRs) were not imported. You can still browse the
old repository and its history at: https://gitlab.com/baserow/baserow.

Please use this GitHub repository for all new issues, discussions, and contributions
going forward at: https://github.com/baserow/baserow.

It lets you easily build databases, applications, automations, and dashboards — all in
one secure, self-hostable environment. Empower your team to create powerful tools
without writing a single line of code.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-29 14:05+0000\n"
"POT-Creation-Date: 2025-10-13 19:58+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
Expand Down Expand Up @@ -335,39 +335,39 @@ msgstr ""
msgid "Table \"%(table_name)s\" (%(table_id)s) created"
msgstr ""

#: src/baserow/contrib/database/table/actions.py:104
#: src/baserow/contrib/database/table/actions.py:107
msgid "Delete table"
msgstr ""

#: src/baserow/contrib/database/table/actions.py:105
#: src/baserow/contrib/database/table/actions.py:108
#, python-format
msgid "Table \"%(table_name)s\" (%(table_id)s) deleted"
msgstr ""

#: src/baserow/contrib/database/table/actions.py:160
#: src/baserow/contrib/database/table/actions.py:163
msgid "Order tables"
msgstr ""

#: src/baserow/contrib/database/table/actions.py:161
#: src/baserow/contrib/database/table/actions.py:164
msgid "Tables order changed"
msgstr ""

#: src/baserow/contrib/database/table/actions.py:224
#: src/baserow/contrib/database/table/actions.py:227
msgid "Update table"
msgstr ""

#: src/baserow/contrib/database/table/actions.py:226
#: src/baserow/contrib/database/table/actions.py:229
#, python-format
msgid ""
"Table (%(table_id)s) name changed from \"%(original_table_name)s\" to "
"\"%(table_name)s\""
msgstr ""

#: src/baserow/contrib/database/table/actions.py:296
#: src/baserow/contrib/database/table/actions.py:299
msgid "Duplicate table"
msgstr ""

#: src/baserow/contrib/database/table/actions.py:298
#: src/baserow/contrib/database/table/actions.py:301
#, python-format
msgid ""
"Table \"%(table_name)s\" (%(table_id)s) duplicated from "
Expand Down
9 changes: 6 additions & 3 deletions backend/src/baserow/contrib/database/table/actions.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import dataclasses
from typing import Any, List, Optional
from typing import Any, Dict, List, Optional, Tuple

from django.contrib.auth.models import AbstractUser
from django.utils.translation import gettext_lazy as _
Expand Down Expand Up @@ -47,8 +47,9 @@ def do(
name: str,
data: Optional[List[List[Any]]] = None,
first_row_header: bool = True,
fill_example: bool = True,
progress: Optional[Progress] = None,
) -> Table:
) -> Tuple[Table, Dict[str, Dict[str, Any]]]:
"""
Create a table in the specified database.
Undoing this action trashes the table and redoing restores it.
Expand All @@ -61,6 +62,8 @@ def do(
:param first_row_header: Indicates if the first row are the fields. The names
of these rows are going to be used as fields. If `fields` is provided,
this options is ignored.
:param fill_example: Whether or not to fill the table with example data if
no data is provided.
:param progress: An optional progress instance if you want to track the progress
of the task.
:return: The created table and the error report.
Expand All @@ -72,7 +75,7 @@ def do(
name,
data=data,
first_row_header=first_row_header,
fill_example=True,
fill_example=fill_example,
progress=progress,
)

Expand Down
12 changes: 6 additions & 6 deletions backend/src/baserow/contrib/database/views/handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -578,12 +578,12 @@ def list_views(
self,
user: AbstractUser,
table: Table,
_type: str,
filters: bool,
sortings: bool,
decorations: bool,
group_bys: bool,
limit: int,
_type: str | None = None,
filters: bool = True,
sortings: bool = True,
decorations: bool = True,
group_bys: bool = True,
limit: int | None = None,
) -> Iterable[View]:
"""
Lists available views for a user/table combination.
Expand Down
4 changes: 2 additions & 2 deletions backend/src/baserow/core/locale/en/LC_MESSAGES/django.po
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-29 14:05+0000\n"
"POT-Creation-Date: 2025-10-13 19:58+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
Expand Down Expand Up @@ -242,7 +242,7 @@ msgstr ""
msgid "Decimal number"
msgstr ""

#: src/baserow/core/handler.py:2185 src/baserow/core/user/handler.py:267
#: src/baserow/core/handler.py:2187 src/baserow/core/user/handler.py:267
#, python-format
msgid "%(name)s's workspace"
msgstr ""
Expand Down
53 changes: 31 additions & 22 deletions backend/src/baserow/locale/en/LC_MESSAGES/django.po
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-30 08:04+0000\n"
"POT-Creation-Date: 2025-10-13 19:58+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
Expand All @@ -35,15 +35,15 @@ msgstr ""
#: src/baserow/contrib/automation/action_scopes.py:14
#, python-format
msgid ""
"of type (%(node_type)s) in automation "
"\"%(automation_name)s\" (%(automation_id)s)."
"of type (%(node_type)s) in automation \"%(automation_name)s\" "
"(%(automation_id)s)."
msgstr ""

#: src/baserow/contrib/automation/actions.py:8
#, python-format
msgid ""
"in workflow (%(workflow_id)s) in automation "
"\"%(automation_name)s\" (%(automation_id)s)."
"in workflow (%(workflow_id)s) in automation \"%(automation_name)s\" "
"(%(automation_id)s)."
msgstr ""

#: src/baserow/contrib/automation/automation_init_application.py:29
Expand All @@ -54,62 +54,71 @@ msgstr ""
msgid "Local Baserow"
msgstr ""

#: src/baserow/contrib/automation/nodes/actions.py:28
#: src/baserow/contrib/automation/nodes/actions.py:32
msgid "Create automation node"
msgstr ""

#: src/baserow/contrib/automation/nodes/actions.py:29
#: src/baserow/contrib/automation/nodes/actions.py:33
#, python-format
msgid "Node (%(node_id)s) created"
msgstr ""

#: src/baserow/contrib/automation/nodes/actions.py:100
#: src/baserow/contrib/automation/nodes/actions.py:104
msgid "Update automation node"
msgstr ""

#: src/baserow/contrib/automation/nodes/actions.py:101
#: src/baserow/contrib/automation/nodes/actions.py:105
#, python-format
msgid "Node (%(node_id)s) updated"
msgstr ""

#: src/baserow/contrib/automation/nodes/actions.py:169
#: src/baserow/contrib/automation/nodes/actions.py:173
msgid "Delete automation node"
msgstr ""

#: src/baserow/contrib/automation/nodes/actions.py:170
#: src/baserow/contrib/automation/nodes/actions.py:174
#, python-format
msgid "Node (%(node_id)s) deleted"
msgstr ""

#: src/baserow/contrib/automation/nodes/actions.py:227
#: src/baserow/contrib/automation/nodes/actions.py:231
msgid "Order nodes"
msgstr ""

#: src/baserow/contrib/automation/nodes/actions.py:228
#: src/baserow/contrib/automation/nodes/actions.py:232
msgid "Node order changed"
msgstr ""

#: src/baserow/contrib/automation/nodes/actions.py:296
#: src/baserow/contrib/automation/nodes/actions.py:300
msgid "Duplicate automation node"
msgstr ""

#: src/baserow/contrib/automation/nodes/actions.py:297
#: src/baserow/contrib/automation/nodes/actions.py:301
#, python-format
msgid "Node (%(node_id)s) duplicated"
msgstr ""

#: src/baserow/contrib/automation/nodes/actions.py:380
#: src/baserow/contrib/automation/nodes/actions.py:384
msgid "Replace automation node"
msgstr ""

#: src/baserow/contrib/automation/nodes/actions.py:382
#: src/baserow/contrib/automation/nodes/actions.py:386
#, python-format
msgid ""
"Node (%(node_id)s) changed from a type of %(original_node_type)s to "
"%(node_type)s"
msgstr ""

#: src/baserow/contrib/automation/nodes/node_types.py:195
#: src/baserow/contrib/automation/nodes/actions.py:491
msgid "Moved automation node"
msgstr ""

#: src/baserow/contrib/automation/nodes/actions.py:492
#, python-format
msgid "Node (%(node_id)s) moved"
msgstr ""

#: src/baserow/contrib/automation/nodes/node_types.py:176
msgid "Branch"
msgstr ""

Expand Down Expand Up @@ -204,18 +213,18 @@ msgstr ""
msgid "Widget \"%(widget_title)s\" (%(widget_id)s) deleted"
msgstr ""

#: src/baserow/contrib/integrations/core/service_types.py:1083
#: src/baserow/contrib/integrations/core/service_types.py:1103
msgid "Branch taken"
msgstr ""

#: src/baserow/contrib/integrations/core/service_types.py:1088
#: src/baserow/contrib/integrations/core/service_types.py:1108
msgid "Label"
msgstr ""

#: src/baserow/contrib/integrations/core/service_types.py:1090
#: src/baserow/contrib/integrations/core/service_types.py:1110
msgid "The label of the branch that matched the condition."
msgstr ""

#: src/baserow/contrib/integrations/core/service_types.py:1374
#: src/baserow/contrib/integrations/core/service_types.py:1402
msgid "Triggered at"
msgstr ""
Original file line number Diff line number Diff line change
Expand Up @@ -142,22 +142,17 @@ class AiMessageSerializer(serializers.Serializer):

class AiThinkingSerializer(serializers.Serializer):
type = serializers.CharField(default=AssistantMessageType.AI_THINKING)
code = serializers.CharField(
help_text=(
"Thinking code. If empty, signals end of thinking. This is used to provide recurring "
"messages that have a translation in the frontend (i.e. 'thinking', 'answering', etc.)"
)
)
content = serializers.CharField(
default="",
allow_blank=True,
help_text=(
"A short description of what the AI is thinking about. It can be used to "
"provide a dynamic message that don't have a translation in the frontend."
),
default="The AI is thinking...",
help_text=("The message to show while the AI is thinking"),
)


class AiNavigationSerializer(serializers.Serializer):
type = serializers.CharField(default=AssistantMessageType.AI_NAVIGATION)
location = serializers.DictField(help_text=("The location to navigate to."))


class AiErrorMessageSerializer(serializers.Serializer):
type = serializers.CharField(default=AssistantMessageType.AI_ERROR)
code = serializers.CharField(
Expand Down Expand Up @@ -185,6 +180,7 @@ class HumanMessageSerializer(serializers.Serializer):
AssistantMessageType.HUMAN: HumanMessageSerializer,
AssistantMessageType.AI_MESSAGE: AiMessageSerializer,
AssistantMessageType.AI_THINKING: AiThinkingSerializer,
AssistantMessageType.AI_NAVIGATION: AiNavigationSerializer,
AssistantMessageType.AI_ERROR: AiErrorMessageSerializer,
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,13 @@ def post(self, request: Request, chat_uuid: str, data) -> StreamingHttpResponse:

handler = AssistantHandler()
chat, _ = handler.get_or_create_chat(request.user, workspace, chat_uuid)

# Clearing the user websocket_id will make sure real-time updates are sent
chat.user.web_socket_id = None
# FIXME: As long as we don't allow users to change it, temporarily set the
# timezone to the one provided in the UI context
chat.user.profile.timezone = ui_context.timezone

assistant = handler.get_assistant(chat)
human_message = HumanMessage(content=data["content"], ui_context=ui_context)

Expand Down
Loading
Loading