diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 02c54a197d..2227f4d991 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -188,6 +188,7 @@ jobs: dockerfiles: ${{ steps.filter.outputs.dockerfiles }} mjml: ${{ steps.filter.outputs.mjml }} zapier: ${{ steps.filter.outputs.zapier }} + helm: ${{ steps.filter.outputs.helm }} steps: - name: Checkout code uses: actions/checkout@v4 @@ -216,7 +217,10 @@ jobs: zapier: - 'integrations/zapier/**' - '.github/workflows/ci.yml' - + helm: + - 'deploy/helm/**' + - '.github/workflows/ci.yml' + - '.github/workflows/trigger-helm-chart-upload.yml' backend-lint: name: Backend Lint runs-on: ubuntu-latest @@ -326,6 +330,44 @@ jobs: path: reports/hadolint.json retention-days: 7 + helm-chart-lint: + name: Helm Chart Lint + runs-on: ubuntu-latest + needs: + - detect-changes + permissions: + contents: read + steps: + - name: Exit early if helm not changed and not develop/master + run: | + if [[ "${{ needs.detect-changes.outputs.helm }}" != "true" && \ + "${{ github.ref_name }}" != "develop" && \ + "${{ github.ref_name }}" != "master" ]]; then + echo "No backend changes detected — skipping backend lint." + exit 0 + fi + + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Helm + uses: azure/setup-helm@v4 + + - name: Lint Helm Chart + run: | + cd deploy/helm + rm -f baserow/Chart.lock + + # Add Helm repositories + helm repo add bitnami https://charts.bitnami.com/bitnami + helm repo add caddy https://caddyserver.github.io/ingress + + # Build dependencies + helm dependency build baserow + + # Lint the chart with strict mode + helm lint baserow --strict + # ========================================================================== # TEST STAGE - Run backend and frontend tests # ========================================================================== @@ -552,7 +594,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: '18' + node-version: "18" - name: Run Zapier tests run: | @@ -585,7 +627,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: '18' + node-version: "18" - name: Compile MJML templates run: | @@ -667,9 +709,9 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: '18' - cache: 'yarn' - cache-dependency-path: 'e2e-tests/yarn.lock' + node-version: "18" + cache: "yarn" + cache-dependency-path: "e2e-tests/yarn.lock" - name: Log in to GitHub Container Registry uses: docker/login-action@v3 @@ -790,7 +832,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: '18' + node-version: "18" - name: Download all E2E test results uses: actions/download-artifact@v4 @@ -832,7 +874,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v5 with: - python-version: '3.11' + python-version: "3.11" - name: Install coverage tool run: pip install coverage diff --git a/.github/workflows/trigger-helm-chart-upload.yml b/.github/workflows/trigger-helm-chart-upload.yml index 81d957dded..1c0a3d9ca7 100644 --- a/.github/workflows/trigger-helm-chart-upload.yml +++ b/.github/workflows/trigger-helm-chart-upload.yml @@ -28,9 +28,6 @@ jobs: # Build dependencies helm dependency build baserow - # Lint the chart with strict mode - helm lint baserow --strict - # Package the chart helm package baserow diff --git a/backend/src/baserow/contrib/automation/nodes/node_types.py b/backend/src/baserow/contrib/automation/nodes/node_types.py index 9dc510a522..2e85587926 100644 --- a/backend/src/baserow/contrib/automation/nodes/node_types.py +++ b/backend/src/baserow/contrib/automation/nodes/node_types.py @@ -1,4 +1,4 @@ -from typing import Any, Dict, List, Optional +from typing import Any, Callable, Dict, List, Optional from django.contrib.auth.models import AbstractUser from django.db import router @@ -341,14 +341,14 @@ def before_move( def on_event( self, services: QuerySet[Service], - event_payload: Optional[List[Dict]] = None, + event_payload: List[Dict] | None | Callable = None, user: Optional[AbstractUser] = None, ): from baserow.contrib.automation.workflows.handler import ( AutomationWorkflowHandler, ) - triggers = ( + triggers = list( self.model_class.objects.filter( service__in=services, ) @@ -363,6 +363,9 @@ def on_event( .select_related("workflow__automation__workspace") ) + if triggers and callable(event_payload): + event_payload = event_payload() + for trigger in triggers: workflow = trigger.workflow diff --git a/backend/src/baserow/contrib/builder/elements/registries.py b/backend/src/baserow/contrib/builder/elements/registries.py index 45d1b28ac6..eff2677124 100644 --- a/backend/src/baserow/contrib/builder/elements/registries.py +++ b/backend/src/baserow/contrib/builder/elements/registries.py @@ -392,6 +392,24 @@ def get_pytest_params(self, pytest_data_fixture) -> Dict[str, Any]: create related objects when the import / export functionality is tested. """ + def formula_generator( + self, element: Element + ) -> Generator[str | Instance, str, None]: + """ + Generator that returns formula fields for the LinkElementType. + + Unlike other Element types, this one has its formula fields in the + page_parameters and query_prameters JSON fields. + """ + + yield from super().formula_generator(element) + + # Deal with visibility_condition + new_formula = yield element.visibility_condition + if new_formula is not None: + element.visibility_condition = new_formula + yield element + ElementTypeSubClass = TypeVar("ElementTypeSubClass", bound=ElementType) diff --git a/backend/src/baserow/contrib/integrations/local_baserow/service_types.py b/backend/src/baserow/contrib/integrations/local_baserow/service_types.py index b28c11bd15..1c5d258af8 100644 --- a/backend/src/baserow/contrib/integrations/local_baserow/service_types.py +++ b/backend/src/baserow/contrib/integrations/local_baserow/service_types.py @@ -2283,18 +2283,22 @@ def _handle_signal( model: "GeneratedTableModel", **kwargs, ): - serializer = get_row_serializer_class( - model, RowSerializer, is_response=True, user_field_names=True - ) + def get_data(): + # Make sure we have an up to date model + local_model = model.baserow_table.get_model() - data_to_process = { - "results": serializer(rows, many=True).data, - "has_next_page": False, - } + serializer = get_row_serializer_class( + local_model, RowSerializer, is_response=True, user_field_names=True + ) + + return { + "results": serializer(rows, many=True).data, + "has_next_page": False, + } self._process_event( self.model_class.objects.filter(table=table), - data_to_process, + get_data, user=user, ) diff --git a/changelog/entries/unreleased/bug/4280_dont_show_the_assistant_panel_if_the_llm_model_env_variable_.json b/changelog/entries/unreleased/bug/4280_dont_show_the_assistant_panel_if_the_llm_model_env_variable_.json new file mode 100644 index 0000000000..34ecedc56c --- /dev/null +++ b/changelog/entries/unreleased/bug/4280_dont_show_the_assistant_panel_if_the_llm_model_env_variable_.json @@ -0,0 +1,9 @@ +{ + "type": "bug", + "message": "Don't show the Assistant panel if the LLM_MODEL env variable is not configured", + "issue_origin": "github", + "issue_number": 4280, + "domain": "core", + "bullet_points": [], + "created_at": "2025-11-18" +} diff --git a/changelog/entries/unreleased/bug/fix_visibility_condition_not_working_if_data_property_wasnt_.json b/changelog/entries/unreleased/bug/fix_visibility_condition_not_working_if_data_property_wasnt_.json new file mode 100644 index 0000000000..837df41875 --- /dev/null +++ b/changelog/entries/unreleased/bug/fix_visibility_condition_not_working_if_data_property_wasnt_.json @@ -0,0 +1,9 @@ +{ + "type": "bug", + "message": "Fix visibility condition not working if data property wasn't used in page", + "issue_origin": "github", + "issue_number": null, + "domain": "builder", + "bullet_points": [], + "created_at": "2025-11-18" +} \ No newline at end of file diff --git a/changelog/entries/unreleased/bug/save_data_preparation_for_table_that_dont_have_trigger_assoc.json b/changelog/entries/unreleased/bug/save_data_preparation_for_table_that_dont_have_trigger_assoc.json new file mode 100644 index 0000000000..402e1e9571 --- /dev/null +++ b/changelog/entries/unreleased/bug/save_data_preparation_for_table_that_dont_have_trigger_assoc.json @@ -0,0 +1,9 @@ +{ + "type": "bug", + "message": "Save data preparation for table that don't have trigger associated to it", + "issue_origin": "github", + "issue_number": null, + "domain": "automation", + "bullet_points": [], + "created_at": "2025-11-18" +} \ No newline at end of file diff --git a/deploy/helm/baserow/templates/backend-configmap.yaml b/deploy/helm/baserow/templates/backend-configmap.yaml index 473d31ca92..f2ef24c1c7 100644 --- a/deploy/helm/baserow/templates/backend-configmap.yaml +++ b/deploy/helm/baserow/templates/backend-configmap.yaml @@ -19,8 +19,8 @@ data: AWS_S3_CUSTOM_DOMAIN: {{ .Values.global.baserow.objectsDomain }}/{{ (index .Values.minio.provisioning.buckets 0).name }} AWS_S3_REGION_NAME: "us-east-1" {{- end }} -{{- if .Values.global.baserow.assistantLLMModel -}} - BASEROW_ENTERPRISE_ASSISTANT_LLM_MODEL: "{{ .Values.baserow.assistantLLMModel }}" +{{- if .Values.global.baserow.assistantLLMModel }} + BASEROW_ENTERPRISE_ASSISTANT_LLM_MODEL: "{{ .Values.global.baserow.assistantLLMModel }}" {{- end }} {{- if (index .Values "baserow-embeddings").enabled }} BASEROW_EMBEDDINGS_API_URL: http://{{ include "baserow.fullname" (index .Subcharts "baserow-embeddings") }} diff --git a/enterprise/web-frontend/modules/baserow_enterprise/components/assistant/AssistantSidebarItem.vue b/enterprise/web-frontend/modules/baserow_enterprise/components/assistant/AssistantSidebarItem.vue index eacef2afa0..7d7ba1e325 100644 --- a/enterprise/web-frontend/modules/baserow_enterprise/components/assistant/AssistantSidebarItem.vue +++ b/enterprise/web-frontend/modules/baserow_enterprise/components/assistant/AssistantSidebarItem.vue @@ -1,5 +1,5 @@