{"record":{"id":"0e9c4676dcdabbbc","repo":"apache/superset","slug":"cannot-convert-node-type-node-type","errorCode":null,"errorMessage":"Cannot convert node type: ${node.type}","messagePattern":"Cannot convert node type: (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"superset-frontend/plugins/plugin-chart-echarts/src/utils/safeEChartOptionsParser.ts","lineNumber":359,"sourceCode":"        objResult[key] = value;\n      });\n      return objResult;\n    }\n\n    case 'ArrayExpression': {\n      const arrNode = node as Node & { elements: (Node | null)[] };\n      return arrNode.elements.map(elem => (elem ? astToValue(elem) : null));\n    }\n\n    case 'TemplateLiteral': {\n      const templateNode = node as Node & {\n        quasis: Array<Node & { value: { cooked: string } }>;\n      };\n      return templateNode.quasis.map(q => q.value.cooked).join('');\n    }\n\n    default:\n      throw new Error(`Cannot convert node type: ${node.type}`);\n  }\n}\n\n// =============================================================================\n// Parse Result Types\n// =============================================================================\n\ninterface ParseResult {\n  success: boolean;\n  data?: CustomEChartOptions;\n}\n\n// =============================================================================\n// Public API\n// =============================================================================\n\n/**\n * Safely parses a JavaScript object literal string into an ECharts options object.","sourceCodeStart":341,"sourceCodeEnd":377,"githubUrl":"https://github.com/apache/superset/blob/f4587218dd19d046c3e4d00063e7d27f8a2ed354/superset-frontend/plugins/plugin-chart-echarts/src/utils/safeEChartOptionsParser.ts#L341-L377","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Have the schedule owner (or an Admin) execute it, or grant the user edit permission on the schedule.","Assign a role with can_update on ReportSchedule (e.g. via Settings > List Roles > ReportSchedule permissions).","Transfer ownership of the schedule to the requesting user."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"from superset import security_manager\ntry:\n    security_manager.raise_for_editorship(schedule)\n    allowed = True\nexcept SupersetSecurityException:\n    allowed = False","typeGuard":null,"tryCatchPattern":"try:\n    ExecuteNowCommand(g.user, schedule_id).run()\nexcept ReportScheduleForbiddenError:\n    request_owner_or_admin_to_execute(schedule_id)","preventionTips":["Grant can_update on ReportSchedule to roles expected to trigger reports.","Check edit rights in the UI before showing the Execute now button.","For service accounts, include report-schedule edit permissions explicitly."],"tags":["reports","rbac","permissions","security"],"backgroundTag":null,"analyzedSha":"f4587218dd19d046c3e4d00063e7d27f8a2ed354","analyzedAt":"2026-08-14T22:39:27.425Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}