Skip to main content

Namespaces based configuration for Apphooks

Project description

PyPI Version Coverage Status

aldryn-apphooks-config

Namespaces based configuration for Apphooks

Basic concepts

The concept of apphooks-config is to store all the configuration in an applications-specific model, and let the developer specify the desired option in a form. In the views the model instance specific for the current application namespace is loaded (through a mixin) and it’s thus available in the view to provide the configuration for the current namespace.

Namespaces can be created on the fly in the Page admin Advanced settings by following the steps above. When creating an application configuration, you are in fact defining a namespace, which is saved in the same field in the Page model as the plain namespaces.

Contributing

We’re grateful to all contributors who have helped create and maintain this package.

Contributors are listed at contributions page.

Supported versions

Python: 3.9 - 3.11 Django: 3.2 - 4.2 django CMS: 3.9 - 3.11

Implementation step-guide

  • Define a AppHookConfig model in cms_appconfig.py:

    from aldryn_apphooks_config.models import AppHookConfig
    
    class NewsBlogConfig(AppHookConfig):
        pass

    Implementation can be completely empty as the schema is defined in the parent (abstract) model

  • Use apphooks managers in your model:

    from aldryn_apphooks_config.managers import AppHookConfigManager
    
    class Article(models.Model):
        title = models.CharField()
    
        objects = AppHookConfigManager()

AppHookConfigManager adds namespace method to manager and queryset:

Article.objects.namespace('foobar')

