Shotgun APIを初めて使う方へ - データ操作編・後編 -

データ操作編・前編では、Shotgun APIを使用してProjectの作成、取得、更新を行う方法をご紹介しました

今回は、Projectに紐づくEntityのデータ操作方法をご紹介します

前回の記事で作成したフォルダやモジュールを使用して進めますので、
まだ前回の記事をご覧になっていない場合は、そちらから先にご覧頂ければ幸いです

* [Shotgun APIを初めて使う方へ - 導入編 -](https://qiita.com/Tetsuya_Nozawa/items/da08c057febf19a2a83b)
* [Shotgun APIを初めて使う方へ - データ操作編・前編 -](https://qiita.com/Tetsuya_Nozawa/items/1a3245d891e0424ca79f)

# Projectに紐づくEntityの特徴

Shotgunにデフォルトで用意されているEntityの中で
AssetやShot、TaskなどのEntityは、<b>Projectと紐づける（リンクする）</b>ことを前提に構成されています

そのため、APIで作成する際は、リンク先のProjectの情報も指定する必要があります
※指定しないで作成しようとするとエラーが出ます

それ以外は、前回の記事でProjectを操作した際の方法とほとんど同じ方法で操作出来ます

# Shotgun APIでAssetを作成する

今回はAssetを作成してみます
※entity_typeを対応するものに変更すれば、ShotやTaskなどの他のEntityも作成出来ます

リンク先のProjectは、前回の記事で作成した<b>SHOTGUN_API_STARTUP</b>とします

## Asset作成用スクリプトを作成する

テキストエディタに下記のコードをコピー＆ペーストし、<b>shotgun_api_startup</b>フォルダの中に
<b>create_asset.py</b>という名前で保存します

```python:create_asset.py
# -*- coding: utf-8 -*-

import sys
from shotgun import create_shotgun_api
from get_project import get_project

# 作成するProjectの名称を指定します
PROJECT_NAME = "SHOTGUN_API_STARTUP"
# 作成するAssetの名称を指定します
ASSET_NAME = "SAMPLE_ASSET"


def create_asset(shotgun_api, project_info):
  # ShotgunにAssetを作成します
  data = {"code": ASSET_NAME,
          "description": u"このAssetは、Shotgun APIの学習用に作成されました",
          "project": {"id": project_info.get("id"),
                      "type": project_info.get("type")}}
  return shotgun_api.create(entity_type="Asset",
                            data=data)


def main():
  shotgun_api = create_shotgun_api()
  project_info = get_project(shotgun_api, PROJECT_NAME)
  print(create_asset(shotgun_api, project_info[0]))
  return 0


if __name__ == "__main__":
  sys.exit(main())
```
### 解説

Shotgun APIを使用するためのオブジェクトの取得やProject情報の取得には、前回の記事（データ操作編・前編）で作成したスクリプトをインポートして使用します

```python
from shotgun import create_shotgun_api
from get_project import get_project
```

Assetの作成に関してもProjectの作成の際に使用した Shotgun APIの<b>create</b> 関数を使用します

* Projectを作成する際と異なる点
    * create関数に指定しているentity_typeが<b>Asset</b>になっている
    * dataに<b>Projectとリンクするために必要な情報</b>を指定している

Projectとリンクするためには、projectフィールドの値として、
対象のProjectのidとtype(entity_type)を指定することでリンクが作成されます

```python
# 作成するProjectの名称を指定します
PROJECT_NAME = "SHOTGUN_API_STARTUP"
# 作成するAssetの名称を指定します
ASSET_NAME = "SAMPLE_ASSET"


def create_asset(shotgun_api, project_info):
  # ShotgunにAssetを作成します
  data = {"code": ASSET_NAME,
          "description": u"このAssetは、Shotgun APIの学習用に作成されました",
          "project": {"id": project_info.get("id"),
                      "type": project_info.get("type")}}
  return shotgun_api.create(entity_type="Asset",
                            data=data)
```

## 動作確認


動作確認をしている様子を動画にしたのでご覧頂ければと思います

<blockquote class="twitter-tweet" data-conversation="none"><p lang="ja" dir="ltr">ShotgunAPIでアセットを作成する方法 <a href="https://t.co/tveYZQYfb9">pic.twitter.com/tveYZQYfb9</a></p>&mdash; Tetsuya Nozawa (@lphing) <a href="https://twitter.com/lphing/status/1222470555565096966?ref_src=twsrc%5Etfw">January 29, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 


### 手順
コマンドプロンプトを開いて、下記のコマンドを入力して実行します
※<b>D:\shotgun_api_startup</b>の部分は、自分の環境に合わせて変更して頂ければと思います

```
cd /d D:\shotgun_api_startup
python create_asset.py
```

実行に成功した場合は、下記のような内容が出力されます

```
D:\shotgun_api_startup>python create_asset.py
{'id': 2292, 'code': 'SAMPLE_ASSET', 'description': 'このAssetはShotgun APIの学習用に作成されました', 'project': {'id': 350, 'name': 'SHOTGUN_API_STARTUP', 'type': 'Project'}, 'type': 'Asset'}
```

ShotgunでAssetテーブルを見てみると、<b>SAMPLE_ASSET</b>という名前のAssetが作成されていることが確認出来るかと思います
<img width="965" alt="2020-01-20_16h40_25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110677/69cdcd6e-276a-03db-3555-f5fd0734eccb.png">


# Shotgun APIでAssetの取得、更新に関して

Shotgun APIでAssetの取得と更新を行う方法に関しては、
前回の記事のProjectの取得と更新を行う際に作成したスクリプト内の
引数等を少し変更するだけで作成出来てしまいます

下記にProjectの取得、更新時に作成したスクリプトをAsset用に変更を加えたものを載せましたので、それぞれテキストエディタにコピー＆ペーストして、<b>shotgun_api_startup</b> フォルダに保存して下さい

## Assetの取得用スクリプトの作成

下記の内容を <b>get_asset.py</b> という名前で保存します

```python:get_asset.py
# -*- coding: utf-8 -*-

import sys
from shotgun import create_shotgun_api

# 取得するAssetの名称を指定します
ASSET_NAME = "SAMPLE_ASSET"


def get_asset(shotgun_api, asset_name):
  # codeがasset_nameの値に合致するものを取得対象に設定します
  filters = [["code", "is", asset_name]]
  # 取得したい情報が入っているフィールドのフィールドコードを指定します
  fields = ["code", "description"]
  # Shotgunからfiltersの条件に合致するAssetの情報を取得します
  return shotgun_api.find(entity_type="Asset",
                          filters=filters,
                          fields=fields)


def main():
  shotgun_api = create_shotgun_api()
  print(get_asset(shotgun_api, ASSET_NAME))
  return 0


if __name__ == "__main__":
  sys.exit(main())

```

* Projectの取得用スクリプトからの主な変更点
    * 取得対象の名称を<b>SAMPLE_ASSET</b>に変更
    * entity_typeを<b>Asset</b>に変更
    * filtersの値を<b>[["code", "is", asset_name]]</b>に変更
        * Assetは名前を入れるためのフィールドが<b>name</b>では無く<b>code</b>になっているため
    * fieldsの値を<b>["code", "description"]</b> に変更
        * ProjectとAssetで対応するフィールドのフィールドコードが異なるため

## Assetの更新用スクリプトの作成

下記の内容を <b>update_asset.py</b> という名前で保存します


```python:update_asset.py
# -*- coding: utf-8 -*-

import sys
import datetime
from shotgun import create_shotgun_api
from get_asset import get_asset

# 更新対象のAssetの名称を指定します
ASSET_NAME = "SAMPLE_ASSET"


def update_asset(shotgun_api, asset_info):
  description = "このデータは、%s に更新されました" % datetime.datetime.now()
  # Shotgunから取得した情報を使ってdescriptionの内容を更新します
  return shotgun_api.update(entity_type=asset_info.get("type"),
                            entity_id=asset_info.get("id"),
                            data={"description": description})


def main():
  shotgun_api = create_shotgun_api()
  # Asset情報取得用スクリプトを使って情報を取得します
  asset_info = get_asset(shotgun_api, ASSET_NAME)
  print(update_asset(shotgun_api=shotgun_api,
                     asset_info=asset_info[0]))
  return 0


if __name__ == "__main__":
  sys.exit(main())

```

* Projectの更新用スクリプトからの主な変更点
    * 更新対象の名称を<b>SAMPLE_ASSET</b>に変更
    * update関数の引数dataの値を<b>{"description": description}</b>に変更
        * Assetの場合は、説明内容を入れるフィールドのフィールドコードがsg_descriptionでは無く<b>description</b>となっているため

## 取得用・更新用スクリプトの動作確認

動作確認の方法は、前回の記事の<b>「作成したProjectの情報を取得する」</b>と
<b>「Projectの情報を更新（変更）する」</b>を参考にして頂ければと思います



# あとがき

今回は、Projectに紐づくEntityの中でAssetのデータ操作方法についてご紹介しました
Asset以外の別のEntityに関しても、今回作成したスクリプト内の<b>entity_type</b>の値を
対応するものに変更することで別のEntityのデータ操作用スクリプトも作成出来るかと思います

ちなみに各Entityのentity_typeを確認する方法に関しては、
確認方法を動画で撮影しましたので見て頂ければと思います

<blockquote class="twitter-tweet" data-conversation="none"><p lang="ja" dir="ltr">エンティティタイプの確認方法 <a href="https://t.co/Sd2R51cvRR">pic.twitter.com/Sd2R51cvRR</a></p>&mdash; Tetsuya Nozawa (@lphing) <a href="https://twitter.com/lphing/status/1222470829109153792?ref_src=twsrc%5Etfw">January 29, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

手順としては
1. Shotgun右上のプルダウンメニューから <b>サイト基本設定</b> を選択します
2. <b>エンティティ</b>のメニューを開きます
3. entity_typeを確認したいEntityを探します
4. 対象Entityの括弧内の文字が<b>entity_type</b>です


下記の画像の赤線を引いてある箇所がentity_typeです
<img width="965" alt="2020-01-20_19h17_50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110677/da69bc83-d499-1e71-59fb-8022f06751c2.png">

このページ内で各Entityの詳細設定や新しいEntityの有効化なども出来るようになっています

次回は、ShotgunとSlackを連携して、Shotgunにデータが追加された際にSlackへ通知が飛ぶような仕組みを構築する方法について紹介したいと思います