Package: djangocms-apphook-setup
Utility function to auto setup apphooks on project startup.Supported Django versions:Django: 3.2, 4.1, 4.2Supported django CMS versions:django CMS: 3.9, 3.11FeaturesThe mixin included in this utility allows to automatically add an Apphook to a django CMS
project on the first access to the website.This is intended for use by the django CMS application developers by extending their ownCMSAppclasses.This behavior simplify the initial setup of a project and lower the barrier for the end user.The setup function included here does the following:Check if the Apphook is already added to a CMS pageIf it is, it skips any further stepIf not:Creates the home page (if not present)Creates a sub page of the homeAdds the application Apphook to itIn case the application usesaldryn-apphooks-config, a Apphook Config instance is created
and added to the application page together with the Apphook.NoteTo avoid issues withAldrynSearchduring the creation of pages, the url of the
pages is faked; this is normally not an issues as the pages will be reindexed
whenever the content is updated.UsageThis utility can be used by extending theCMSAppclass, adding theauto_setupattribute
with relevant configuration options and triggering setup at the end ofcms_app.py:@apphook_pool.register
class App4(AutoCMSAppMixin, CMSConfigApp):
    name = _('App4')
    urls = ['sample_app_4.urls']
    app_name = 'app4'
    app_config = App4Config
    # djangocms-apphook-setup attribute
    auto_setup = {
        'enabled': True,
        'home title': 'home title',
        'page title': 'page 4 title',
        'namespace': 'namespace',
        'config_fields': {'random_option': True},
        'config_translated_fields': {'app_title': 'app title', 'object_name': 'name'},
        'sites': True,
    }


# trigger djangocms-apphook-setup function
App4.setup()Customizing ApphookConfig instances creationWhileconfig_fieldsandconfig_translated_fieldsshould cover most use cases when it comes
to ApphookConfig instances creation, you may need more control over the process.For this, it’s possible to overrideAutoCMSAppMixin._create_configandAutoCMSAppMixin._create_config_translation.Default implementation:@classmethod
def _create_config(cls):
    return cls.app_config.objects.create(
        namespace=cls.auto_setup['namespace'], **cls.auto_setup['config_fields']
    )

@classmethod
def _create_config_translation(cls, config, lang):
    config.set_current_language(lang, initialize=True)
    for field, data in cls.auto_setup['config_translated_fields'].items():
        setattr(config, field, data)
    config.save_translations()You can completely redefine the methods, provided you return an ApphookConfig instance
in_create_config.Configuration optionsThe behavior of the setup function can be customized by setting the following keys in theauto_setupattribute:enabled: IfTruethe setup is invoked; a good option is to use a setting to control this
to allow application users to disable the behavior (default:True)home title: Title of the home page if created by the setup function; thismustbe set in
the applicationCMSApp, otherwise the setup function will exit with a warning.page title: Title of the page created by the setup function; thismustbe set in
the applicationCMSApp, otherwise the setup function will exit with a warning.namespace: Application instance name used when attaching the Apphook; thismustbe set in
the applicationCMSAppif anapp_nameis defined, otherwise the setup function will exit
with a warning.config_fields: Fields used when creating the ApphookConfigModel instance; use this attribute
for non-translated fields.config_translated_fields: Fields used when creating the ApphookConfigModel instance;
use this attribute for translated fields (currently onlydjango-parleris supported).sites: List of site ids for which to create the pages; if set toTrue(the default value)
pages will be created for all sites. A single apphook config is created for all the sites;
instance is created only on first page creation.Notes on testingAs this utility works by triggering setup function at import time, extra steps must be taken
in the tests to unload the modules between the tests (this is only needed when testing the setup).Example cleanup to be included insetUpmethod:def setUp(self):
    super(SetupAppBaseTest, self).setUp()
    from cms.apphook_pool import apphook_pool

    delete = [
        'my_app',
        'my_app.cms_app',
    ]
    for module in delete:
        if module in sys.modules:
            del sys.modules[module]
    MyApphoolConfigModel.cmsapp = None
    apphook_pool.clear()History0.5.1 (2024-01-16)FeaturesSwitch to Coveralls Github action (#37)BugfixesPin Django CMS version < 4, fix README (#45)0.5.0 (2023-05-07)FeaturesAdd support for Django 4.2 / django CMS 3.11 (#16)Update tooling and drop Python 2 / Django < 2.2 compatibility (#10214)0.4.1 (2019-12-22)Fix classifiers0.4.0 (2019-12-22)Add Django 2.2 supportAdd django CMS 3.6, 3.7 supportDrop Django < 1.11 supportDrop django CMS < 3.6 supportFix monkey-patch not applied consistently0.3.0 (2018-01-15)Add support for multisite setupsAdd Django 1.11 supportAdd django CMS 3.5 support0.2.0 (2016-12-04)Add support for multisite setupsAdd Django 1.9, 1.10 supportAdd django CMS 3.4 support0.1.2 (2015-12-22)Monekypatch aldryn_search index to avoid errors0.1.1 (2015-11-02)Easier extension of ApphookConfig creation0.1.0 (2015-10-24)First experimental release