Modules and Extensions¶
Cubane itself is modular: Different Django apps are providing different aspects of Cubane.
For example, the app cubane
itself provides the core system but then
important aspects like fonts, SVG icons, the CMS system or the shop system are
individual Django apps.
- The app
cubane.cms
provides content management functionality. cubane.backend
provides a backend system.cubane.shop
provides an eCommerce system.
This modularity allows you to only load the apps that you actually need but it also presents challenges how the different parts can extend each other.
Extensions¶
For example, the CMS system provides a way to generate a sitemap and provides a navigation system. When using the very same CMS system in combination with the shop system then the shop system would need to utilise services provided by the CMS system such as sitemap and navigation.
For example, since the shop system is introducing products, it would need to
extend the navigation system to include product pages. Likewise, such product
pages would also need to be listed within the sitemap.xml
file by extending
the sitemap system provided by the CMS system.
In the same way your own app might need to extend various parts of various sub-systems depending on your requirements.
For this purpose, each Cubane module provides a specific mechanism by which a
certain aspect can be extended by overriding certain class methods. The pattern
is always the same, it starts with a specific function that needs to be
implemented in the __init__.py
file in the root folder of the app or module:
def install_nav(nav):
from myapp.nav import MyNavigationExtension
return nav.register_extension(MyNavigationExtension)
The function install_nav
is called by the system in order to extend the
cubane.cms.nav.CMSNavigationBuilder
class, which is part of the CMS
system. Keep in mind that multiple apps may implement the same pattern and will
therefore extend the very same class.
The class is passed as an argument to the function (nav
). The class method
register_extension
is then called in order to extend the class with
additional functionality by basically overriding certain methods.
The extension class itself is simply derived from object
:
class MyNavigationExtension(object):
def get_objects(self, objects):
"""
Override: Include 'navigation_image'
"""
objects = super(MyNavigationExtension, self).get_objects(objects)
return objects.select_related('navigation_image')
def get_nav_item(self, page, nav_name=None):
"""
Override: Add additional properties to a navigation item.
"""
item = super(MyNavigationExtension, self).get_nav_item(page, nav_name)
item['navigation_image'] = page.navigation_image
return item
Note
Be aware that your app might not be the only one who is extending a
sub-system. Always use super()
in order to play nice with others;
otherwise you may end up preventing other apps from overriding methods.
Not all installation methods support the extension of an underlying class via
register_extension
. Some may only provide an opportunity to interact with a
certain object.
Common Extensions¶
A number of different apps are using the extension mechanism in order to allow
other apps to extend part of their infrastructure. The following list gives an
overview of the most common extensions that are provided by Cubane which can be
extended by using the register_extension
method:
App | Installer Method | Base Class |
---|---|---|
cubane |
install_resource_manager(resource_manager) |
cubane.lib.resources.ResourceManager |
cubane.cms |
install_cms(cms) |
cubane.cms.views.CMS |
cubane.cms |
install_page_context(page_context) |
cubane.cms.views.PageContext |
cubane.cms |
install_nav(nav) |
cubane.cms.nav.CMSNavigationBuilder |
See also
Please refer to section :ref:`` for more information about extending the
resource manager class cubane.lib.resources.ResourceManager
.
Section :ref:`` is describing the extension of the
cubane.cms.views.CMS
class.
Section :ref:`` is describing the extension of the page context
cubane.cms.views.PageContext
as part of the CMS system.
Finally, please refer to section Navigation Builder for
more information about extending the class
cubane.cms.nav.CMSNavigationBuilder
as part of the navigation
system.
Backend¶
The backend is using a similar concept, where each app can define an
installation function such as install_backend
in order to register backend
sections to the backend system.
def install_backend(backend):
backend.register_api(...)
backend.register_section(...)
backend.register_dashboard_widget(...)
This way, each app can install certain components for the backend system such as backend sections, API endpoints and/or dashboard widgets.
See also
Please refer to the reference documentation of the
cubane.backend.views.Backend
class or section
Backend Views for more information.