"Обновить параметры безопасности" в portal_workflow запускает обновление метаданных каталога без необходимости?

Plone 3.3.5: у нас есть сайт Plone среднего размера, и мы хотели бы обновить его рабочие процессы. Поскольку это длительный процесс, мы заметили что-то странное. Наши средства доступа Archetypes, не связанные с безопасностью, вызывались при нажатии "Обновить параметры безопасности" в portal_workflow.

Похоже, виновником является update_metadata=1 настройка по умолчанию в ZCatalog:

-> self.plone_log("treatmentToImagingHours: %s"%str(treatmentToImagingHours))
(Pdb) bt
  /Users/moo/sits/parts/zope2/lib/python/ZServer/PubCore/ZServerPublisher.py(25)__init__()
-> response=b)
  /Users/moo/sits/parts/zope2/lib/python/ZPublisher/Publish.py(401)publish_module()
-> environ, debug, request, response)
  /Users/moo/sits/parts/zope2/lib/python/ZPublisher/Publish.py(202)publish_module_standard()
-> response = publish(request, module_name, after_list, debug=debug)
  /Users/moo/sits/parts/zope2/lib/python/ZPublisher/Publish.py(119)publish()
-> request, bind=1)
  /Users/moo/sits/parts/zope2/lib/python/ZPublisher/mapply.py(88)mapply()
-> if debug is not None: return debug(object,args,context)
  /Users/moo/sits/parts/zope2/lib/python/ZPublisher/Publish.py(42)call_object()
-> result=apply(object,args) # Type s<cr> to step into published object.
  <string>(4)_facade()
  /Users/moo/sits/parts/zope2/lib/python/AccessControl/requestmethod.py(64)_curried()
-> return callable(*args, **kw)
  /Users/moo/sits/eggs/Products.CMFCore-2.1.2-py2.4.egg/Products/CMFCore/WorkflowTool.py(457)updateRoleMappings()
-> count = self._recursiveUpdateRoleMappings(portal, wfs)
  /Users/moo/sits/eggs/Products.CMFCore-2.1.2-py2.4.egg/Products/CMFCore/WorkflowTool.py(609)_recursiveUpdateRoleMappings()
-> count = count + self._recursiveUpdateRoleMappings(v, wfs)
  /Users/moo/sits/eggs/Products.CMFCore-2.1.2-py2.4.egg/Products/CMFCore/WorkflowTool.py(609)_recursiveUpdateRoleMappings()
-> count = count + self._recursiveUpdateRoleMappings(v, wfs)
  /Users/moo/sits/eggs/Products.CMFCore-2.1.2-py2.4.egg/Products/CMFCore/WorkflowTool.py(609)_recursiveUpdateRoleMappings()
-> count = count + self._recursiveUpdateRoleMappings(v, wfs)
  /Users/moo/sits/eggs/Products.CMFCore-2.1.2-py2.4.egg/Products/CMFCore/WorkflowTool.py(609)_recursiveUpdateRoleMappings()
-> count = count + self._recursiveUpdateRoleMappings(v, wfs)
  /Users/moo/sits/eggs/Products.CMFCore-2.1.2-py2.4.egg/Products/CMFCore/WorkflowTool.py(609)_recursiveUpdateRoleMappings()
-> count = count + self._recursiveUpdateRoleMappings(v, wfs)
  /Users/moo/sits/eggs/Products.CMFCore-2.1.2-py2.4.egg/Products/CMFCore/WorkflowTool.py(600)_recursiveUpdateRoleMappings()
-> ob.reindexObject(idxs=['allowedRolesAndUsers'])
  /Users/moo/sits/eggs/Products.Archetypes-1.5.11-py2.4.egg/Products/Archetypes/CatalogMultiplex.py(115)reindexObject()
-> c.catalog_object(self, url, idxs=lst)
  /Users/moo/sits/eggs/Plone-3.3rc2-py2.4.egg/Products/CMFPlone/CatalogTool.py(417)catalog_object()
-> update_metadata, pghandler=pghandler)
  /Users/moo/sits/parts/zope2/lib/python/Products/ZCatalog/ZCatalog.py(536)catalog_object()
-> update_metadata=update_metadata)
  /Users/moo/sits/parts/zope2/lib/python/Products/ZCatalog/Catalog.py(348)catalogObject()
-> self.updateMetadata(object, uid)
  /Users/moo/sits/parts/zope2/lib/python/Products/ZCatalog/Catalog.py(277)updateMetadata()
-> newDataRecord = self.recordify(object)
  /Users/moo/sits/parts/zope2/lib/python/Products/ZCatalog/Catalog.py(417)recordify()
-> if(attr is not MV and safe_callable(attr)): attr=attr()
  /Users/moo/sits/products/SitsPatient/content/SitsPatient.py(2452)outSichECASS()

portal_workflow вызывает ob.reindexObject(idxs=['allowRolesAndUsers']). Однако это запускает обновление для всех метаданных.

1) Это нормальное поведение?

2) Это желаемое поведение?

3) Могу ли я отключить update_metadata, чтобы ускорить процесс, ничего не нарушая? Надежна ли безопасность портала от метаданных?

1 ответ

Решение

Да, это нормальное поведение. В каталоге хранится подмножество информации, которую объект предоставляет в виде кэша, поэтому вы можете отображать страницы только с результатами каталога без необходимости пробуждать исходные объекты. Это включает текущее состояние рабочего процесса для объекта.

При переиндексации каталог также должен обновлять метаданные, поскольку у него нет средств для определения, изменились ли эти данные или нет.

В этом конкретном процессе вы не можете отключить update_metadata без исправления; вам придется либо:

  • патч Products.ZCatalog.Catalog.catalogObject для отключения там update_metadata,

  • патч Products.Archetypes.CatalogMultiplex.CatalogMultiplex.reindexObject для вызова catalogObject с флагом update_metadata, установленным в False,

  • исправьте инструмент рабочего процесса для вызова reindexObjectSecurity вместо reindexObject.

Вам нужно будет проверить столбцы схемы каталога (метаданных), чтобы убедиться, что ничего не изменится при обновлении безопасности рабочего процесса.

Другие вопросы по тегам