Namespaces based configuration for Apphooks
Project description
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.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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for aldryn-apphooks-config-0.7.0.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | d6467ed1a61f88ef73ea02d5ec5a9c3ffd96855738192b1849ab0df86a5e1566 |
|
MD5 | 411c429d7befc220021937032b00fa66 |
|
BLAKE2b-256 | fe0dae9d0a05f9a87bd99ea34789bb405bc9d89d4c9deadeaf0bb9769977ddfa |
Hashes for aldryn_apphooks_config-0.7.0-py2.py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 909339d91ebde6b9d0b1e5b791f08cce4f52d3f7967fa3de2d6e299fd869344c |
|
MD5 | bdbb0b02ee922a8e7d45e7b455fb69ed |
|
BLAKE2b-256 | 01a24dcb3121a6e011515e8b8a86e98495bcd59a78d5d691961d84eee4b8880f |