Добавление данных в поле AT с помощью трансмогрификатора - PullRequest
2 голосов
/ 30 августа 2011

У меня есть 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]

Итак, чтобы уточнить, объект сid a назван в строках 1, 2 и 3 CSV, и, таким образом, для свойства LinesField объекта a должны быть указаны эти идентификаторы строк (первое число в строке).

В идеале я хотел бы использовать Transmogrifier для импорта этой информации (и избегать каких-либо манипуляций в Excel заранее), и я вижу два пути, теоретически это сделать, но я не могу понять, как это сделать на практике,Я был бы благодарен за некоторые ссылки на примеры.Я думаю, что либо мне нужно преобразовать весь конвейер так, чтобы элементы отражали структуру моих объектов Plone, а затем использовать план ATSchemaUpdater, но я не вижу примеров того, как добавить элементы в конвейер (нужно ли мненаписать свой собственный план?) Или, в качестве альтернативы, я мог бы перебрать элементы, как они существуют, и добавить значение в левом столбце к элементам в списке справа.Для этого мне нужен способ добавления значений с помощью ATSchemaUpdater, а не перезаписывать их - опять же, есть какой-нибудь проект для этого где-нибудь?Объект будет темой, а в строках появится список имен:

cah, ['Bessie Brown', 'Fred Boggs' etc etc]

1 Ответ

2 голосов
/ 31 августа 2011

Я не совсем уверен, что вы хотите прочитать файл CVS с помощью transmogrifier, но я думаю, что вы можете создать раздел для вставки этих значений в элементы в конвейере, используя такую ​​функцию:

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.

...