"""
Django settings for website project.

Generated by 'django-admin startproject' using Django 3.2.8.

For more information on this file, see
https://docs.djangoproject.com/en/3.2/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.2/ref/settings/
"""
import os
from pathlib import Path

from dotenv import load_dotenv

# take environment variables from .env.
load_dotenv()

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent.parent

# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = os.environ.get('DJANGO_SECRET_KEY')

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app1',
    'app2',
    'app3',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'website.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],  # BASE_DIR / 'templates'
        'APP_DIRS': True,  # 告知引擎是否再已安裝應用程序中查找 Templates 模板。
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
            # 可在 template 模板中取消 {% load static %}
            'builtins': ['django.templatetags.static'],
        },
    },
]

WSGI_APPLICATION = 'website.wsgi.application'

# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    },
    'primary': {
        'ENGINE': 'mssql',
        'NAME': os.environ.get('PRIMARY_DATABASE_NAME'),
        'USER': os.environ.get('PRIMARY_DATABASE_USER'),
        'PASSWORD': os.environ.get('PRIMARY_DATABASE_PASSWORD'),
        'HOST': os.environ.get('PRIMARY_DATABASE_HOST'),
        'PORT': os.environ.get('PRIMARY_DATABASE_PORT'),
        'OPTIONS': {
            'driver': 'ODBC Driver 17 for SQL Server',
        },
    },
    'secondary': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': os.environ.get('SECONDARY_DATABASE_NAME'),
        'USER': os.environ.get('SECONDARY_DATABASE_USER'),
        'PASSWORD': os.environ.get('SECONDARY_DATABASE_PASSWORD'),
        'HOST': os.environ.get('SECONDARY_DATABASE_HOST'),
        'PORT': os.environ.get('SECONDARY_DATABASE_PORT'),
        'OPTIONS': {
            # 存儲引擎啟用嚴格模式，非法數據值被拒絕
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
            'charset': 'utf8',
        },
    },
    'third': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': os.environ.get('THIRD_DATABASE_NAME'),
        'USER': os.environ.get('THIRD_DATABASE_USER'),
        'PASSWORD': os.environ.get('THIRD_DATABASE_PASSWORD'),
        'HOST': os.environ.get('THIRD_DATABASE_HOST'),
        'PORT': os.environ.get('THIRD_DATABASE_PORT'),
        'default-character-set': 'utf8',
        'OPTIONS': {
            # 存儲引擎啟用嚴格模式，非法數據值被拒絕
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
            'charset': 'utf8',
        },
    },
}

# DATABASE_ROUTERS 定義 app 對應資料庫路由規則。
DATABASE_ROUTERS = ['website.settings.database_router.DatabaseAppsRouter']

DATABASE_APPS_MAPPING = {
    'accounts': 'default',
    'admin': 'default',
    'auth': 'default',
    'contenttypes': 'default',
    'django_cache': 'default',
    'messages': 'default',
    'sessions': 'default',
    'staticfiles': 'default',
    'app1': 'primary',  # db1
    'app2': 'secondary',  # db2
    'app3': 'third',  # db3
}

# Django’s cache framework
# https://docs.djangoproject.com/en/3.2/topics/cache/#django-s-cache-framework
# https://docs.djangoproject.com/zh-hans/3.2/ref/settings/#caches

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
        'LOCATION': os.environ.get('DEFAULT_CACHES_HOST'),
    },
    'primary': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': os.environ.get('PRIMARY_REDIS_HOST'),
        'KEY_PREFIX': 'Cache_primary',  # 緩存鍵前缀
        'OPTIONS': {
            'CLIENT_CLASS': 'django_redis.client.DefaultClient',
            'PASSWORD': os.environ.get('PRIMARY_REDIS_PASSWORD'),
            "SOCKET_CONNECT_TIMEOUT": 5,  # 「建立連接」的超時時間，seconds
            "SOCKET_TIMEOUT": 5,  # 建立連接後「讀寫操作」的超時時間，seconds
        },
        'TIMEOUT': 180,  # 預設 300 seconds
    },
    'secondary': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': os.environ.get('SECONDARY_REDIS_HOST'),
        'KEY_PREFIX': 'Cache_secondary',  # 緩存鍵前缀
        'OPTIONS': {
            'CLIENT_CLASS': 'django_redis.client.DefaultClient',
            'PASSWORD': os.environ.get('SECONDARY_REDIS_PASSWORD'),
            "SOCKET_CONNECT_TIMEOUT": 5,  # 「建立連接」的超時時間，seconds
            "SOCKET_TIMEOUT": 5,  # 建立連接後「讀寫操作」的超時時間，seconds
        },
        'TIMEOUT': 180,  # 預設 300 seconds
    },
}

