""" Django settings for config project. Generated by 'django-admin startproject' using Django 5.2.7. For more information on this file, see https://docs.djangoproject.com/en/5.2/topics/settings/ For the full list of settings and their values, see https://docs.djangoproject.com/en/5.2/ref/settings/ """ from pathlib import Path import os from dotenv import load_dotenv from django.utils.translation import gettext_lazy as _ BASE_DIR = Path(__file__).resolve().parent.parent load_dotenv(BASE_DIR.parent / ".env") SECRET_KEY = os.getenv("DJANGO_SECRET_KEY", "change-me") DEBUG = os.getenv("DJANGO_DEBUG", "true").lower() == "true" ALLOWED_HOSTS = [ "127.0.0.1", "localhost", os.getenv("HOST_FQDN", ""), ] CSRF_TRUSTED_ORIGINS = [ origin for origin in [ os.getenv("HOST_FQDN", ""), os.getenv("CSRF_TRUSTED_ORIGIN", "") ] if origin ] CSRF_TRUSTED_ORIGINS = [ f"https://{host}" if not host.startswith(("http://", "https://")) else host for host in CSRF_TRUSTED_ORIGINS ] # Cookies must always be HTTPS-only; SameSite=Lax keeps CSRF working behind the proxy. SESSION_COOKIE_SECURE = True CSRF_COOKIE_SECURE = True SESSION_COOKIE_SAMESITE = "None" CSRF_COOKIE_SAMESITE = "None" LANGUAGE_COOKIE_SAMESITE = "None" LANGUAGE_COOKIE_SECURE = True # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ # Application definition INSTALLED_APPS = [ 'jazzmin', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'core', 'configuration', ] MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.locale.LocaleMiddleware', # Added for i18n 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', # Disable X-Frame-Options middleware to allow Flatlogic preview iframes. # 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] X_FRAME_OPTIONS = 'ALLOWALL' ROOT_URLCONF = 'config.urls' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', 'django.template.context_processors.i18n', # Added for i18n # IMPORTANT: do not remove – injects PROJECT_DESCRIPTION/PROJECT_IMAGE_URL and cache-busting timestamp 'core.context_processors.project_context', ], }, }, ] WSGI_APPLICATION = 'config.wsgi.application' # Database # https://docs.djangoproject.com/en/5.2/ref/settings/#databases DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': os.getenv('DB_NAME', ''), 'USER': os.getenv('DB_USER', ''), 'PASSWORD': os.getenv('DB_PASS', ''), 'HOST': os.getenv('DB_HOST', '127.0.0.1'), 'PORT': os.getenv('DB_PORT', '3306'), 'OPTIONS': { 'charset': 'utf8mb4', }, }, } # Password validation # https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators AUTH_PASSWORD_VALIDATORS = [ { 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', }, { 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', }, { 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', }, { 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', }, ] # Internationalization # https://docs.djangoproject.com/en/5.2/topics/i18n/ LANGUAGE_CODE = 'ar' TIME_ZONE = 'UTC' USE_I18N = True USE_TZ = True LANGUAGES = [ ('en', _('English')), ('ar', _('Arabic')), ] LOCALE_PATHS = [ BASE_DIR / 'locale', ] # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/5.2/howto/static-files/ STATIC_URL = '/static/' # Collect static into a separate folder; avoid overlapping with STATICFILES_DIRS. STATIC_ROOT = BASE_DIR / 'staticfiles' STATICFILES_DIRS = [ BASE_DIR / 'static', BASE_DIR / 'assets', BASE_DIR / 'node_modules', ] MEDIA_URL = '/media/' MEDIA_ROOT = BASE_DIR / 'media' # Email EMAIL_BACKEND = os.getenv( "EMAIL_BACKEND", "django.core.mail.backends.smtp.EmailBackend" ) EMAIL_HOST = os.getenv("EMAIL_HOST", "127.0.0.1") EMAIL_PORT = int(os.getenv("EMAIL_PORT", "587")) EMAIL_HOST_USER = os.getenv("EMAIL_HOST_USER", "") EMAIL_HOST_PASSWORD = os.getenv("EMAIL_HOST_PASSWORD", "") EMAIL_USE_TLS = os.getenv("EMAIL_USE_TLS", "true").lower() == "true" EMAIL_USE_SSL = os.getenv("EMAIL_USE_SSL", "false").lower() == "true" DEFAULT_FROM_EMAIL = os.getenv("DEFAULT_FROM_EMAIL", "no-reply@example.com") CONTACT_EMAIL_TO = [ item.strip() for item in os.getenv("CONTACT_EMAIL_TO", DEFAULT_FROM_EMAIL).split(",") if item.strip() ] # When both TLS and SSL flags are enabled, prefer SSL explicitly if EMAIL_USE_SSL: EMAIL_USE_TLS = False # Default primary key field type # https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' # Authentication Redirects LOGIN_URL = 'login' LOGIN_REDIRECT_URL = 'profile' LOGOUT_REDIRECT_URL = 'index' JAZZMIN_SETTINGS = { # title of the window (Will default to current_admin_site.site_title if absent or None) "site_title": "School Admin", # Enable built-in language chooser "language_chooser": True, # Title on the login screen (19 chars max) (defaults to current_admin_site.site_header if absent or None) "site_header": "School", # Title on the brand (19 chars max) (defaults to current_admin_site.site_header if absent or None) "site_brand": "School Admin", # Logo to use for your site, must be present in static files, used for brand on top left # "site_logo": "books/img/logo.png", # CSS classes that are applied to the logo above "site_logo_classes": "img-circle", # Welcome text on the login screen "welcome_sign": "Welcome to the School Admin", # Copyright on the footer "copyright": "School Ltd", # List of model admins to search from the search bar, search defaults to all models "search_model": ["core.Student", "core.Resource"], # Field name on user model that contains avatar ImageField/URLField/Charfield or a callable that receives the user "user_avatar": None, ############ # Top Menu # ############ # Links to put along the top menu "topmenu_links": [ # Url that gets reversed (Permissions can be added) {"name": "Home", "url": "admin:index", "permissions": ["auth.view_user"]}, # external url that opens in a new window (Permissions can be added) {"name": "Support", "url": "https://github.com/farridav/django-jazzmin/issues", "new_window": True}, # model admin to link to (Permissions checked against model) {"model": "core.Student"}, ], ############# # User Menu # ############# # Additional links to include in the user menu on the top right ("app" url type is not allowed) "usermenu_links": [ {"name": "Support", "url": "https://github.com/farridav/django-jazzmin/issues", "new_window": True}, {"model": "core.Student"} ], ############# # Side Menu # ############# # Whether to display the side menu "show_sidebar": True, # Whether to aut expand the menu "navigation_expanded": True, # Hide these apps when generating side menu e.g (auth) "hide_apps": [], # Hide these models when generating side menu (e.g auth.user) "hide_models": [], # List of apps (and/or models) to base side menu ordering off of (does not need to contain all apps/models) "order_with_respect_to": ["core", "configuration", "auth"], # Custom icons for side menu apps/models See https://fontawesome.com/icons?d=gallery&m=free&v=5.0.0,5.0.1,5.0.10,5.0.11,5.0.12,5.0.13,5.1.0,5.1.1,5.2.0,5.3.0,5.3.1,5.4.0,5.4.1,5.4.2,5.13.0,5.12.0,5.11.2,5.11.1,5.10.0,5.5.0,5.6.0,5.6.1,5.6.3,5.7.0,5.7.1,5.7.2,5.8.0,5.8.1,5.8.2,5.9.0 "icons": { "auth": "fas fa-users-cog", "auth.user": "fas fa-user", "auth.Group": "fas fa-users", "core.Student": "fas fa-user-graduate", "core.Teacher": "fas fa-chalkboard-teacher", "core.Subject": "fas fa-book", "core.Resource": "fas fa-file-alt", "core.Classroom": "fas fa-layer-group", "configuration.ThawaniSettings": "fas fa-credit-card", "configuration.WablasSettings": "fas fa-comment-alt", "configuration.PlatformProfile": "fas fa-cogs", }, # Icons that are used when one is not manually specified "default_icon_parents": "fas fa-chevron-circle-right", "default_icon_children": "fas fa-circle", ################# # Related Modal # ################# # Use modals instead of popups "related_modal_active": False, ############# # UI Tweaks # ############# # Relative paths to custom CSS/JS scripts (must be present in static files) "custom_css": "css/admin_custom.css", "custom_js": None, # Whether to link font from fonts.googleapis.com (use custom_css to supply font otherwise) "use_google_fonts_cdn": True, # Whether to show the UI customizer on the sidebar "show_ui_builder": True, }