显示在Plone中对文档进行最后修改的用户

时间:2012-04-10 07:21:20

标签: plone

我正在尝试找出上次更改文档的用户是谁。 最好,我想根据这个信息制作收藏品...... 我能找到的只是修改日期......

使用this link中的脚本,我似乎找不到元数据中最后一个用户的信息。

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

2 个答案:

答案 0 :(得分:5)

正如@MikkoOhtamaa所写,Plone默认情况下不会在对象上保存最后一个修饰符。但是,页面,新闻项目,事件和链接(通过CMFEditions)和版本元数据的Plone does have version control enabled by default具有最新修饰符的信息。

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

  1. Register a new index(在您的加载项的Generic Setup -profile中使用catalog.xml;您可能还需要注册元数据列以在结果中返回索引数据):

    <?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. Register a custom search condition to be used in Topic-collections(在您的加载项的Generic Setup -profile中使用portal_atct.xml)和元数据列以获取其表格视图中列出的信息:

    <?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. Write a custom indexer,其中looks up the last modifier来自版本元数据并为其编制索引:

    # -*- 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" />
    
  5. 请注意,由于版本控制机制是由与目录索引器相同的事件触发的,因此我们可能无法确定在调用索引它时是否存在最新版本的元数据。上面,我应用虚拟启发式,当存储库说明与待索引的对象相比时版本历史元数据已过时时,我会改为索引当前用户的用户名(并期望用户只是编辑文档)。

答案 1 :(得分:2)

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

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