# 控制 Django 存儲會話數據的地方，預設為 'django.contrib.sessions.backends.db'
# SESSION_ENGINE = 'django.contrib.sessions.backends.cache'

# 如果使用的是 cache-based session storage，則必須選擇要使用的緩存，預設為 'default'
# SESSION_CACHE_ALIAS = 'default'

# Password validation
# https://docs.djangoproject.com/en/3.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/3.2/topics/i18n/

LANGUAGE_CODE = 'zh-Hant'

TIME_ZONE = 'Asia/Taipei'

USE_I18N = True

USE_L10N = True

USE_TZ = False  # 因 MySQL 沒有設定時區表，故使用 TIME_ZONE 所設定之時區

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.2/howto/static-files/

STATIC_URL = '/static/'

STATICFILES_DIRS = [BASE_DIR / 'static']  # 開發時，使用runserver 時， Django 會自動加載靜態文件

# Default primary key field type
# https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

# 對 CSRF cookie 使用 HttpOnly 標誌，客戶端的 JS 無法直接訪問 cookie 取得 CSRF-Token，預設為 False
# CSRF_COOKIE_HTTPONLY = True

# 對於 CSRF 類似 Cookie 的名稱，預設為 'csrftoken'
# CSRF_COOKIE_NAME = 'csrftoken'

# 如果設置為 True，cookie 將被標記為 安全，這意味著瀏覽器可以確保 cookie 只在 HTTPS 連接下發送，預設為 False
# CSRF_COOKIE_SECURE = True

# 自定義 CSRF 錯誤頁面
# CSRF_FAILURE_VIEW = 'website.views.csrf_failure'

# 用於 CSRF 認證的請求頭的名稱，預設為 'HTTP_X_CSRFTOKEN'，則前端需傳遞 'X_CSRFTOKEN' 頭
# CSRF_HEADER_NAME = 'HTTP_X_CSRFTOKEN'

# 自定義 session 對應 cookie 的名稱(在客戶端)，預設為 'sessionid'
# SESSION_COOKIE_NAME = 'sessionid'

# set-cookie 標記為 secure ，確保 cookie 只在 HTTPS 連接下傳送
# SESSION_COOKIE_SECURE = True

# 設置 X-Frame-Options 為同源政策時，才能被嵌入到 frame 中
# X_FRAME_OPTIONS = 'SAMEORIGIN'

"""
Django settings for website project.

Generated by 'django-admin startproject' using Django 3.2.8.

For more information on this file, see
https://docs.djangoproject.com/en/3.2/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.2/ref/settings/
"""
import os
from pathlib import Path

from dotenv import load_dotenv

# take environment variables from .env.
load_dotenv()

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent.parent

# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = os.environ.get('DJANGO_SECRET_KEY')

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app1',
    'app2',
    'app3',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'website.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],  # BASE_DIR / 'templates'
        'APP_DIRS': True,  # 告知引擎是否再已安裝應用程序中查找 Templates 模板。
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
            # 可在 template 模板中取消 {% load static %}
            'builtins': ['django.templatetags.static'],
        },
    },
]

WSGI_APPLICATION = 'website.wsgi.application'

# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    },
    'primary': {
        'ENGINE': 'mssql',
        'NAME': os.environ.get('PRIMARY_DATABASE_NAME'),
        'USER': os.environ.get('PRIMARY_DATABASE_USER'),
        'PASSWORD': os.environ.get('PRIMARY_DATABASE_PASSWORD'),
        'HOST': os.environ.get('PRIMARY_DATABASE_HOST'),
        'PORT': os.environ.get('PRIMARY_DATABASE_PORT'),
        'OPTIONS': {
            'driver': 'ODBC Driver 17 for SQL Server',
        },
    },
    'secondary': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': os.environ.get('SECONDARY_DATABASE_NAME'),
        'USER': os.environ.get('SECONDARY_DATABASE_USER'),
        'PASSWORD': os.environ.get('SECONDARY_DATABASE_PASSWORD'),
        'HOST': os.environ.get('SECONDARY_DATABASE_HOST'),
        'PORT': os.environ.get('SECONDARY_DATABASE_PORT'),
        'OPTIONS': {
            # 存儲引擎啟用嚴格模式，非法數據值被拒絕
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
            'charset': 'utf8',
        },
    },
    'third': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': os.environ.get('THIRD_DATABASE_NAME'),
        'USER': os.environ.get('THIRD_DATABASE_USER'),
        'PASSWORD': os.environ.get('THIRD_DATABASE_PASSWORD'),
        'HOST': os.environ.get('THIRD_DATABASE_HOST'),
        'PORT': os.environ.get('THIRD_DATABASE_PORT'),
        'default-character-set': 'utf8',
        'OPTIONS': {
            # 存儲引擎啟用嚴格模式，非法數據值被拒絕
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
            'charset': 'utf8',
        },
    },
}

