🔄 Integration Patterns
🔄 Integration Patterns
Django REST Framework Integration
from django_cfg import OpenAPIClientConfig
from typing import Dict, Any, List
class DRFIntegration:
"""Django REST Framework integration"""
@staticmethod
def generate_settings(config: "DjangoConfig") -> Dict[str, Any]:
"""Generate DRF settings based on configuration"""
settings = {}
# Basic DRF configuration
settings['REST_FRAMEWORK'] = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.TokenAuthentication',
],
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated',
],
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 25,
'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',
}
# Configure based on API groups
if config.openapi_client:
settings.update(
DRFIntegration._configure_openapi_client_integration(config.openapi_client)
)
return settings
@staticmethod
def _configure_openapi_client_integration(openapi_client: OpenAPIClientConfig) -> Dict[str, Any]:
"""Configure DRF for API groups"""
settings = {}
# Generate API documentation settings
settings['SPECTACULAR_SETTINGS'] = {
'TITLE': 'API Documentation',
'DESCRIPTION': 'Auto-generated API documentation',
'VERSION': '1.0.0',
'SERVE_INCLUDE_SCHEMA': False,
}
# Configure throttling based on zones
throttle_classes = {}
for zone_name, zone in openapi_client.zones.items():
if zone.public:
throttle_classes[f'{zone_name}_anon'] = '100/hour'
throttle_classes[f'{zone_name}_user'] = '1000/hour'
else:
throttle_classes[f'{zone_name}_user'] = '500/hour'
settings['REST_FRAMEWORK']['DEFAULT_THROTTLE_CLASSES'] = [
'rest_framework.throttling.AnonRateThrottle',
'rest_framework.throttling.UserRateThrottle'
]
settings['REST_FRAMEWORK']['DEFAULT_THROTTLE_RATES'] = throttle_classes
return settings
class OpenAPIClientIntegration:
"""Django-CFG API Client Generation integration for API zones"""
@staticmethod
def generate_urls(openapi_client: OpenAPIClientConfig) -> str:
"""Generate URL patterns for API groups"""
url_patterns = []
for zone_name, zone in openapi_client.zones.items():
zone_urls = f"""
# {zone.title} - {zone.description}
path('{openapi_client.api_prefix}/{zone_name}/', include([
path('', include('{zone.apps[0]}.urls')),
path('docs/', SpectacularSwaggerView.as_view(url_name='schema-{zone_name}'),
name='{zone_name}-docs'),
path('schema/', SpectacularAPIView.as_view(
patterns=['{openapi_client.api_prefix}/{zone_name}/']
), name='schema-{zone_name}'),
])),"""
url_patterns.append(zone_urls)
return '\n'.join(url_patterns)
@staticmethod
def generate_settings(openapi_client: OpenAPIClientConfig) -> Dict[str, Any]:
"""Generate OpenAPI client-specific settings"""
return {
'DJANGO_OPENAPI_CLIENT': {
'API_PREFIX': openapi_client.api_prefix,
'ZONES': {
zone_name: {
'apps': zone.apps,
'public': zone.public,
'auth_required': zone.auth_required,
'version': zone.version,
}
for zone_name, zone in openapi_client.zones.items()
},
'MONOREPO_ENABLED': openapi_client.monorepo_enabled,
'MONOREPO_PATH': openapi_client.monorepo_path,
}
}Unfold Dashboard Integration
from django_cfg.models.third_party.unfold import UnfoldConfig
from typing import Dict, Any
class UnfoldIntegration:
"""Unfold admin dashboard integration"""
@staticmethod
def generate_settings(unfold: UnfoldConfig, dashboard: "DashboardConfig") -> Dict[str, Any]:
"""Generate Unfold dashboard settings"""
settings = {}
# Basic Unfold configuration
settings['UNFOLD'] = {
'SITE_TITLE': unfold.site_title,
'SITE_HEADER': unfold.site_header,
'SITE_URL': unfold.site_url,
'THEME': unfold.theme,
}
# Color configuration
if unfold.colors:
settings['UNFOLD']['COLORS'] = {
'primary': unfold.colors.primary,
'success': unfold.colors.success,
'info': unfold.colors.info,
'warning': unfold.colors.warning,
'danger': unfold.colors.danger,
}
# Sidebar configuration
if unfold.sidebar:
settings['UNFOLD']['SIDEBAR'] = {
'show_search': unfold.sidebar.show_search,
'show_all_applications': unfold.sidebar.show_all_applications,
}
# Dashboard integration
if dashboard:
settings['UNFOLD'].update(
UnfoldIntegration._configure_dashboard_integration(dashboard)
)
# Environment badge
if unfold.environment_callback:
settings['UNFOLD']['ENVIRONMENT'] = unfold.environment_callback
# Custom styles and scripts
if unfold.styles:
settings['UNFOLD']['STYLES'] = unfold.styles
if unfold.scripts:
settings['UNFOLD']['SCRIPTS'] = unfold.scripts
return settings
@staticmethod
def _configure_dashboard_integration(dashboard: "DashboardConfig") -> Dict[str, Any]:
"""Configure dashboard integration with Unfold"""
config = {}
# Navigation configuration
if dashboard.navigation:
config['NAVIGATION'] = [
{
'title': group.title,
'items': [
{
'title': item.title,
'url': item.url,
'icon': item.icon,
'permission': getattr(item, 'permission', None),
'external': getattr(item, 'external', False),
}
for item in group.items
]
}
for group in dashboard.navigation
]
return config🔄 Data Flow & Processing
Configuration Loading Flow
Settings Generation Process
class SettingsGenerator:
"""Generates Django settings from DjangoConfig"""
@staticmethod
def generate(config: "DjangoConfig") -> Dict[str, Any]:
"""Generate complete Django settings dictionary"""
settings = {}
# Core Django settings
settings.update(SettingsGenerator._generate_core_settings(config))
# Database settings
settings.update(SettingsGenerator._generate_database_settings(config))
# Cache settings
settings.update(SettingsGenerator._generate_cache_settings(config))
# Security settings
settings.update(SettingsGenerator._generate_security_settings(config))
# Third-party integrations
settings.update(SettingsGenerator._generate_integration_settings(config))
# Logging configuration
settings.update(SettingsGenerator._generate_logging_settings(config))
return settings
@staticmethod
def _generate_core_settings(config: "DjangoConfig") -> Dict[str, Any]:
"""Generate core Django settings"""
return {
'SECRET_KEY': config.secret_key,
'DEBUG': config.debug,
'ALLOWED_HOSTS': config.get_allowed_hosts(), # Auto-generated from security_domains
'ROOT_URLCONF': config.root_urlconf,
'WSGI_APPLICATION': config.wsgi_application,
'INSTALLED_APPS': config.get_installed_apps(),
'MIDDLEWARE': config.get_middleware(),
}
@staticmethod
def _generate_database_settings(config: "DjangoConfig") -> Dict[str, Any]:
"""Generate database settings"""
settings = {}
if config.databases:
settings['DATABASES'] = {
alias: db_config.to_django_config()
for alias, db_config in config.databases.items()
}
# Database routing
if config.database_routing:
settings['DATABASE_ROUTERS'] = ['django_cfg.routers.DatabaseRouter']
settings['DATABASE_ROUTING_RULES'] = [
rule.dict() for rule in config.database_routing
]
# Custom user model
if config.auth_user_model:
settings['AUTH_USER_MODEL'] = config.auth_user_model
return settings
@staticmethod
def _generate_cache_settings(config: "DjangoConfig") -> Dict[str, Any]:
"""Generate cache settings"""
caches = {}
if config.cache_default:
caches['default'] = config.cache_default.to_django_config(
config._environment, config.debug
)
if config.cache_sessions:
caches['sessions'] = config.cache_sessions.to_django_config(
config._environment, config.debug
)
settings = {}
if caches:
settings['CACHES'] = caches
# Configure session engine to use cache if available
if 'sessions' in caches:
settings['SESSION_ENGINE'] = 'django.contrib.sessions.backends.cache'
settings['SESSION_CACHE_ALIAS'] = 'sessions'
return settings