· 4 years ago · Apr 01, 2021, 04:08 PM
1"""
2Django settings for orakul project.
3"""
4
5import os
6import redis
7import sys
8import codecs
9from dotenv import load_dotenv
10import json
11from pathlib import Path
12
13# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
14from oracul_elasticsearch.elasticsearch_logging.handlers import CMRESHandler
15
16BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
17
18load_dotenv(dotenv_path=''.join((BASE_DIR, '/orakul/.env')))
19
20IS_AUTO_TEST = ('test' in sys.argv) or ('pytest' in sys.modules)
21
22DATA_UPLOAD_MAX_MEMORY_SIZE = 1000000000
23DATA_UPLOAD_MAX_NUMBER_FIELDS = 1048576
24
25# SECURITY WARNING: keep the secret key used in production secret!
26SECRET_KEY = 'mb*su4i9q@4fcc9j5a95v*j95e)vh750mde^%%18!-0mb6k=cu'
27
28# SECURITY WARNING: don't run with debug turned on in production!
29DEBUG = os.getenv('DJANGO_DEBUG_MODE_ON', 'false').lower() == 'true'
30
31ALLOWED_HOSTS = [
32 os.getenv('ORACUL_ALLOWED_HOST'),
33]
34
35AUTH_USER_MODEL = 'adauth.User'
36
37# Application definition
38INSTALLED_APPS = [
39 'django.contrib.admin',
40 'django.contrib.auth',
41 'django.contrib.contenttypes',
42 'django.contrib.sessions',
43 'django.contrib.messages',
44 'django_extensions',
45 'django_python3_ldap',
46 'adauth',
47 'defender',
48 'django.contrib.staticfiles',
49 'rest_framework',
50 'django_filters',
51 'drf_yasg',
52 'django_celery_beat',
53 'django_celery_results',
54 'utils',
55 'main',
56 'company',
57 'letter',
58 'checklist',
59 'note',
60 'api',
61 'integration',
62 'ml_engines',
63]
64
65MIDDLEWARE = [
66 'utils.middleware.RESTParsingMiddleware',
67 'django.middleware.security.SecurityMiddleware',
68 'django.contrib.sessions.middleware.SessionMiddleware',
69 'django.middleware.common.CommonMiddleware',
70 'django.contrib.auth.middleware.AuthenticationMiddleware',
71 'django.contrib.messages.middleware.MessageMiddleware',
72 'django.middleware.clickjacking.XFrameOptionsMiddleware',
73 'adauth.middlwares.FailedLoginMiddleware',
74 'utils.middleware.LoggingMiddleware',
75]
76
77AUTHENTICATION_BACKENDS = [
78 'adauth.authentication.DefendedLDAPBackend',
79 'django.contrib.auth.backends.ModelBackend',
80]
81
82# The URL of the LDAP server.
83LDAP_AUTH_URL = os.getenv('ORACUL_LDAP_AUTH_URL')
84
85# Initiate TLS on connection.
86LDAP_AUTH_USE_TLS = os.getenv('ORACUL_LDAP_AUTH_USE_TLS', 'false').lower() == 'true'
87
88# The LDAP search base for looking up users.
89LDAP_AUTH_SEARCH_BASE = os.getenv('ORACUL_LDAP_AUTH_SEARCH_BASE')
90
91# The LDAP class that represents a user.
92LDAP_AUTH_OBJECT_CLASS = os.getenv('ORACUL_LDAP_AUTH_OBJECT_CLASS')
93
94# User model fields mapped to the LDAP
95# attributes that represent them.
96LDAP_AUTH_USER_FIELDS = json.loads(os.getenv('ORACUL_LDAP_AUTH_USER_FIELDS', '{}'))
97
98# A tuple of django model fields used to uniquely identify a user.
99LDAP_AUTH_USER_LOOKUP_FIELDS = ("username",)
100
101# Path to a callable that takes a dict of {model_field_name: value},
102# returning a dict of clean model data.
103# Use this to customize how data loaded from LDAP is saved to the User model.
104LDAP_AUTH_CLEAN_USER_DATA = "django_python3_ldap.utils.clean_user_data"
105
106# Path to a callable that takes a user model and a dict of {ldap_field_name: [value]},
107# and saves any additional user relationships based on the LDAP data.
108# Use this to customize how data loaded from LDAP is saved to User model relations.
109# For customizing non-related User model fields, use LDAP_AUTH_CLEAN_USER_DATA.
110LDAP_AUTH_SYNC_USER_RELATIONS = "django_python3_ldap.utils.sync_user_relations"
111
112# Path to a callable that takes a dict of {ldap_field_name: value},
113# returning a list of [ldap_search_filter]. The search filters will then be AND'd
114# together when creating the final search filter.
115LDAP_AUTH_FORMAT_SEARCH_FILTERS = "adauth.authentication.format_search_filters"
116
117# Path to a callable that takes a dict of {model_field_name: value}, and returns
118# a string of the username to bind to the LDAP server.
119# Use this to support different types of LDAP server.
120LDAP_AUTH_FORMAT_USERNAME = "adauth.authentication.format_username_active_directory"
121
122# Sets the login domain for Active Directory users.
123LDAP_AUTH_ACTIVE_DIRECTORY_DOMAIN = os.getenv('ORACUL_LDAP_AUTH_ACTIVE_DIRECTORY_DOMAIN')
124
125# The LDAP username and password of a user for querying the LDAP database for user
126# details. If None, then the authenticated user will be used for querying, and
127# the `ldap_sync_users` command will perform an anonymous query.
128# LDAP_AUTH_CONNECTION_USERNAME = os.getenv('ORACUL_LDAP_AUTH_CONNECTION_USERNAME')
129# LDAP_AUTH_CONNECTION_PASSWORD = os.getenv('ORACUL_LDAP_AUTH_CONNECTION_PASSWORD')
130
131# Set connection/receive timeouts (in seconds) on the underlying `ldap3` library.
132LDAP_AUTH_CONNECT_TIMEOUT = None
133LDAP_AUTH_RECEIVE_TIMEOUT = None
134
135# ELASTICSEARCH_DOCUMENT_OPTIONS
136ELASTICSEARCH_DOCUMENTS_HOST = os.getenv('ELASTICSEARCH_DOCUMENTS_HOST')
137ELASTICSEARCH_DOCUMENTS_PORT = int(os.getenv('ELASTICSEARCH_DOCUMENTS_PORT', 9200))
138
139default_log_handler = ["console"] if os.getenv('DJANGO_LOG_TO_CONSOLE', "false").lower() == 'true' else ["app_log"]
140
141LOG_ROOT = os.getenv('ORACUL_PERSISTENT_LOG_DIR', os.path.join(BASE_DIR, 'logs'))
142os.makedirs(LOG_ROOT, exist_ok=True)
143
144# ELASTICSEARCH logging options
145ELASTICSEARCH_HOST = os.getenv('ELASTICSEARCH_DOCUMENTS_HOST')
146ELASTICSEARCH_PORT = int(os.getenv('ELASTICSEARCH_DOCUMENTS_PORT', 9200))
147
148LOGGING = {
149 "version": 1,
150 "disable_existing_loggers": False,
151 "formatters": {
152 "default": {
153 "format": '[%(asctime)s] %(levelname)s| %(message)s'
154 },
155 },
156 "handlers": {
157 "console": {
158 "class": "logging.StreamHandler",
159 "formatter": "default",
160 },
161 "app_log": {
162 "level": "DEBUG",
163 "class": "logging.handlers.RotatingFileHandler",
164 "filename": os.getenv('DJANGO_LOG_FILE', os.path.join(LOG_ROOT, 'application.log')),
165 "encoding": 'UTF-8',
166 "formatter": "default",
167 },
168 'elasticsearch_handler': {
169 'class': 'oracul_elasticsearch.elasticsearch_logging.handlers.CMRESHandler',
170 'hosts': [{'host': ELASTICSEARCH_HOST, 'port': ELASTICSEARCH_PORT}],
171 'index_name_frequency': CMRESHandler.IndexNameFrequency.ALWAYS,
172 'additional_logging_filter_fields': [
173 'name',
174 'msg',
175 'levelname',
176 'pathname',
177 'filename',
178 'module',
179 'exc_info',
180 'exc_text',
181 'stack_info',
182 'lineno',
183 'funcName',
184 'thread',
185 'threadName',
186 'processName',
187 'process',
188 ],
189 'es_doc_type': 'log',
190 'auth_type': CMRESHandler.AuthType.NO_AUTH,
191 'use_ssl': False,
192 'buffer_size': 0,
193 'max_retries': 1,
194 },
195 },
196 "loggers": {
197 "": {
198 "handlers": default_log_handler,
199 "level": os.getenv('DJANGO_LOG_LEVEL', 'INFO'),
200 "propagate": True,
201 },
202 "django": {
203 "handlers": default_log_handler,
204 "level": os.getenv('DJANGO_LOG_LEVEL', 'INFO'),
205 "propagate": True,
206 },
207 "django.template": {
208 "handlers": default_log_handler,
209 "level": 'INFO',
210 },
211 "app": {
212 "handlers": default_log_handler,
213 "level": os.getenv('DJANGO_LOG_LEVEL', 'INFO'),
214 },
215 'elasticsearch_logger': {
216 'handlers': ['elasticsearch_handler'],
217 'level': 'INFO',
218 },
219 },
220}
221
222ROOT_URLCONF = 'orakul.urls'
223
224TEMPLATES = [
225 {
226 'BACKEND': 'django.template.backends.django.DjangoTemplates',
227 'DIRS': [os.path.join(BASE_DIR, "templates"), ],
228 'APP_DIRS': True,
229 'OPTIONS': {
230 'context_processors': [
231 'django.template.context_processors.debug',
232 'django.template.context_processors.request',
233 'django.contrib.auth.context_processors.auth',
234 'django.contrib.messages.context_processors.messages',
235 ],
236 },
237 },
238]
239
240WSGI_APPLICATION = 'orakul.wsgi.application'
241
242ORACUL_DATABASES = {
243 'default': {
244 'NAME': os.getenv('ORACUL_DB_NAME'),
245 'HOST': os.getenv('ORACUL_DB_HOST'),
246 'PORT': os.getenv('ORACUL_DB_PORT'),
247 'USER': os.getenv('ORACUL_DB_USER'),
248 'PASSWORD': os.getenv('ORACUL_DB_PASSWORD'),
249 },
250 'test': {
251 'NAME': os.getenv('ORACUL_DB_TEST_NAME'),
252 'HOST': os.getenv('ORACUL_DB_TEST_HOST'),
253 'PORT': os.getenv('ORACUL_DB_TEST_PORT'),
254 'USER': os.getenv('ORACUL_DB_TEST_USER'),
255 'PASSWORD': os.getenv('ORACUL_DB_TEST_PASSWORD'),
256 'TEST': {
257 'USER': 'ORACUL_AUTOTEST',
258 'TBLSPACE': "ORACUL_AUTOTEST",
259 'TBLSPACE_TMP': 'ORACUL_AUTOTEST_TMP'
260 }
261 }
262}
263
264DATABASES = {
265 'default': {
266 'ENGINE': os.getenv('ORACUL_DB_ENGINE'),
267 'OPTIONS': json.loads(os.getenv('ORACUL_DB_OPTS', '{}')),
268 **(ORACUL_DATABASES['default'] if not IS_AUTO_TEST else ORACUL_DATABASES['test']),
269 }
270}
271
272# Password validation
273AUTH_PASSWORD_VALIDATORS = [
274 {
275 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
276 },
277 {
278 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
279 },
280 {
281 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
282 },
283 {
284 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
285 },
286]
287
288# Django Rest Framework
289REST_FRAMEWORK = {
290 'DEFAULT_RENDERER_CLASSES': (
291 'rest_framework.renderers.JSONRenderer',
292 ),
293 'DEFAULT_AUTHENTICATION_CLASSES': (
294 'adauth.authentication.TokenAuthentication',
295 'rest_framework.authentication.SessionAuthentication',
296 ),
297}
298
299LOGIN_URL = '/login'
300LOGOUT_URL = '/logout'
301DEFAULT_RELEVANCE_MINIMUM = 0.4
302DJANGO_ADMIN_MAX_LIST_SIZE = 75
303
304# Internationalization
305LANGUAGE_CODE = 'ru-ru'
306TIME_ZONE = 'Europe/Moscow'
307USE_I18N = True
308USE_L10N = True
309USE_TZ = True
310CSRF_COOKIE_SECURE = False
311
312# Static files
313STATIC_URL = '/static/'
314STATIC_ROOT = os.path.join(BASE_DIR, 'static')
315MEDIA_URL = '/media/'
316MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
317
318# Redis Cache Options
319REDIS_CACHE_TIMEOUT = 7200
320REDIS_HOST = os.getenv('ORACUL_REDIS_HOST', '127.0.0.1')
321REDIS_PORT = int(os.getenv('ORACUL_REDIS_PORT', 6379))
322REDIS_CACHE_DB = int(os.getenv('REDIS_CACHE_DB', 1))
323REDIS_INSTANCE = redis.StrictRedis(host=REDIS_HOST, port=REDIS_PORT, db=0)
324REDIS_CACHE_INSTANCE = redis.StrictRedis(host=REDIS_HOST, port=REDIS_PORT, db=REDIS_CACHE_DB)
325
326# Pagination Options
327DEFAULT_PAGE_SIZE = 10
328DEFAULT_LOV_SIZE = 50
329
330# TOMITA_PARSER
331TOMITA_PARSER_ENDPOINT = os.getenv('TOMITA_PARSER_ENDPOINT')
332
333# BKU_RECOGNITION_SERVICE
334BKU_RECOGNITION_URL = os.getenv('BKU_RECOGNITION_URL')
335
336# ML params
337ML_MULTITHREADING_THREAD_COUNT = int(os.getenv('ML_MULTITHREADING_THREAD_COUNT', '16'))
338ML_MULTIPROCESSING_CORES_COUNT = int(os.getenv('ML_MULTIPROCESSING_CORES_COUNT', '8'))
339
340ML_STORAGE_PATH = os.getenv('ML_STORAGE_PATH') or os.path.join(BASE_DIR, 'ml_engines/vector_distance/files/')
341ML_DOCFREQ_PATH = os.path.join(BASE_DIR, 'docfreq.pckl.gz')
342ML_FREQ_CACHE_PATH = f"/tmp/oracul_freq_cache{'' if not IS_AUTO_TEST else '.test'}.gz"
343
344
345# EOSDO_
346INTEGRATIONS_EOSDO_USERNAME = os.getenv('INTEGRATIONS_EOSDO_USERNAME')
347INTEGRATIONS_EOSDO_PASSWORD = os.getenv('INTEGRATIONS_EOSDO_PASSWORD')
348INTEGRATIONS_EOSDO_SLD_CODE = os.getenv('INTEGRATIONS_EOSDO_SLD_CODE')
349INTEGRATIONS_EOSDO_REQUEST_MAX_RECURSION = int(os.getenv('INTEGRATIONS_EOSDO_REQUEST_MAX_RECURSION', '3'))
350
351INTEGRATIONS_EOSDO_ID1_NAMESPACE = os.getenv('INTEGRATIONS_EOSDO_ID1_NAMESPACE')
352INTEGRATIONS_EOSDO_ID1_ENDPOINT = os.getenv('INTEGRATIONS_EOSDO_ID1_ENDPOINT')
353INTEGRATIONS_EOSDO_ID1_BINDING = os.getenv('INTEGRATIONS_EOSDO_ID1_BINDING')
354
355INTEGRATIONS_EOSDO_ID3_NAMESPACE = os.getenv('INTEGRATIONS_EOSDO_ID3_NAMESPACE')
356INTEGRATIONS_EOSDO_ID3_ENDPOINT = os.getenv('INTEGRATIONS_EOSDO_ID3_ENDPOINT')
357INTEGRATIONS_EOSDO_ID3_BINDING = os.getenv('INTEGRATIONS_EOSDO_ID3_BINDING')
358
359INTEGRATIONS_EOSDO_ID4_NAMESPACE = os.getenv('INTEGRATIONS_EOSDO_ID4_NAMESPACE')
360INTEGRATIONS_EOSDO_ID4_ENDPOINT = os.getenv('INTEGRATIONS_EOSDO_ID4_ENDPOINT')
361INTEGRATIONS_EOSDO_ID4_BINDING = os.getenv('INTEGRATIONS_EOSDO_ID4_BINDING')
362
363# BKU
364INTEGRATIONS_BKU_USERNAME = os.getenv('INTEGRATIONS_BKU_USERNAME')
365INTEGRATIONS_BKU_PASSWORD = os.getenv('INTEGRATIONS_BKU_PASSWORD')
366INTEGRATIONS_BKU_SLD_CODE = os.getenv('INTEGRATIONS_BKU_SLD_CODE')
367INTEGRATIONS_BKU_DEFAULT_NAMESPACE = os.getenv('INTEGRATIONS_BKU_DEFAULT_NAMESPACE')
368INTEGRATIONS_BKU_REGULATION_ANALYSE_RESPONSE_ENDPOINT = os.getenv('INTEGRATIONS_BKU_REGULATION_ANALYSE_RESPONSE_ENDPOINT')
369INTEGRATIONS_BKU_REGULATION_ANALYSE_RESPONSE_BINDING = os.getenv('INTEGRATIONS_BKU_REGULATION_ANALYSE_RESPONSE_BINDING')
370INTEGRATIONS_BKU_REQUEST_CONFIRMATION_ENDPOINT = os.getenv('INTEGRATIONS_BKU_REQUEST_CONFIRMATION_ENDPOINT')
371INTEGRATIONS_BKU_REQUEST_CONFIRMATION_BINDING = os.getenv('INTEGRATIONS_BKU_REQUEST_CONFIRMATION_BINDING')
372INTEGRATIONS_BKU_LAW135_ANALYSE_RESPONSE_ENDPOINT = os.getenv('INTEGRATIONS_BKU_LAW135_ANALYSE_RESPONSE_ENDPOINT')
373INTEGRATIONS_BKU_LAW135_ANALYSE_RESPONSE_BINDING = os.getenv('INTEGRATIONS_BKU_LAW135_ANALYSE_RESPONSE_BINDING')
374
375
376# Checklist settings
377CHECKLIST_LARGE_FILE_WARNING_SIZE = os.getenv('CHECKLIST_LARGE_FILE_WARNING_SIZE', 10**7)
378CHECKLIST_FRENGINEWS_URL = os.getenv('CHECKLIST_FRENGINEWS_URL')
379
380# POA WATSON_AC SETTINGS
381POA_RECOGNITION_URL = os.getenv('POA_RECOGNITION_URL')
382
383# OCR settings for FRS
384FRS_WORKFLOW_NAME = os.getenv('FRS_WORKFLOW_NAME')
385
386
387# celery settings
388CELERY_RESULT_BACKEND = 'django-db'
389CELERY_ACCEPT_CONTENT = ['json', 'pickle']
390
391# some other settings
392DOC_FILE_EXT = 'docx'
393PDF_FILE_EXT = 'pdf'
394
395# defender settings
396DEFENDER_LOGIN_FAILURE_LIMIT = int(os.getenv('DEFENDER_LOGIN_FAILURE_LIMIT', '2'))
397DEFENDER_COOLOFF_TIME = int(os.getenv('DEFENDER_COOLOFF_TIME', '60'))
398DEFENDER_REDIS_URL = os.getenv('DEFENDER_REDIS_URL', 'redis://localhost:6379/0')
399DEFENDER_BEHIND_REVERSE_PROXY = True
400DEFENDER_REVERSE_PROXY_HEADER = 'HTTP_X_FORWARDED_FOR'
401
402SWAGGER_SETTINGS = {
403 'SECURITY_DEFINITIONS': {
404 'basic': {
405 'type': 'basic'
406 },
407 },
408 'USE_SESSION_AUTH': False
409}
410
411REDOC_SETTINGS = {
412 'LAZY_RENDERING': True,
413}
414
415# try to load local dev settings
416try:
417 from .__dev_settings import *
418except ImportError:
419 pass
420