2017-09-22 20 views
2

私はいくつかのArchetypesベースのコンテンツタイプを紹介するアドオンパッケージを開発しています。 これらは、そのパッケージのデフォルトプロファイルで定義されています。My Archetypesベースのコンテンツタイプを追加できません。

クイックインストーラでパッケージを(再)インストールした後、タイプツールで自分のタイプを確認できます。 TTWを追加することはできず、folder_constraintypes_formにはリストされていません。私は、フォルダポータルタイプの "許可され​​たコンテンツタイプ"のマルチセレクションリストでそれらを選択しました。私はbin/instance debugセッションでFactoryTypeInformation._getFactoryMethodからValueErrorを得ましたので、私は "開発"

Products.CMFPlone(分岐2.2)とTypesTool.pyそうのように変更:

from pprint import pprint     # ADDED 
... 
class FactoryTypeInformation(TypeInformation): 
    ... 
    def _getFactoryMethod(self, container, check_security=1): 
     if not self.product or not self.factory: 
      raise ValueError, ('Product factory for %s was undefined' % 
           self.getId()) 
     pd = container.manage_addProduct # ADDED 
     p = container.manage_addProduct[self.product] 
     self_product = self.product  # ADDED 
     self_factory = self.factory  # ADDED 
     m = getattr(p, self.factory, None) 
     if m is None: 
      pprint(locals())    # ADDED 
      raise ValueError, ('Product factory for %s was invalid' % 
           self.getId()) 
     if not check_security: 
      return m 
     if getSecurityManager().validate(p, p, self.factory, m): 
      return m 
     raise AccessControl_Unauthorized('Cannot create %s' % self.getId()) 

debugセッションは次のようになります。

>>> root = app.plone 
>>> from Products.CMFCore.utils import getToolByName 
>>> tmp_folder = root.temp 
>>> type_name = 'MyType' 
>>> types_tool = getToolByName(tmp_folder, 'portal_types') 
>>> type_info = types_tool.getTypeInfo(type_name) 
>>> type_info 
<DynamicViewTypeInformation at /plone/portal_types/MyType> 
>>> new_content_item = type_info._constructInstance(tmp_folder, 'shiny_new_object') 
{'check_security': 0, 
'container': <ATFolder at /plone/temp>, 
'pd': <App.FactoryDispatcher.ProductDispatcher object at 0x227afd0>, 
'p': <App.FactoryDispatcher.FactoryDispatcher object at 0x7b97450>, 
'self': <DynamicViewTypeInformation at /plone/portal_types/MyType>, 
'm': None, 
'self_factory': 'addMyType', 
'self_product': 'MyCompany.MyProduct'} 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "/opt/zope/instances/zope-devel/src/Products.CMFCore/Products/CMFCore/TypesTool.py", line 551, in _constructInstance 
    m = self._getFactoryMethod(container, check_security=0) 
    File "/opt/zope/instances/zope-devel/src/Products.CMFCore/Products/CMFCore/TypesTool.py", line 467, in _getFactoryMethod 
    self.getId()) 
ValueError: Product factory for MyType was invalid 

したがって、FactoryDispatcherには、必要なaddMyType属性がありません。 私の宣言は不完全でしょうか?

これは私が持っているものです。

config.py

# -*- coding: utf-8 -*- 
from Products.CMFCore.permissions import setDefaultRoles 
from os import sep 

from .permissions import (AddMyType, 
     ) 

PROJECTNAME = "MyCompany.MyProduct" 
PRODUCT_HOME = sep.join(__file__.split(sep)[:-1]) 

MANAGERS_ONLY = ('Manager',) 
MANAGERS_AND_OWNER = ('Manager', 'Owner') 

# Permissions 
DEFAULT_ADD_CONTENT_PERMISSION = "Add portal content" 
setDefaultRoles(DEFAULT_ADD_CONTENT_PERMISSION, MANAGERS_AND_OWNER) 
ADD_CONTENT_PERMISSIONS = { 
    'MyType': AddMyType, 
} 
for perm in ADD_CONTENT_PERMISSIONS.values(): 
    setDefaultRoles(perm, MANAGERS_ONLY) 

content/mytype.py

# -*- coding: utf-8 -*- 
__author__ = """unknown <unknown>""" 
__docformat__ = 'plaintext' 

from AccessControl import ClassSecurityInfo 
from zope.interface import implements 
from ..interfaces import IMyType 

from ..config import PROJECTNAME 

from Products.ATContentTypes.content.base import ATCTContent 
from Products.ATContentTypes.content.schemata import ATContentTypeSchema 
from Products.ATContentTypes.content.base import registerATCT as registerType 

MyType_schema = (
    ATContentTypeSchema.copy() 
    ) 

class MyType(ATCTContent): 
    """ 
    description of my type 
    """ 
    security = ClassSecurityInfo() 
    implements(IMyType) 
    meta_type = 'MyType' 
    _at_rename_after_creation = True 

    schema = MyType_schema 

registerType(MyType, PROJECTNAME) 

interfaces.py

# -*- coding: utf-8 -*- 
"""Module where all interfaces, events and exceptions live.""" 

from zope.publisher.interfaces.browser import IDefaultBrowserLayer 
from zope.interface import Interface 

class ISupBetonqualiLayer(IDefaultBrowserLayer): 
    """Marker interface that defines a browser layer.""" 

