2017-09-22 2 views
2

몇 가지 Archetypes 기반 콘텐츠 형식을 소개하는 추가 기능 패키지를 개발 중입니다. 이러한 패키지의 기본 프로필에 정의되어 있습니다.내 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> 

,993,210 :

<?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 기반 개체 만 포함되어 있습니다. 민첩성 기반 유형을 추가하면 문제가 생깁니 까? ''(전 전혀 손재수가 아니에요.) '

내가 누군가을 이미 만들었습니다. 지금까지 행운이 없다. 중요한 정보가 어느 쪽의 페이지에서 오게되면, 나는 그것을 동기화 할 것이다.)

1. MyCompany/MyProduct/configure.zcml의 내용 디렉토리를 등록 추가하여 :

+0

하지 당신이 당신의 config.py 또는 왜에 무슨 일을하는지 확인을 열어 주시기를 들어

하지만 paster- 또는 zopeskel- 생성 된 config.py는 PROJECTNAME과 ADD_PERMISSIONS 만 선언합니다. –

+0

안녕하세요 @ Tobias, 당신은 "개발 된 제품 .CMFPlone 지점 2.2"무슨 뜻 이죠? 디버깅을 위해 먼저 다음을 시도해보십시오. https://docs.plone.org/develop/debugging/pdb.html – marr

+0

@IdaEbkes : IMO, 권한 문제는 아닙니다. 나는 이것을 .../manage_reportUserPermissions를 사용하여 체크했는데 예상되는 권한이 있습니다. – Tobias

답변

1

이들은 당신의 컨텐트 유형의 추가 가능한 수 있도록 누락 된 부분은

<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

관련 문제