Profiel van 麦田守望者异想空间Foto'sWeblogLijsten Extra Help

Weblog


    31-7-2009

    解决psycopg2导入错误

    psycopg2版本:2.0.11

    Zope版本:2.10.7-final

    在上述环境中创建一个ZPsycopgDA数据连接对象的时候,会出现ImportError异常,提示psycopg version mismatch (imported 2.0.11 (dt dec ext pq3))。

    解决办法:在ZPsycopgDA目录中,修改DA.py文件的119行:

    - if psycopg2.__version__[:5] not in ALLOWED_PSYCOPG_VERSIONS:
    + if psycopg2.__version__.split(' ')[0] not in ALLOWED_PSYCOPG_VERSIONS:

    导致这个错误的原因是,2.0.11版本的psycopg2的__version__属性会返回“2.0.11 (dt dec ext pq3)”,只有按照空格打断字符串并取得第一元素,才能正确获得版本号。


    30-7-2009

    解锁Plone对象

    如果某个对象被上了锁,导致没法对其进行操作,可以用wl_clearLocks方法为其解锁:

    obj = getattr(context, 'obj_id')
    obj.wl_clearLocks()

    至于对象为何以及在什么条件下会被上锁,我尚不清楚。如果您清楚,感谢指点一二。

    29-7-2009

    content_status_modify方法在哪里定义的?

    寻寻觅觅,在源码中始终不见content_status_modify方法的踪迹。你知道吗?请告诉我。谢谢!

    BaseFolder对象的manage_addFolder方法

    BaseFolder位于Products.Archetypes.BaseFolder.py

    在Python脚本对象中,可以使用manage_addFolder方法创建一个Folder对象。从ATFolder继承下来的容器对象,都包含了这个方法。当在自定义的容器对象上调用manage_addFolder方法的时候,要明确地给type_name参数传递一个字符串值Folder。例如:

    context.manage_addFolder(id = 'objid', title = 'Object's title', type_name = 'Folder')

    然而,不要被这个方法的字面意思所蒙蔽。只要给type_name参数传递了正确的portal_type值,还可以用它创建其他类型的内容对象。例如:

    context.manage_addFolder(id = 'objid', title = 'title', type_name = 'Document')
    context.manage_addFolder(id = 'objid', title = 'title', type_name = 'Image')

    这里“正确的”含义有二。一是,type_name的值必须是已经注册的对象的portal_type值;二是,指定的portal_type必须是当前容器被允许容纳的对象类型中的一种。

    实际上,manage_addFolder在做了一系列准备工作后调用invokeFactory方法,而invokeFactory最终调用portal_types对象的constructContent方法创建对象。如果很清楚自己要做些什么,也可以直接调用invokeFactory和constructContent方法。

    22-7-2009

    IObjectManager接口中的几个有用的方法

    IObjectManager位于OFS.interfaces.py文件中。IObjectManager接口定义了一个容器类需要实现的方法。其中有几个方法很有用。

    def hasObject(id):
        """ Indicate whether the folder has an item by ID. """

    def manage_delObjects(ids=[], REQUEST=None):
        """Delete a subordinate object

           The objects specified in 'ids' get deleted.
        """

    def __getitem__(key):
        """
        """

    • hasObject方法接受一个参数,该参数表示某个对象的id,hasObject方法会判断该对象是否存在于容器中。
    • manage_delObjects方法用于在容器中删除一组对象。删除的依据是ids参数,这是一个列表对象,其中包括将要被删除的对象的id。
    • __getitem__方法使得提供了IObjectManager接口的对象可以像字典对象那样获得容器中的某个对象。

    IObjectManager接口还提供了诸如superValues、objectItems、objectValues等其他方法用于访问容器中的对象。

    Plone的ATFolder对象通过继承和实现IATFolder接口,也提供了IObjectManager接口的功能。因此,在Plone中,以编程的方式对一个ATFolder对象施加更多的控制就变得容易许多。通过对CMFCore和CMFPlone的探索得知,还有许多其他更高层的接口可以利用。

    12-7-2009

    在portal_catalog中按照分类搜索使用Subject关键字

    当以编程方式通过portal_catalog工具搜索具有特定分类属性的内容对象的时候,使用Subject关键字。请注意首字母大写。在ZMI中,portal_catalog的Indexes页中存在一个类型为KeywordIndex,名称为Subject的索引。这就是我们所需要的。

    11-7-2009

    (dynamic view)和(selected layout)

    Plone提供了一种机制,允许开发者给实现了IATFolder接口的内容类型提供不同的显示视图(Views),而用户则可以通过Display菜单设置内容类型的动态视图。作为内容类型的开发者,特别需要留意“(dynamic view)”和“(selected layout)”的使用。即在某个内容类型的GenericSetup配置文件中,必须确保下面的两行正确出现:

    <alias from="(Default)" to="(dynamic view)" />
    <alias from="view" to="(selected layout)" />

    如果,选择Display菜单中的视图没有任何作用的话,那么可以看看这两个配置值是否正确出现。


     
    *