2015-06-30 2 views
1

У меня есть сайт со многими плагинами Filer Video, которые указывают на YouTube. Я решил, что фильтр не очень хорош для чувствительных сайтов (он требует фиксированной ширины), поэтому вместо того, чтобы исправить это, я написал свой собственный простой плагин, который очень легко встраивается в YouTube для макетов с переменной шириной.Программно заменить один плагин CMS django другим

Итак, теперь у меня есть тонна cmsplugin_filer_video.models.FilerVideo экземпляров, которые я хочу заменить моими cmsyoutube.models.YtVideo экземплярами. Зацикливание их в порядке, но как я программно вынимаю один плагин и заменяю его (на месте) другим?

Размышляя вслух, они оба [в конечном итоге] основаны на CMSPlugin. Можно ли перенести родительские элементы в новый класс?


Это насколько я дошел до сих пор. Итерации над старыми видео и попытаться создать новую YtVideo (то же самое), что указывает на то же cmsplugin_ptr перед удалением старого FilerVideo v ...

for v in FilerVideo.objects.all(): 
    plugin = v.cmsplugin_ptr 
    v.cmsplugin_ptr_id = None 
    new = YtVideo() 
    new.cmsplugin_ptr = plugin 
    plugin.plugin_type = 'YoutubePlugin' 
    new.youtube_id = re.search(r'v=([^&]+)', v.movie_url).groups(0)[0] 
    new.thumbnail = v.image 
    new.save() 
    plugin.save() 
    v.delete() 

Но Древоборода очень расстраивается с этим:

NodeAlreadySaved: Attempted to add a tree node that is already in the database 

Похоже, там есть каскадная логика сохранения. Любая идея, как hotwire это, чтобы я мог заменить экземпляры плагина, не разрушая базовое дерево CMSPlugin?

ответ

0

Удалось с cms.api.add_plugin. Забавно, что я не мог удержать позицию. Я думаю, что он ожидает, что «последний ребенок» - стильный английский, а не цифровой ввод. Поэтому я просто прибиваю его во второй раз после add_plugin.

from cms import api 
for v in FilerVideo.objects.all(): 
    youtube_id = re.search(r'v=([^&]+)', v.movie_url).groups(0)[0] 
    position = v.position 
    v.delete() 
    new = api.add_plugin(v.placeholder, 'YoutubePlugin', v.language, position, v.parent, youtube_id=youtube_id, thumbnail=v.image) 
    new.position = position 
    new.save() 
Смежные вопросы