0

我试图找出最后更改文档的用户是谁。最好,我想根据此信息进行收藏...我能找到的只是修改日期...

使用此链接中的脚本,我似乎没有在元数据中找到有关最后一个用户的信息。

这是正确的(没有修改用户信息......),如果是这样,可以做到吗?

4

2 回答 2

5

正如@MikkoOhtamaa 所写,Plone 默认情况下不会将最后一个修饰符保存在对象上。但是Plone 确实默认为页面、新闻项目、事件和链接启用了版本控制(由 CMFEditions 提供),并且版本元数据具有最新修饰符的信息。

如果可以从版本元数据中读取信息并仅针对版本控制的内容类型限制该功能,我认为,您需要

  1. 注册一个新索引catalog.xml在您的附加组件的 Generic Setup -profile 中使用;您可能还想注册一个元数据列以在结果中返回索引数据):

    <?xml version="1.0"?>
    <object name="portal_catalog" meta_type="Plone Catalog Tool">
      <index name="last_modifier" meta_type="FieldIndex">
        <indexed_attr value="last_modifier"/>
      </index>
      <column value="last_modifier"/>
    </object>
    
  2. 注册要在主题集合中使用的自定义搜索条件(portal_atct.xml在您的附加组件的 Generic Setup -profile 中使用)和元数据列以获取其表格视图中列出的信息:

    <?xml version="1.0"?>
    <atcttool>
      <topic_indexes>
        <index name="last_modifier"
              description="The last user, who has modified the object"
              friendlyName="Last Modifier"
              enabled="True">
          <criteria>ATCurrentAuthorCriterion</criteria>
          <criteria>ATListCriterion</criteria>
          <criteria>ATSimpleStringCriterion</criteria>
        </index>
      </topic_indexes>
      <topic_metadata>
        <metadata name="last_modifier"
                  description="The last user, who has modified the object"
                  friendlyName="Last Modifier"
                  enabled="True"/>
      </topic_metadata>
    </atcttool>
    
  3. 编写一个自定义索引器,它从版本元数据中查找最后一个修饰符并对其进行索引:

    # -*- coding: utf-8 -*-
    """Last modifier indexer"""
    
    from zope.component import getUtility
    
    from plone.indexer import indexer
    
    from Products.CMFCore.interfaces import ISiteRoot, IContentish
    from Products.CMFCore.utils import getToolByName
    
    
    @indexer(IContentish)
    def indexLastModifier(context):
        try:
            creator = context.Creators()[0]  # fallback value
        except AttributeError:
            creator = None
        except IndexError:
            creator = None
    
        site = getUtility(ISiteRoot)
        rt = getToolByName(site, "portal_repository")
    
        if rt is None or not rt.isVersionable(context):
            # not versionable; fallback to the creator
            return creator
    
        history = rt.getHistoryMetadata(context)
            if not history:
            # empty history; fallback to the creator
            return creator
    
        if not rt.isUpToDate(context):
            # history not up-to-date; fallback to the authenticated user
            mtool = getToolByName(site, "portal_membership")
            if mtool.isAnonymousUser():
                # no authenticated user found; fallback to the creator
                return creator
            else:
                return mtool.getAuthenticatedMember().getId()
    
        length = history.getLength(countPurged=False)
    
        last = history.retrieve(length - 1)
        if not last or type(last) != dict:
            # unexpected version metadata; fallback to the creator
            return creator
    
        metadata = last.get("metadata")
        if not metadata or type(metadata) != dict:
            # unexpected version metadata; fallback to the creator
            return creator
    
        sys_metadata = metadata.get("sys_metadata")
        if not sys_metadata or type(sys_metadata) != dict:
            # unexpected version metadata; fallback to the creator
            return creator
    
        principal = sys_metadata.get("principal")
        if not principal or type(principal) != str:
            # unexpected version metadata; fallback to the creator
            return creator
    
        return principal
    
  4. 并在您的附加组件中注册索引器configure.zcml

    <adapter name="last_modifier"
             factory=".indexers.indexLastModifier" />
    

但是请注意,因为版本控制机制是由与目录索引器相同的事件触发的,所以当我们被调用来索引它时,我们可能不确定是否存在最新版本的元数据。上面,我应用了虚拟启发式方法,当存储库说版本历史元数据与要索引的对象相比已过时时,我改为索引当前用户的用户名(并期望该用户只是在编辑文档)。

于 2012-04-12T06:29:05.257 回答
2

http://developer.plone.org/content/history.html#getting-the-complete-revision-history-for-an-object

拥有您需要的有关文档历史记录的所有信息。您还可以单击文档标题下方的“历史记录”查看信息。

于 2012-04-10T08:49:49.053 回答