Use XMM (Legacy CMS)

Use XMM as content management system and migrate later to the new CMS.

Dependencies

Install necessary dependencies first.

pipenv install
yarn install

Update database by executing the two following commands:

./manage.py migrate
./manage.py sync_translation_fields --noinput

Settings

The following changes has to be done in the settings.py First off all you have to activate CMS_LEGACY_MODE.

CMS_LEGACY_MODE = True

VIEWS

CMS views has been moved into legacy package. The inheritance must be checked if the views have been overwritten.

VIEWS = {
   'cms-page-index': 'eshop.modules.cms.legacy_views.cms_page',
   'cms-page': 'eshop.modules.cms.legacy_views.cms_page',
}

CMS object classes

Object classes has been moved into legacy package. The inheritance must be checked if the objects have been overwritten.

CMS_OBJECT = 'eshop.modules.cms.models.legacy.base.BaseCMSObject'
CMS_PAGE_CLASS = 'eshop.modules.cms.models.legacy.page.Page'

CMS_PAGE_CLASSES = {
    'landing': 'eshop.modules.cms.models.legacy.page.LandingPage',
    'link': 'eshop.modules.cms.models.legacy.page.LinkPage',
    'folder': 'eshop.modules.cms.models.legacy.page.FolderPage',
    'notification': 'eshop.modules.cms.models.legacy.page.NotificationPage',
}

CMS_BLOCK_CLASSES = {
    'button': 'eshop.modules.cms.models.legacy.block.ButtonBlock',
    'newsletter_button': 'eshop.modules.cms.models.legacy.block.ButtonBlock',
    'card': 'eshop.modules.cms.models.legacy.block.CardBlock',
    'text': 'eshop.modules.cms.models.legacy.block.TextBlock',
    'offset': 'eshop.modules.cms.models.legacy.block.OffsetBlock',
    'map': 'eshop.modules.cms.models.legacy.block.MapBlock',
    'slider': 'eshop.modules.cms.models.legacy.block.SliderBlock',
    'video': 'eshop.modules.cms.models.legacy.block.VideoBlock',
    'news': 'eshop.modules.cms.models.legacy.block.NewsBlock',
    'gallery': 'eshop.modules.cms.models.legacy.block.GalleryBlock',
    'itemlist': 'eshop.modules.cms.models.legacy.block.ItemlistBlock',
}

TEMPLATES - context_processors

Add legacy_mode context processor.

...
'eshop.modules.cms.context_processors.notifications',
'eshop.modules.cms.context_processors.legacy_mode',
'eshop.modules.catalog.context_processors.navigation',
...

BACKEND

URL

Change cms_error_handler imports in project urls.py.

if getattr(settings, 'CMS_LEGACY_MODE', False):
    from eshop.modules.cms.legacy_views import cms_error_handler
else:
    from eshop.modules.cms.views import cms_error_handler

Celery

Add elastic_celery task to project tasks.py. Replace [PROJECT] with your project package name.

@task
def elastic_celery(ctx):
    print('Running Elastic Celery worker...')
    try:
        log = '-l INFO'
        run(f'PYTHONPATH=. celery worker -A [PROJECT].celery -Q elastic {log}', pty=True)
    except UnexpectedExit as e:
        if e.result.exited != 1:
            print('Elastic Celery task queue worker crashed!')
            raise
    except KeyboardInterrupt:
        pass
    print('Stopped Elastic Celery beat and worker')


@task(default=True)
def runall(ctx, with_flower=False, with_chrome=False, with_exports_celery=False):
    tasks = [runserver, celery, elastic_celery]
    if with_flower:
        tasks.append(flower)
    if with_chrome:
        tasks.append(chrome)
    if with_exports_celery:
        tasks.append(exports_celery)
    processes = [Process(target=func, args=(ctx,)) for func in tasks]
    [proc.start() for proc in processes]
    [proc.join() for proc in processes]
    print('All background processes cleaned up.')

Add new celery task to settings.py

# Celery task queue
CELERY_BROKER_URL = env('CELERY_BROKER_URL', default='redis://localhost:6379/1')
CELERY_RESULT_BACKEND = env('CELERY_RESULT_BACKEND', default='redis://localhost:6379/1')
CELERY_DEFAULT_QUEUE = 'celery'
CELERY_DEFAULT_EXCHANGE_TYPE = 'topic'
CELERY_DEFAULT_ROUTING_KEY = 'celery'
CELERY_TASK_QUEUES = (
    Queue('celery', Exchange('celery'), routing_key='celery'),
    Queue('elastic', Exchange('elastic'), routing_key='elastic'),
)
CELERY_TASK_ROUTES = {
    'api_core_update_index': {
        'queue': 'elastic',
        'routing_key': 'elastic',
    }
}
if 'eshop.modules.exporter' in INSTALLED_APPS:
    CELERY_TASK_QUEUES += (Queue('exporter', Exchange('exporter'), routing_key='exporter'),)
    CELERY_TASK_ROUTES['eshop.modules.Export.tasks.Export'] = {
        'queue': 'exporter',
        'routing_key': 'exporter',
    }

FRONTEND

JavaScript

  1. Import used javascript files in ui/js/app.js

    import 'poly-eshop4/eshop/ui/js/news';
    import 'poly-eshop4/eshop/ui/js/cms';
    
  2. Create the file ui/js/admin.js

    import 'poly-eshop4/eshop/ui/js/admin';
    
  3. Add “vue” alias, “admin” entrypoint, “css” and font rules to your webpack.config.js (or adopt the changes from poly-eshop4/eshop/conf/project_template/ui/webpack.config.js)

    ...
    resolve: {
      ...
      alias: {
        vue: 'vue/dist/vue.js',
      },
    },
    entry: {
      app: [...],
      admin: [
        path.resolve(rootPath, 'ui/js/admin.js'),
      ],
    },
    module: {
      rules: [
        ...
        {
          test: /\.css/,
          use: ['style-loader', 'css-loader'],
        },
        {
          test: /\.(eot|svg|ttf|woff|woff2)(\??#?v=[.0-9]+)?$/,
          loader: 'file-loader',
          options: {
            name: '[name].[ext]',
            outputPath: '../fonts/',
            publicPath: '/static/fonts/',
            esModule: false,
          },
        },
        ...
      ],
    },
    ...
    

Templates

Check project specific cms templates and change extends to legacy package.

{% extends "cms/legacy/bocks/article.html" %}
{% extends "cms/legacy/pages/default.html" %}
{% extends "cms/legacy/forms/form.html" %}