2011-11-28 43 views
3

加入我得根據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當我嘗試這個測試。我搜索了一下,發現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> 
+0

你確定它的作品通過網絡,即一個新的網站閱讀下setUpZope說明你實際上可以創建內容類型?這聽起來像你有類型/ contentsheetfolder.xml中的問題 – MatthewWilkes

+0

是的,它絕對通過網絡工作。我可以添加和編輯概念圖表文件夾。 – kevinharvey

+0

你在Concept_Sheet_Folder.xml裏面有什麼? – hvelarde

回答

4

我碰到的這個問題我自己。問題在於你的Archetype工廠在你嘗試創建它的時候還沒有正確的註冊。

這就是爲什麼_queryFactoryMethod()返回無,因爲你發現了。

的解決方案不同,您是否正在使用Products.ZopeTestCase或較新的plone.app.testing爲您的測試框架位。

然而,在這兩種情況下,你需要確保的是,附加產品定義,你要創建(通過invokeFactory)的原型(ConceptSheetFolder),已AREADY安裝。

當使用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(257線) https://github.com/plone/plone.app.testing/blob/2ef789f8173c695179b043fd4634e0bdb6567511/plone/app/testing/helpers.py