はじめに
Pro ライセンスを持たないユーザーがワークスペースの共同作成者以上のロールが付与されていても、引継ぎができない事象を確認しました。
この回避策として複製を API で試してみましたが、諦めた記録(ポエム)です。
結論
REST API を使用して引継ぎを実施してみましたが、結局この API も Pro ライセンスないと NG と気づき、あきらめました。
おそらく引継ぎの API が Power BI の方で動いているから・・・
ロードマップ には、API のサポートや、名前を付けて保存などがあるので、大人しくこのあたりを待ち、現時点では Power Query テンプレートのエクスポートインポート -> 同期先設定という流れで対処しましょう。
ちなみに新しい Dataflow Gen 2 が 先日まで作れていましたが別アイテム Dataflow Gen 2 (CI/CD)となっていたことを推察すると、全く新しい Fabric API で管理されているのでしょう。それによってPro ライセンスでの問題は起きなくなることに期待します。
今回試したことはなにか別のケースの参考になる気もしたのでコードだけ備忘しておきます。
コード実装
Pro ライセンスがないユーザーでの実行は成功しないコードであることに注意
import requests
import pandas as pd
from sempy import fabric
def take_over_dataflow_gen2(dataflow_object_id):
base_url = "https://wabi-japan-east-redirect.analysis.windows.net"
pbi_token = notebookutils.credentials.getToken("pbi")
workspace_id = fabric.get_workspace_id()
# Get workspace metadata
url_get_workspace = f"{base_url}/metadata/relations/folder/{workspace_id}"
headers = {"Authorization": f"Bearer {pbi_token}"}
workspace_response = requests.get(url_get_workspace, headers=headers)
if workspace_response.status_code != 200:
raise Exception(f"Failed to fetch workspace metadata: {workspace_response.status_code}")
workspace_data = workspace_response.json()
# アイテムには url で見られる objectid とは別に id が降られています
df_target_item = pd.json_normalize(workspace_data['artifacts']).query(f"objectId == '{dataflow_object_id}'")
if df_target_item.empty:
raise Exception(f"No dataflow found with objectId {dataflow_object_id}")
dataflow_id = df_target_item['id'].iloc[0]
# Get dataflow metadata
# id を使用してmetadata/gallery の api から取得すると、workspace と紐づいたfolder_id なるものが取れます。
url_get_dataflow_metadata = f"{base_url}/metadata/gallery/dataflows/{dataflow_id}"
dataflow_metadata_response = requests.get(url_get_dataflow_metadata, headers=headers)
if dataflow_metadata_response.status_code != 200:
raise Exception(f"Failed to fetch dataflow metadata: {dataflow_metadata_response.status_code}")
dataflow_metadata = dataflow_metadata_response.json()
folder_id = dataflow_metadata['cdsaModel']['folderId']
# Take over dataflow
# 現時点での dataflow 引継ぎは folder id と object id によって動きます。
url_post_takeover = f"{base_url}/metadata/dataflows/gen2/{dataflow_object_id}/takeover?folderId={folder_id}"
data = {"isallowNativeQueriesChecked": True}
takeover_response = requests.post(url_post_takeover, headers=headers, json=data)
if takeover_response.status_code != 200:
raise Exception(f"""Failed to take over dataflow
status:{takeover_response.status_code},
response: {takeover_response.json()}""")
return takeover_response
実行方法
-
Dataflow Gen 2 の設定に移動して、url から dataflow gen2 のobject id を取得します。
公開されていないデータフローは設定ボタンが押下できないことに注意
-
実行例
python# Example usage dataflow_object_id = '65a6bfa4-8f5f-499e-a70f-f9bacfa6f1fa' response = take_over_dataflow_gen2(dataflow_object_id) print(response.json()) # Print the response from the takeover