Forum Discussion

apenaranda's avatar
apenaranda
Post Partisan
2 years ago

Error embed token panel powerbi

Hi there

I'm trying to embed a power bi panel with python code but I get stuck in the datasetid part

I am using the following code:

 

 

def get_embed_params_for_single_report(self, workspace_id, report_id, additional_dataset_id=None):
        
        report_url = f'https://api.powerbi.com/v1.0/myorg/groups/{workspace_id}/dashboards/{report_id}'       
        api_response = requests.get(report_url, headers=self.get_request_header())
        
        if api_response.status_code != 200:
            abort(api_response.status_code, description=f'Error while retrieving Embed URL\n{api_response.reason}:\t{api_response.text}\nRequestId:\t{api_response.headers.get("RequestId")}')

        api_response = json.loads(api_response.text)
        print(api_response)
        report = ReportConfig(api_response['id'], api_response['displayName'], api_response['embedUrl'])

        dataset_ids = [api_response['datasetId']]
        #dataset_ids = app.config['DATASET_DASHBOARD']
        
        # Append additional dataset to the list to achieve dynamic binding later
        if additional_dataset_id is not None:
            dataset_ids.append(additional_dataset_id)

        embed_token = self.get_embed_token_for_single_report_single_workspace(report_id, dataset_ids, workspace_id)
        embed_config = EmbedConfig(embed_token.tokenId, embed_token.token, embed_token.tokenExpiry, [report.__dict__])
        return json.dumps(embed_config.__dict__)

 

 

If I make a print of api_response = json.loads(api_response.text)

I see that the datasetid does not appear, which for a report does appear with

 

report_url = f'https://api.powerbi.com/v1.0/myorg/groups/{workspace_id}/reports/{report_id}'

 

The problem is that the line

embed_token = self.get_embed_token_for_single_report_single_workspace(report_id, dataset_ids, workspace_id)

I get an error because it can't find datasetid

Do you know how to proceed?

