Merge pull request #17088 from edx/arch/delete-dev-files
Delete old development config files
This commit is contained in:
@@ -1,48 +0,0 @@
|
||||
"""
|
||||
Script for cloning a course
|
||||
"""
|
||||
from __future__ import print_function
|
||||
|
||||
from django.core.management.base import BaseCommand
|
||||
from opaque_keys.edx.keys import CourseKey
|
||||
|
||||
from student.roles import CourseInstructorRole, CourseStaffRole
|
||||
from xmodule.modulestore import ModuleStoreEnum
|
||||
from xmodule.modulestore.django import modulestore
|
||||
|
||||
|
||||
#
|
||||
# To run from command line: ./manage.py cms clone_course --settings=dev master/300/cough edx/111/foo
|
||||
#
|
||||
class Command(BaseCommand):
|
||||
"""
|
||||
Clone a MongoDB-backed course to another location
|
||||
"""
|
||||
help = 'Clone a MongoDB backed course to another location'
|
||||
|
||||
def add_arguments(self, parser):
|
||||
parser.add_argument('source_course_id', help='Course ID to copy from')
|
||||
parser.add_argument('dest_course_id', help='Course ID to copy to')
|
||||
|
||||
def handle(self, *args, **options):
|
||||
"""
|
||||
Execute the command
|
||||
"""
|
||||
|
||||
source_course_id = CourseKey.from_string(options['source_course_id'])
|
||||
dest_course_id = CourseKey.from_string(options['dest_course_id'])
|
||||
|
||||
mstore = modulestore()
|
||||
|
||||
print("Cloning course {0} to {1}".format(source_course_id, dest_course_id))
|
||||
|
||||
with mstore.bulk_operations(dest_course_id):
|
||||
if mstore.clone_course(source_course_id, dest_course_id, ModuleStoreEnum.UserID.mgmt_command):
|
||||
print("copying User permissions...")
|
||||
# purposely avoids auth.add_user b/c it doesn't have a caller to authorize
|
||||
CourseInstructorRole(dest_course_id).add_users(
|
||||
*CourseInstructorRole(source_course_id).users_with_role()
|
||||
)
|
||||
CourseStaffRole(dest_course_id).add_users(
|
||||
*CourseStaffRole(source_course_id).users_with_role()
|
||||
)
|
||||
@@ -1,60 +0,0 @@
|
||||
"""
|
||||
Script for granting existing course instructors course creator privileges.
|
||||
|
||||
This script is only intended to be run once on a given environment.
|
||||
|
||||
To run: ./manage.py cms populate_creators --settings=dev
|
||||
"""
|
||||
from django.contrib.auth.models import User
|
||||
from django.core.management.base import BaseCommand
|
||||
from django.db.utils import IntegrityError
|
||||
|
||||
from course_creators.views import add_user_with_status_granted, add_user_with_status_unrequested
|
||||
from student.roles import CourseInstructorRole, CourseStaffRole
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
"""
|
||||
Script for granting existing course instructors course creator privileges.
|
||||
"""
|
||||
help = 'Grants all users with INSTRUCTOR role permission to create courses'
|
||||
|
||||
def handle(self, *args, **options):
|
||||
"""
|
||||
The logic of the command.
|
||||
"""
|
||||
username = 'populate_creators_command'
|
||||
email = 'grant+creator+access@edx.org'
|
||||
try:
|
||||
admin = User.objects.create_user(username, email, 'foo')
|
||||
admin.is_staff = True
|
||||
admin.save()
|
||||
except IntegrityError:
|
||||
# If the script did not complete the last time it was run,
|
||||
# the admin user will already exist.
|
||||
admin = User.objects.get(username=username, email=email)
|
||||
|
||||
try:
|
||||
for user in get_users_with_role(CourseInstructorRole.ROLE):
|
||||
add_user_with_status_granted(admin, user)
|
||||
|
||||
# Some users will be both staff and instructors. Those folks have been
|
||||
# added with status granted above, and add_user_with_status_unrequested
|
||||
# will not try to add them again if they already exist in the course creator database.
|
||||
for user in get_users_with_role(CourseStaffRole.ROLE):
|
||||
add_user_with_status_unrequested(user)
|
||||
|
||||
# There could be users who are not in either staff or instructor (they've
|
||||
# never actually done anything in Studio). I plan to add those as unrequested
|
||||
# when they first go to their dashboard.
|
||||
finally:
|
||||
# Let's not leave this lying around.
|
||||
admin.delete()
|
||||
|
||||
|
||||
# Because these are expensive and far-reaching, I moved them here
|
||||
def get_users_with_role(role_prefix):
|
||||
"""
|
||||
An expensive operation which finds all users in the db with the given role prefix
|
||||
"""
|
||||
return User.objects.filter(groups__name__startswith=role_prefix)
|
||||
@@ -1,12 +0,0 @@
|
||||
"""
|
||||
A new cms ENV configuration to use a slow upload file handler to help test
|
||||
progress bars in uploads
|
||||
"""
|
||||
# pylint: disable=unused-wildcard-import
|
||||
from .dev import * # pylint: disable=wildcard-import
|
||||
|
||||
FILE_UPLOAD_HANDLERS = [
|
||||
'contentstore.debug_file_uploader.DebugFileUploader',
|
||||
'django.core.files.uploadhandler.MemoryFileUploadHandler',
|
||||
'django.core.files.uploadhandler.TemporaryFileUploadHandler',
|
||||
]
|
||||
185
cms/envs/dev.py
185
cms/envs/dev.py
@@ -1,185 +0,0 @@
|
||||
"""
|
||||
This config file runs the simplest dev environment"""
|
||||
|
||||
# We intentionally define lots of variables that aren't used, and
|
||||
# want to import all variables from base settings files
|
||||
# pylint: disable=wildcard-import, unused-wildcard-import
|
||||
|
||||
from .common import *
|
||||
from openedx.core.lib.derived import derive_settings
|
||||
from openedx.core.lib.logsettings import get_logger_config
|
||||
|
||||
# import settings from LMS for consistent behavior with CMS
|
||||
from lms.envs.dev import (WIKI_ENABLED)
|
||||
|
||||
DEBUG = True
|
||||
HTTPS = 'off'
|
||||
|
||||
LOGGING = get_logger_config(ENV_ROOT / "log",
|
||||
logging_env="dev",
|
||||
tracking_filename="tracking.log",
|
||||
dev_env=True,
|
||||
debug=True)
|
||||
|
||||
update_module_store_settings(
|
||||
MODULESTORE,
|
||||
module_store_options={
|
||||
'default_class': 'xmodule.raw_module.RawDescriptor',
|
||||
'fs_root': GITHUB_REPO_ROOT,
|
||||
}
|
||||
)
|
||||
|
||||
DJFS = {
|
||||
'type': 'osfs',
|
||||
'directory_root': 'cms/static/djpyfs',
|
||||
'url_root': '/static/djpyfs'
|
||||
}
|
||||
|
||||
# cdodge: This is the specifier for the MongoDB (using GridFS) backed static content store
|
||||
# This is for static content for courseware, not system static content (e.g. javascript, css, edX branding, etc)
|
||||
CONTENTSTORE = {
|
||||
'ENGINE': 'xmodule.contentstore.mongo.MongoContentStore',
|
||||
'DOC_STORE_CONFIG': {
|
||||
'host': 'localhost',
|
||||
'db': 'xcontent',
|
||||
},
|
||||
# allow for additional options that can be keyed on a name, e.g. 'trashcan'
|
||||
'ADDITIONAL_OPTIONS': {
|
||||
'trashcan': {
|
||||
'bucket': 'trash_fs'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
DATABASES = {
|
||||
'default': {
|
||||
'ENGINE': 'django.db.backends.sqlite3',
|
||||
'NAME': ENV_ROOT / "db" / "edx.db",
|
||||
'ATOMIC_REQUESTS': True,
|
||||
}
|
||||
}
|
||||
|
||||
LMS_BASE = "localhost:8000"
|
||||
LMS_ROOT_URL = "http://{}".format(LMS_BASE)
|
||||
FEATURES['PREVIEW_LMS_BASE'] = "localhost:8000"
|
||||
|
||||
REPOS = {
|
||||
'edx4edx': {
|
||||
'branch': 'master',
|
||||
'origin': 'git@github.com:MITx/edx4edx.git',
|
||||
},
|
||||
'content-mit-6002x': {
|
||||
'branch': 'master',
|
||||
# 'origin': 'git@github.com:MITx/6002x-fall-2012.git',
|
||||
'origin': 'git@github.com:MITx/content-mit-6002x.git',
|
||||
},
|
||||
'6.00x': {
|
||||
'branch': 'master',
|
||||
'origin': 'git@github.com:MITx/6.00x.git',
|
||||
},
|
||||
'7.00x': {
|
||||
'branch': 'master',
|
||||
'origin': 'git@github.com:MITx/7.00x.git',
|
||||
},
|
||||
'3.091x': {
|
||||
'branch': 'master',
|
||||
'origin': 'git@github.com:MITx/3.091x.git',
|
||||
},
|
||||
}
|
||||
|
||||
CACHES = {
|
||||
# This is the cache used for most things. Askbot will not work without a
|
||||
# functioning cache -- it relies on caching to load its settings in places.
|
||||
# In staging/prod envs, the sessions also live here.
|
||||
'default': {
|
||||
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
|
||||
'LOCATION': 'edx_loc_mem_cache',
|
||||
'KEY_FUNCTION': 'util.memcache.safe_key',
|
||||
},
|
||||
|
||||
# The general cache is what you get if you use our util.cache. It's used for
|
||||
# things like caching the course.xml file for different A/B test groups.
|
||||
# We set it to be a DummyCache to force reloading of course.xml in dev.
|
||||
# In staging environments, we would grab VERSION from data uploaded by the
|
||||
# push process.
|
||||
'general': {
|
||||
'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
|
||||
'KEY_PREFIX': 'general',
|
||||
'VERSION': 4,
|
||||
'KEY_FUNCTION': 'util.memcache.safe_key',
|
||||
},
|
||||
|
||||
'mongo_metadata_inheritance': {
|
||||
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
|
||||
'LOCATION': '/var/tmp/mongo_metadata_inheritance',
|
||||
'TIMEOUT': 300,
|
||||
'KEY_FUNCTION': 'util.memcache.safe_key',
|
||||
},
|
||||
'loc_cache': {
|
||||
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
|
||||
'LOCATION': 'edx_location_mem_cache',
|
||||
},
|
||||
'course_structure_cache': {
|
||||
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
|
||||
'LOCATION': 'edx_course_structure_mem_cache',
|
||||
},
|
||||
}
|
||||
|
||||
# Make the keyedcache startup warnings go away
|
||||
CACHE_TIMEOUT = 0
|
||||
|
||||
# Dummy secret key for dev
|
||||
SECRET_KEY = '85920908f28904ed733fe576320db18cabd7b6cd'
|
||||
|
||||
################################ PIPELINE #################################
|
||||
|
||||
PIPELINE_SASS_ARGUMENTS = '--debug-info'
|
||||
|
||||
################################# CELERY ######################################
|
||||
|
||||
# By default don't use a worker, execute tasks as if they were local functions
|
||||
CELERY_ALWAYS_EAGER = True
|
||||
|
||||
################################ DEBUG TOOLBAR #################################
|
||||
INSTALLED_APPS += ['debug_toolbar', 'debug_toolbar_mongo', 'djpyfs']
|
||||
|
||||
MIDDLEWARE_CLASSES.append('debug_toolbar.middleware.DebugToolbarMiddleware')
|
||||
INTERNAL_IPS = ('127.0.0.1',)
|
||||
|
||||
DEBUG_TOOLBAR_PANELS = (
|
||||
'debug_toolbar.panels.versions.VersionsPanel',
|
||||
'debug_toolbar.panels.timer.TimerPanel',
|
||||
'debug_toolbar.panels.settings.SettingsPanel',
|
||||
'debug_toolbar.panels.headers.HeadersPanel',
|
||||
'debug_toolbar.panels.request.RequestPanel',
|
||||
'debug_toolbar.panels.sql.SQLPanel',
|
||||
'debug_toolbar.panels.signals.SignalsPanel',
|
||||
'debug_toolbar.panels.logging.LoggingPanel',
|
||||
'debug_toolbar.panels.profiling.ProfilingPanel',
|
||||
)
|
||||
|
||||
# To see stacktraces for MongoDB queries, set this to True.
|
||||
# Stacktraces slow down page loads drastically (for pages with lots of queries).
|
||||
DEBUG_TOOLBAR_MONGO_STACKTRACES = False
|
||||
|
||||
# Enable URL that shows information about the status of various services
|
||||
FEATURES['ENABLE_SERVICE_STATUS'] = True
|
||||
|
||||
############################# SEGMENT-IO ##################################
|
||||
|
||||
# If there's an environment variable set, grab it to turn on Segment
|
||||
# Note that this is the Studio key. There is a separate key for the LMS.
|
||||
import os
|
||||
CMS_SEGMENT_KEY = os.environ.get('SEGMENT_KEY')
|
||||
|
||||
|
||||
#####################################################################
|
||||
# Lastly, see if the developer has any local overrides.
|
||||
try:
|
||||
from .private import * # pylint: disable=import-error
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
########################## Derive Any Derived Settings #######################
|
||||
|
||||
derive_settings(__name__)
|
||||
@@ -1,26 +0,0 @@
|
||||
"""
|
||||
This configuration is to turn on the Django Toolbar stats for DB access stats, for performance analysis
|
||||
"""
|
||||
|
||||
# We intentionally define lots of variables that aren't used, and
|
||||
# want to import all variables from base settings files
|
||||
# pylint: disable=wildcard-import, unused-wildcard-import
|
||||
|
||||
from .dev import *
|
||||
|
||||
DEBUG_TOOLBAR_PANELS = (
|
||||
'debug_toolbar.panels.versions.VersionsPanel',
|
||||
'debug_toolbar.panels.timer.TimerPanel',
|
||||
'debug_toolbar.panels.settings.SettingsPanel',
|
||||
'debug_toolbar.panels.headers.HeadersPanel',
|
||||
'debug_toolbar.panels.request.RequestPanel',
|
||||
'debug_toolbar.panels.sql.SQLPanel',
|
||||
'debug_toolbar.panels.signals.SignalsPanel',
|
||||
'debug_toolbar.panels.logging.LoggingPanel',
|
||||
'debug_toolbar_mongo.panel.MongoDebugPanel'
|
||||
'debug_toolbar.panels.profiling.ProfilingPanel',
|
||||
)
|
||||
|
||||
# To see stacktraces for MongoDB queries, set this to True.
|
||||
# Stacktraces slow down page loads drastically (for pages with lots of queries).
|
||||
DEBUG_TOOLBAR_MONGO_STACKTRACES = True
|
||||
@@ -1,12 +0,0 @@
|
||||
"""
|
||||
This is a localdev test for the Microsite processing pipeline
|
||||
"""
|
||||
# We intentionally define lots of variables that aren't used, and
|
||||
# want to import all variables from base settings files
|
||||
# pylint: disable=wildcard-import, unused-wildcard-import
|
||||
|
||||
from .dev import *
|
||||
|
||||
MICROSITE_NAMES = ['openedx']
|
||||
MICROSITE_CONFIGURATION = {}
|
||||
FEATURES['USE_MICROSITES'] = True
|
||||
@@ -1,270 +0,0 @@
|
||||
"""
|
||||
This is the default template for our main set of AWS servers.
|
||||
|
||||
Before importing this settings file the following MUST be
|
||||
defined in the environment:
|
||||
|
||||
* SERVICE_VARIANT - can be either "lms" or "cms"
|
||||
* CONFIG_ROOT - the directory where the application
|
||||
yaml config files are located
|
||||
|
||||
"""
|
||||
|
||||
# We intentionally define lots of variables that aren't used, and
|
||||
# want to import all variables from base settings files
|
||||
# pylint: disable=wildcard-import, unused-wildcard-import, undefined-variable, used-before-assignment
|
||||
|
||||
import yaml
|
||||
|
||||
from .common import *
|
||||
from openedx.core.lib.derived import derive_settings
|
||||
from openedx.core.lib.logsettings import get_logger_config
|
||||
from util.config_parse import convert_tokens
|
||||
import os
|
||||
|
||||
from path import Path as path
|
||||
from xmodule.modulestore.modulestore_settings import convert_module_store_setting_if_needed
|
||||
|
||||
# https://stackoverflow.com/questions/2890146/how-to-force-pyyaml-to-load-strings-as-unicode-objects
|
||||
from yaml import Loader, SafeLoader
|
||||
|
||||
|
||||
def construct_yaml_str(self, node):
|
||||
"""
|
||||
Override the default string handling function
|
||||
to always return unicode objects
|
||||
"""
|
||||
return self.construct_scalar(node)
|
||||
Loader.add_constructor(u'tag:yaml.org,2002:str', construct_yaml_str)
|
||||
SafeLoader.add_constructor(u'tag:yaml.org,2002:str', construct_yaml_str)
|
||||
|
||||
# SERVICE_VARIANT specifies name of the variant used, which decides what YAML
|
||||
# configuration files are read during startup.
|
||||
SERVICE_VARIANT = os.environ.get('SERVICE_VARIANT', None)
|
||||
|
||||
# CONFIG_ROOT specifies the directory where the YAML configuration
|
||||
# files are expected to be found. If not specified, use the project
|
||||
# directory.
|
||||
CONFIG_ROOT = path(os.environ.get('CONFIG_ROOT', ENV_ROOT))
|
||||
|
||||
# CONFIG_PREFIX specifies the prefix of the YAML configuration files,
|
||||
# based on the service variant. If no variant is use, don't use a
|
||||
# prefix.
|
||||
CONFIG_PREFIX = SERVICE_VARIANT + "." if SERVICE_VARIANT else ""
|
||||
|
||||
##############################################################
|
||||
#
|
||||
# DEFAULT SETTINGS FOR PRODUCTION
|
||||
#
|
||||
# These are defaults common for all production deployments
|
||||
#
|
||||
|
||||
DEBUG = False
|
||||
|
||||
EMAIL_BACKEND = 'django_ses.SESBackend'
|
||||
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
|
||||
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
|
||||
|
||||
GIT_REPO_EXPORT_DIR = '/edx/var/edxapp/export_course_repos'
|
||||
SESSION_INACTIVITY_TIMEOUT_IN_SECONDS = None
|
||||
EMAIL_FILE_PATH = None
|
||||
STATIC_URL_BASE = None
|
||||
STATIC_ROOT_BASE = None
|
||||
SESSION_COOKIE_NAME = None
|
||||
ADDL_INSTALLED_APPS = []
|
||||
AUTH_USE_CAS = False
|
||||
CAS_ATTRIBUTE_CALLBACK = None
|
||||
MICROSITE_ROOT_DIR = ''
|
||||
CMS_SEGMENT_KEY = None
|
||||
DATADOG = {}
|
||||
ADDL_INSTALLED_APPS = []
|
||||
LOCAL_LOGLEVEL = 'INFO'
|
||||
##############################################################
|
||||
#
|
||||
# ENV TOKEN IMPORT
|
||||
#
|
||||
# Currently non-secure and secure settings are managed
|
||||
# in two yaml files. This section imports the non-secure
|
||||
# settings and modifies them in code if necessary.
|
||||
#
|
||||
|
||||
with open(CONFIG_ROOT / CONFIG_PREFIX + "env.yaml") as env_file:
|
||||
ENV_TOKENS = yaml.safe_load(env_file)
|
||||
|
||||
ENV_TOKENS = convert_tokens(ENV_TOKENS)
|
||||
|
||||
##############################################################
|
||||
#
|
||||
# DEFAULT SETTINGS FOR CELERY
|
||||
#
|
||||
|
||||
# Don't use a connection pool, since connections are dropped by ELB.
|
||||
BROKER_POOL_LIMIT = 0
|
||||
BROKER_CONNECTION_TIMEOUT = 1
|
||||
|
||||
# For the Result Store, use the django cache named 'celery'
|
||||
CELERY_RESULT_BACKEND = 'djcelery.backends.cache:CacheBackend'
|
||||
|
||||
# When the broker is behind an ELB, use a heartbeat to refresh the
|
||||
# connection and to detect if it has been dropped.
|
||||
BROKER_HEARTBEAT = 60.0
|
||||
BROKER_HEARTBEAT_CHECKRATE = 2
|
||||
|
||||
# Each worker should only fetch one message at a time
|
||||
CELERYD_PREFETCH_MULTIPLIER = 1
|
||||
|
||||
# Rename the exchange and queues for each variant
|
||||
|
||||
QUEUE_VARIANT = CONFIG_PREFIX.lower()
|
||||
|
||||
CELERY_DEFAULT_EXCHANGE = 'edx.{0}core'.format(QUEUE_VARIANT)
|
||||
|
||||
HIGH_PRIORITY_QUEUE = 'edx.{0}core.high'.format(QUEUE_VARIANT)
|
||||
DEFAULT_PRIORITY_QUEUE = 'edx.{0}core.default'.format(QUEUE_VARIANT)
|
||||
LOW_PRIORITY_QUEUE = 'edx.{0}core.low'.format(QUEUE_VARIANT)
|
||||
|
||||
CELERY_DEFAULT_QUEUE = DEFAULT_PRIORITY_QUEUE
|
||||
CELERY_DEFAULT_ROUTING_KEY = DEFAULT_PRIORITY_QUEUE
|
||||
|
||||
ENV_CELERY_QUEUES = ENV_TOKENS.get('CELERY_QUEUES', None)
|
||||
if ENV_CELERY_QUEUES:
|
||||
CELERY_QUEUES = {queue: {} for queue in ENV_CELERY_QUEUES}
|
||||
else:
|
||||
CELERY_QUEUES = {
|
||||
HIGH_PRIORITY_QUEUE: {},
|
||||
LOW_PRIORITY_QUEUE: {},
|
||||
DEFAULT_PRIORITY_QUEUE: {}
|
||||
}
|
||||
|
||||
CELERY_ALWAYS_EAGER = False
|
||||
|
||||
##########################################
|
||||
# Merge settings from common.py
|
||||
#
|
||||
# Before the tokens are imported directly
|
||||
# into settings some dictionary settings
|
||||
# need to be merged from common.py
|
||||
|
||||
ENV_FEATURES = ENV_TOKENS.get('FEATURES', {})
|
||||
for feature, value in ENV_FEATURES.items():
|
||||
FEATURES[feature] = value
|
||||
|
||||
# Delete keys from ENV_TOKENS so that when it's imported
|
||||
# into settings it doesn't override what was set above
|
||||
if 'FEATURES' in ENV_TOKENS:
|
||||
del ENV_TOKENS['FEATURES']
|
||||
|
||||
vars().update(ENV_TOKENS)
|
||||
|
||||
##########################################
|
||||
# Manipulate imported settings with code
|
||||
#
|
||||
# For historical reasons some settings need
|
||||
# to be modified in code. For example
|
||||
# conversions to other data structures that
|
||||
# cannot be represented in YAML.
|
||||
|
||||
if STATIC_URL_BASE:
|
||||
# collectstatic will fail if STATIC_URL is a unicode string
|
||||
STATIC_URL = STATIC_URL_BASE.encode('ascii')
|
||||
if not STATIC_URL.endswith("/"):
|
||||
STATIC_URL += "/"
|
||||
STATIC_URL += 'studio/'
|
||||
|
||||
if STATIC_ROOT_BASE:
|
||||
STATIC_ROOT = path(STATIC_ROOT_BASE) / 'studio'
|
||||
|
||||
|
||||
# Cache used for location mapping -- called many times with the same key/value
|
||||
# in a given request.
|
||||
if 'loc_cache' not in CACHES:
|
||||
CACHES['loc_cache'] = {
|
||||
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
|
||||
'LOCATION': 'edx_location_mem_cache',
|
||||
}
|
||||
|
||||
|
||||
# allow for environments to specify what cookie name our login subsystem should use
|
||||
# this is to fix a bug regarding simultaneous logins between edx.org and edge.edx.org which can
|
||||
# happen with some browsers (e.g. Firefox)
|
||||
if SESSION_COOKIE_NAME:
|
||||
# NOTE, there's a bug in Django (http://bugs.python.org/issue18012) which necessitates this being a str()
|
||||
SESSION_COOKIE_NAME = str(SESSION_COOKIE_NAME)
|
||||
|
||||
|
||||
# Additional installed apps
|
||||
for app in ADDL_INSTALLED_APPS:
|
||||
INSTALLED_APPS.append(app)
|
||||
|
||||
|
||||
LOGGING = get_logger_config(LOG_DIR,
|
||||
local_loglevel=LOCAL_LOGLEVEL,
|
||||
logging_env=LOGGING_ENV,
|
||||
debug=False,
|
||||
service_variant=SERVICE_VARIANT)
|
||||
|
||||
if AUTH_USE_CAS:
|
||||
AUTHENTICATION_BACKENDS = [
|
||||
'django.contrib.auth.backends.ModelBackend',
|
||||
'django_cas.backends.CASBackend',
|
||||
]
|
||||
|
||||
INSTALLED_APPS.append('django_cas')
|
||||
|
||||
MIDDLEWARE_CLASSES.append('django_cas.middleware.CASMiddleware')
|
||||
if CAS_ATTRIBUTE_CALLBACK:
|
||||
import importlib
|
||||
CAS_USER_DETAILS_RESOLVER = getattr(
|
||||
importlib.import_module(CAS_ATTRIBUTE_CALLBACK['module']),
|
||||
CAS_ATTRIBUTE_CALLBACK['function']
|
||||
)
|
||||
|
||||
MICROSITE_ROOT_DIR = path(MICROSITE_ROOT_DIR)
|
||||
|
||||
##############################################################
|
||||
#
|
||||
# AUTH TOKEN IMPORT
|
||||
#
|
||||
|
||||
with open(CONFIG_ROOT / CONFIG_PREFIX + "auth.yaml") as auth_file:
|
||||
AUTH_TOKENS = yaml.safe_load(auth_file)
|
||||
|
||||
AUTH_TOKENS = convert_tokens(AUTH_TOKENS)
|
||||
|
||||
vars().update(AUTH_TOKENS)
|
||||
|
||||
##########################################
|
||||
# Manipulate imported settings with code
|
||||
#
|
||||
|
||||
if AWS_ACCESS_KEY_ID == "":
|
||||
AWS_ACCESS_KEY_ID = None
|
||||
|
||||
if AWS_SECRET_ACCESS_KEY == "":
|
||||
AWS_SECRET_ACCESS_KEY = None
|
||||
|
||||
MODULESTORE = convert_module_store_setting_if_needed(MODULESTORE)
|
||||
|
||||
# TODO: deprecated (compatibility with previous settings)
|
||||
if 'DATADOG_API' in AUTH_TOKENS:
|
||||
DATADOG['api_key'] = AUTH_TOKENS['DATADOG_API']
|
||||
|
||||
BROKER_URL = "{0}://{1}:{2}@{3}/{4}".format(CELERY_BROKER_TRANSPORT,
|
||||
CELERY_BROKER_USER,
|
||||
CELERY_BROKER_PASSWORD,
|
||||
CELERY_BROKER_HOSTNAME,
|
||||
CELERY_BROKER_VHOST)
|
||||
BROKER_USE_SSL = ENV_TOKENS.get('CELERY_BROKER_USE_SSL', False)
|
||||
|
||||
######################## CUSTOM COURSES for EDX CONNECTOR ######################
|
||||
if FEATURES.get('CUSTOM_COURSES_EDX'):
|
||||
INSTALLED_APPS.append('openedx.core.djangoapps.ccxcon.apps.CCXConnectorConfig')
|
||||
|
||||
########################## Extra middleware classes #######################
|
||||
|
||||
# Allow extra middleware classes to be added to the app through configuration.
|
||||
MIDDLEWARE_CLASSES.extend(ENV_TOKENS.get('EXTRA_MIDDLEWARE_CLASSES', []))
|
||||
|
||||
########################## Derive Any Derived Settings #######################
|
||||
|
||||
derive_settings(__name__)
|
||||
@@ -38,7 +38,6 @@ from path import Path as path
|
||||
from warnings import simplefilter
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from .discussionsettings import *
|
||||
from openedx.core.djangoapps.theming.helpers_dirs import (
|
||||
get_themes_unchecked,
|
||||
get_theme_base_dirs_from_settings
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
"""
|
||||
These are debug machines used for content creators, so they're kind of a cross
|
||||
between dev machines and AWS machines.
|
||||
"""
|
||||
|
||||
# We intentionally define lots of variables that aren't used, and
|
||||
# want to import all variables from base settings files
|
||||
# pylint: disable=wildcard-import, unused-wildcard-import
|
||||
|
||||
from .aws import *
|
||||
|
||||
DEBUG = True
|
||||
|
||||
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
|
||||
|
||||
################################ DEBUG TOOLBAR #################################
|
||||
INSTALLED_APPS.append('debug_toolbar')
|
||||
|
||||
MIDDLEWARE_CLASSES.append('debug_toolbar.middleware.DebugToolbarMiddleware')
|
||||
|
||||
DEBUG_TOOLBAR_PANELS = (
|
||||
'debug_toolbar.panels.versions.VersionsPanel',
|
||||
'debug_toolbar.panels.timer.TimerPanel',
|
||||
'debug_toolbar.panels.settings.SettingsPanel',
|
||||
'debug_toolbar.panels.headers.HeadersPanel',
|
||||
'debug_toolbar.panels.request.RequestPanel',
|
||||
'debug_toolbar.panels.sql.SQLPanel',
|
||||
'debug_toolbar.panels.signals.SignalsPanel',
|
||||
'debug_toolbar.panels.logging.LoggingPanel',
|
||||
'debug_toolbar.panels.profiling.ProfilingPanel',
|
||||
)
|
||||
276
lms/envs/dev.py
276
lms/envs/dev.py
@@ -1,276 +0,0 @@
|
||||
"""
|
||||
This config file runs the simplest dev environment using sqlite, and db-based
|
||||
sessions. Assumes structure:
|
||||
|
||||
/envroot/
|
||||
/db # This is where it'll write the database file
|
||||
/edx-platform # The location of this repo
|
||||
/log # Where we're going to write log files
|
||||
"""
|
||||
|
||||
# We intentionally define lots of variables that aren't used, and
|
||||
# want to import all variables from base settings files
|
||||
# pylint: disable=wildcard-import, unused-wildcard-import
|
||||
|
||||
from .common import *
|
||||
from openedx.core.lib.derived import derive_settings
|
||||
|
||||
DEBUG = True
|
||||
|
||||
HTTPS = 'off'
|
||||
FEATURES['DISABLE_START_DATES'] = False
|
||||
FEATURES['ENABLE_SQL_TRACKING_LOGS'] = True
|
||||
FEATURES['ENABLE_MANUAL_GIT_RELOAD'] = True
|
||||
FEATURES['ENABLE_SERVICE_STATUS'] = True
|
||||
FEATURES['ENABLE_SHOPPING_CART'] = True
|
||||
FEATURES['AUTOMATIC_VERIFY_STUDENT_IDENTITY_FOR_TESTING'] = True
|
||||
FEATURES['ENABLE_GRADE_DOWNLOADS'] = True
|
||||
FEATURES['ENABLE_PAYMENT_FAKE'] = True
|
||||
|
||||
LMS_ROOT_URL = "http://localhost:8000"
|
||||
|
||||
FEEDBACK_SUBMISSION_EMAIL = "dummy@example.com"
|
||||
|
||||
WIKI_ENABLED = True
|
||||
|
||||
DJFS = {
|
||||
'type': 'osfs',
|
||||
'directory_root': 'lms/static/djpyfs',
|
||||
'url_root': '/static/djpyfs'
|
||||
}
|
||||
|
||||
# If there is a database called 'read_replica', you can use the use_read_replica_if_available
|
||||
# function in util/query.py, which is useful for very large database reads
|
||||
DATABASES = {
|
||||
'default': {
|
||||
'ENGINE': 'django.db.backends.sqlite3',
|
||||
'NAME': ENV_ROOT / "db" / "edx.db",
|
||||
'ATOMIC_REQUESTS': True,
|
||||
},
|
||||
'student_module_history': {
|
||||
'ENGINE': 'django.db.backends.sqlite3',
|
||||
'NAME': ENV_ROOT / "db" / "student_module_history.db",
|
||||
'ATOMIC_REQUESTS': True,
|
||||
}
|
||||
}
|
||||
|
||||
CACHES = {
|
||||
# This is the cache used for most things.
|
||||
# In staging/prod envs, the sessions also live here.
|
||||
'default': {
|
||||
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
|
||||
'LOCATION': 'edx_loc_mem_cache',
|
||||
'KEY_FUNCTION': 'util.memcache.safe_key',
|
||||
},
|
||||
|
||||
# The general cache is what you get if you use our util.cache. It's used for
|
||||
# things like caching the course.xml file for different A/B test groups.
|
||||
# We set it to be a DummyCache to force reloading of course.xml in dev.
|
||||
# In staging environments, we would grab VERSION from data uploaded by the
|
||||
# push process.
|
||||
'general': {
|
||||
'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
|
||||
'KEY_PREFIX': 'general',
|
||||
'VERSION': 4,
|
||||
'KEY_FUNCTION': 'util.memcache.safe_key',
|
||||
},
|
||||
|
||||
'mongo_metadata_inheritance': {
|
||||
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
|
||||
'LOCATION': '/var/tmp/mongo_metadata_inheritance',
|
||||
'TIMEOUT': 300,
|
||||
'KEY_FUNCTION': 'util.memcache.safe_key',
|
||||
},
|
||||
'loc_cache': {
|
||||
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
|
||||
'LOCATION': 'edx_location_mem_cache',
|
||||
},
|
||||
'course_structure_cache': {
|
||||
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
|
||||
'LOCATION': 'edx_course_structure_mem_cache',
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
XQUEUE_INTERFACE = {
|
||||
"url": "https://sandbox-xqueue.edx.org",
|
||||
"django_auth": {
|
||||
"username": "lms",
|
||||
"password": "***REMOVED***"
|
||||
},
|
||||
"basic_auth": ('anant', 'agarwal'),
|
||||
}
|
||||
|
||||
# Make the keyedcache startup warnings go away
|
||||
CACHE_TIMEOUT = 0
|
||||
|
||||
# Dummy secret key for dev
|
||||
SECRET_KEY = '85920908f28904ed733fe576320db18cabd7b6cd'
|
||||
|
||||
|
||||
COURSE_LISTINGS = {
|
||||
'default': ['BerkeleyX/CS169.1x/2012_Fall',
|
||||
'BerkeleyX/CS188.1x/2012_Fall',
|
||||
'HarvardX/CS50x/2012',
|
||||
'HarvardX/PH207x/2012_Fall',
|
||||
'MITx/3.091x/2012_Fall',
|
||||
'MITx/6.002x/2012_Fall',
|
||||
'MITx/6.00x/2012_Fall'],
|
||||
'berkeley': ['BerkeleyX/CS169/fa12',
|
||||
'BerkeleyX/CS188/fa12'],
|
||||
'harvard': ['HarvardX/CS50x/2012H'],
|
||||
'mit': ['MITx/3.091/MIT_2012_Fall'],
|
||||
'sjsu': ['MITx/6.002x-EE98/2012_Fall_SJSU'],
|
||||
}
|
||||
|
||||
# List of `university` landing pages to display, even though they may not
|
||||
# have an actual course with that org set
|
||||
VIRTUAL_UNIVERSITIES = []
|
||||
|
||||
# Organization that contain other organizations
|
||||
META_UNIVERSITIES = {'UTx': ['UTAustinX']}
|
||||
|
||||
COMMENTS_SERVICE_KEY = "PUT_YOUR_API_KEY_HERE"
|
||||
|
||||
############################## Course static files ##########################
|
||||
if os.path.isdir(DATA_DIR):
|
||||
# Add the full course repo if there is no static directory
|
||||
STATICFILES_DIRS += [
|
||||
# TODO (cpennington): When courses are stored in a database, this
|
||||
# should no longer be added to STATICFILES
|
||||
(course_dir, DATA_DIR / course_dir)
|
||||
for course_dir in os.listdir(DATA_DIR)
|
||||
if (os.path.isdir(DATA_DIR / course_dir) and
|
||||
not os.path.isdir(DATA_DIR / course_dir / 'static'))
|
||||
]
|
||||
# Otherwise, add only the static directory from the course dir
|
||||
STATICFILES_DIRS += [
|
||||
# TODO (cpennington): When courses are stored in a database, this
|
||||
# should no longer be added to STATICFILES
|
||||
(course_dir, DATA_DIR / course_dir / 'static')
|
||||
for course_dir in os.listdir(DATA_DIR)
|
||||
if (os.path.isdir(DATA_DIR / course_dir / 'static'))
|
||||
]
|
||||
|
||||
|
||||
################################# edx-platform revision string #####################
|
||||
|
||||
EDX_PLATFORM_VERSION_STRING = os.popen('cd %s; git describe' % REPO_ROOT).read().strip()
|
||||
|
||||
############################## LMS Migration ##################################
|
||||
FEATURES['ENABLE_LMS_MIGRATION'] = True
|
||||
FEATURES['XQA_SERVER'] = 'http://xqa:server@content-qa.edX.mit.edu/xqa'
|
||||
|
||||
INSTALLED_APPS.append('lms_migration')
|
||||
|
||||
LMS_MIGRATION_ALLOWED_IPS = ['127.0.0.1']
|
||||
|
||||
################################ OpenID Auth #################################
|
||||
|
||||
FEATURES['AUTH_USE_OPENID'] = True
|
||||
FEATURES['AUTH_USE_OPENID_PROVIDER'] = True
|
||||
FEATURES['BYPASS_ACTIVATION_EMAIL_FOR_EXTAUTH'] = True
|
||||
|
||||
OPENID_CREATE_USERS = False
|
||||
OPENID_UPDATE_DETAILS_FROM_SREG = True
|
||||
OPENID_SSO_SERVER_URL = 'https://www.google.com/accounts/o8/id' # TODO: accept more endpoints
|
||||
OPENID_USE_AS_ADMIN_LOGIN = False
|
||||
|
||||
OPENID_PROVIDER_TRUSTED_ROOTS = ['*']
|
||||
|
||||
############################## OAUTH2 Provider ################################
|
||||
FEATURES['ENABLE_OAUTH2_PROVIDER'] = True
|
||||
|
||||
######################## MIT Certificates SSL Auth ############################
|
||||
|
||||
FEATURES['AUTH_USE_CERTIFICATES'] = False
|
||||
|
||||
########################### External REST APIs #################################
|
||||
FEATURES['ENABLE_MOBILE_REST_API'] = True
|
||||
FEATURES['ENABLE_VIDEO_ABSTRACTION_LAYER_API'] = True
|
||||
|
||||
################################# CELERY ######################################
|
||||
|
||||
# By default don't use a worker, execute tasks as if they were local functions
|
||||
CELERY_ALWAYS_EAGER = True
|
||||
|
||||
################################ DEBUG TOOLBAR ################################
|
||||
|
||||
INSTALLED_APPS += ['debug_toolbar', 'djpyfs']
|
||||
MIDDLEWARE_CLASSES += [
|
||||
'django_comment_client.utils.QueryCountDebugMiddleware',
|
||||
'debug_toolbar.middleware.DebugToolbarMiddleware',
|
||||
]
|
||||
|
||||
INTERNAL_IPS = ('127.0.0.1',)
|
||||
|
||||
DEBUG_TOOLBAR_PANELS = (
|
||||
'debug_toolbar.panels.versions.VersionsPanel',
|
||||
'debug_toolbar.panels.timer.TimerPanel',
|
||||
'debug_toolbar.panels.settings.SettingsPanel',
|
||||
'debug_toolbar.panels.headers.HeadersPanel',
|
||||
'debug_toolbar.panels.request.RequestPanel',
|
||||
'debug_toolbar.panels.sql.SQLPanel',
|
||||
'debug_toolbar.panels.signals.SignalsPanel',
|
||||
'debug_toolbar.panels.logging.LoggingPanel',
|
||||
'debug_toolbar.panels.profiling.ProfilingPanel',
|
||||
)
|
||||
|
||||
#################### FILE UPLOADS (for discussion forums) #####################
|
||||
|
||||
DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage'
|
||||
MEDIA_ROOT = ENV_ROOT / "uploads"
|
||||
MEDIA_URL = "/static/uploads/"
|
||||
STATICFILES_DIRS.append(("uploads", MEDIA_ROOT))
|
||||
FILE_UPLOAD_TEMP_DIR = ENV_ROOT / "uploads"
|
||||
FILE_UPLOAD_HANDLERS = [
|
||||
'django.core.files.uploadhandler.MemoryFileUploadHandler',
|
||||
'django.core.files.uploadhandler.TemporaryFileUploadHandler',
|
||||
]
|
||||
|
||||
FEATURES['AUTH_USE_SHIB'] = True
|
||||
FEATURES['RESTRICT_ENROLL_BY_REG_METHOD'] = True
|
||||
|
||||
########################### PIPELINE #################################
|
||||
|
||||
PIPELINE_SASS_ARGUMENTS = '--debug-info'
|
||||
|
||||
##### Segment ######
|
||||
|
||||
# If there's an environment variable set, grab it
|
||||
LMS_SEGMENT_KEY = os.environ.get('SEGMENT_KEY')
|
||||
|
||||
###################### Payment ######################
|
||||
|
||||
CC_PROCESSOR['CyberSource']['SHARED_SECRET'] = os.environ.get('CYBERSOURCE_SHARED_SECRET', '')
|
||||
CC_PROCESSOR['CyberSource']['MERCHANT_ID'] = os.environ.get('CYBERSOURCE_MERCHANT_ID', '')
|
||||
CC_PROCESSOR['CyberSource']['SERIAL_NUMBER'] = os.environ.get('CYBERSOURCE_SERIAL_NUMBER', '')
|
||||
CC_PROCESSOR['CyberSource']['PURCHASE_ENDPOINT'] = '/shoppingcart/payment_fake/'
|
||||
|
||||
CC_PROCESSOR['CyberSource2']['SECRET_KEY'] = os.environ.get('CYBERSOURCE_SECRET_KEY', '')
|
||||
CC_PROCESSOR['CyberSource2']['ACCESS_KEY'] = os.environ.get('CYBERSOURCE_ACCESS_KEY', '')
|
||||
CC_PROCESSOR['CyberSource2']['PROFILE_ID'] = os.environ.get('CYBERSOURCE_PROFILE_ID', '')
|
||||
CC_PROCESSOR['CyberSource2']['PURCHASE_ENDPOINT'] = '/shoppingcart/payment_fake/'
|
||||
|
||||
########################## USER API ##########################
|
||||
EDX_API_KEY = None
|
||||
|
||||
####################### Shoppingcart ###########################
|
||||
FEATURES['ENABLE_SHOPPING_CART'] = True
|
||||
|
||||
### This enables the Metrics tab for the Instructor dashboard ###########
|
||||
FEATURES['CLASS_DASHBOARD'] = True
|
||||
|
||||
### This settings is for the course registration code length ############
|
||||
REGISTRATION_CODE_LENGTH = 8
|
||||
|
||||
#####################################################################
|
||||
# Lastly, see if the developer has any local overrides.
|
||||
try:
|
||||
from .private import * # pylint: disable=import-error
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
########################## Derive Any Derived Settings #######################
|
||||
|
||||
derive_settings(__name__)
|
||||
@@ -1,2 +0,0 @@
|
||||
|
||||
DISCUSSION_ALLOWED_UPLOAD_FILE_TYPES = ('.jpg', '.jpeg', '.gif', '.bmp', '.png', '.tiff')
|
||||
@@ -1,15 +0,0 @@
|
||||
"""
|
||||
Used when testing with MySQL.
|
||||
"""
|
||||
from .test import * # pylint: disable=wildcard-import
|
||||
from .aws import * # pylint: disable=wildcard-import
|
||||
|
||||
# Dummy secret key for dev
|
||||
SECRET_KEY = 'dev key'
|
||||
|
||||
INSTALLED_APPS = [
|
||||
'django.contrib.auth',
|
||||
'django.contrib.contenttypes',
|
||||
|
||||
'lms.djangoapps.verify_student.apps.VerifyStudentConfig',
|
||||
]
|
||||
@@ -1,335 +0,0 @@
|
||||
"""
|
||||
This is the default settings files for all
|
||||
production servers.
|
||||
|
||||
Before importing this settings file the following MUST be
|
||||
defined in the environment:
|
||||
|
||||
* SERVICE_VARIANT - can be either "lms" or "cms"
|
||||
* CONFIG_ROOT - the directory where the application
|
||||
yaml config files are located
|
||||
"""
|
||||
# We intentionally define lots of variables that aren't used, and
|
||||
# want to import all variables from base settings files
|
||||
# pylint: disable=wildcard-import, unused-wildcard-import, undefined-variable, used-before-assignment
|
||||
|
||||
import yaml
|
||||
|
||||
from .common import *
|
||||
from openedx.core.lib.derived import derive_settings
|
||||
from openedx.core.lib.logsettings import get_logger_config
|
||||
from util.config_parse import convert_tokens
|
||||
import os
|
||||
|
||||
from path import Path as path
|
||||
|
||||
# https://stackoverflow.com/questions/2890146/how-to-force-pyyaml-to-load-strings-as-unicode-objects
|
||||
from yaml import Loader, SafeLoader
|
||||
|
||||
|
||||
def construct_yaml_str(self, node):
|
||||
"""
|
||||
Override the default string handling function
|
||||
to always return unicode objects
|
||||
"""
|
||||
return self.construct_scalar(node)
|
||||
Loader.add_constructor(u'tag:yaml.org,2002:str', construct_yaml_str)
|
||||
SafeLoader.add_constructor(u'tag:yaml.org,2002:str', construct_yaml_str)
|
||||
|
||||
# SERVICE_VARIANT specifies name of the variant used, which decides what YAML
|
||||
# configuration files are read during startup.
|
||||
SERVICE_VARIANT = os.environ.get('SERVICE_VARIANT', None)
|
||||
|
||||
# CONFIG_ROOT specifies the directory where the YAML configuration
|
||||
# files are expected to be found. If not specified, use the project
|
||||
# directory.
|
||||
CONFIG_ROOT = path(os.environ.get('CONFIG_ROOT', ENV_ROOT))
|
||||
|
||||
# CONFIG_PREFIX specifies the prefix of the YAML configuration files,
|
||||
# based on the service variant. If no variant is use, don't use a
|
||||
# prefix.
|
||||
CONFIG_PREFIX = SERVICE_VARIANT + "." if SERVICE_VARIANT else ""
|
||||
|
||||
|
||||
##############################################################
|
||||
#
|
||||
# DEFAULT SETTINGS FOR PRODUCTION
|
||||
#
|
||||
# These are defaults common for all production deployments
|
||||
#
|
||||
|
||||
DEBUG = False
|
||||
|
||||
EMAIL_BACKEND = 'django_ses.SESBackend'
|
||||
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
|
||||
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
|
||||
|
||||
# IMPORTANT: With this enabled, the server must always be behind a proxy that
|
||||
# strips the header HTTP_X_FORWARDED_PROTO from client requests. Otherwise,
|
||||
# a user can fool our server into thinking it was an https connection.
|
||||
# See
|
||||
# https://docs.djangoproject.com/en/dev/ref/settings/#secure-proxy-ssl-header
|
||||
# for other warnings.
|
||||
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
|
||||
|
||||
SESSION_COOKIE_NAME = None
|
||||
GIT_REPO_DIR = '/edx/var/edxapp/course_repos'
|
||||
MICROSITE_ROOT_DIR = ''
|
||||
CAS_SERVER_URL = None
|
||||
CAS_ATTRIBUTE_CALLBACK = None
|
||||
|
||||
##### Defaults for OAUTH2 Provider ##############
|
||||
OAUTH_OIDC_ISSUER = None
|
||||
OAUTH_ENFORCE_SECURE = True
|
||||
OAUTH_ENFORCE_CLIENT_SECURE = True
|
||||
|
||||
#### Course Registration Code length ####
|
||||
REGISTRATION_CODE_LENGTH = 8
|
||||
|
||||
# SSL external authentication settings
|
||||
SSL_AUTH_EMAIL_DOMAIN = "MIT.EDU"
|
||||
SSL_AUTH_DN_FORMAT_STRING = "/C=US/ST=Massachusetts/O=Massachusetts Institute of Technology/OU=Client CA v1/CN={0}/emailAddress={1}"
|
||||
|
||||
GIT_IMPORT_STATIC = True
|
||||
META_UNIVERSITIES = {}
|
||||
DATADOG = {}
|
||||
EMAIL_FILE_PATH = None
|
||||
|
||||
MONGODB_LOG = {}
|
||||
SESSION_INACTIVITY_TIMEOUT_IN_SECONDS = None
|
||||
ADDL_INSTALLED_APPS = []
|
||||
LOCAL_LOGLEVEL = 'INFO'
|
||||
|
||||
##############################################################
|
||||
#
|
||||
# ENV TOKEN IMPORT
|
||||
#
|
||||
# Currently non-secure and secure settings are managed
|
||||
# in two yaml files. This section imports the non-secure
|
||||
# settings and modifies them in code if necessary.
|
||||
#
|
||||
|
||||
with open(CONFIG_ROOT / CONFIG_PREFIX + "env.yaml") as env_file:
|
||||
ENV_TOKENS = yaml.safe_load(env_file)
|
||||
|
||||
# Works around an Ansible bug
|
||||
ENV_TOKENS = convert_tokens(ENV_TOKENS)
|
||||
|
||||
##############################################################
|
||||
#
|
||||
# DEFAULT SETTINGS FOR CELERY
|
||||
#
|
||||
|
||||
|
||||
# Don't use a connection pool, since connections are dropped by ELB.
|
||||
BROKER_POOL_LIMIT = 0
|
||||
BROKER_CONNECTION_TIMEOUT = 1
|
||||
|
||||
# For the Result Store, use the django cache named 'celery'
|
||||
CELERY_RESULT_BACKEND = 'djcelery.backends.cache:CacheBackend'
|
||||
|
||||
# When the broker is behind an ELB, use a heartbeat to refresh the
|
||||
# connection and to detect if it has been dropped.
|
||||
BROKER_HEARTBEAT = 60.0
|
||||
BROKER_HEARTBEAT_CHECKRATE = 2
|
||||
|
||||
# Each worker should only fetch one message at a time
|
||||
CELERYD_PREFETCH_MULTIPLIER = 1
|
||||
|
||||
# Rename the exchange and queues for each variant
|
||||
|
||||
QUEUE_VARIANT = CONFIG_PREFIX.lower()
|
||||
|
||||
CELERY_DEFAULT_EXCHANGE = 'edx.{0}core'.format(QUEUE_VARIANT)
|
||||
|
||||
HIGH_PRIORITY_QUEUE = 'edx.{0}core.high'.format(QUEUE_VARIANT)
|
||||
DEFAULT_PRIORITY_QUEUE = 'edx.{0}core.default'.format(QUEUE_VARIANT)
|
||||
LOW_PRIORITY_QUEUE = 'edx.{0}core.low'.format(QUEUE_VARIANT)
|
||||
HIGH_MEM_QUEUE = 'edx.{0}core.high_mem'.format(QUEUE_VARIANT)
|
||||
|
||||
CELERY_DEFAULT_QUEUE = DEFAULT_PRIORITY_QUEUE
|
||||
CELERY_DEFAULT_ROUTING_KEY = DEFAULT_PRIORITY_QUEUE
|
||||
|
||||
ENV_CELERY_QUEUES = ENV_TOKENS.get('CELERY_QUEUES', None)
|
||||
if ENV_CELERY_QUEUES:
|
||||
CELERY_QUEUES = {queue: {} for queue in ENV_CELERY_QUEUES}
|
||||
else:
|
||||
CELERY_QUEUES = {
|
||||
HIGH_PRIORITY_QUEUE: {},
|
||||
LOW_PRIORITY_QUEUE: {},
|
||||
DEFAULT_PRIORITY_QUEUE: {},
|
||||
HIGH_MEM_QUEUE: {},
|
||||
}
|
||||
|
||||
# If we're a worker on the high_mem queue, set ourselves to die after processing
|
||||
# one request to avoid having memory leaks take down the worker server. This env
|
||||
# var is set in /etc/init/edx-workers.conf -- this should probably be replaced
|
||||
# with some celery API call to see what queue we started listening to, but I
|
||||
# don't know what that call is or if it's active at this point in the code.
|
||||
if os.environ.get('QUEUE') == 'high_mem':
|
||||
CELERYD_MAX_TASKS_PER_CHILD = 1
|
||||
|
||||
##########################################
|
||||
# Merge settings from common.py
|
||||
#
|
||||
# Before the tokens are imported directly
|
||||
# into settings some dictionary settings
|
||||
# need to be merged from common.py
|
||||
|
||||
ENV_FEATURES = ENV_TOKENS.get('FEATURES', {})
|
||||
for feature, value in ENV_FEATURES.items():
|
||||
FEATURES[feature] = value
|
||||
|
||||
MKTG_URL_LINK_MAP.update(ENV_TOKENS.get('MKTG_URL_LINK_MAP', {}))
|
||||
|
||||
# Delete keys from ENV_TOKENS so that when it's imported
|
||||
# into settings it doesn't override what was set above
|
||||
if 'FEATURES' in ENV_TOKENS:
|
||||
del ENV_TOKENS['FEATURES']
|
||||
|
||||
if 'MKTG_URL_LINK_MAP' in ENV_TOKENS:
|
||||
del ENV_TOKENS['MKTG_URL_LINK_MAP']
|
||||
|
||||
# Update the token dictionary directly into settings
|
||||
vars().update(ENV_TOKENS)
|
||||
|
||||
##########################################
|
||||
# Manipulate imported settings with code
|
||||
#
|
||||
# For historical reasons some settings need
|
||||
# to be modified in code. For example
|
||||
# conversions to other data structures that
|
||||
# cannot be represented in YAML.
|
||||
|
||||
|
||||
if SESSION_COOKIE_NAME:
|
||||
# NOTE, there's a bug in Django (http://bugs.python.org/issue18012) which necessitates this being a str()
|
||||
SESSION_COOKIE_NAME = str(SESSION_COOKIE_NAME)
|
||||
|
||||
MICROSITE_ROOT_DIR = path(MICROSITE_ROOT_DIR)
|
||||
|
||||
# Cache used for location mapping -- called many times with the same key/value
|
||||
# in a given request.
|
||||
if 'loc_cache' not in CACHES:
|
||||
CACHES['loc_cache'] = {
|
||||
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
|
||||
'LOCATION': 'edx_location_mem_cache',
|
||||
}
|
||||
|
||||
# We want Bulk Email running on the high-priority queue, so we define the
|
||||
# routing key that points to it. At the moment, the name is the same.
|
||||
# We have to reset the value here, since we have changed the value of the queue name.
|
||||
BULK_EMAIL_ROUTING_KEY = HIGH_PRIORITY_QUEUE
|
||||
|
||||
# We can run smaller jobs on the low priority queue. See note above for why
|
||||
# we have to reset the value here.
|
||||
BULK_EMAIL_ROUTING_KEY_SMALL_JOBS = LOW_PRIORITY_QUEUE
|
||||
|
||||
LANGUAGE_DICT = dict(LANGUAGES)
|
||||
|
||||
# Additional installed apps
|
||||
for app in ADDL_INSTALLED_APPS:
|
||||
INSTALLED_APPS.append(app)
|
||||
|
||||
LOGGING = get_logger_config(LOG_DIR,
|
||||
logging_env=LOGGING_ENV,
|
||||
local_loglevel=LOCAL_LOGLEVEL,
|
||||
debug=False,
|
||||
service_variant=SERVICE_VARIANT)
|
||||
|
||||
for name, value in ENV_TOKENS.get("CODE_JAIL", {}).items():
|
||||
oldvalue = CODE_JAIL.get(name)
|
||||
if isinstance(oldvalue, dict):
|
||||
for subname, subvalue in value.items():
|
||||
oldvalue[subname] = subvalue
|
||||
else:
|
||||
CODE_JAIL[name] = value
|
||||
|
||||
|
||||
if FEATURES.get('AUTH_USE_CAS'):
|
||||
AUTHENTICATION_BACKENDS = [
|
||||
'django.contrib.auth.backends.ModelBackend',
|
||||
'django_cas.backends.CASBackend',
|
||||
]
|
||||
|
||||
INSTALLED_APPS.append('django_cas')
|
||||
|
||||
MIDDLEWARE_CLASSES.append('django_cas.middleware.CASMiddleware')
|
||||
|
||||
if CAS_ATTRIBUTE_CALLBACK:
|
||||
import importlib
|
||||
CAS_USER_DETAILS_RESOLVER = getattr(
|
||||
importlib.import_module(CAS_ATTRIBUTE_CALLBACK['module']),
|
||||
CAS_ATTRIBUTE_CALLBACK['function']
|
||||
)
|
||||
|
||||
|
||||
STATIC_ROOT = path(STATIC_ROOT_BASE)
|
||||
|
||||
##############################################################
|
||||
#
|
||||
# AUTH TOKEN IMPORT
|
||||
#
|
||||
|
||||
with open(CONFIG_ROOT / CONFIG_PREFIX + "auth.yaml") as auth_file:
|
||||
AUTH_TOKENS = yaml.safe_load(auth_file)
|
||||
|
||||
# Works around an Ansible bug
|
||||
AUTH_TOKENS = convert_tokens(AUTH_TOKENS)
|
||||
|
||||
vars().update(AUTH_TOKENS)
|
||||
|
||||
##########################################
|
||||
# Manipulate imported settings with code
|
||||
#
|
||||
|
||||
if AWS_ACCESS_KEY_ID == "":
|
||||
AWS_ACCESS_KEY_ID = None
|
||||
|
||||
if AWS_SECRET_ACCESS_KEY == "":
|
||||
AWS_SECRET_ACCESS_KEY = None
|
||||
|
||||
# TODO: deprecated (compatibility with previous settings)
|
||||
if 'DATADOG_API' in AUTH_TOKENS:
|
||||
DATADOG['api_key'] = AUTH_TOKENS['DATADOG_API']
|
||||
|
||||
BROKER_URL = "{0}://{1}:{2}@{3}/{4}".format(CELERY_BROKER_TRANSPORT,
|
||||
CELERY_BROKER_USER,
|
||||
CELERY_BROKER_PASSWORD,
|
||||
CELERY_BROKER_HOSTNAME,
|
||||
CELERY_BROKER_VHOST)
|
||||
BROKER_USE_SSL = ENV_TOKENS.get('CELERY_BROKER_USE_SSL', False)
|
||||
|
||||
# Grades download
|
||||
GRADES_DOWNLOAD_ROUTING_KEY = HIGH_MEM_QUEUE
|
||||
|
||||
##### Custom Courses for EdX #####
|
||||
if FEATURES.get('CUSTOM_COURSES_EDX'):
|
||||
INSTALLED_APPS += ['lms.djangoapps.ccx', 'openedx.core.djangoapps.ccxcon.apps.CCXConnectorConfig']
|
||||
MODULESTORE_FIELD_OVERRIDE_PROVIDERS += (
|
||||
'lms.djangoapps.ccx.overrides.CustomCoursesForEdxOverrideProvider',
|
||||
)
|
||||
|
||||
##### Individual Due Date Extensions #####
|
||||
if FEATURES.get('INDIVIDUAL_DUE_DATES'):
|
||||
FIELD_OVERRIDE_PROVIDERS += (
|
||||
'courseware.student_field_overrides.IndividualStudentOverrideProvider',
|
||||
)
|
||||
|
||||
##################### LTI Provider #####################
|
||||
if FEATURES.get('ENABLE_LTI_PROVIDER'):
|
||||
INSTALLED_APPS.append('lti_provider.apps.LtiProviderConfig')
|
||||
AUTHENTICATION_BACKENDS.append('lti_provider.users.LtiBackend')
|
||||
|
||||
################################ Settings for Credentials Service ################################
|
||||
|
||||
CREDENTIALS_GENERATION_ROUTING_KEY = HIGH_PRIORITY_QUEUE
|
||||
|
||||
########################## Extra middleware classes #######################
|
||||
|
||||
# Allow extra middleware classes to be added to the app through configuration.
|
||||
MIDDLEWARE_CLASSES.extend(ENV_TOKENS.get('EXTRA_MIDDLEWARE_CLASSES', []))
|
||||
|
||||
########################## Derive Any Derived Settings #######################
|
||||
|
||||
derive_settings(__name__)
|
||||
Reference in New Issue
Block a user