apache/superset · error · Error

Cannot convert node type

Error message

Cannot convert node type: ${node.type}

What it means

Raised in ExecuteNowCommand.validate when security_manager.raise_for_editorship(self._model) throws SupersetSecurityException: the current user does not have permission to change/execute this report schedule. Manual execution is gated on editorship, not merely ownership or can_read.

Solutions

  1. Have the schedule owner (or an Admin) execute it, or grant the user edit permission on the schedule.
  2. Assign a role with can_update on ReportSchedule (e.g. via Settings > List Roles > ReportSchedule permissions).
  3. Transfer ownership of the schedule to the requesting user.
Defensive patterns

Strategy: validation

Validate before calling

from superset import security_manager
try:
    security_manager.raise_for_editorship(schedule)
    allowed = True
except SupersetSecurityException:
    allowed = False

Try / catch

try:
    ExecuteNowCommand(g.user, schedule_id).run()
except ReportScheduleForbiddenError:
    request_owner_or_admin_to_execute(schedule_id)

Prevention

When it happens

Trigger: A user without the 'can edit' permission on the report schedule (not creator, not Admin, lacks the relevant RBAC role) calls the Execute now endpoint or UI action. raise_for_editorship enforces owner-or-privileged edit rights before dispatching the Celery task.

Common situations: Shared schedules owned by another user; Gamma/Alpha roles trying to trigger reports they can view but not edit; role changes after the schedule was created; service accounts missing the can_update schedule permission.

Related errors


AI-assisted analysis of apache/superset@f4587218dd (2026-08-14). Data as JSON: /api/errors/0e9c4676dcdabbbc. Report an issue: GitHub.

Appendix: source

Thrown at superset-frontend/plugins/plugin-chart-echarts/src/utils/safeEChartOptionsParser.ts:359

        objResult[key] = value;
      });
      return objResult;
    }

    case 'ArrayExpression': {
      const arrNode = node as Node & { elements: (Node | null)[] };
      return arrNode.elements.map(elem => (elem ? astToValue(elem) : null));
    }

    case 'TemplateLiteral': {
      const templateNode = node as Node & {
        quasis: Array<Node & { value: { cooked: string } }>;
      };
      return templateNode.quasis.map(q => q.value.cooked).join('');
    }

    default:
      throw new Error(`Cannot convert node type: ${node.type}`);
  }
}

// =============================================================================
// Parse Result Types
// =============================================================================

interface ParseResult {
  success: boolean;
  data?: CustomEChartOptions;
}

// =============================================================================
// Public API
// =============================================================================

/**
 * Safely parses a JavaScript object literal string into an ECharts options object.

View on GitHub (pinned to f4587218dd)