2 Replies

  • Anonymous's avatar
    Anonymous
    Not applicable

    HI apenaranda,

    The error message mentions the issue is related to the dataset id. Can you please share some more detail about detail operation steps? They can help us clarify your scenario and test to troubleshoot.

    How to Get Your Question Answered Quickly  

    Regards,

    Xiaoxin Sheng

    • apenaranda's avatar
      apenaranda
      Post Partisan

      well, I'll explain what I do when I want to embed a report

      everything starts in app.py with the def get_embed_info (Returns report embed configuration) which calls

       

      embed_info = PbiEmbedService().get_embed_params_for_single_report(app.config['WORKSPACE_ID'], app.config['REPORT_ID'])

      This function will:

       

      class PbiEmbedService:
      
          def get_embed_params_for_single_report(self, workspace_id, report_id, additional_dataset_id=None):
              report_url = f'https://api.powerbi.com/v1.0/myorg/groups/{workspace_id}/reports/{report_id}'     
              api_response = requests.get(report_url, headers=self.get_request_header())
              
              if api_response.status_code != 200:
                  abort(api_response.status_code, description=f'Error while retrieving Embed URL\n{api_response.reason}:\t{api_response.text}\nRequestId:\t{api_response.headers.get("RequestId")}')
      
              api_response = json.loads(api_response.text)
              print(api_response)
              report = ReportConfig(api_response['id'], api_response['displayName'], api_response['embedUrl'])
      
              dataset_ids = [api_response['datasetId']]
              #dataset_ids = app.config['DATASET_DASHBOARD']
              
              # Append additional dataset to the list to achieve dynamic binding later
              if additional_dataset_id is not None:
                  dataset_ids.append(additional_dataset_id)
      
              embed_token = self.get_embed_token_for_single_report_single_workspace(report_id, dataset_ids, workspace_id)
              embed_config = EmbedConfig(embed_token.tokenId, embed_token.token, embed_token.tokenExpiry, [report.__dict__])
              return json.dumps(embed_config.__dict__)

       

      get_request_header will generate token:

       

      def get_request_header(self):
              return {'Content-Type': 'application/json', 'Authorization': 'Bearer ' + AadService.get_access_token()}

      and get_embed_token_for_single_report_single_workspace goes to:

       

      def get_embed_token_for_single_report_single_workspace(self, report_id, dataset_ids, target_workspace_id=None):
              '''Get Embed token for single report, multiple datasets, and an optional target workspace
      
              Args:
                  report_id (str): Report Id
                  dataset_ids (list): Dataset Ids
                  target_workspace_id (str, optional): Workspace Id. Defaults to None.
      
              Returns:
                  EmbedToken: Embed token
              '''
      
              request_body = EmbedTokenRequestBody()
      
              for dataset_id in dataset_ids:
                  request_body.datasets.append({'id': dataset_id})
      
              request_body.reports.append({'id': report_id})
      
              if target_workspace_id is not None:
                  request_body.targetWorkspaces.append({'id': target_workspace_id})
      
              # Generate Embed token for multiple workspaces, datasets, and reports. Refer https://aka.ms/MultiResourceEmbedToken
              embed_token_api = 'https://api.powerbi.com/v1.0/myorg/GenerateToken'
              api_response = requests.post(embed_token_api, data=json.dumps(request_body.__dict__), headers=self.get_request_header())
      
              if api_response.status_code != 200:
                  abort(api_response.status_code, description=f'Error while retrieving Embed token\n{api_response.reason}:\t{api_response.text}\nRequestId:\t{api_response.headers.get("RequestId")}')
      
              api_response = json.loads(api_response.text)
              embed_token = EmbedToken(api_response['tokenId'], api_response['token'], api_response['expiration'])
              return embed_token

       

      Afterwards, the embedding is generated through index.js:

       

      $(function () {
          var reportContainer = $("#report-container").get(0);
      
          // Initialize iframe for embedding report
          powerbi.bootstrap(reportContainer, { type: "report" });
      
          var models = window["powerbi-client"].models;
          var reportLoadConfig = {
              type: "report",
              pageView: 'fitToWidth',
              tokenType: models.TokenType.Embed,
      
              // Enable this setting to remove gray shoulders from embedded report
              // settings: {
              //     background: models.BackgroundType.Transparent
              // }
          };
      
      
          $.ajax({
              type: "GET",
              url: "/getembedinfo",
              dataType: "json",
              success: function (data) {
                  embedData = $.parseJSON(JSON.stringify(data));
                  console.log(embedData);
                  reportLoadConfig.accessToken = embedData.accessToken;
      
                  // You can embed different reports as per your need
                  reportLoadConfig.embedUrl = embedData.reportConfig[0].embedUrl;
                  console.log(reportLoadConfig.embedUrl);
                  // Use the token expiry to regenerate Embed token for seamless end user experience
                  // Refer https://aka.ms/RefreshEmbedToken
                  tokenExpiry = embedData.tokenExpiry;
      
                  // Embed Power BI report when Access token and Embed URL are available
                  var report = powerbi.embed(reportContainer, reportLoadConfig);
      
                  // Triggers when a report schema is successfully loaded
                  report.on("loaded", function () {
                      console.log("Report load successful")
                  });
      
                  // Triggers when a report is successfully embedded in UI
                  report.on("rendered", function () {
                      console.log("Report render successful")
                  });
      
                  // Clear any other error handler event
                  report.off("error");
      
                  // Below patch of code is for handling errors that occur during embedding
                  report.on("error", function (event) {
                      var errorMsg = event.detail;
      
                      // Use errorMsg variable to log error in any destination of choice
                      console.error(errorMsg);
                      return;
                  });
              },
              error: function (err) {
      
                  // Show error container
                  var errorContainer = $(".error-container");
                  $(".embed-container").hide();
                  errorContainer.show();
      
                  // Format error message
                  var errMessageHtml = "<strong> Error Details: </strong> <br/>" + $.parseJSON(err.responseText)["errorMsg"];
                  errMessageHtml = errMessageHtml.split("\n").join("<br/>")
      
                  // Show error message on UI
                  errorContainer.html(errMessageHtml);
              }
          });
      });

       

      This process works perfectly embedding reports, the problem comes when embedding the panel. The only thing I substitute (I don't know if it's correct) is the line

       

      report_url = f'https://api.powerbi.com/v1.0/myorg/groups/{workspace_id}/reports/{report_id}'

       

      by

       

      report_url = f'https://api.powerbi.com/v1.0/myorg/groups/{workspace_id}/dashboards/{report_id}'

       

      and also in index.js that changed report for dashboard

      If I run I get the error:

       

      Error Details:
      'datasetId'

       

      This would be the entire process.