class IMyType(Interface): 
    """Marker interface for .mytype.MyType 
    """ 

permissions.py

# -*- coding: utf-8 -*- vim: ts=8 sts=4 sw=4 si et tw=79 
""" 
Permissions 
""" 
AddMyType = 'MyCompany.MyProduct: Add MyType' 

profiles/default/factorytool.xml

<?xml version="1.0"?> 
<object name="portal_factory" meta_type="Plone Factory Tool"> 
<factorytypes> 
    <type portal_type="MyType"/> 
</factorytypes> 
</object> 

profiles/default/rolemap.xml

<?xml version="1.0"?> 
<rolemap> 
    <roles> 
    <role name="MyAuthor"/> 
    </roles> 
    <permissions> 
    <permission name="MyCompany.MyProduct: Add MyType" acquire="True"> 
     <role name="MyAuthor"/> 
     <role name="Manager"/> 
    </permission> 
    </permissions> 
</rolemap> 

profiles/default/types.xml

<?xml version="1.0"?> 
<object name="portal_types" 
     meta_type="Plone Types Tool"> 
<object name="MyType" 
     meta_type="Factory-based Type Information with dynamic views"/> 
</object> 

profiles/default/types/MyType.xml

<?xml version="1.0"?> 
<object name="MyType" 
     meta_type="Factory-based Type Information with dynamic views" 
     xmlns:i18n="http://xml.zope.org/namespaces/i18n"> 
<property name="title">MyType</property> 
<property name="description"> 
Some description text which is indeed visible in the types tool 
</property> 
<property name="content_icon">SomeExisting.png</property> 
<property name="content_meta_type">MyType</property> 
<property name="product">MyCompany.MyProduct</property> 
<property name="factory">addMyType</property> 
<property name="immediate_view">mytype_view</property> 
<property name="global_allow">True</property> 
<property name="filter_content_types">False</property> 
<property name="allowed_content_types"> 
</property> 
<property name="allow_discussion">False</property> 
<property name="default_view">mytype_view</property> 
<property name="view_methods"> 
    <element value="base_view"/> 
</property> 
<property name="default_view_fallback">False</property> 
<alias from="(Default)" to="(dynamic view)"/> 
<alias from="index.html" to="(dynamic view)"/> 
<alias from="view" to="(selected layout)"/> 
<alias from="edit" to="base_edit"/> 
<alias from="properties" to="base_metadata"/> 
<action title="View" 
     action_id="view" 
     category="object" 
     condition_expr="" 
     url_expr="string:${object_url}/view" 
     visible="True"> 
    <permission value="View"/> 
</action> 
<action title="Edit" 
     action_id="edit" 
     category="object" 
     condition_expr="not:object/@@plone_lock_info/is_locked_for_current_user" 
     url_expr="string:${object_url}/edit" 
     visible="True"> 
    <permission value="Modify portal content"/> 
</action> 
</object> 
  • が原型は、その不足しているaddMyType方法を作成するの世話をするべきではないでしょうか。
  • これが失敗する原因は何ですか?
  • 私の設定に明らかに欠けていることがありますか?
  • このサイトにはArchtypesベースのオブジェクトが含まれています。敏捷性に基づいたタイプを今追加すると困りますか? 「私は完全に手伝っていない)」

誰かが私に言っている前に、私はすでにa question in the Plone community forumを作成しました。これまで運がなかった。重要な情報がどちらのページにも入ったら、私はそれを同期させます。

+0

ないあなたはconfig.pyか理由でやっていることを確認を開けて自由に感じるために

しかしpaster-またはzopeskel-作成されたconfig.pyは、PROJECTNAMEとADD_PERMISSIONS、hthだけを宣言します。 –

+0

こんにちは@Tobias、あなたは "開発された製品.CMFPlone支店2.2"とはどういう意味ですか?デバッグのために、まずこれを試してみてください。https://docs.plone.org/develop/debugging/pdb.html – marr

+0

@IdaEbkes:IMO、これは許可の問題ではありません。私は.../manage_reportUserPermissionsを使用してこれをチェックしましたが、予想される権限があります。 – Tobias

答えて

1

これらはあなたのContentType追加可能を作るために不足している部分です:

1)を加えることにより、MyCompany/MyProduct/configure.zcmlでコンテンツ・ディレクトリを登録します。

<include package=".content" />

2)をこれでファイルMyCompany/MyProduct/content/configure.zcmlを追加します。内容:

<configure 
    xmlns="http://namespaces.zope.org/zope" 
    xmlns:five="http://namespaces.zope.org/five" 
    i18n_domain="MyCompany.MyProduct"> 

    <class class=".mytype.MyType"> 
    <require 
     permission="zope2.View" 
     interface="..interfaces.IMyType" 
     /> 
    </class> 

</configure> 

3.)に現れる構文エラーを修正します。また、class MyType(*basecls)class MyType(ATCTContent)に置き換えることにより、に記載されている。

最後に、これまでのやり方を取り除いてみましょう。最高ののは、専用のpckgにタイプをアウトソーシングし、zopeskel、imoで作成することです。タイプを追加した後に発生したビュー・エラー、新しいクエスト;-)

+0

ありがとうございます。私はあなたの変更を適用し、予測したようにエラーが発生します。 [これは新しい質問です](https://stackoverflow.com/q/46524247/1051649);-) – Tobias

関連する問題