使用transmogrifier将数据附加到AT字段

时间:2011-08-30 14:59:17

标签: plone transmogrifier

我有一个这样的CSV数据文件:

1, [a, b, c]
2, [a, b, d]
3, [a]

和一些应该像这样更新的Plone对象:

ID, LinesField
a, [1,2,3]
b, [1,2]
c, [1]
d, [2]

因此,为了澄清,具有标识a的对象在CSV的第1,2和3行上命名,因此对象LinesField的{​​{1}}属性需要具有列出的那些行ID(行上的第一个数字)。

理想情况下,我想使用Transmogrifier来导入这些信息(并避免事先在Excel中进行任何操作),我可以看到两种方法,理论上这样做,但我无法弄清楚如何在实践。我要感谢一些例子。我认为要么我需要转换整个管道,以便项目反映我的Plone对象的结构,然后使用ATSchemaUpdater蓝图,但我看不到任何关于如何将项目添加到管道的示例(我是否需要写我自己的蓝图?)或者,我可以循环遍历项目,并将左栏中的值附加到右侧列表中的项目。为此,我需要一种用ATSchemaUpdater附加值而不是覆盖它们的方法 - 再次,是否有任何蓝图?

以下是一些示例csv行:

a

Plone对象将是一个主题,而行将列出一个名称列表:

"Name","Themes"
"Bessie Brown","cah;cab;cac"
"Fred Blogs","cah;cac"
"Dinah Washington","cah;cab"

1 个答案:

答案 0 :(得分:2)

我不确定您是否想要使用transmogrifier读取CVS文件,但我认为您可以创建一个部分,使用如下函数将这些值插入管道中的项目:

def transpose(cvs):
    keys = []
    [keys.extend(v) for v in cvs.values()]
    keys = set(keys)

    d = {}
    for key in keys:
        values = [k for k, v in cvs.iteritems() if key in v]
        d[key] = values

    return d

在这种情况下, cvs 是{1:['a','b','c'],2:['a','b','d'],3 : ['一个']}; 将包含所有可能设置的值(['a','c','b','d']); d 将是您想要的{'a':[1,2,3],'c':[1],'b':[1,2],'d':[ 2]}。

可能有更好的方法可以做到,但我不是Python魔术师。

插入部分可能如下所示:

class Insert(object):
    """Insert new keys into items.
    """
    classProvides(ISectionBlueprint)
    implements(ISection)

    def __init__(self, transmogrifier, name, options, previous):
        self.previous = previous
        self.new_keys = transpose(cvs)

    def __iter__(self):
        for item in self.previous:
            item.update(self.new_keys)
            yield item

之后,您可以使用SchemaUpdater部分。