diff --git a/cms/djangoapps/contentstore/management/commands/clone_course.py b/cms/djangoapps/contentstore/management/commands/clone_course.py deleted file mode 100644 index fb7a39c9ba..0000000000 --- a/cms/djangoapps/contentstore/management/commands/clone_course.py +++ /dev/null @@ -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() - ) diff --git a/cms/djangoapps/contentstore/management/commands/populate_creators.py b/cms/djangoapps/contentstore/management/commands/populate_creators.py deleted file mode 100644 index 4822f9089f..0000000000 --- a/cms/djangoapps/contentstore/management/commands/populate_creators.py +++ /dev/null @@ -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) diff --git a/cms/envs/debug_upload.py b/cms/envs/debug_upload.py deleted file mode 100644 index 944675031b..0000000000 --- a/cms/envs/debug_upload.py +++ /dev/null @@ -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', -] diff --git a/cms/envs/dev.py b/cms/envs/dev.py deleted file mode 100644 index 625d990c4d..0000000000 --- a/cms/envs/dev.py +++ /dev/null @@ -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__) diff --git a/cms/envs/dev_dbperf.py b/cms/envs/dev_dbperf.py deleted file mode 100644 index 7d800fa964..0000000000 --- a/cms/envs/dev_dbperf.py +++ /dev/null @@ -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 diff --git a/cms/envs/microsite_test.py b/cms/envs/microsite_test.py deleted file mode 100644 index f84d587613..0000000000 --- a/cms/envs/microsite_test.py +++ /dev/null @@ -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 diff --git a/cms/envs/yaml_config.py b/cms/envs/yaml_config.py deleted file mode 100644 index b269d1fda6..0000000000 --- a/cms/envs/yaml_config.py +++ /dev/null @@ -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__) diff --git a/lms/envs/common.py b/lms/envs/common.py index 7fdf8c0ad0..4b218ad47e 100644 --- a/lms/envs/common.py +++ b/lms/envs/common.py @@ -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 diff --git a/lms/envs/content.py b/lms/envs/content.py deleted file mode 100644 index c262777e7d..0000000000 --- a/lms/envs/content.py +++ /dev/null @@ -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', -) diff --git a/lms/envs/dev.py b/lms/envs/dev.py deleted file mode 100644 index 316d8ddff8..0000000000 --- a/lms/envs/dev.py +++ /dev/null @@ -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__) diff --git a/lms/envs/discussionsettings.py b/lms/envs/discussionsettings.py deleted file mode 100644 index f7aef72ddb..0000000000 --- a/lms/envs/discussionsettings.py +++ /dev/null @@ -1,2 +0,0 @@ - -DISCUSSION_ALLOWED_UPLOAD_FILE_TYPES = ('.jpg', '.jpeg', '.gif', '.bmp', '.png', '.tiff') diff --git a/lms/envs/test_with_mysql.py b/lms/envs/test_with_mysql.py deleted file mode 100644 index aad9b6ec8a..0000000000 --- a/lms/envs/test_with_mysql.py +++ /dev/null @@ -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', -] diff --git a/lms/envs/yaml_config.py b/lms/envs/yaml_config.py deleted file mode 100644 index 7c28cea6b1..0000000000 --- a/lms/envs/yaml_config.py +++ /dev/null @@ -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__)