Skip to Content

🔄 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