跳转到主要内容

提供一组视图,允许将内容导入和导出到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 (18.7 kB 查看哈希值)

上传时间

由以下组织支持