mirror of
https://gitlab.com/allianceauth/allianceauth.git
synced 2025-07-09 12:30:15 +02:00
Context processor to count notifications for display in base template Logging handler to generate notifications for users with permission
479 lines
18 KiB
Python
Executable File
479 lines
18 KiB
Python
Executable File
"""
|
|
vim: set filetype=python:
|
|
Django settings for alliance_auth project.
|
|
|
|
For more information on this file, see
|
|
https://docs.djangoproject.com/en/1.6/topics/settings/
|
|
|
|
For the full list of settings and their values, see
|
|
https://docs.djangoproject.com/en/1.6/ref/settings/
|
|
|
|
"""
|
|
|
|
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
|
|
import os
|
|
|
|
import djcelery
|
|
|
|
djcelery.setup_loader()
|
|
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
|
|
|
|
# Quick-start development settings - unsuitable for production
|
|
# See https://docs.djangoproject.com/en/1.6/howto/deployment/checklist/
|
|
|
|
# SECURITY WARNING: keep the secret key used in production secret!
|
|
# Generate a new key here: http://www.miniwebtool.com/django-secret-key-generator/
|
|
SECRET_KEY = os.environ.get('AA_SECRET_KEY', '5xvh4e0x&@-$6(kj%4^80pdo1n5v-!mtx(e(1tw@kn-1le*ts@')
|
|
|
|
# SECURITY WARNING: don't run with debug turned on in production!
|
|
DEBUG = 'True' == os.environ.get('AA_DEBUG','True')
|
|
|
|
TEMPLATE_DEBUG = True
|
|
|
|
ALLOWED_HOSTS = []
|
|
|
|
BROKER_URL = 'amqp://guest:guest@localhost:5672/'
|
|
|
|
CELERYBEAT_SCHEDULER = "djcelery.schedulers.DatabaseScheduler"
|
|
|
|
# Application definition
|
|
INSTALLED_APPS = (
|
|
'django.contrib.admin',
|
|
'django.contrib.auth',
|
|
'django.contrib.contenttypes',
|
|
'django.contrib.sessions',
|
|
'django.contrib.messages',
|
|
'django.contrib.staticfiles',
|
|
'django.contrib.humanize',
|
|
'django_evolution',
|
|
'djcelery',
|
|
'celerytask',
|
|
'bootstrapform',
|
|
'authentication',
|
|
'portal',
|
|
'registration',
|
|
'services',
|
|
'eveonline',
|
|
'groupmanagement',
|
|
'hrapplications',
|
|
'timerboard',
|
|
'srp',
|
|
'sigtracker',
|
|
'optimer',
|
|
'corputils',
|
|
'notifications',
|
|
)
|
|
|
|
MIDDLEWARE_CLASSES = (
|
|
'django.contrib.sessions.middleware.SessionMiddleware',
|
|
'django.middleware.common.CommonMiddleware',
|
|
'django.middleware.csrf.CsrfViewMiddleware',
|
|
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
|
'django.contrib.messages.middleware.MessageMiddleware',
|
|
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
|
)
|
|
|
|
ROOT_URLCONF = 'alliance_auth.urls'
|
|
|
|
WSGI_APPLICATION = 'alliance_auth.wsgi.application'
|
|
|
|
# Database
|
|
# https://docs.djangoproject.com/en/1.6/ref/settings/#databases
|
|
|
|
DATABASES = {
|
|
'default': {
|
|
'ENGINE': 'django.db.backends.mysql',
|
|
'NAME': 'alliance_auth',
|
|
'USER': os.environ.get('AA_DB_DEFAULT_USER', 'allianceserver'),
|
|
'PASSWORD': os.environ.get('AA_DB_DEFAULT_PASSWORD', 'password'),
|
|
'HOST': os.environ.get('AA_DB_DEFAULT_HOST', '127.0.0.1'),
|
|
'PORT': os.environ.get('AA_DB_DEFAULT_PORT', '3306'),
|
|
},
|
|
|
|
'phpbb3': {
|
|
'ENGINE': 'django.db.backends.mysql',
|
|
'NAME': 'alliance_forum',
|
|
'USER': os.environ.get('AA_DB_PHPBB3_USER', 'allianceserver'),
|
|
'PASSWORD': os.environ.get('AA_DB_PHPBB3_PASSWORD', 'password'),
|
|
'HOST': os.environ.get('AA_DB_PHPBB3_HOST', '127.0.0.1'),
|
|
'PORT': os.environ.get('AA_DB_PHPBB3_PORT', '3306'),
|
|
},
|
|
|
|
'mumble': {
|
|
'ENGINE': 'django.db.backends.mysql',
|
|
'NAME': 'alliance_mumble',
|
|
'USER': os.environ.get('AA_DB_MUMBLE_USER', 'allianceserver'),
|
|
'PASSWORD': os.environ.get('AA_DB_MUMBLE_PASSWORD', 'password'),
|
|
'HOST': os.environ.get('AA_DB_MUMBLE_HOST', '127.0.0.1'),
|
|
'PORT': os.environ.get('AA_DB_MUMBLE_PORT', '3306'),
|
|
}
|
|
}
|
|
|
|
TEMPLATE_CONTEXT_PROCESSORS = (
|
|
'django.contrib.auth.context_processors.auth',
|
|
'django.core.context_processors.debug',
|
|
'django.core.context_processors.i18n',
|
|
'django.core.context_processors.media',
|
|
'django.core.context_processors.static',
|
|
'django.core.context_processors.tz',
|
|
'django.contrib.messages.context_processors.messages',
|
|
'django.core.context_processors.request',
|
|
'util.context_processors.is_corp',
|
|
'util.context_processors.corp_id',
|
|
'util.context_processors.corp_name',
|
|
'util.context_processors.alliance_id',
|
|
'util.context_processors.alliance_name',
|
|
'util.context_processors.jabber_url',
|
|
'util.context_processors.domain_url',
|
|
'util.context_processors.member_api_mask',
|
|
'util.context_processors.blue_api_mask',
|
|
'notifications.context_processors.user_notification_count',
|
|
)
|
|
|
|
TEMPLATE_DIRS = (
|
|
'customization/templates',
|
|
'stock/templates',
|
|
)
|
|
|
|
STATICFILES_DIRS = (
|
|
'customization/static',
|
|
'stock/static',
|
|
)
|
|
|
|
LOGIN_URL = '/login_user/'
|
|
|
|
# Internationalization
|
|
# https://docs.djangoproject.com/en/1.6/topics/i18n/
|
|
|
|
LANGUAGE_CODE = os.environ.get('AA_LANGUAGE_CODE', 'en-us')
|
|
|
|
TIME_ZONE = os.environ.get('AA_TIME_ZONE', 'UTC')
|
|
|
|
USE_I18N = True
|
|
|
|
USE_L10N = True
|
|
|
|
USE_TZ = True
|
|
|
|
# Static files (CSS, JavaScript, Images)
|
|
# https://docs.djangoproject.com/en/1.6/howto/static-files/
|
|
STATIC_URL = '/static/'
|
|
STATIC_ROOT = '/home/allianceserver/allianceauth/static/'
|
|
|
|
# Cache directory for EveWho, no ending /
|
|
# by default this becomes ~/<installdir>/alliance_auth/cache
|
|
# This directory needs to be writable by the webserver
|
|
EVEWHO_CACHE_DIR = '{}/cache'.format(BASE_DIR)
|
|
|
|
|
|
#####################################################
|
|
##
|
|
## Auth configuration starts here
|
|
##
|
|
#####################################################
|
|
|
|
###########################
|
|
# ALLIANCE / CORP TOGGLE
|
|
###########################
|
|
# Specifies to run membership checks against corp or alliance
|
|
# Set to FALSE for alliance
|
|
# Set to TRUE for corp
|
|
###########################
|
|
IS_CORP = 'True' == os.environ.get('AA_IS_CORP', 'True')
|
|
|
|
|
|
#################
|
|
# EMAIL SETTINGS
|
|
#################
|
|
# DOMAIN - The alliance auth domain_url
|
|
# EMAIL_HOST - SMTP Server URL
|
|
# EMAIL_PORT - SMTP Server PORT
|
|
# EMAIL_HOST_USER - Email Username (for gmail, the part before @gmail.com)
|
|
# EMAIL_HOST_PASSWORD - Email Password
|
|
# EMAIL_USE_TLS - Set to use TLS encryption
|
|
#################
|
|
DOMAIN = os.environ.get('AA_DOMAIN', 'https://yourdomain.com')
|
|
EMAIL_HOST = os.environ.get('AA_EMAIL_HOST', 'smtp.gmail.com')
|
|
EMAIL_PORT = int(os.environ.get('AA_EMAIL_PORT', '587'))
|
|
EMAIL_HOST_USER = os.environ.get('AA_EMAIL_HOST_USER', '')
|
|
EMAIL_HOST_PASSWORD = os.environ.get('AA_EMAIL_HOST_PASSWORD', '')
|
|
EMAIL_USE_TLS = 'True' == os.environ.get('AA_EMAIL_USE_TLS', 'True')
|
|
|
|
####################
|
|
# Front Page Links
|
|
####################
|
|
# KILLBOARD_URL - URL for your killboard. Blank to hide link
|
|
# MEDIA_URL - URL for your media page (youtube etc). Blank to hide link
|
|
# FORUM_URL - URL for your forums. Blank to hide link
|
|
####################
|
|
KILLBOARD_URL = os.environ.get('AA_KILLBOARD_URL', '')
|
|
EXTERNAL_MEDIA_URL = os.environ.get('AA_EXTERNAL_MEDIA_URL', '')
|
|
FORUM_URL = os.environ.get('AA_FORUM_URL', '')
|
|
|
|
#########################
|
|
# Default Group Settings
|
|
#########################
|
|
# DEFAULT_AUTH_GROUP - Default group members are put in
|
|
# DEFAULT_BLUE_GROUP - Default group for blue members
|
|
# MEMBER_CORP_GROUPS - Assign members to a group representing their main corp
|
|
# BLUE_CORP_GROUPS - Assign blues to a group representing their main corp
|
|
#########################
|
|
DEFAULT_AUTH_GROUP = os.environ.get('AA_DEFAULT_ALLIANCE_GROUP', 'Member')
|
|
DEFAULT_BLUE_GROUP = os.environ.get('AA_DEFAULT_BLUE_GROUP', 'Blue')
|
|
MEMBER_CORP_GROUPS = 'True' == os.environ.get('AA_MEMBER_CORP_GROUPS', 'True')
|
|
BLUE_CORP_GROUPS = 'True' == os.environ.get('AA_BLUE_CORP_GROUPS', 'False')
|
|
|
|
#########################
|
|
# Alliance Service Setup
|
|
#########################
|
|
# ENABLE_AUTH_FORUM - Enable forum support in the auth for auth'd members
|
|
# ENABLE_AUTH_JABBER - Enable jabber support in the auth for auth'd members
|
|
# ENABLE_AUTH_MUMBLE - Enable mumble support in the auth for auth'd members
|
|
# ENABLE_AUTH_IPBOARD - Enable IPBoard forum support in the auth for auth'd members
|
|
# ENABLE_AUTH_DISCORD - Enable Discord support in the auth for auth'd members
|
|
#########################
|
|
ENABLE_AUTH_FORUM = 'True' == os.environ.get('AA_ENABLE_AUTH_FORUM', 'False')
|
|
ENABLE_AUTH_JABBER = 'True' == os.environ.get('AA_ENABLE_AUTH_JABBER', 'False')
|
|
ENABLE_AUTH_MUMBLE = 'True' == os.environ.get('AA_ENABLE_AUTH_MUMBLE', 'False')
|
|
ENABLE_AUTH_IPBOARD = 'True' == os.environ.get('AA_ENABLE_AUTH_IPBOARD', 'False')
|
|
ENABLE_AUTH_TEAMSPEAK3 = 'True' == os.environ.get('AA_ENABLE_AUTH_TEAMSPEAK3', 'False')
|
|
ENABLE_AUTH_DISCORD = 'True' == os.environ.get('AA_ENABLE_AUTH_DISCORD', 'False')
|
|
|
|
#####################
|
|
# Blue service Setup
|
|
#####################
|
|
# BLUE_STANDING - The default lowest standings setting to consider blue
|
|
# ENABLE_BLUE_FORUM - Enable forum support in the auth for blues
|
|
# ENABLE_BLUE_JABBER - Enable jabber support in the auth for blues
|
|
# ENABLE_BLUE_MUMBLE - Enable mumble support in the auth for blues
|
|
# ENABLE_BLUE_IPBOARD - Enable IPBoard forum support in the auth for blues
|
|
# ENABLE_BLUE_DISCORD - Enable Discord support in the auth for blues
|
|
#####################
|
|
BLUE_STANDING = float(os.environ.get('AA_BLUE_STANDING', '5.0'))
|
|
ENABLE_BLUE_FORUM = 'True' == os.environ.get('AA_ENABLE_BLUE_FORUM', 'False')
|
|
ENABLE_BLUE_JABBER = 'True' == os.environ.get('AA_ENABLE_BLUE_JABBER', 'False')
|
|
ENABLE_BLUE_MUMBLE = 'True' == os.environ.get('AA_ENABLE_BLUE_MUMBLE', 'False')
|
|
ENABLE_BLUE_IPBOARD = 'True' == os.environ.get('AA_ENABLE_BLUE_IPBOARD', 'False')
|
|
ENABLE_BLUE_TEAMSPEAK3 = 'True' == os.environ.get('AA_ENABLE_BLUE_TEAMSPEAK3', 'False')
|
|
ENABLE_BLUE_DISCORD = 'True' == os.environ.get('AA_ENABLE_BLUE_DISCORD', 'False')
|
|
|
|
#########################
|
|
# Corp Configuration
|
|
#########################
|
|
# If running in alliance mode, the following should be for the executor corp#
|
|
# CORP_ID - Set this to your corp ID (get this from https://zkillboard.com/corporation/#######)
|
|
# CORP_NAME - Set this to your Corporation Name
|
|
# CORP_API_ID - Set this to the api id for the corp API key
|
|
# CORP_API_VCODE - Set this to the api vcode for the corp API key
|
|
########################
|
|
CORP_ID = os.environ.get('AA_CORP_ID', '')
|
|
CORP_NAME = os.environ.get('AA_CORP_NAME', '')
|
|
CORP_API_ID = os.environ.get('AA_CORP_API_ID', '')
|
|
CORP_API_VCODE = os.environ.get('AA_CORP_API_VCODE', '')
|
|
|
|
|
|
#########################
|
|
# Alliance Configuration
|
|
#########################
|
|
# ALLIANCE_ID - Set this to your Alliance ID (get this from https://zkillboard.com/alliance/#######)
|
|
# ALLIANCE_NAME - Set this to your Alliance Name
|
|
########################
|
|
ALLIANCE_ID = os.environ.get('AA_ALLIANCE_ID', '')
|
|
ALLIANCE_NAME = os.environ.get('AA_ALLIANCE_NAME', '')
|
|
|
|
########################
|
|
# API Configuration
|
|
########################
|
|
# MEMBER_API_MASK - Numeric value of minimum API mask required for members
|
|
# MEMBER_API_ACCOUNT - Require API to be for Account and not character restricted
|
|
# BLUE_API_MASK - Numeric value of minimum API mask required for blues
|
|
# BLUE_API_ACCOUNT - Require API to be for Account and not character restricted
|
|
#######################
|
|
MEMBER_API_MASK = os.environ.get('AA_MEMBER_API_MASK', 268435455)
|
|
MEMBER_API_ACCOUNT = 'True' == os.environ.get('AA_MEMBER_API_ACCOUNT', 'True')
|
|
BLUE_API_MASK = os.environ.get('AA_BLUE_API_MASK', 8388608)
|
|
BLUE_API_ACCOUNT = 'True' == os.environ.get('AA_BLUE_API_ACCOUNT', 'False')
|
|
|
|
#####################
|
|
# HR Configuration
|
|
#####################
|
|
# JACK_KNIFE_URL - Url for the audit page of API Jack knife
|
|
# Should seriously replace with your own.
|
|
#####################
|
|
JACK_KNIFE_URL = os.environ.get('AA_JACK_KNIFE_URL', 'http://ridetheclown.com/eveapi/audit.php')
|
|
|
|
#####################
|
|
# Forum Configuration
|
|
#####################
|
|
# IPBOARD_ENDPOINT - Api endpoint if using ipboard
|
|
# IPBOARD_APIKEY - Api key to interact with ipboard
|
|
# IPBOARD_APIMODULE - Module for alliance auth *leave alone*
|
|
#####################
|
|
IPBOARD_ENDPOINT = os.environ.get('AA_IPBOARD_ENDPOINT', 'yourdomain.com/interface/board/index.php')
|
|
IPBOARD_APIKEY = os.environ.get('AA_IPBOARD_APIKEY', 'somekeyhere')
|
|
IPBOARD_APIMODULE = 'aa'
|
|
|
|
######################
|
|
# Jabber Configuration
|
|
######################
|
|
# JABBER_URL - Jabber address url
|
|
# JABBER_PORT - Jabber service portal
|
|
# JABBER_SERVER - Jabber server url
|
|
# OPENFIRE_ADDRESS - Address of the openfire admin console including port
|
|
# Please use http with 9090 or https with 9091
|
|
# OPENFIRE_SECRET_KEY - Openfire REST API secret key
|
|
# BROADCAST_USER - Broadcast user JID
|
|
# BROADCAST_USER_PASSWORD - Broadcast user password
|
|
######################
|
|
JABBER_URL = os.environ.get('AA_JABBER_URL', "yourdomain.com")
|
|
JABBER_PORT = int(os.environ.get('AA_JABBER_PORT', '5223'))
|
|
JABBER_SERVER = os.environ.get('AA_JABBER_SERVER', "yourdomain.com")
|
|
OPENFIRE_ADDRESS = os.environ.get('AA_OPENFIRE_ADDRESS', "http://yourdomain.com:9090")
|
|
OPENFIRE_SECRET_KEY = os.environ.get('AA_OPENFIRE_SECRET_KEY', "somekey")
|
|
BROADCAST_USER = os.environ.get('AA_BROADCAST_USER', "broadcast@") + JABBER_URL
|
|
BROADCAST_USER_PASSWORD = os.environ.get('AA_BROADCAST_USER_PASSWORD', "somepassword")
|
|
BROADCAST_SERVICE_NAME = os.environ.get('AA_BROADCAST_SERVICE_NAME', "broadcast")
|
|
|
|
######################################
|
|
# Mumble Configuration
|
|
######################################
|
|
# MUMBLE_URL - Mumble server url
|
|
# MUMBLE_SERVER_ID - Mumble server id
|
|
######################################
|
|
MUMBLE_URL = os.environ.get('AA_MUMBLE_URL', "yourdomain.com")
|
|
MUMBLE_SERVER_ID = int(os.environ.get('AA_MUMBLE_SERVER_ID', '1'))
|
|
|
|
######################################
|
|
# Teamspeak3 Configuration
|
|
######################################
|
|
# TEAMSPEAK3_SERVER_IP - Teamspeak3 server ip
|
|
# TEAMSPEAK3_SERVER_PORT - Teamspeak3 server port
|
|
# TEAMSPEAK3_SERVERQUERY_USER - Teamspeak3 serverquery username
|
|
# TEAMSPEAK3_SERVERQUERY_PASSWORD - Teamspeak3 serverquery password
|
|
# TEAMSPEAK3_VIRTUAL_SERVER - Virtual server id
|
|
# TEAMSPEAK3_AUTHED_GROUP_ID - Default authed group id
|
|
# TEAMSPEAK3_PUBLIC_URL - teamspeak3 public url used for link creation
|
|
######################################
|
|
TEAMSPEAK3_SERVER_IP = os.environ.get('AA_TEAMSPEAK3_SERVER_IP', '127.0.0.1')
|
|
TEAMSPEAK3_SERVER_PORT = int(os.environ.get('AA_TEAMSPEAK3_SERVER_PORT', '10011'))
|
|
TEAMSPEAK3_SERVERQUERY_USER = os.environ.get('AA_TEAMSPEAK3_SERVERQUERY_USER', 'serveradmin')
|
|
TEAMSPEAK3_SERVERQUERY_PASSWORD = os.environ.get('AA_TEAMSPEAK3_SERVERQUERY_PASSWORD', 'passwordhere')
|
|
TEAMSPEAK3_VIRTUAL_SERVER = int(os.environ.get('AA_TEAMSPEAK3_VIRTUAL_SERVER', '1'))
|
|
TEAMSPEAK3_PUBLIC_URL = os.environ.get('AA_TEAMSPEAK3_PUBLIC_URL', 'yourdomain.com')
|
|
|
|
######################################
|
|
# Discord Configuration
|
|
######################################
|
|
# DISCORD_SERVER_ID - ID of the server to manage
|
|
# DISCORD_USER_EMAIL - email of the server management user
|
|
# DISCORD_USER_PASSWORD - password of the server management user
|
|
######################################
|
|
DISCORD_SERVER_ID = os.environ.get('AA_DISCORD_SERVER_ID', '')
|
|
DISCORD_USER_EMAIL = os.environ.get('AA_DISCORD_USER_EMAIL', '')
|
|
DISCORD_USER_PASSWORD = os.environ.get('AA_DISCORD_USER_PASSWORD', '')
|
|
|
|
#####################################
|
|
# Logging Configuration
|
|
#####################################
|
|
# Set log_file and console level to desired state:
|
|
# DEBUG - basically stack trace, explains every step
|
|
# INFO - model creation, deletion, updates, etc
|
|
# WARN - unexpected function outcomes that do not impact user
|
|
# ERROR - unexcpeted function outcomes which prevent user from achieving desired outcome
|
|
# EXCEPTION - something critical went wrong, unhandled
|
|
#####################################
|
|
# Recommended level for log_file is INFO, console is DEBUG
|
|
# Change log level of individual apps below to narrow your debugging
|
|
#####################################
|
|
LOGGING = {
|
|
'version': 1,
|
|
'disable_existing_loggers': False,
|
|
'formatters': {
|
|
'verbose': {
|
|
'format' : "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s",
|
|
'datefmt' : "%d/%b/%Y %H:%M:%S"
|
|
},
|
|
'simple': {
|
|
'format': '%(levelname)s %(message)s'
|
|
},
|
|
},
|
|
'handlers': {
|
|
'log_file': {
|
|
'level': 'INFO', # edit this line to change logging level to file
|
|
'class': 'logging.handlers.RotatingFileHandler',
|
|
'filename': os.path.join(BASE_DIR,'allianceauth.log'),
|
|
'formatter': 'verbose',
|
|
'maxBytes': 1024*1024*5, # edit this line to change max log file size
|
|
'backupCount': 5, # edit this line to change number of log backups
|
|
},
|
|
'console': {
|
|
'level': 'DEBUG', # edit this line to change logging level to console
|
|
'class': 'logging.StreamHandler',
|
|
'formatter': 'verbose',
|
|
}
|
|
},
|
|
'loggers': {
|
|
'authentication': {
|
|
'handlers': ['log_file', 'console'],
|
|
'level': 'DEBUG',
|
|
},
|
|
'celerytask': {
|
|
'handlers': ['log_file', 'console'],
|
|
'level': 'DEBUG',
|
|
},
|
|
'eveonline': {
|
|
'handlers': ['log_file', 'console'],
|
|
'level': 'DEBUG',
|
|
},
|
|
'groupmanagement': {
|
|
'handlers': ['log_file', 'console'],
|
|
'level': 'DEBUG',
|
|
},
|
|
'hrapplications': {
|
|
'handlers': ['log_file', 'console'],
|
|
'level': 'DEBUG',
|
|
},
|
|
'portal': {
|
|
'handlers': ['log_file', 'console'],
|
|
'level': 'DEBUG',
|
|
},
|
|
'registration': {
|
|
'handlers': ['log_file', 'console'],
|
|
'level': 'DEBUG',
|
|
},
|
|
'services': {
|
|
'handlers': ['log_file', 'console'],
|
|
'level': 'DEBUG',
|
|
},
|
|
'srp': {
|
|
'handlers': ['log_file', 'console'],
|
|
'level': 'DEBUG',
|
|
},
|
|
'timerboard': {
|
|
'handlers': ['log_file', 'console'],
|
|
'level': 'DEBUG',
|
|
},
|
|
'sigtracker': {
|
|
'handlers': ['log_file', 'console'],
|
|
'level': 'DEBUG',
|
|
},
|
|
'optimer': {
|
|
'handlers': ['log_file', 'console'],
|
|
'level': 'DEBUG',
|
|
},
|
|
'corputils': {
|
|
'handlers': ['log_file', 'console'],
|
|
'level': 'DEBUG',
|
|
},
|
|
'util': {
|
|
'handlers': ['log_file', 'console'],
|
|
'level': 'DEBUG',
|
|
},
|
|
'django': {
|
|
'handlers': ['log_file', 'console'],
|
|
'level': 'ERROR',
|
|
},
|
|
}
|
|
}
|
|
|