1.4. Конфигурация системы

В данном разделе описываются конфигурационные опции системы, какие значения они принимают и как влияют на работу системы. Опции размещаются в 2-х файлах в корневом разделе системы.

Основной файл config.py. Он находится под управлением системы контроля версий, описывает общие настройки проекта, которые не зависят от типа развертывания (production / stage / test / dev). Этот файл не должен содержать в себе паролей и секретных ключей системы, так как в случае попадания в чужие руки, злоумышленник вместе с кодом может узнать и пароли от нее. Опции конфигурации, значения которых желательно держать в секрете, в этом файле описываются в виде «*****».

Дополнительный файл config_local.py Находится вне системы управления версиями и перекрывает все настройки файла config.py. В нем мы размещаем настройки паролей, секретных ключей и настройки, специфичные для типа развертывания (например, если тестовый и рабочий сервер находятся на одном сервере и соединяются к разным базам данных и имеют разные кэши, чтобы не мешать друг другу).

Приложение использует внешние библиотеки. О их опциях конфигурации можно узнать

import os

# Абсолютный путь к корневой директории проекта
BASE_DIR = os.path.abspath('.')

# Режим отладки и тестирования
DEBUG = False
TESTING = False
SECRET_KEY = '******************************************************'
PRESERVE_CONTEXT_ON_EXCEPTION = False  # Дополнительная информация о контексте при ошибках

# Настройки подключения к базе данных
SQLALCHEMY_DATABASE_URI = 'postgresql://sphere_user:*********@localhost/expertise'
SQLALCHEMY_BINDS = {
    'reports': SQLALCHEMY_DATABASE_URI,
}
SQLALCHEMY_POOL_RECYCLE = 3600
SQLALCHEMY_TRACK_MODIFICATIONS = False

# Настройка безопасности для операторов
USER_SECURITY = {
    'password_expire_days': 60,  # Срок обязательной смены пароля
    'password_expire_notify_days': 5,  # За сколько дней предупреждать о смене
    'password_validate': {  # Проверки пароля на сложность
        'patterns': [
            re.compile('[A-Z]+'),
            re.compile('[a-z]+'),
            re.compile('\d+'),
            re.compile('.{7,}'),
        ],
        'validators': {'no_login'},
        'message': 'Должны быть заглавная и строчная английская буква, цифра, длина от 7 символов'
    },
    'save_login_location': False,  # При входе в систему, сохранять местоположение оператора (широта и долгота)
}
PERMANENT_SESSION_LIFETIME = timedelta(hours=1)  # Сброс авторизации при 1 часе бездействия

# Операции, выполняющиеся в фоне по расписанию
QUEUE_PREFIX = 'expertise'
QUEUE_SHEDULE = {
    'request_autoevents': {
        'function_path': 'sphere_conf.bps.projects.request.tasks.autoevents',
        'schedule': '*/10 * * * *',
    },
    'service_autoevents': {
        'function_path': 'sphere_conf.bps.projects.service.tasks.autoevents',
        'schedule': '*/10 * * * *',
    },
    'service_autoevents': {
        'function_path': 'sphere_conf.bps.projects.service.tasks.request_missing_documents_repeat',
        'schedule': '0 7 * * *',
    },
    'email_download_in': {
        'function_path': 'sphere.email.tasks.load_emails',
        'schedule': '*/10 * * * *',
        'kwargs': {'load_profile': 'in@ravtexpert.ru'},
    },
    'email_download_service': {
        'function_path': 'sphere.email.tasks.load_emails',
        'schedule': '*/10 * * * *',
        'kwargs': {'load_profile': 'service@ravtexpert.ru'},
    },
    'email_download_payments': {
        'function_path': 'sphere.email.tasks.load_emails',
        'schedule': '*/10 * * * *',
        'kwargs': {'load_profile': 'payments@ravtexpert.ru'},
    },
    'sphere_conf_bank_requis_update': {
        'function_path': 'sphere_conf.tasks.bank_requis_update',
        'schedule': '0 6 * * *',
    },
    'sphere_conf_download_mango_records': {
        'function_path': 'sphere_conf.tasks.download_mango_records',
        schedule': '*/20 * * * *',
    },
}

# Настройки профилей исходящих писем
EMAIL_PROFILES = {
    None: {
        'username': '************',
        'password': '************',
        'host': 'smtp.mail.ru',
        'port': 465,
    },
    'payments': {
        'username': '************',
        'password': '************',
        'host': 'smtp.mail.ru',
        'port': 465,
    },
}

