# # Gramps Web API - A RESTful API for the Gramps genealogy program # # Copyright (C) 2020-2022 David Straub # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # """Default configuration settings.""" import datetime from pathlib import Path from typing import Dict from PIL.Image import MAX_IMAGE_PIXELS from ._version import __version__ class DefaultConfig(object): """Default configuration object.""" PROPAGATE_EXCEPTIONS = True API_TITLE = "Gramps Web API" API_VERSION = __version__ OPENAPI_VERSION = "3.0.3" OPENAPI_URL_PREFIX = "/" OPENAPI_JSON_PATH = "api/openapi.json" OPENAPI_SWAGGER_UI_PATH = "/api/swagger-ui" OPENAPI_SWAGGER_UI_URL = "https://cdn.jsdelivr.net/npm/swagger-ui-dist/" SEARCH_INDEX_DIR = "indexdir" # deprecated! SEARCH_INDEX_DB_URI = "" # verify pooled connections on checkout, as idle ones can be dropped server-side SQLALCHEMY_ENGINE_OPTIONS = {"pool_pre_ping": True} EMAIL_HOST = "localhost" EMAIL_PORT = "465" EMAIL_HOST_USER = "" EMAIL_HOST_PASSWORD = "" EMAIL_USE_TLS = True EMAIL_USE_SSL = None EMAIL_USE_STARTTLS = None DEFAULT_FROM_EMAIL = "" BASE_URL = "http://localhost/" CORS_EXPOSE_HEADERS = ["X-Total-Count"] STATIC_PATH = "static" REQUEST_CACHE_CONFIG = { "CACHE_TYPE": "FileSystemCache", "CACHE_DIR": str(Path.cwd() / "request_cache"), "CACHE_THRESHOLD": 1000, "CACHE_DEFAULT_TIMEOUT": 0, } THUMBNAIL_CACHE_CONFIG = { "CACHE_TYPE": "FileSystemCache", "CACHE_DIR": str(Path.cwd() / "thumbnail_cache"), "CACHE_THRESHOLD": 1000, "CACHE_DEFAULT_TIMEOUT": 0, } PERSISTENT_CACHE_CONFIG = { "CACHE_TYPE": "FileSystemCache", "CACHE_DIR": str(Path.cwd() / "persistent_cache"), "CACHE_THRESHOLD": 0, "CACHE_DEFAULT_TIMEOUT": 0, } POSTGRES_USER = None POSTGRES_PASSWORD = None POSTGRES_HOST = "localhost" POSTGRES_PORT = "5432" IGNORE_DB_LOCK = False TREE_ID = "" CELERY_CONFIG: Dict[str, str] = {} # seconds without heartbeat after which a running task counts as lost TASK_HEARTBEAT_TIMEOUT = 300 # seconds after which a task still waiting in the queue counts as lost TASK_QUEUE_TIMEOUT = 6 * 3600 MEDIA_BASE_DIR = "" MEDIA_PREFIX_TREE = False REPORT_DIR = str(Path.cwd() / "report_cache") EXPORT_DIR = str(Path.cwd() / "export_cache") EXPORT_RETENTION_SECONDS = 24 * 60 * 60 # no default: on most deployments it would be ephemeral storage BACKUP_DIR = "" BACKUP_KEEP = 5 # backups kept per tree RATE_LIMIT_BACKUP = "10 per day" # per tree NEW_DB_BACKEND = "sqlite" RATE_LIMIT_MEDIA_ARCHIVE = "1 per hour" REGISTRATION_DISABLED = False LOG_LEVEL = "INFO" LLM_BASE_URL = None LLM_MODEL = "" LLM_MAX_CONTEXT_LENGTH = 50000 LLM_MAX_REQUESTS = 15 LLM_MAX_TOKENS = 200_000 LLM_MAX_OUTPUT_TOKENS = None LLM_SYSTEM_PROMPT = None # ignored since semantic search was removed in 3.25.0, see deprecations.py VECTOR_EMBEDDING_MODEL = "" VECTOR_EMBEDDING_BASE_URL = None VECTOR_EMBEDDING_API_KEY = None DISABLE_TELEMETRY = False SENTRY_DSN = "" SENTRY_ENVIRONMENT = "" SENTRY_TRACES_SAMPLE_RATE = 0.0 SENTRY_SEND_DEFAULT_PII = False OIDC_ISSUER = "" OIDC_CLIENT_ID = "" OIDC_CLIENT_SECRET = "" OIDC_ENABLED = False OIDC_DISABLE_LOCAL_AUTH = False OIDC_AUTO_REDIRECT = False OIDC_USERNAME_CLAIM = "preferred_username" OIDC_NAME = "OIDC" PILLOW_MAX_IMAGE_PIXELS = MAX_IMAGE_PIXELS MAX_THUMBNAIL_FILE_BYTES = 50 * 1024 * 1024 # 50 MB MAX_MEDIA_ARCHIVE_UPLOAD_BYTES = None class JWTConfig: """JWT settings. Not user-configurable; the frontend relies on them.""" JWT_TOKEN_LOCATION = ["headers", "query_string"] JWT_ACCESS_TOKEN_EXPIRES = datetime.timedelta(minutes=15) JWT_REFRESH_TOKEN_EXPIRES = False JWT_ERROR_MESSAGE_KEY = "message"