提供一组视图,允许将内容导入和导出到Plone站点。
项目描述
prdg.ploneio
概述
提供一组视图,允许将内容导入和导出到Plone站点。
导出视图的命名遵循模式 @@${format}-to-${output},其中
- ${format} 可以是以下之一
dicts:包含一系列字典的pickle文件。
html:以目录结构呈现的HTML文件,类似于站点的文件夹结构。
- ${output} 可以是以下之一
archive:可下载的 .tar.gz 文件。
directory:服务器中的目录。在这种情况下,必须在请求中传递 directory 参数,包含到目录的路径。
导出视图是上下文感知的,即导出上下文和子文件夹中的内容。
提供了一个导入视图:@@dicts-from-directory。必须在请求中传递 directory 参数,包含一个包含名为 dicts.pickle 的文件的目录的路径。
导入和导出返回的字典的格式在 prdg.plone.util.structure.create_dict_from_obj 中指定。
导入视图始终导入到门户的根目录,使用字典的 _path 键来确定每个对象的放置位置。此键必须包含一个表示对象路径的元组,相对于门户根目录。此包导出的字典始终包含此键。
示例
示例的某些设置代码
>>> import pickle, os >>> from os.path import join >>> portal = self.portal >>> browser = self.browser >>> folder = self.folder >>> catalog = self.catalog >>> tmpdir = self.tmpdir
我们有一个空文件夹,让我们添加一些对象
>>> len(folder.objectIds()) 0 >>> id = folder.invokeFactory( ... id='obj1', type_name='Document', title='Doc 1', text='blah' ... ) >>> id = folder.invokeFactory( ... id='folder2', type_name='Folder', title='Folder 2' ... ) >>> folder2 = folder[id] >>> id = folder2.invokeFactory( ... id='obj2', type_name='Document', title='Doc 2', text='blah 2' ... )
导出到包含字典的pickle文件
让我们将文件夹导出为包含字典的pickle文件。我们通过访问视图来完成此操作
>>> view = folder.unrestrictedTraverse('@@dicts-to-archive') >>> view.context <ATFolder at ... >>> tar_gz_str = view() >>> pickle_str = self.extract_to_str(tar_gz_str, 'dicts.pickle') >>> dicts = pickle.loads(pickle_str) >>> dicts [{...}, ...]
让我们检查文件夹中的所有对象是否都已导出
>>> brains = catalog(path='/'.join(folder.getPhysicalPath())) >>> len(dicts) == len(brains) True
让我们检查返回的字典是否与文件夹中的对象匹配
>>> objs = [b.getObject() for b in brains] >>> set(d['id'] for d in dicts) == set(o.getId() for o in objs) True >>> set(d['title'] for d in dicts) == set(o.Title() for o in objs) True >>> set(d.get('text') for d in dicts if d.has_key('text')) \ ... == set(o.getText() for o in objs if hasattr(o, 'getText')) True
我们可以将文件夹导出到服务器上的目录,而不是下载.tar.gz文件
>>> view = folder.unrestrictedTraverse('@@dicts-to-directory') >>> view.context <ATFolder at ... >>> view.request['directory'] = tmpdir >>> view() 'Success.' >>> pickle_path = join(tmpdir, 'dicts.pickle') >>> pickle_file = open(pickle_path) >>> dicts = pickle.load(pickle_file) >>> dicts [{...}, ...]
导出到其他格式
HTML到存档
>>> view = folder.unrestrictedTraverse('@@html-to-archive') >>> tar_gz_str = view() >>> len(tar_gz_str) > 0 True
HTML到目录
>>> old_tmpdir_len = len(os.listdir(tmpdir)) >>> view = folder.unrestrictedTraverse('@@html-to-directory') >>> view.request['directory'] = tmpdir >>> view() 'Success.' >>> len(os.listdir(tmpdir)) > old_tmpdir_len True
导入
记住,在之前的示例中我们创建了一个pickle文件
>>> import_dir = tmpdir >>> 'dicts.pickle' in os.listdir(import_dir) True
让我们清空我们的文件夹。稍后我们将使用导入视图重新创建对象
>>> old_folder_len = len(catalog(path='/'.join(folder.getPhysicalPath()))) >>> old_folder_len > 0 True >>> folder.manage_delObjects(ids=folder.objectIds()) >>> len(folder.objectIds()) 0
现在我们将导入pickle文件
>>> view = portal.unrestrictedTraverse('@@dicts-from-directory') >>> view.request['directory'] = import_dir >>> view() 'Success.'
让我们验证
>>> brains = catalog(path='/'.join(folder.getPhysicalPath())) >>> len(brains) == len(dicts) True >>> len(brains) == old_folder_len True >>> objs = [b.getObject() for b in brains] >>> set(d['id'] for d in dicts) == set(o.getId() for o in objs) True >>> set(d['title'] for d in dicts) == set(o.Title() for o in objs) True
鸣谢
由Paradigma Internet开发(http://www.paradigma.com.br)。
变更日志
0.0.2 (20ago2009)
大规模重构。
项目详情
prdg.ploneio-0.0.2.zip的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 141a9bb8c5a29f4e7981a922c5712713ae1d87417140a80c1b6a981193edbdbe |
|
MD5 | 207aabd6b412f5d32b615e03bca3353e |
|
BLAKE2b-256 | 41e2a56b925b12cd773cd0efafd550848d0422b2cd54a3542c91b125e20ac72e |