import os import logging from dotenv import load_dotenv BASEDIR = os.path.abspath(os.path.dirname(__file__)) load_dotenv(os.path.join(BASEDIR, ".env")) BOOL_STR = { 0: False, 1: True, "": False, "0": False, "1": True, "f": False, "false": False, "o": True, "on": True, "n": False, "t": True, "true": True, True: True, "v": True, "vrai": True, "y": True, } def to_bool(x) -> bool: """Cast value to boolean. The value may be encoded as a string False are: empty, "0", "False", "f", "n". True: all other values, such as "1", "True", "foo", "bar"... Case insentive, ignore leading and trailing spaces. """ if isinstance(x, str): return BOOL_STR.get(x.lower().strip(), True) return bool(x) class Config: """General configuration. Mostly loaded from environment via .env""" FLASK_ENV = None # # set in subclass SECRET_KEY = os.environ.get("SECRET_KEY") or "90e01e751977d4276a4c70d98564b425e" # LOG_TO_STDOUT = os.environ.get("LOG_TO_STDOUT") LOG_LEVEL = getattr(logging, os.environ.get("LOG_LEVEL", "INFO"), "INFO") MAIL_SERVER = os.environ.get("MAIL_SERVER", "localhost") LANGUAGES = ["fr", "en"] # unused for now ADMIN_MAIL = os.environ.get("ADMIN_MAIL") ADMIN_LOGIN = os.environ.get("ADMIN_LOGIN") or "admin" ADMINS = [ADMIN_MAIL] ERR_MAIL = os.environ.get("ERR_MAIL") # Le "from" des mails émis. Attention: peut être remplacée par la préférence email_from_addr: MAIL_FROM = os.environ.get("MAIL_FROM") or ("no-reply@" + MAIL_SERVER) AUTOSCO_DIR = os.environ.get("AUTOSCO_DIR", "/opt/autosco") AUTOSCO_VAR_DIR = os.environ.get("AUTOSCO_VAR_DIR", "/opt/autosco-data") AUTOSCO_LOG_FILE = os.path.join(AUTOSCO_VAR_DIR, "log", "autosco.log") # evite confusion avec le log nginx scodoc_error.log: AUTOSCO_ERR_FILE = os.path.join(AUTOSCO_VAR_DIR, "log", "autosco_exc.log") # MAX_CONTENT_LENGTH = 16 * 1024 * 1024 # Flask uploads (16Mo, en ligne avec nginx) # flask_json: JSON_ADD_STATUS = False JSON_USE_ENCODE_METHODS = True JSON_DATETIME_FORMAT = "%Y-%m-%dT%H:%M:%S%z" # "%Y-%m-%dT%H:%M:%S" # --- Lien avec API ScoDoc SCODOC_URL = os.environ.get("SCODOC_URL", "http://localhost:5000") SCODOC_LOGIN = os.environ.get("SCODOC_LOGIN", "autosco") SCODOC_PASSWORD = os.environ.get("SCODOC_PASSWORD") SCODOC_CHECK_CERTIFICATE = to_bool(os.environ.get("SCODOC_CHECK_CERTIFICATE", True)) API_TIMEOUT = 120 # 2 minutes API_URL = SCODOC_URL + "/ScoDoc/api" SCODOC_DEPT_ACRONYM = os.environ.get("SCODOC_DEPT_ACRONYM", "ESPL") def __getitem__(self, k) -> str | int | None: return getattr(self, k) def get(self, k, default=None): return getattr(self, k, default=default) class ProdConfig(Config): "mode production, normalement derrière nginx/gunicorn" FLASK_ENV = "production" DEBUG = False TESTING = False PREFERRED_URL_SCHEME = "https" class DevConfig(Config): "mode développement" FLASK_ENV = "development" DEBUG = True TESTING = False SECRET_KEY = os.environ.get("DEV_SECRET_KEY") or "cc4fbec7d9a34eb69a7e3e710087d87a" class TestConfig(DevConfig): "Pour les tests unitaires" TESTING = True DEBUG = False SERVER_NAME = os.environ.get("AUTOSCO_TEST_SERVER_NAME") or "autotest.gr" SECRET_KEY = os.environ.get("TEST_SECRET_KEY") or "c8ecff5db1592c308f563ff30e0f6bbc" class TestAPIConfig(Config): "Pour les tests de l'API" FLASK_ENV = "test_api" TESTING = False DEBUG = True SECRET_KEY = os.environ.get("TEST_SECRET_KEY") or "d8ecff5db15946789Hhahbh88aja276" mode = os.environ.get("FLASK_ENV", "production") if mode == "production": RunningConfig = ProdConfig elif mode == "development": RunningConfig = DevConfig elif mode == "test": RunningConfig = TestConfig elif mode == "test_api": RunningConfig = TestAPIConfig