145 lines
5.8 KiB
Python
145 lines
5.8 KiB
Python
from django.conf import settings
|
|
from pprint import pprint
|
|
import os
|
|
from importlib import import_module, util
|
|
|
|
|
|
# Core TemplateHelper class
|
|
class TemplateHelper:
|
|
# Init the Template Context using TEMPLATE_CONFIG
|
|
def init_context(context):
|
|
context.update(
|
|
{
|
|
"layout": settings.TEMPLATE_CONFIG.get("layout"),
|
|
"primary_color": settings.TEMPLATE_CONFIG.get("primary_color"),
|
|
"theme": settings.TEMPLATE_CONFIG.get("theme"),
|
|
"skins": settings.TEMPLATE_CONFIG.get("my_skins"),
|
|
"semiDark": settings.TEMPLATE_CONFIG.get("has_semi_dark"),
|
|
"rtl_mode": settings.TEMPLATE_CONFIG.get("rtl_mode"),
|
|
"has_customizer": settings.TEMPLATE_CONFIG.get("has_customizer"),
|
|
"display_customizer": settings.TEMPLATE_CONFIG.get( "display_customizer" ),
|
|
"content_layout": settings.TEMPLATE_CONFIG.get("content_layout"),
|
|
"navbar_type": settings.TEMPLATE_CONFIG.get("navbar_type"),
|
|
"header_type": settings.TEMPLATE_CONFIG.get("header_type"),
|
|
"menu_fixed": settings.TEMPLATE_CONFIG.get("menu_fixed"),
|
|
"menu_collapsed": settings.TEMPLATE_CONFIG.get("menu_collapsed"),
|
|
"footer_fixed": settings.TEMPLATE_CONFIG.get("footer_fixed"),
|
|
"show_dropdown_onhover": settings.TEMPLATE_CONFIG.get( "show_dropdown_onhover" ),
|
|
"customizer_controls": settings.TEMPLATE_CONFIG.get( "customizer_controls" ),
|
|
}
|
|
)
|
|
return context
|
|
|
|
# ? Map context variables to template class/value/variables names
|
|
def map_context(context):
|
|
#! Header Type (horizontal support only)
|
|
if context.get("layout") == "horizontal":
|
|
if context.get("header_type") == "fixed":
|
|
context["header_type_class"] = "layout-menu-fixed"
|
|
elif context.get("header_type") == "static":
|
|
context["header_type_class"] = ""
|
|
else:
|
|
context["header_type_class"] = ""
|
|
else:
|
|
context["header_type_class"] = ""
|
|
|
|
#! Navbar Type (vertical/front support only)
|
|
if context.get("layout") != "horizontal":
|
|
if context.get("navbar_type") == "fixed":
|
|
context["navbar_type_class"] = "layout-navbar-fixed"
|
|
elif context.get("navbar_type") == "static":
|
|
context["navbar_type_class"] = ""
|
|
else:
|
|
context["navbar_type_class"] = "layout-navbar-hidden"
|
|
else:
|
|
context["navbar_type_class"] = ""
|
|
|
|
# Menu collapsed
|
|
context["menu_collapsed_class"] = (
|
|
"layout-menu-collapsed" if context.get("menu_collapsed") else ""
|
|
)
|
|
|
|
#! Menu Fixed (vertical support only)
|
|
if context.get("layout") == "vertical":
|
|
if context.get("menu_fixed") is True:
|
|
context["menu_fixed_class"] = "layout-menu-fixed"
|
|
else:
|
|
context["menu_fixed_class"] = ""
|
|
|
|
# Footer Fixed
|
|
context["footer_fixed_class"] = (
|
|
"layout-footer-fixed" if context.get("footer_fixed") else ""
|
|
)
|
|
|
|
# RTL Mode/Layout
|
|
context["rtl_mode_value"], context["text_direction_value"] = (
|
|
("rtl", "rtl") if context.get("rtl_mode") else ("ltr", "ltr")
|
|
)
|
|
|
|
#! Show dropdown on hover (Horizontal menu)
|
|
context["show_dropdown_onhover_value"] = (
|
|
"true" if context.get("show_dropdown_onhover") else "false"
|
|
)
|
|
|
|
context["semi_dark_value"] = (
|
|
"true" if context.get("semiDark") else "false"
|
|
)
|
|
|
|
# Display Customizer
|
|
context["display_customizer_class"] = (
|
|
"" if context.get("display_customizer") else "customizer-hide"
|
|
)
|
|
|
|
# Content Layout
|
|
if context.get("content_layout") == "wide":
|
|
context["container_class"] = "container-fluid"
|
|
context["content_layout_class"] = "layout-wide"
|
|
else:
|
|
context["container_class"] = "container-xxl"
|
|
context["content_layout_class"] = "layout-compact"
|
|
|
|
# Detached Navbar
|
|
if context.get("navbar_detached") == True:
|
|
context["navbar_detached_class"] = "navbar-detached"
|
|
else:
|
|
context["navbar_detached_class"] = ""
|
|
|
|
# Get theme variables by scope
|
|
def get_theme_variables(scope):
|
|
return settings.THEME_VARIABLES[scope]
|
|
|
|
# Get theme config by scope
|
|
def get_theme_config(scope):
|
|
return settings.TEMPLATE_CONFIG[scope]
|
|
|
|
# Set the current page layout and init the layout bootstrap file
|
|
def set_layout(view, context={}):
|
|
# Extract layout from the view path
|
|
layout = os.path.splitext(view)[0].split("/")[0]
|
|
|
|
# Get module path
|
|
module = f"templates.{settings.THEME_LAYOUT_DIR.replace('/', '.')}.bootstrap.{layout}"
|
|
|
|
# Check if the bootstrap file is exist
|
|
if util.find_spec(module) is not None:
|
|
# Auto import and init the default bootstrap.py file from the theme
|
|
TemplateBootstrap = TemplateHelper.import_class(
|
|
module, f"TemplateBootstrap{layout.title().replace('_', '')}"
|
|
)
|
|
TemplateBootstrap.init(context)
|
|
else:
|
|
module = f"templates.{settings.THEME_LAYOUT_DIR.replace('/', '.')}.bootstrap.default"
|
|
|
|
TemplateBootstrap = TemplateHelper.import_class(
|
|
module, "TemplateBootstrapDefault"
|
|
)
|
|
TemplateBootstrap.init(context)
|
|
|
|
return f"{settings.THEME_LAYOUT_DIR}/{view}"
|
|
|
|
# Import a module by string
|
|
def import_class(fromModule, import_className):
|
|
pprint(f"Loading {import_className} from {fromModule}")
|
|
module = import_module(fromModule)
|
|
return getattr(module, import_className)
|