Fabric Free user による Dataflow Gen 2 の所有権引継ぎをあきらめた話【続報あり】

## はじめに

Pro ライセンスを持たないユーザーがワークスペースの共同作成者以上のロールが付与されていても、引継ぎができない事象を確認しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/bef29b35-4477-8cab-714d-c73a951a48fc.png)

この回避策として複製を API で試してみましたが、諦めた記録（ポエム）です。

## 続報（2025/02/04追記）

:::note info

[CI/CD と Git 統合をサポートする Dataflow Gen2 (プレビュー)](https://learn.microsoft.com/ja-jp/fabric/data-factory/dataflow-gen2-cicd-and-git-integration) では [所有権の引継ぎ](https://learn.microsoft.com/ja-jp/fabric/fundamentals/item-ownership-take-over)ボタンが利用できるようになって、 Free User でも引継ぎ可能になっていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/ecbdb1a9-3326-67f9-5a6d-662cb34525ca.png)


:::



## 結論


REST API を使用して引継ぎを実施してみましたが、結局この API も Pro ライセンスないと NG と気づき、あきらめました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/1ec95ff7-ed78-3cca-d3de-f8706de16af7.png)

おそらく引継ぎの API が Power BI の方で動いているから・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/665413e2-d499-7093-002b-5e14e83ddd6d.png)

[ロードマップ](https://learn.microsoft.com/ja-jp/fabric/release-plan/data-factory)　には、API のサポートや、名前を付けて保存などがあるので、大人しくこのあたりを待ち、現時点では **Power Query テンプレートのエクスポートインポート -> 同期先設定**という流れで対処しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/47b26043-3231-a92c-3fb0-15c6c7288d35.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/be2360bb-d542-e5d8-3f8c-53e786428b94.png)


ちなみに新しい Dataflow Gen 2 が 先日まで作れていましたが別アイテム Dataflow Gen 2 (CI/CD)となっていたことを推察すると、全く新しい Fabric API で管理されているのでしょう。それによってPro ライセンスでの問題は起きなくなることに期待します。

今回試したことはなにか別のケースの参考になる気もしたのでコードだけ備忘しておきます。

### コード実装

:::note alert

Pro ライセンスがないユーザーでの実行は成功しないコードであることに注意

:::


```python:python
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




```


### 実行方法

1. python ノートブックとして起動します。（spark でもよいです
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/8b558772-8224-de89-85cd-08d35880945c.png)
2. Dataflow Gen 2 の設定に移動して、url から dataflow gen2 のobject id を取得します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/62093eec-43eb-1c74-7d05-7dcfdf07cb3b.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/ef4be452-9ce2-e66b-d3d6-9912112ac98d.png)
    
    :::note warn
    公開されていないデータフローは設定ボタンが押下できないことに注意
    
    
3. 実行例
    ```python: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
    
    ```