【问题标题】:Update File Version with Autodesk API使用 Autodesk API 更新文件版本
【发布时间】:2018-03-29 08:45:35
【问题描述】:

我现在可以upload a file 并创建initial version for the file,但无法更新版本。即使将versions:autodesk.core:File 替换为versions:autodesk.bim360:File 后,使用Step 6 of this tutorial 中的代码也不起作用。从错误消息Request contains 0 includes instead of 1 来看,我似乎需要步骤 5 中示例中的 included 块的一部分,但我不确定它应该是什么样子;鉴于外部 relationships 块在第 5 步和第 6 步之间的格式不匹配,我假设内部内容也会有所不同。

def create_version_for_file(self, project_name, file_name, folder_id, object_id, storage_id):
    project_id = self.get_project_id_by_name(project_name)
    existing_object_id = self.get_version_id_for_file_in_folder(project_name, folder_id, file_name)
    url = '{}data/v1/projects/{}/items'.format(self.DOMAIN, project_id)
    logger.info('Starting version create at %s for file_name %s, folder %s, object %s',
                url, file_name, folder_id, object_id)
    if existing_object_id:
        logger.info('Creating version for existing object')
        data = self._get_version_data_for_existing_file(file_name, object_id, storage_id)
    else:
        logger.info('Creating version for new object')
        data = self._get_version_json_for_new_file(file_name, folder_id, object_id)
    response = self.session.post(url, json=data, headers={
        'content-type': 'application/vnd.api+json',
        'accept': 'application/vnd.api+json'
    })
    if response.status_code != status.HTTP_201_CREATED:
        logger.warn('Version create for %s failed with status %s: %s', file_name, response.status_code,
                    response.content)
        return None
    return json.loads(response.content)

def _get_version_json_for_new_file(self, file_name, folder_id, object_id):
    return {
        "jsonapi": {"version": "1.0"},
        "data": {
            "type": "items",
            "attributes": {
                "displayName": file_name,
                "extension": {
                    "type": "items:autodesk.bim360:File",
                    "version": "1.0"
                }
            },
            "relationships": {
                "tip": {
                    "data": {
                        "type": "versions",
                        "id": "1"
                    }
                },
                "parent": {
                    "data": {
                        "type": "folders",
                        "id": folder_id
                    }
                }
            }
        },
        "included": [
            {
                "type": "versions",
                "id": "1",
                "attributes": {
                    "name": file_name,
                    "extension": {
                        "type": "versions:autodesk.bim360:File",
                        "version": "1.0"
                    }
                },
                "relationships": {
                    "storage": {
                        "data": {
                            "type": "objects",
                            "id": object_id
                        }
                    }
                }
            }
        ]
    }

def _get_version_data_for_existing_file(self, file_name, object_id, storage_id):
    return {
        "jsonapi": {
            "version": "1.0"
        },
        "data": {
            "type": "versions",
            "attributes": {
                "name": file_name,
                "extension": {
                    "type": "versions:autodesk.bim360:File",
                    "version": "1.0"
                }
            },
            "relationships": {
                "item": {
                    "data": {
                        "type": "items",
                        "id": object_id
                    }
                },
                "storage": {
                    "data": {
                        "type": "objects",
                        "id": storage_id
                    }
                }
            }
        }
    }

【问题讨论】:

    标签: python autodesk-forge


    【解决方案1】:

    您的有效载荷是正确的。要创建第二个版本,您必须将您的请求发送到CreateVersion endpoint

        url = '{}data/v1/projects/{}/versions'.format(self.DOMAIN, project_id)
    

    【讨论】:

      【解决方案2】:

      您更新版本的数据对我来说似乎不正确,请尝试以下步骤。

      • 在文件 V1 所在的同一文件夹中创建新的存储位置
      • 将文件的 v2 上传到在以下步骤中创建的新存储位置。
      • 从你V1上传成功的manifest结果中获取资源的item ID或者调用如下endpoint获取IDhttps://developer.autodesk.com/en/docs/data/v2/reference/http/projects-project_id-folders-folder_id-contents-GET
      • 获得所有这些信息后,您要传递的数据将如下所示。

        {
        "jsonapi": { "version": "1.0" },
        "data": {
          "type": "versions",
          "attributes": {
             "name": "v2File.rvt",
             "extension": { "type": "versions:autodesk.bim360:File", "version": "1.0"}
          },
          "relationships": {
             "item": { "data": { "type": "items", "id": "urn:adsk.wipprod:dm.lineage:8jehs1iSQGu_wXpZ977bjA" } },
             "storage": { "data": { "type": "objects", "id": "urn:adsk.objects:os.object:wip.dm.prod/a7fde689-62cf-49c1-9273-8df976568996.rvt" } }
          }
         }
        }
        

      我能想到的唯一区别是您的 objectId 不正确。下图是使用 API 上传的两个版本的证明。

      【讨论】:

      • 我想我当时很困惑。键是否修改名称以在其前面包含v2 以指示版本?我一直在传递相同的文件名attributes.name) 每次假设版本控制将通过其他一些键发生。
      【解决方案3】:

      您一定是遗漏了一些使其无法正常工作的细节,但是由于您提供的描述如此之少,没有人可以据此判断...为了创建新版本,您首先需要创建一个新的存储位置,将文件上传到该位置,并发布一个新版本,引用现有的项目 ID。

      如果项目存在,也可以查看我的那个节点 js 示例到upload a file and create a new item or version

      【讨论】:

      • 添加了代码。我不认为我遗漏了一个小细节:我直接从示例中复制代码以创建第一个版本并添加其他版本示例,而第二个示例的 JSON 似乎遗漏了一些东西。
      猜你喜欢
      • 2018-03-24
      • 2018-05-27
      • 1970-01-01
      • 2011-10-22
      • 1970-01-01
      • 2021-12-16
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多