# DATABASE_ROUTERS 定義 app 對應資料庫路由規則。
DATABASE_ROUTERS = ['website.settings.database_router.DatabaseAppsRouter']

DATABASE_APPS_MAPPING = {
    'accounts': 'default',
    'admin': 'default',
    'auth': 'default',
    'contenttypes': 'default',
    'django_cache': 'default',
    'messages': 'default',
    'sessions': 'default',
    'staticfiles': 'default',
    'app1': 'primary',  # db1
    'app2': 'secondary',  # db2
    'app3': 'third',  # db3
}

# Django’s cache framework
# https://docs.djangoproject.com/en/3.2/topics/cache/#django-s-cache-framework
# https://docs.djangoproject.com/zh-hans/3.2/ref/settings/#caches

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
        'LOCATION': os.environ.get('DEFAULT_CACHES_HOST'),
    },
    'primary': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': os.environ.get('PRIMARY_REDIS_HOST'),
        'KEY_PREFIX': 'Cache_primary',  # 緩存鍵前缀
        'OPTIONS': {
            'CLIENT_CLASS': 'django_redis.client.DefaultClient',
            'PASSWORD': os.environ.get('PRIMARY_REDIS_PASSWORD'),
            "SOCKET_CONNECT_TIMEOUT": 5,  # 「建立連接」的超時時間，seconds
            "SOCKET_TIMEOUT": 5,  # 建立連接後「讀寫操作」的超時時間，seconds
        },
        'TIMEOUT': 180,  # 預設 300 seconds
    },
    'secondary': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': os.environ.get('SECONDARY_REDIS_HOST'),
        'KEY_PREFIX': 'Cache_secondary',  # 緩存鍵前缀
        'OPTIONS': {
            'CLIENT_CLASS': 'django_redis.client.DefaultClient',
            'PASSWORD': os.environ.get('SECONDARY_REDIS_PASSWORD'),
            "SOCKET_CONNECT_TIMEOUT": 5,  # 「建立連接」的超時時間，seconds
            "SOCKET_TIMEOUT": 5,  # 建立連接後「讀寫操作」的超時時間，seconds
        },
        'TIMEOUT': 180,  # 預設 300 seconds
    },
}

# 控制 Django 存儲會話數據的地方，預設為 'django.contrib.sessions.backends.db'
# SESSION_ENGINE = 'django.contrib.sessions.backends.cache'

# 如果使用的是 cache-based session storage，則必須選擇要使用的緩存，預設為 'default'
# SESSION_CACHE_ALIAS = 'default'

# Password validation
# https://docs.djangoproject.com/en/3.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/3.2/topics/i18n/

LANGUAGE_CODE = 'zh-Hant'

TIME_ZONE = 'Asia/Taipei'

USE_I18N = True

USE_L10N = True

USE_TZ = False  # 因 MySQL 沒有設定時區表，故使用 TIME_ZONE 所設定之時區

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.2/howto/static-files/

STATIC_URL = '/static/'

STATICFILES_DIRS = [BASE_DIR / 'static']  # 開發時，使用runserver 時， Django 會自動加載靜態文件

# Default primary key field type
# https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

# 對 CSRF cookie 使用 HttpOnly 標誌，客戶端的 JS 無法直接訪問 cookie 取得 CSRF-Token，預設為 False
# CSRF_COOKIE_HTTPONLY = True

# 對於 CSRF 類似 Cookie 的名稱，預設為 'csrftoken'
# CSRF_COOKIE_NAME = 'csrftoken'

# 如果設置為 True，cookie 將被標記為 安全，這意味著瀏覽器可以確保 cookie 只在 HTTPS 連接下發送，預設為 False
# CSRF_COOKIE_SECURE = True

