backend/config.py (102 lines of code) (raw):

import logging import os from dotenv import load_dotenv class EnvironmentConfig: """ Base class for configuration. """ """ Most settings can be defined through environment variables. """ # Load configuration from file load_dotenv( os.path.normpath( os.path.join(os.path.dirname(__file__), "..", "tasking-manager.env") ) ) # The base url the application is reachable APP_BASE_URL = os.getenv("TM_APP_BASE_URL", "http://127.0.0.1:5000/") if APP_BASE_URL.endswith("/"): APP_BASE_URL = APP_BASE_URL[:-1] API_VERSION = os.getenv("TM_APP_API_VERSION", "v2") ORG_CODE = os.getenv("TM_ORG_CODE", "") ORG_NAME = os.getenv("TM_ORG_NAME", "") ORG_LOGO = os.getenv( "TM_ORG_LOGO", "https://cdn.hotosm.org/tasking-manager/uploads/1588741335578_hot-logo.png", ) ENVIRONMENT = os.getenv("TM_ENVIRONMENT", "") # The default tag used in the OSM changeset comment DEFAULT_CHANGESET_COMMENT = os.getenv("TM_DEFAULT_CHANGESET_COMMENT", None) # The address to use as the sender on auto generated emails EMAIL_FROM_ADDRESS = os.getenv("TM_EMAIL_FROM_ADDRESS", None) # The address to use as the receiver in contact form. EMAIL_CONTACT_ADDRESS = os.getenv("TM_EMAIL_CONTACT_ADDRESS", None) # A freely definable secret key for connecting the front end with the back end SECRET_KEY = os.getenv("TM_SECRET", None) # OSM API, Nomimatim URLs OSM_SERVER_URL = os.getenv("OSM_SERVER_URL", "https://www.openstreetmap.org") OSM_NOMINATIM_SERVER_URL = os.getenv( "OSM_NOMINATIM_SERVER_URL", "https://nominatim.openstreetmap.org" ) # Database connection POSTGRES_USER = os.getenv("POSTGRES_USER", None) POSTGRES_PASSWORD = os.getenv("POSTGRES_PASSWORD", None) POSTGRES_ENDPOINT = os.getenv("POSTGRES_ENDPOINT", "postgresql") POSTGRES_DB = os.getenv("POSTGRES_DB", None) POSTGRES_PORT = os.getenv("POSTGRES_PORT", "5432") # Assamble the database uri if os.getenv("TM_DB", False): SQLALCHEMY_DATABASE_URI = os.getenv("TM_DB", None) elif os.getenv("TM_DB_CONNECT_PARAM_JSON", False): """ This section reads JSON formatted Database connection parameters passed from AWS Secrets Manager with the ENVVAR key `TM_DB_CONNECT_PARAM_JSON` and forms a valid SQLALCHEMY DATABASE URI """ import json _params = json.loads(os.getenv("TM_DB_CONNECT_PARAM_JSON", None)) SQLALCHEMY_DATABASE_URI = ( f"postgresql://{_params.get('username')}" + f":{_params.get('password')}" + f"@{_params.get('host')}" + f":{_params.get('port')}" + f"/{_params.get('dbname')}" ) else: SQLALCHEMY_DATABASE_URI = ( f"postgresql://{POSTGRES_USER}" + f":{POSTGRES_PASSWORD}" + f"@{POSTGRES_ENDPOINT}:" + f"{POSTGRES_PORT}" + f"/{POSTGRES_DB}" ) # Logging settings LOG_LEVEL = os.getenv("TM_LOG_LEVEL", logging.DEBUG) LOG_DIR = os.getenv("TM_LOG_DIR", "logs") # Mapper Level values represent number of OSM changesets MAPPER_LEVEL_INTERMEDIATE = int(os.getenv("TM_MAPPER_LEVEL_INTERMEDIATE", 250)) MAPPER_LEVEL_ADVANCED = int(os.getenv("TM_MAPPER_LEVEL_ADVANCED", 500)) # Time to wait until task auto-unlock (e.g. '2h' or '7d' or '30m' or '1h30m') TASK_AUTOUNLOCK_AFTER = os.getenv("TM_TASK_AUTOUNLOCK_AFTER", "2h") # Configuration for sending emails SMTP_SETTINGS = { "host": os.getenv("TM_SMTP_HOST", None), "smtp_user": os.getenv("TM_SMTP_USER", None), "smtp_port": os.getenv("TM_SMTP_PORT", 25), "smtp_password": os.getenv("TM_SMTP_PASSWORD", None), } # Languages offered by the Tasking Manager # Please note that there must be exactly the same number of Codes as languages. SUPPORTED_LANGUAGES = { "codes": os.getenv( "TM_SUPPORTED_LANGUAGES_CODES", "ar, cs, de, el, en, es, fa_IR, fr, he, hu, id, it, ja, ko, mg, ml, nl_NL, pt, pt_BR, ru, sv, sw, tl, tr, uk, zh_TW", # noqa ), "languages": os.getenv( "TM_SUPPORTED_LANGUAGES", "عربى, Čeština, Deutsch, Ελληνικά, English, Español, فارسی, Français, עברית, Magyar, Indonesia, Italiano, 日本語, 한국어, Malagasy, Malayalam, Nederlands, Português, Português (Brasil), Русский язык, Svenska, Kiswahili, Filipino (Tagalog), Türkçe, Українська, 繁體中文", # noqa ), } # Connection to OSM authentification system OSM_OAUTH_SETTINGS = { "base_url": "{}/api/0.6/".format(OSM_SERVER_URL), "consumer_key": os.getenv("TM_CONSUMER_KEY", None), "consumer_secret": os.getenv("TM_CONSUMER_SECRET", None), "request_token_url": "{}/oauth/request_token".format(OSM_SERVER_URL), "access_token_url": "{}/oauth/access_token".format(OSM_SERVER_URL), "authorize_url": "{}/oauth/authorize".format(OSM_SERVER_URL), } # Some more definitions (not overridable) SEND_FILE_MAX_AGE_DEFAULT = 0 SQLALCHEMY_TRACK_MODIFICATIONS = False SQLALCHEMY_POOL_SIZE = 10 SQLALCHEMY_MAX_OVERFLOW = 10 # Image upload Api IMAGE_UPLOAD_API_KEY = os.getenv("TM_IMAGE_UPLOAD_API_KEY", None) IMAGE_UPLOAD_API_URL = os.getenv("TM_IMAGE_UPLOAD_API_URL", None) # Sentry backend DSN SENTRY_BACKEND_DSN = os.getenv("TM_SENTRY_BACKEND_DSN", None) class TestEnvironmentConfig(EnvironmentConfig): POSTGRES_USER = os.getenv("POSTGRES_USER", None) POSTGRES_PASSWORD = os.getenv("POSTGRES_PASSWORD", None) POSTGRES_ENDPOINT = os.getenv("POSTGRES_ENDPOINT", "localhost") POSTGRES_DB = os.getenv("POSTGRES_DB", None) POSTGRES_PORT = os.getenv("POSTGRES_PORT", "5432") SQLALCHEMY_DATABASE_URI = ( f"postgresql://{POSTGRES_USER}" + f":{POSTGRES_PASSWORD}" + f"@{POSTGRES_ENDPOINT}:" + f"{POSTGRES_PORT}" + f"/test_{POSTGRES_DB}" )