Coverage for dalima/settings.py: 95%

54 statements  

« prev     ^ index     » next       coverage.py v7.10.1, created at 2025-07-29 15:38 +0000

1""" 

2Django settings for dalima project. 

3 

4Generated by "django-admin startproject" using Django 5.1.6. 

5 

6For more information on this file, see 

7https://docs.djangoproject.com/en/5.1/topics/settings/ 

8 

9For the full list of settings and their values, see 

10https://docs.djangoproject.com/en/5.1/ref/settings/ 

11""" 

12 

13from pathlib import Path 

14 

15import environ # type: ignore[import-untyped] 

16import sentry_sdk 

17 

18# Build paths inside the project like this: BASE_DIR / "subdir". 

19BASE_DIR = Path(__file__).resolve().parent.parent 

20 

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")) 

25 

26 

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) 

35 

36 

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") 

42 

43# Django Debug DebugToolbar 

44# See https://django-debug-toolbar.readthedocs.io/en/latest/installation.html 

45INTERNAL_IPS = [ 

46 "127.0.0.1", 

47] 

48 

49 

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] 

67 

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] 

78 

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") 

82 

83ROOT_URLCONF = "dalima.urls" 

84 

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] 

100 

101CRISPY_ALLOWED_TEMPLATE_PACKS = "bootstrap5" 

102CRISPY_TEMPLATE_PACK = "bootstrap5" 

103CRISPY_FAIL_SILENTLY = not DEBUG 

104 

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" 

115 

116WSGI_APPLICATION = "dalima.wsgi.application" 

117 

118 

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} 

133 

134 

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} 

164 

165 

166# Internationalization 

167# https://docs.djangoproject.com/en/5.1/topics/i18n/ 

168LANGUAGE_CODE = "en-us" 

169 

170TIME_ZONE = "UTC" 

171 

172USE_I18N = True 

173 

174USE_TZ = True 

175 

176 

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/") 

182 

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" 

186 

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] 

194 

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") 

205 

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) 

212 

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) 

218 

219# Other 

220DEFAULT_FREE_LICENSE = env.str("DEFAULT_FREE_LICENSE", "cc-by-4.0") 

221DEFAULT_EMBARGO_LICENSE = env.str("DEFAULT_EMBARGO_LICENSE", "Embargoed access")