Templates
Table of Contents
Introduction
You can set which template Sahana Eden uses in /models/000_config.py
with the line:
settings.base.template = "default"
Templates allow selecting alternate configuration sets.
This allows a separation between Core Code & Settings/Custom Code.
This helps prevent merge conflicts between different deployment branches & hence reduces the risk of forking.
Examples
See the current templates in Sahana Eden: https://github.com/sahana/eden/tree/master/modules/templates
The skeleton
template is designed to be copied & renamed to create new templates.
Files
Configuration is done using these files:
/modules/templates/000_config.py
/modules/templates/default/config.py
/modules/templates/<template>/config.py
During the 1st run, 000_config.py
is copied to models/
000_config.py
includes:
FINISHED_EDITING_CONFIG_FILE
VERSION
- machine-specific configuration (Debug, Database, SMTP, API Keys, etc)
- a setting to define which template folder to run
- importing of settings from
/modules/templates/<template>/config.py
- optional local overrides to the template's settings
Prepopulate Data
An empty database isn't terribly useful - e.g. maps won't display at all.
Options for how to Prepopulate the database are defined in the template's config.py
(but can be overridden in the running 000_config.py
):
settings.base.prepopulate = ("default",)
- DeveloperGuidelines/PrePopulate
Menus
If you need to tweak your menus of build completely new ones:
Theme
It is possible to develop a custom theme for the look & feel of your system:
Custom Pages
If you wish to add a new custom page without creating a new module:
Cascading Templates
If you wish to inherit the functionality from another template & then make tweaks, you can do this by cascading templates:
modules/templates/MY_TEMPLATE/config.py
:
def config(settings): from templates.OTHER_TEMPLATE.config import config as OTHER_config OTHER_config(settings) settings.base.system_name = T("Other System Name") settings.base.system_name_short = T("Other Short System name")
modules/templates/MY_TEMPLATE/controllers.py
:
# Pull a page from another template from templates.OTHER_TEMPLATE.controllers import other_page # (This coukld be subclassed if-desired) # Define your own homepage: class index(): ...
modules/templates/MY_TEMPLATE/menus.py
:
from templates.OTHER_TEMPLATE.menus import S3OptionsMenu as OTHEROptionsMenu class S3OptionsMenu(OTHEROptionsMenu): # Override those side menus which are specific.