2015-04-23 54 views
1

我有一個Plone 4站點,它停止重命名新的Archetypes對象;在創建之後(如/temp/portaltype.2015-04-23.1234567890)並保存第一次更改(包括給它一個標題),它應該被重命名爲更好的東西(/temp/an-object-with-a-meaningful-name),但這不會再發生。自動重命名新的Archetypes對象(Plone 4)停止工作

也許問題出現了,當我應用一些更改將Plone從4.3.3更新到4.3.4(一次只做一步);但我繼承了很長的versions.cfg,它是單獨按包名分類的,並且不包含爲什麼選擇某些版本的任何提示...爲什麼選擇某些版本...

我能夠返回兩個月,並有一個版本進行重命名,但沒有更多關於尋找什麼的知識,這將是一個非常耗時的重新應用每一個變化,重建,啓動和測試的過程;但是我的模式定義沒有任何更改。我有一個temp瀏覽器,它涉及提供主要編輯表單。但這似乎並不適用於保存行動。

可悲的是,我不完全理解尚base_edit行動應的機制 - 據我瞭解 - 打電話Archetypes.BaseObject.processForm和隱含._renameAfterCreation,所以我會很感激一些指導如何調試這一點。謝謝!

更新: 我有我的產品的configure.zcml,例如:

<subscriber 
    for=".content.portaltype.PortalType 
     Products.Archetypes.interfaces.IObjectInitializedEvent" 
    handler=".events.onInitPortalType"/> 

&hellip幾個觸發器;與在events.py

def onInitPortalType(self, event): 
    """ 
    Called after first edit of new objects? 
    """ 
    print '/// onInitPortalType(%(self)r, %(event)r)' % locals() 
    setInitialOwner(self, event) 
    setStateToPrivate(self, event) 

然而,事件似乎並沒有被觸發,因爲我無法找到在instance fg會話的輸出。

更新2: 我注意到zope.event已被釘在一個比較舊版本(3.5.2),所以我想更新到4.3.4更嚴重的是,現在(following this how-to)。這讓我zope.event V4.0.3,但我有一個版本衝突現在:

There is a version conflict. 
We already have: zc.recipe.egg 1.3.2. 
While: 
    Installing. 
    Getting section test. 
    Initializing section test. 
    Installing recipe zc.recipe.testrunner. 

似乎是zc.recipe.egg < 2dev要求的地方,但我不能找到它。

回答

2

Plone 4.3.3和4.3.4在Archetypes上沒有任何顯着變化。 Products.Archetypes從1.9.7更改爲1.9.8,而Products.ATContentTypes保持相同版本。

指針可能是:

  • 有一個_at_rename_after_creation標誌,這是True默認。這可以在內容類型class上更改。
  • 您的類型是否仍在portal_factory工具中激活? (Afaik在創建後應該不會影響重命名 - 但是誰知道:-))
  • 任何Products.Archetypes.interfaces.IObjectInitializedEvent訂戶?
  • 問題我曾經有過,tmp id portaltype.2015-04-23.1234567890格式錯誤,AT沒有把它識別爲tmp id,因此它在創建後沒有重命名。AT用來檢查id是否自動生成 - >https://github.com/plone/Products.CMFPlone/blob/4.3.4/Products/CMFPlone/utils.py#L111 AFAIK問題是,meta_type和portal_type不再一樣。
+0

標誌'_at_rename_after_creation'明確設置爲'True';類型在'@@ types-controlpanel'中可見; 'isIDAutoGenerated'可以正常工作(但在提交表單後不會調用*)。有一些IObjectInitializedEvent訂戶,但不適用於當前檢查的類型。也許我應該添加一個事件函數來明確觸發重命名... – Tobias

+0

我更新了問題。訂閱的funktions似乎沒有被觸發(我嘗試了'print'語句和'pdb.set_trace()')。 – Tobias

+0

我想你需要調試整個堆棧。嘗試在Products.Archetypes _renameAfterCreation方法中啓動,如果這不會被調用,請在您的自定義類型中定義該方法並添加一個斷點。然後嘗試在_processForm中設置一個斷點。 – Mathias