Миграция из (теперь устаревшего) пользовательского типа контента ATImage - PullRequest
4 голосов
/ 31 августа 2011

У нас была целая коллекция сайтов Plone 3 с пользовательским типом изображения, подклассом которого является ATImage.Это позволило нам добавить дополнительное масштабирование изображения в стандартный список ("logo" :( 454, 58) ", используемый нашим пакетом тем).

Хотя это все еще работает в Plone 4, это не так.Это действительно правильный подход, так как plone.app.imaging является частью стандартного инструментария.Это может определять пользовательские масштабы на лету.

Похоже, я могу включить plone.app.imaging для любого типа, подкласса из ATImage, просто установив «sizes = None» для коллекции пользовательских масштабов для типа.Я, однако, затем остался с избыточным подклассом ATImage.В долгосрочной перспективе было бы полезно заменить все наши существующие элементы контента «FalconImage» (всего их сотни) стандартными элементами контента «Image».

Краткий эксперимент на тестовом сайте показывает, что если я простопройдитесь по дереву документов, изменив атрибут portal_type с «FalconImage» на «Image», после чего содержимое будет работать как «Image»: каждый объект внезапно получает вкладку «Преобразование» и все шкалы, определенные @@ imaging-controlpanel.

Я уверен, что при таком грубом насилии будут последствия.Есть ли рекомендуемый подход для преобразования одного типа в другой?

(Я рад добавить источник для нашего пользовательского типа ATImage, если кто-то считает, что он актуален. Это на самом деле просто минимальная настройка ATImage,с другой коллекцией размеров в ImageField)

Ответы [ 3 ]

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

Да, есть рекомендуемый подход:

http://pypi.python.org/pypi/Products.contentmigration

Единственное, что вам нужно сделать, - написать пользовательский переход с FalconImage на Image.

Bye, Джакомо

1 голос
/ 01 сентября 2011

Спасибо Джакомо и Россу за указатели.

На всякий случай, если это пригодится другим, мой код миграции в итоге выглядел следующим образом:

from Products.contentmigration.walker import CustomQueryWalker
from Products.contentmigration.archetypes import InplaceATItemMigrator

class FalconImageMigrator(InplaceATItemMigrator):
    walker = CustomQueryWalker
    src_meta_type = "FalconImage"
    src_portal_type = "FalconImage"
    dst_meta_type = "ATBlob"
    dst_portal_type = "Image"

    # Following stolen from plone.app.blob.migrations, ATImageToBlobImageMigrator
    # migrate all fields except 'image', which needs special handling...
    fields_map = {
        'image': None,
    }

    def migrate_data(self):
        self.new.getField('image').getMutator(self.new)(self.old)

    # ATFileToBlobMigrator reindexes certain fields. Otherwise we
    # need to clear and rebuild the entire catalog.
    def last_migrate_reindex(self):
        self.new.reindexObject(idxs=['object_provides', 'portal_type',
           'Type', 'UID'])

migrator = FalconImageMigrator
walker   = migrator.walker(portal, FalconImageMigrator)

walker.go()
print walker.getOutput()

Осложнения:

  1. Изображение немного странно как тип назначения, так как данные переносятся в хранилище BLOB-объектов.

  2. Нам нужно обновить каталог, чтобы "ссылки resoluid / UID, сгенерированные TinyMCE, продолжают работать.Метод last_migrate_reindex () в классе Migrator должен выполняться быстрее, чем очистка и повторная сборка всего каталога с нуля.

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

Вам нужно использовать Products.contentmigration, но в документах нет места для начала.Используйте документы на plone.org для пошаговой миграции контента.

...