跳转到主要内容

Zope 3应用程序的用户主文件夹

项目描述

主要主文件夹订阅者允许您像在任何操作系统一样将主文件夹分配给主体。这种功能的特定实现旨在作为处理主体的方式之强大的一种演示,而不是作为神圣的至宝。如果您对这种实现中做出的假设(可能是合理的)有顾虑,请完全忽略此包。

详细文档

主要主文件夹

主要主文件夹订阅者允许您像在任何操作系统一样将主文件夹分配给主体。这种功能的特定实现旨在作为处理主体的方式之强大的一种演示,而不是作为神圣的至宝。如果您对这种实现中做出的假设(可能是合理的)有顾虑,请完全忽略此包。

管理主文件夹

假设我们有一个主体,我们想为其创建一个主文件夹。第一个任务是创建主文件夹管理器,该管理器跟踪主体的主文件夹

>>> from zope.app.homefolder.homefolder import HomeFolderManager
>>> manager = HomeFolderManager()

现在管理器将无法做很多事情,因为它不知道在哪里查找主体主文件夹。因此,我们必须指定一个文件夹容器

>>> from zope.container.btree import BTreeContainer
>>> baseFolder = BTreeContainer()
>>> manager.homeFolderBase = baseFolder

现在我们可以将一个主文件夹分配给一个主体

>>> manager.assignHomeFolder('stephan')

由于我们没有指定主文件夹的名称,因此它将与主体ID相同

>>> manager.assignments['stephan']
'stephan'

由于主文件夹不存在,并且已启用 createHomeFolder 选项,因此目录已为您创建

>>> 'stephan' in baseFolder
True

在创建主文件夹时,主体还会自动获得 zope.Manager 角色

>>> from zope.securitypolicy.interfaces import IPrincipalRoleManager
>>> roles = IPrincipalRoleManager(baseFolder['stephan'])
>>> [(role, str(setting))
...  for role, setting in roles.getRolesForPrincipal('stephan')]
[(u'zope.Manager', 'PermissionSetting: Allow')]

如果已存在具有提供名称的文件夹,则创建操作将静默地跳过

>>> from zope.app.folder import Folder
>>> baseFolder['sc3'] = Folder()
>>> manager.assignHomeFolder('sc3')
>>> manager.assignments['sc3']
'sc3'

这有一个优点,即您可以自己选择 IContainer 实现,而不是依赖于普通的文件夹。

现在让我们来看看同一任务的几个变体。

  1. 有时您想指定一个替代文件夹名称

>>> manager.assignHomeFolder('jim', folderName='J1m')
>>> manager.assignments['jim']
'J1m'
>>> 'J1m' in baseFolder
True
  1. 尽管默认情况下会创建文件夹,但您可以专门关闭特定赋值的行为

>>> manager.assignHomeFolder('dreamcatcher', create=False)
>>> manager.assignments['dreamcatcher']
'dreamcatcher'
>>> 'dreamcatcher' in baseFolder
False
  1. 您希望默认不创建文件夹

>>> manager.createHomeFolder = False
>>> manager.assignHomeFolder('philiKON')
>>> manager.assignments['philiKON']
'philiKON'
>>> 'philiKON' in baseFolder
False
  1. 您不希望默认创建文件夹,而想为特定用户创建文件夹

>>> manager.assignHomeFolder('stevea', create=True)
>>> manager.assignments['stevea']
'stevea'
>>> 'stevea' in baseFolder
True

现在让我们看看移除主文件夹赋值。默认情况下,删除赋值将 不会 删除实际文件夹

>>> manager.unassignHomeFolder('stevea')
>>> 'stevea' not in manager.assignments
True
>>> 'stevea' in baseFolder
True

但如果您指定了 delete 参数,则将删除文件夹

>>> 'J1m' in baseFolder
True
>>> manager.unassignHomeFolder('jim', delete=True)
>>> 'jim' not in manager.assignments
True
>>> 'J1m' in baseFolder
False

接下来,让我们看看如何检索主文件夹。可以通过以下方式完成

>>> homeFolder = manager.getHomeFolder('stephan')
>>> homeFolder is baseFolder['stephan']
True

如果您尝试获取一个文件夹且它尚不存在,如果 autoCreateAssignment 为 False,则将返回 None。记住‘dreamcatcher’,它有一个赋值但没有文件夹

>>> 'dreamcatcher' in baseFolder
False
>>> homeFolder = manager.getHomeFolder('dreamcatcher')
>>> homeFolder is None
True

但是,如果 autoCreateAssignment 为 True,并且您尝试获取没有赋值的实体的主文件夹,则将自动创建赋值和文件夹。文件夹将始终创建,无论 createHomeFolder 的值如何。文件夹的名称将与 principalId 完全相同

>>> manager.autoCreateAssignment = True
>>> homeFolder = manager.getHomeFolder('florian')
>>> 'florian' in manager.assignments
True
>>> 'florian' in baseFolder
True

有时您想创建一个不是 zope.app.Folder 的主文件夹。您可以通过更改 containerObject 属性来更改正在创建的对象类型。它默认为‘zope.app.folder.Folder’。让我们创建一个主文件。

>>> manager.containerObject = 'zope.app.file.File'
>>> manager.assignHomeFolder('fileuser', create=True)
>>> homeFolder = manager.getHomeFolder('fileuser')
>>> print homeFolder #doctest: +ELLIPSIS
<zope.app.file.file.File object at ...>

您可以看到现在已创建了一个文件对象。我们将 containerObject 重置为 zope,folder.Folder 以避免混淆后续测试。

>>> manager.containerObject = 'zope.folder.Folder'

访问主文件夹

但是,主文件夹是如何分配给实体的呢?有两种方法可以访问主文件夹。第一种是通过提供 homeFolder 属性的简单适配器。第二种方法通过名为 homefolder 的路径适配器提供文件夹。

让我们首先创建一个实体

>>> from zope.security.interfaces import IPrincipal
>>> from zope.interface import implements
>>> class Principal:
...     implements(IPrincipal)
...     def __init__(self, id):
...         self.id = id
>>> principal = Principal('stephan')

我们还需要将我们的管理器注册为实用工具

>>> from zope.app.testing import ztapi
>>> from zope.app.homefolder.interfaces import IHomeFolderManager
>>> ztapi.provideUtility(IHomeFolderManager, manager, 'manager')
  1. 现在我们可以通过适配器访问主文件夹

>>> from zope.app.homefolder.interfaces import IHomeFolder
>>> adapter = IHomeFolder(principal)
>>> adapter.homeFolder is baseFolder['stephan']
True
  1. 或者通过路径适配器访问

>>> import zope.component
>>> from zope.traversing.interfaces import IPathAdapter
>>> zope.component.getAdapter(principal, IPathAdapter,
...                           "homefolder") is baseFolder['stephan']
True

如您所见,路径适配器仅返回主文件夹。这样我们可以保证文件夹的完整 API 总是可用。当然,它实际上将通过 TALES 表达式使用。

引擎设置

>>> from zope.app.pagetemplate.engine import Engine
>>> from zope.tales.tales import Context
>>> context = Context(Engine, {'principal': principal})

执行 TALES 表达式

>>> bytecode = Engine.compile('principal/homefolder:keys')
>>> list(bytecode(context))
[]
>>> baseFolder['stephan'][u'documents'] = Folder()
>>> list(bytecode(context))
[u'documents']

更改

3.5.0 (2009-02-01)

  • 使用 zope.container 而不是 zope.app.container

  • 删除对 zope.app.zapi 的依赖。

3.4.0 (2007-11-03)

  • 初始版本独立于主 Zope 树。

支持者