# Настройки скачивания писем
EMAIL_DOWNLOAD = {
    'in@ravtexpert.ru': {
        'host': 'imap.mail.ru',
        'email': '************',
        'login': '************',
        'password': '************',
        'folders': ['robot'],
        'move_processed_to': {'robot': 'robot_success'},
    },
    'service@ravtexpert.ru': {
        'host': 'imap.mail.ru',
        'email': '************',
        'login': '************',
        'password': '************',
        'folders': ['inbox'],
    },
    'payments@ravtexpert.ru': {
        'host': 'imap.mail.ru',
        'email': '************',
        'login': '************',
        'password': '************',
        'folders': ['inbox'],
    },
}
IS_MAIL_WITH_ATTACH_SEND_ASYNC = True  # Сообщения с вложениями отправляются в отложенном режиме

SMS_LOGIN = '********'
SMS_PASSWORD = '********'
SMS_SENDER = '********'
SMS_PROVIDER = 'prostor'  # или 'smsc'
SMS_SUPPRESS_SENDING = True  # Не отправлять сообщения - для режима отладки

# Локализация и часовой пояс по умолчанию
LANGUAGES = {
    'ru': 'Русский',
}
BABEL_DEFAULT_LOCALE = 'ru'
BABEL_DEFAULT_TIMEZONE = 'Europe/Moscow'

# Форматирование для вывода на экран
DATE_FORMAT = 'dd.MM.yyyy'
DATETIME_FORMAT = 'dd.MM.yyyy H:mm'

# Кэш
CACHE_TYPE = 'werkzeug.contrib.cache.RedisCache'
CACHE_KWARGS = {
    'key_prefix': 'expertise',
}

# Загрузка файлов
MAX_CONTENT_LENGTH = 10 * 1024 * 1024
MEDIA_DIR = os.path.join(BASE_DIR, 'media')
THUMBNAIL_DUMMY = os.path.join(BASE_DIR, 'sphere/lib/static/thumbnail_dummy.jpeg')
FILES_REFRESH_AFTER_UPLOAD = True  # После загрузки файла обновлять страницу

# Панель отладки (видна только при включении режима отладки DEBUG = True)
DEBUG_TB_INTERCEPT_REDIRECTS = False
DEBUG_TB_PANELS = [
    'flask_debugtoolbar.panels.request_vars.RequestVarsDebugPanel',
    'flask_debugtoolbar.panels.config_vars.ConfigVarsDebugPanel',
    'flask_debugtoolbar.panels.template.TemplateDebugPanel',
    'flask_debugtoolbar.panels.logger.LoggingPanel',
    'flask_debugtoolbar.panels.route_list.RouteListDebugPanel',
    'flask_debugtoolbar.panels.profiler.ProfilerDebugPanel',
    'flask_debugtoolbar.panels.sqlalchemy.SQLAlchemyDebugPanel',
]

# Пути поиска приложений для загрузки. Вначале ищем в директории конфигурации
# для подмены шаблонов уровня ядра
TEMPLATE_FOLDERS = [
    os.path.join(BASE_DIR, 'templates'),
    os.path.join(BASE_DIR, 'sphere_conf/reports'),
]

SITE_URL = 'https://ravt.sbps.ru'

# Список загружаемых приложений
APPS = (
    ('sphere.lib', '/lib'),
    ('sphere.auth', '/auth'),
    ('sphere.logs', '/logs'),
    ('sphere.email', '/email'),
    ('sphere.sms', '/sms'),
    ('sphere.reports', '/reports'),
    ('sphere.bps', '/bps'),
    ('sphere.bps.plugins.files', '/bps_files'),
    ('sphere.bps.plugins.tasks', '/bps_tasks'),

    ('sphere_conf', None),
    ('sphere_conf.bps.projects.request', '/request'),
    ('sphere_conf.bps.projects.service', '/service'),
    ('sphere_conf.bps.projects.contractor', '/contractor'),
    ('sphere_conf.bps.projects.contract', '/contract'),
    ('sphere_conf.bps.projects.area', '/area'),
    ('sphere_conf.bps.projects.avr', '/avr'),
    ('sphere_conf.bps.projects.task', '/task'),
    ('mail_gui', '/mail_gui'),
)

BRAND = 'Сфера Эксперт'

SOGAZ_INTEGRATION_EMAIL = 'expertizaravt@sogaz.ru'

# Настройки логгирования событий и внешнего аггрегатора событий
# для отправки логов в удаленное хранилище (если используется обработчик SphereHTTPHandler).
# Стандартные обработчики логов также поддерживаются https://docs.python.org/2/library/logging.handlers.html
LOGGING_SERVER = {
    'project_name': 'expertise',
    'url': 'https://logs.sbps.ru/',
    'api_key': '*****'
}
LOGGING = [
    {
        'logger': 'sphere',
        'level': 'INFO',
        'handler': 'sphere.logs.handlers.SphereHTTPHandler',
    }
]

LOG_SUPPRESS_ENDPOINT = ['lib.user_notification_new']  # Исключения из логгирования действий операторов

# Настройки сервиса отображения офисных документов (Excel, Word)
ONLYOFFICE_URL = 'https://sbps.ru:444'
ONLYOFFICE_HOST_URL = SITE_URL