# 自定義 CSRF 錯誤頁面
# CSRF_FAILURE_VIEW = 'website.views.csrf_failure'

# 用於 CSRF 認證的請求頭的名稱，預設為 'HTTP_X_CSRFTOKEN'，則前端需傳遞 'X_CSRFTOKEN' 頭
# CSRF_HEADER_NAME = 'HTTP_X_CSRFTOKEN'

# 自定義 session 對應 cookie 的名稱(在客戶端)，預設為 'sessionid'
# SESSION_COOKIE_NAME = 'sessionid'

# set-cookie 標記為 secure ，確保 cookie 只在 HTTPS 連接下傳送
# SESSION_COOKIE_SECURE = True

# 設置 X-Frame-Options 為同源政策時，才能被嵌入到 frame 中
# X_FRAME_OPTIONS = 'SAMEORIGIN'

Django settings for website project.  Generated by 'django-admin startproject' using Django 3.2.8.  For more information on this file, see https://docs.djangoproject.com/en/3.2/topics/settings/  For the full list of settings and their values, see https://docs.djangoproject.com/en/3.2/ref/settings/ # take environment variables from .env. # Build paths inside the project like this: BASE_DIR / 'subdir'. # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! # Application definition # BASE_DIR / 'templates' # 告知引擎是否再已安裝應用程序中查找 Templates 模板。 # 可在 template 模板中取消 {% load static %} # Database # https://docs.djangoproject.com/en/3.2/ref/settings/#databases # 存儲引擎啟用嚴格模式，非法數據值被拒絕 # 存儲引擎啟用嚴格模式，非法數據值被拒絕 # DATABASE_ROUTERS 定義 app 對應資料庫路由規則。 # db1 # db2 # db3 # Django’s cache framework # https://docs.djangoproject.com/en/3.2/topics/cache/#django-s-cache-framework # https://docs.djangoproject.com/zh-hans/3.2/ref/settings/#caches # 緩存鍵前缀 # 「建立連接」的超時時間，seconds # 建立連接後「讀寫操作」的超時時間，seconds # 預設 300 seconds # 緩存鍵前缀 # 「建立連接」的超時時間，seconds # 建立連接後「讀寫操作」的超時時間，seconds # 預設 300 seconds # 控制 Django 存儲會話數據的地方，預設為 'django.contrib.sessions.backends.db' # SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 如果使用的是 cache-based session storage，則必須選擇要使用的緩存，預設為 'default' # SESSION_CACHE_ALIAS = 'default' # Password validation # https://docs.djangoproject.com/en/3.2/ref/settings/#auth-password-validators # Internationalization # https://docs.djangoproject.com/en/3.2/topics/i18n/ # 因 MySQL 沒有設定時區表，故使用 TIME_ZONE 所設定之時區 # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/3.2/howto/static-files/ # 開發時，使用runserver 時， Django 會自動加載靜態文件 # Default primary key field type # https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field # 對 CSRF cookie 使用 HttpOnly 標誌，客戶端的 JS 無法直接訪問 cookie 取得 CSRF-Token，預設為 False # CSRF_COOKIE_HTTPONLY = True # 對於 CSRF 類似 Cookie 的名稱，預設為 'csrftoken' # CSRF_COOKIE_NAME = 'csrftoken' # 如果設置為 True，cookie 將被標記為 安全，這意味著瀏覽器可以確保 cookie 只在 HTTPS 連接下發送，預設為 False # CSRF_COOKIE_SECURE = True # 自定義 CSRF 錯誤頁面 # CSRF_FAILURE_VIEW = 'website.views.csrf_failure' # 用於 CSRF 認證的請求頭的名稱，預設為 'HTTP_X_CSRFTOKEN'，則前端需傳遞 'X_CSRFTOKEN' 頭 # CSRF_HEADER_NAME = 'HTTP_X_CSRFTOKEN' # 自定義 session 對應 cookie 的名稱(在客戶端)，預設為 'sessionid' # SESSION_COOKIE_NAME = 'sessionid' # set-cookie 標記為 secure ，確保 cookie 只在 HTTPS 連接下傳送 # SESSION_COOKIE_SECURE = True # 設置 X-Frame-Options 為同源政策時，才能被嵌入到 frame 中 # X_FRAME_OPTIONS = 'SAMEORIGIN'