3.4 примечания к выпуску

Самым значительным изменением в этом выпуске является удаление поддержки ревизий (т.е. функций отмены/повтора/восстановления на страницах) из основной части django CMS. Эта функциональность будет восстановлена в качестве опционального дополнения со временем, а пока она недоступна.

Что нового в версии 3.4

  • Изменен способ отображения плагинов CMS. HTML div с классом cms-plugin больше не отображается вокруг каждого плагина CMS. Вместо этого используется комбинация тегов template и JavaScript для добавления обработчиков событий и данных плагина непосредственно в разметку плагина. Это устраняет большинство проблем с рендерингом, вызванных дополнительной разметкой.

  • Изменена реализация очистки кэша активов, которая теперь обрабатывается изменением пути, а не параметром GET.

  • Добавлена возможность копирования страниц в дереве страниц с помощью интерфейса перетаскивания.

  • Сделано возможным использование многотабличного наследования для расширений Page/Title.

  • Переработана функциональность рендеринга плагина для ускорения времени загрузки как в режиме структуры, так и в режиме контента.

  • Добавлено новое сочетание клавиш Shift + Space для переключения между режимом структуры и содержимого при выделении текущего плагина, показывая его положение.

  • Улучшенная навигация по клавиатуре

  • Добавлена модальная подсказка о доступных сокращениях

  • Добавлено нечеткое сопоставление в подборщик плагинов.

  • Изменена утилита downcast_plugins, чтобы возвращать генератор вместо списка.

  • Исправлена ошибка, из-за которой в режиме структуры отображался псевдозаголовок.

  • Исправлена ошибка, из-за которой псевдосозданный контент не отображался корректно без предварительной публикации страницы.

  • Добавлен текст подсказки к форме изменения плагина Alias при прикреплении к странице, чтобы показать редактору контента, откуда был сделан псевдоним контента.

  • Удалена поддержка ревизий из ядра django CMS. В результате перестали поддерживаться параметры CMS_MAX_PAGE_HISTORY_REVERSIONS и CMS_MAX_PAGE_PUBLISH_REVERSIONS, а также параметр with_revision в cms.api.create_page и cms.api.create_title.

  • В cms.plugin_base.CMSPluginBase методы get_child_classes и get_parent_classes теперь реализованы как @classmethod.

Обновление до версии 3.4

Требуется миграция базы данных, поскольку значение по умолчанию CMSPlugin.position было установлено в 0 вместо null.

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

Затем запустите:

python manage.py migrate
python manage.py cms fix-tree

Обратные несовместимые изменения

Крючки и панели инструментов

В соответствии с нашей политикой устаревания мы удалили обратно совместимый шим для cms_app.py и cms_toolbar.py. Если вы еще не сделали этого, переименуйте их в cms_apps.py и cms_toolbars.py.

Разрешения

Система разрешений была сильно переработана. В результате несколько внутренних функций и методов были удалены или изменены.

Функции удалены:

  • user_has_page_add_perm

  • has_page_add_permission

  • has_page_add_permission_from_request

  • has_any_page_change_permissions

  • has_auth_page_permission

  • has_page_change_permission

  • has_global_page_permission

  • has_global_change_permissions_permission

  • has_generic_permission

  • load_view_restrictions

  • get_any_page_view_permissions

Следующие методы были изменены и теперь требуют параметр пользователя вместо запроса:

  • Page.has_view_permission

  • Page.has_add_permission

  • Page.has_change_permission

  • Page.has_delete_permission

  • Page.has_delete_translation_permission

  • Page.has_publish_permission

  • Page.has_advanced_settings_permission

  • Page.has_change_permissions_permission

  • Page.has_move_page_permission

Они также устарели в пользу своих аналогов в cms.utils.page_permissions.

Чтобы сохранить согласованность с разрешениями django CMS и разрешениями Django, мы изменили ванильную систему разрешений (CMS_PERMISSIONS = False), чтобы требовать от пользователей наличия определенных разрешений Django для выполнения действия.

Вот обзор:

Действие

Требуется разрешение

Добавить страницу

Можно добавить страницу и изменить страницу

Изменить страницу

Можно изменить страницу

Удалить страницу

Можно изменить страницу и удалить страницу

Переместить страницу

Можно изменить страницу

Опубликовать страницу

Можно изменить страницу и можно опубликовать страницу

Это изменение коснется только сотрудников, не являющихся суперпользователями.

Предупреждение

Если у вас есть пользовательское расширение Page с настроенной панелью инструментов, обратитесь к обновленному example. В нем используются новые внутренние механизмы разрешения.

Ручной рендеринг плагинов

Мы переписали способ отображения плагинов и плейсхолдеров. В результате, если вы вручную выводите плагины и плейсхолдеры, вам придется адаптировать свой код под новый механизм вывода.

Чтобы программно вывести плагин, вам понадобится контекст и объект запроса.

Предупреждение

Ручной рендеринг плагинов не является публичным API, и поэтому он может быть изменен без предварительного уведомления.

from django.template import RequestContext
from cms.plugin_rendering import ContentRenderer

def render_plugin(request, plugin):
    renderer = ContentRenderer(request)
    context = RequestContext(request)
    # Avoid errors if plugin require a request object
    # when rendering.
    context['request'] = request
    return renderer.render_plugin(plugin, context)

Как и в случае с плагином, для программного отображения заполнителя вам понадобится контекст и объект запроса.

Предупреждение

Ручной рендеринг не является публичным API, и поэтому может быть изменен без предварительного уведомления.

from django.template import RequestContext
from cms.plugin_rendering import ContentRenderer

def render_placeholder(request, placeholder):
    renderer = ContentRenderer(request)
    context = RequestContext(request)
    # Avoid errors if plugin require a request object
    # when rendering.
    context['request'] = request
    content = renderer.render_placeholder(
       placeholder,
       context=context,
    )
    return content
Вернуться на верх