一个用于 Python 的 CMIS API 库,第 2 部分: 使用 Python 和 cmislib 构建真正的 ECM 工具
2010-05-05 00:00:00 来源:WEB开发网步骤 5:带有元数据的文档创建
在这个步骤中,您需要使用一列属性在目标存储库中创建一个文档,这些属性必须设置,以便 CMIS 存储库确切知道要创建什么。例如,在 CMIS 中,当您将一个新文档 POST(在逻辑上表示创建)到一个文件夹时,正是对象上的属性列表告知 CMIS 要实例化什么。您的意思是要创建 cmis:document 的一个实例呢还是想要名为 CmisJpg 的文档的一个子类呢?这个信息正是通过属性列表来进行通信的。
我原以为在这样一个工具中,元数据将是使事情变得复杂(需要更多代码)的地方。但是我惊喜地发现,只需很少的代码就可以实现这种类型的映射。我要向 Jeff Potts(cmislib 的作者)脱帽致敬,是他使这一切如此轻松!
对于将在目标文件夹中创建的每个文档,将调用 createCMISDoc(),即 清单 6 中的外层方法。作为最后一个参数传入的 propBag 是从 getExifTagsForFile 方法获取的 Exif 标记列表。您对 createPropertyBag() 执行一个调用,以便设置 cmis:objectTypeId 属性(这指定要创建的对象的类型)并将所有标记处理到类型适当的对象中,这些对象将匹配那个特定属性的目标存储库的定义。最后,目标文件夹对象中的实际文档创建只需一行代码:newDoc = folder.createDocument(…)。
清单 6. createCMISDoc 方法
def createCMISDoc(folder, targetClass, docLocalPath, docName, propBag):
"""
Create document in CMIS repository in the folder specified.
Create the document of type targetClass
Take stream for this document from docLocalPath
Set the name of the document to be docName
Set the properties on the object using the propBag
"""
def createPropertyBag(sourceProps, targetClassObj):
"""
Take the exif tags and return a props collection to submit
on the doc create method
"""
# set the class object id first.
propsForCreate = {'cmis:objectTypeId':targetClassObj.id}
for sourceProp in sourceProps:
# First see if there is a matching property by display name
if (sourceProp in targetClassObj.propsKeyedByDisplayName):
# there’s a matching property in the repo's class type !
print "Found matching metadata: " + sourceProp
# now make the data fit
addPropertyOfTheCorrectTypeToPropbag(propsForCreate,
targetClassObj.propsKeyedByDisplayName[sourceProp],
sourceProps[sourceProp] )
return propsForCreate
props = createPropertyBag(propBag, targetClass)
f = open(docLocalPath, 'rb')
newDoc = folder.createDocument(docName, props, contentFile=f)
print "Cmislib create returned id=" + newDoc.id
f.close()
更多精彩
赞助商链接