There is also a proper queryset, the ApphooksConfigQueryset. Parler integrated variants can be found in aldryn_apphooks_config.managers.parler. Names are AppHookConfigTranslatableManager and AppHookConfigTranslatableQueryset.

  • Define a ConfigForm in cms_appconfig.py:

    from app_data import AppDataForm
    from django import forms
    from aldryn_newsblog.models import NewsBlogConfig
    from aldryn_apphooks_config.utils import setup_config
    
    class BlogOptionForm(AppDataForm):
        # fields are totally arbitrary: any form field supported by
        # django-appdata is supported
        show_authors = forms.BooleanField(required=False)
        ...
    
    # this function will register the provided form with the model created
    # at the above step
    setup_config(BlogOptionForm, NewsBlogConfig)
    
    # setup_config can be used as a decorator too, but the `model`
    # attribute must be added to the form class
    @setup_config
    class BlogOptionForm(AppDataForm):
        model = NewsBlogConfig
  • Define an admin class for the AppHookConfig model (usually in admin.py:

    from django.contrib import admin
    from aldryn_apphooks_config.admin import BaseAppHookConfig
    
    class BlogConfigAdmin(BaseAppHookConfig):
    
        def get_config_fields(self):
            # this method **must** be implemented and **must** return the
            # fields defined in the above form, with the ``config`` prefix
            # This is dependent on the django-appdata API
            return ('config.show_authors', ...)
  • Define a CMSApp derived from CMSConfigApp provided by this application (in cms_app.py/cms_apps.py):

    from aldryn_apphooks_config.app_base import CMSConfigApp
    from cms.apphook_pool import apphook_pool
    from django.utils.translation import ugettext_lazy as _
    from .models import NewsBlogConfig
    
    
    class NewsBlogApp(CMSConfigApp):
        name = _('NewsBlogApp')
        urls = ['aldryn_newsblog.urls']
        app_name = 'aldryn_newsblog'
        # this option is specific of CMSConfigApp, and links the
        # CMSApp to a specific AppHookConfig model
        app_config = NewsBlogConfig
    
    apphook_pool.register(NewsBlogApp)
  • Implements your views inheriting the AppConfigMixin:

    from django.views.generic.detail import DetailView
    from aldryn_apphooks_config.mixins import AppConfigMixin
    
    class ArticleDetail(AppConfigMixin, DetailView):
        def get_queryset(self):
            return Article.objects.namespace(self.namespace)

    AppConfigMixin provides a complete support to namespaces, so the view is not required to set anything specific to support them; the following attributes are set for the view class instance:

    • current namespace in self.namespace

    • namespace configuration (the instance of NewsBlogConfig) in self.config

    • current application in the current_app parameter passed to the Response class

Test setup

To properly setup the data for tests to run for a apphook-config enabled application, make sure you add the following code to your TestCase:

MyTestCase():

    def setUp(self):
        # This is the namespace represented by the AppHookConfig model instance
        self.ns_newsblog = NewsBlogConfig.objects.create(namespace='NBNS')
        self.page = api.create_page(
            'page', self.template, self.language, published=True,
            # this is the name of the apphook defined in the CMSApp class
            apphook='NewsBlogApp',
            # The namespace is the namespace field of the AppHookConfig instance created above
            apphook_namespace=self.ns_newsblog.namespace)
        # publish the page to make the apphook available
        self.page.publish(self.language)

Changelog

0.7.1 (2026-04-29)

  • Fix: Enable Aldryn queryset in admin (draft) mode.

0.7.0 (2023-05-07)

  • Add Django 3.2+ support

0.6.0 (2020-05-12)

  • Add Django 3.0 support

0.5.3 (2019-10-19)

  • Fix media asset declaration on django 2.2+

0.5.2 (2019-01-02)

  • Changed deprecated rel.to to remote_field.model

  • Fixed migration for example app

  • Fixed issues for Django 2.0 and up

0.5.1 (2018-12-18)

  • Added support for Django 2.0 and 2.1

  • Removed support for Django < 1.11

  • Adapted testing infrastructure (tox/travis) to incorporate django CMS 3.6

  • Fixed setup.py

0.4.2 (2018-12-17)

  • Fixed issue with Django 1.10 and below in AppHookConfigWidget

0.4.1 (2018-04-10)

  • django-appdata>=0.2.0 is now required

0.4.0 (2018-03-19)

  • Added Django 1.11 compatibility

  • Added django CMS 3.5 compatibility

  • Implemented django-appdata 0.2 interface

  • Removed south migrations

  • Dropped support for django CMS 3.3 and below

  • Allowed use setup_config as decorators

0.3.3 (2017-03-06)

  • Fixed MANIFEST.in typo

0.3.2 (2017-03-06)

  • Fixed setup.py issue

  • Added locale files to MANIFEST.in

0.3.1 (2017-03-02)

  • Added translation system

  • Added german translation

0.3.0 (2017-01-06)

  • Allowed override AppHookConfigField attributes

  • Dropped Django 1.7 and below

  • Dropped django CMS 3.1 and below

  • Added Django 1.10 support

0.2.7 (2016-03-03)

  • Set namespace as readonly

  • Added official Django 1.9 support

  • Updated readme

  • Used path_info instead of path in resolve

0.2.6 (2015-10-05)

  • Added support for Python 3.5

  • Added support for Django 1.9a1

  • Code style cleanup and tests

0.2.5 (2015-09-25)

  • Added support for Django 1.8, django CMS 3.2

  • AppHookConfigTranslatableManager.get_queryset should use queryset_class

  • Skipped overriding admin form if app_config field not present

0.2.4 (2015-04-20)

  • Fixed issue where an apphook could not be changed, once set.

  • Added optional ‘default’ kwarg to namespace_url templatetag

0.1.0 (2014-01-01)

  • Released first version on PyPI.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

djangocms_aldryn_apphooks_config-0.7.1.tar.gz (27.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

djangocms_aldryn_apphooks_config-0.7.1-py2.py3-none-any.whl (32.9 kB view details)

Uploaded Python 2Python 3

File details

Details for the file djangocms_aldryn_apphooks_config-0.7.1.tar.gz.

File metadata

File hashes

Hashes for djangocms_aldryn_apphooks_config-0.7.1.tar.gz
Algorithm Hash digest
SHA256 5db83ab4328023b1ae7ea345c230c5d2f0863fc4b7a3a57f7913c80c684eaa81
MD5 ef57430a901d93cc7c540b7dde092d2e
BLAKE2b-256 2d16b77f326c313fdad8b428c00bbf048f9bbdb8527952eec06bd99d602f0980

See more details on using hashes here.

File details

Details for the file djangocms_aldryn_apphooks_config-0.7.1-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for djangocms_aldryn_apphooks_config-0.7.1-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 6ab183b84f3ee267145aa815d735762f883cbde010531bf66565f8ca09b92961
MD5 074ca99a5c5a5a2c096af4fff4314cf8
BLAKE2b-256 e0e61146aad9632ffecd68606c69fd1d13047f475badf17e3943a29bc7809423

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page