尽管可以通过网络添加内容类型,但Plone测试中未经授权的错误

时间:2011-11-28 12:45:51

标签: plone

我有一个基于ATFolder的内容类型:

ConceptSheetFolderSchema = folder.ATFolderSchema.copy()

ConceptSheetFolderSchema['title'].widget.label = _(u"Title")
ConceptSheetFolderSchema['title'].widget.description = _(u"")
ConceptSheetFolderSchema['title'].storage = atapi.AnnotationStorage()
ConceptSheetFolderSchema['description'].widget.label = _(u"Description")
ConceptSheetFolderSchema['description'].widget.description = _("")
ConceptSheetFolderSchema['description'].storage = atapi.AnnotationStorage()

finalizeATCTSchema(ConceptSheetFolderSchema, folderish=True, moveDiscussion=False)

class ConceptSheetFolder(folder.ATFolder):
    """
    This is the central container for concept sheets in the site 
    """
    implements(IConceptSheetFolder)

    portal_type = "Concept Sheet Folder"
    _at_rename_after_creation = True
    schema = ConceptSheetFolderSchema

    title = atapi.ATFieldProperty('title')
    description = atapi.ATFieldProperty('description')

atapi.registerType(ConceptSheetFolder, PROJECTNAME)

我可以通过Plone界面添加 ConceptSheetFolder 没问题,但我无法让这个基本测试工作:

class TestContent(unittest.TestCase):

    layer = PROJECT_CONCEPTSHEETS_INTEGRATION_TESTING

    def test_hierarchy(self):
        portal = self.layer['portal']

        # Ensure that we can create the various content types without error

        setRoles(portal, TEST_USER_ID, ('Manager',))

        portal.invokeFactory('Concept Sheet Folder', 'csf1', title=u"Concept Sheet folder")        
        portal['csf1'].invokeFactory('project.ConceptSheet', 'cs1', title=u"ConceptSheet")
        portal['csf1']['cs1'].invokeFactory('project.ConceptMilestone', 'cs1', title=u"Approved")`

我收到错误 我尝试此测试时Unauthorized: Cannot create Concept Sheet Folder。我用Google搜索了一下,发现this Nabble post,让我看看Plone / CMFCore / TestTools.py中的isConstructionAllowed()。使用pdb,我发现._queryFactoryMethod()在此上下文中运行时返回'None'。

所以看起来这种类型的FactoryTool不起作用,至少不在测试中。我已经在正常的GenericSetup位置(types.xml,Concept_Sheet_Folder.xml,factorytool.xml)进行了测试,我很遗憾还有什么可能导致这个问题。有什么想法吗?

奖金问题:为什么这在Plone界面中起作用而在测试中不起作用?

编辑(2011年12月13日):这是我的Concept_Sheet_Folder.xml

<?xml version="1.0"?>
<object name="Concept Sheet Folder"
   meta_type="Factory-based Type Information with dynamic views"
   i18n:domain="iedea.conceptsheets" xmlns:i18n="http://xml.zope.org/namespaces/i18n">
 <property name="title" i18n:translate="">Concept Sheet Folder</property>
 <property name="description"
     i18n:translate="">A folder which can contain concept sheets.</property>
 <property name="content_icon">++resource++conceptsheetfolder_icon.gif</property>
 <property name="content_meta_type">Concept Sheet Folder</property>
 <property name="product">iedea.conceptsheets</property>
 <property name="factory">addConceptSheetFolder</property>
 <property name="immediate_view">atct_edit</property>
 <property name="global_allow">True</property>
 <property name="filter_content_types">True</property>
 <property name="allowed_content_types">
     <element value="Concept Sheet" />
 </property>
 <property name="allow_discussion">False</property>
 <property name="default_view">view</property>
 <property name="view_methods">
  <element value="view"/>
 </property>
 <alias from="(Default)" to="(dynamic view)"/>
 <alias from="edit" to="atct_edit"/>
 <alias from="sharing" to="@@sharing"/>
 <alias from="view" to="(selected layout)"/>
 <action title="View" action_id="view" category="object" condition_expr=""
    url_expr="string:${folder_url}/" visible="True">
  <permission value="View"/>
 </action>
 <action title="Edit" action_id="edit" category="object" condition_expr=""
    url_expr="string:${object_url}/edit" visible="True">
  <permission value="Modify portal content"/>
 </action>
</object>

1 个答案:

答案 0 :(得分:4)

我自己遇到了这个问题。问题是,当您尝试创建它时,您的Archetype工厂尚未正确注册。

这就是为什么_queryFactoryMethod()会返回None,正如您所发现的那样。

对于您是否使用 Products.ZopeTestCase 或较新的 plone.app.testing 作为测试框架,该解决方案有所不同。

但是,在这两种情况下,您都需要确保已经安装了您尝试创建的Archetype( ConceptSheetFolder )的附加产品(通过invokeFactory)。< / p>

使用Products.ZopeTestCase时:

如果您使用的是 Products.ZopeTestCase (以及 Products.PloneTestCase ),则需要调用

  • Products.ZopeTestCase.installProduct

在调用测试之前,您需要确保 installProduct 调用确实延迟。

在Plone 4中,这意味着您的 installProduct 调用不应该在 @onsetup 修饰函数中(尽管这仍然适用于Plone 3)。

此邮件列表讨论可能会进一步澄清:

http://plone.293351.n2.nabble.com/invokeFactory-failing-on-Plone-4-PTC-but-working-on-Plone-3-td5755482.html

使用plone.app.testing时:

如果您使用 plone.app.testing ,则应致电:

  • plone.testing.z2.installProduct

这应该在您从PloneSandboxLayer覆盖的 setUpZope 方法中完成。

有关详细信息,请阅读 plone.app.testing.helpers.py setUpZope 下的说明(第257行) https://github.com/plone/plone.app.testing/blob/2ef789f8173c695179b043fd4634e0bdb6567511/plone/app/testing/helpers.py