Coverage for dalima/settings.py: 95%
54 statements
« prev ^ index » next coverage.py v7.10.1, created at 2025-07-29 15:38 +0000
« prev ^ index » next coverage.py v7.10.1, created at 2025-07-29 15:38 +0000
1"""
2Django settings for dalima project.
4Generated by "django-admin startproject" using Django 5.1.6.
6For more information on this file, see
7https://docs.djangoproject.com/en/5.1/topics/settings/
9For the full list of settings and their values, see
10https://docs.djangoproject.com/en/5.1/ref/settings/
11"""
13from pathlib import Path
15import environ # type: ignore[import-untyped]
16import sentry_sdk
18# Build paths inside the project like this: BASE_DIR / "subdir".
19BASE_DIR = Path(__file__).resolve().parent.parent
21# Take environment variables form system and from .env file
22# See https://django-environ.readthedocs.io/en/latest/quickstart.html
23env = environ.Env()
24environ.Env.read_env(Path(BASE_DIR / ".env"))
27# Initialize Sentry
28# See https://docs.sentry.io/platforms/python/integrations/django/
29sentry_sdk.init(
30 dsn=env.str("SENTRY_DSN"),
31 environment=env.str("SENTRY_ENVIRONMENT"),
32 traces_sample_rate=1.0,
33 profiles_sample_rate=env.float("SENTRY_PROFILES_SAMPLE_RATE"),
34)
37# Quick-start development settings - unsuitable for production
38# See https://docs.djangoproject.com/en/5.1/howto/deployment/checklist/
39SECRET_KEY = env.str("SECRET_KEY")
40DEBUG: bool = env.bool("DEBUG")
41ALLOWED_HOSTS = env.list("ALLOWED_HOSTS")
43# Django Debug DebugToolbar
44# See https://django-debug-toolbar.readthedocs.io/en/latest/installation.html
45INTERNAL_IPS = [
46 "127.0.0.1",
47]
50# Application definition
51INSTALLED_APPS = [
52 "whitenoise.runserver_nostatic",
53 "crispy_forms",
54 "crispy_bootstrap5",
55 "django_extensions",
56 "django.contrib.admin",
57 "django.contrib.auth",
58 "django.contrib.contenttypes",
59 "django.contrib.sessions",
60 "django.contrib.messages",
61 "django.contrib.staticfiles",
62 "datacite",
63 "network",
64 "extra_views",
65 "widget_tweaks",
66]
68MIDDLEWARE = [
69 "django.middleware.security.SecurityMiddleware",
70 "whitenoise.middleware.WhiteNoiseMiddleware",
71 "django.contrib.sessions.middleware.SessionMiddleware",
72 "django.middleware.common.CommonMiddleware",
73 "django.middleware.csrf.CsrfViewMiddleware",
74 "django.contrib.auth.middleware.AuthenticationMiddleware",
75 "django.contrib.messages.middleware.MessageMiddleware",
76 "django.middleware.clickjacking.XFrameOptionsMiddleware",
77]
79if DEBUG: 79 ↛ 83line 79 didn't jump to line 83 because the condition on line 79 was always true
80 INSTALLED_APPS.append("debug_toolbar")
81 MIDDLEWARE.insert(1, "debug_toolbar.middleware.DebugToolbarMiddleware")
83ROOT_URLCONF = "dalima.urls"
85TEMPLATES = [
86 {
87 "BACKEND": "django.template.backends.django.DjangoTemplates",
88 "DIRS": [BASE_DIR / "templates"],
89 "APP_DIRS": True,
90 "OPTIONS": {
91 "context_processors": [
92 "django.template.context_processors.debug",
93 "django.template.context_processors.request",
94 "django.contrib.auth.context_processors.auth",
95 "django.contrib.messages.context_processors.messages",
96 ],
97 },
98 },
99]
101CRISPY_ALLOWED_TEMPLATE_PACKS = "bootstrap5"
102CRISPY_TEMPLATE_PACK = "bootstrap5"
103CRISPY_FAIL_SILENTLY = not DEBUG
105# Compressed and manifest static files
106# https://whitenoise.readthedocs.io/en/latest/django.html
107STORAGES = {
108 "staticfiles": {
109 "BACKEND": "django.contrib.staticfiles.storage.StaticFilesStorage"
110 if DEBUG
111 else "whitenoise.storage.CompressedManifestStaticFilesStorage",
112 },
113}
114MESSAGE_STORAGE = "django.contrib.messages.storage.session.SessionStorage"
116WSGI_APPLICATION = "dalima.wsgi.application"
119# Database
120# https://docs.djangoproject.com/en/5.1/ref/settings/#databases
121DATABASES = {
122 "default": {
123 "ENGINE": env.str("DATABASE_ENGINE"),
124 "NAME": env.str("DATABASE_NAME"),
125 "USER": env.str("DATABASE_USER"),
126 "PASSWORD": env.str("DATABASE_PASSWORD"),
127 "HOST": env.str("DATABASE_HOST"),
128 "PORT": env.int("DATABASE_PORT"),
129 "CONN_MAX_AGE": env.int("DATABASE_CONN_MAX_AGE"),
130 "CONN_HEALTH_CHECKS": env.bool("DATABASE_CONN_HEALTH_CHECKS"),
131 }
132}
135# Password validation
136# https://docs.djangoproject.com/en/5.1/ref/settings/#auth-password-validators
137AUTH_PASSWORD_VALIDATORS = [
138 {
139 "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator", # noqa: E501
140 },
141 {
142 "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator",
143 },
144 {
145 "NAME": "django.contrib.auth.password_validation.CommonPasswordValidator",
146 },
147 {
148 "NAME": "django.contrib.auth.password_validation.NumericPasswordValidator",
149 },
150]
151# Logging
152LOG_LEVEL = env.str("LOG_LEVEL", "INFO")
153LOGGING = {
154 "version": 1,
155 "disable_existing_loggers": False,
156 "handlers": {
157 "console_custom": {"level": LOG_LEVEL, "class": "logging.StreamHandler"}
158 },
159 "loggers": {
160 "datacite": {"level": LOG_LEVEL, "handlers": ["console_custom"]},
161 "network": {"level": LOG_LEVEL, "handlers": ["console_custom"]},
162 },
163}
166# Internationalization
167# https://docs.djangoproject.com/en/5.1/topics/i18n/
168LANGUAGE_CODE = "en-us"
170TIME_ZONE = "UTC"
172USE_I18N = True
174USE_TZ = True
177# Static files (CSS, JavaScript, Images)
178# https://docs.djangoproject.com/en/5.1/howto/static-files/
179STATIC_ROOT = env.path("STATIC_ROOT")
180STATIC_URL = env.str("STATIC_URL", "static/")
181WHITENOISE_STATIC_PREFIX = env.str("WHITENOISE_STATIC_PREFIX", "/static/")
183# Default primary key field type
184# https://docs.djangoproject.com/en/5.1/ref/settings/#default-auto-field
185DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"
187# Supported prefixes : they could be fetched from Datacite (https://api.test.datacite.org/client/**)
188DEFAULT_DOI_PREFIX = "10.15778"
189SUPPORTED_DOI_PREFIXES = env.list(
190 "SUPPORTED_DOI_PREFIXES", default=[DEFAULT_DOI_PREFIX]
191)
192if not SUPPORTED_DOI_PREFIXES: # avoid empty list 192 ↛ 193line 192 didn't jump to line 193 because the condition on line 192 was never true
193 SUPPORTED_DOI_PREFIXES = [DEFAULT_DOI_PREFIX]
195# Datacite
196DATACITE_BASE_URL = env.str("DATACITE_BASE_URL", "https://api.test.datacite.org/")
197DATACITE_USER = env.str("DATACITE_USER")
198DATACITE_PASSWORD = env.str("DATACITE_PASSWORD")
199DATACITE_TIMEOUT = env.int("DATACITE_TIMEOUT", 10)
200DEFAULT_PUBLISHER_ID = env.str(
201 "DEFAULT_PUBLISHER_ID", "https://www.re3data.org/repository/r3d100012222"
202)
203DEFAULT_CREATOR_NAME = env.str("DEFAULT_CREATOR_NAME", "Epos-France")
204DEFAULT_RESOURCE_TYPE = env.str("DEFAULT_RESOURCE_TYPE", "Seismic Network")
206# DC
207DC_URL = env.str("DC_URL")
208DC_MAIL = env.str("DC_MAIL")
209LANDING_PAGE_BASE_URL = env.str(
210 "LANDING_PAGE_BASE_URL", "https://seismology.resif.fr/networks/#/"
211)
213# FDSN
214FDSN_BASE_URL = env.str("FDSN_BASE_URL", "https://www.fdsn.org/ws/")
215FDSN_NETWORK_URL = env.str(
216 "FDSN_NETWORK_URL", "https://fdsn.fdsn.org/ws/networks/1/query"
217)
219# Other
220DEFAULT_FREE_LICENSE = env.str("DEFAULT_FREE_LICENSE", "cc-by-4.0")
221DEFAULT_EMBARGO_LICENSE = env.str("DEFAULT_EMBARGO_LICENSE", "Embargoed access")