diff --git a/cms/envs/common.py b/cms/envs/common.py index ad4bfed948..a6896160b6 100644 --- a/cms/envs/common.py +++ b/cms/envs/common.py @@ -506,10 +506,6 @@ ENABLE_JASMINE = False MARKETING_EMAILS_OPT_IN = False -# List of logout URIs for each IDA that the learner should be logged out of when they logout of the LMS. Only applies to -# IDA for which the social auth flow uses DOT (Django OAuth Toolkit). -IDA_LOGOUT_URI_LIST = [] - ############################# MICROFRONTENDS ################################### COURSE_AUTHORING_MICROFRONTEND_URL = None DISCUSSIONS_MICROFRONTEND_URL = None @@ -562,6 +558,7 @@ DJFS = { 'directory_root': '/edx/var/edxapp/django-pyfs/static/django-pyfs', 'url_root': '/static/django-pyfs', } + ######################## BRANCH.IO ########################### BRANCH_IO_KEY = '' @@ -650,14 +647,9 @@ TEMPLATES = [ DEFAULT_TEMPLATE_ENGINE = TEMPLATES[0] #################################### AWS ####################################### -AWS_SES_REGION_NAME = 'us-east-1' -AWS_SES_REGION_ENDPOINT = 'email.us-east-1.amazonaws.com' AWS_ACCESS_KEY_ID = None AWS_SECRET_ACCESS_KEY = None AWS_SECURITY_TOKEN = None -AWS_QUERYSTRING_AUTH = False -AWS_STORAGE_BUCKET_NAME = 'SET-ME-PLEASE (ex. bucket-name)' -AWS_S3_CUSTOM_DOMAIN = 'SET-ME-PLEASE (ex. bucket-name.s3.amazonaws.com)' ############################################################################## @@ -672,17 +664,13 @@ AUTHENTICATION_BACKENDS = [ 'bridgekeeper.backends.RulePermissionBackend', ] -STATIC_ROOT_BASE = '/edx/var/edxapp/staticfiles' - # License for serving content in China ICP_LICENSE = None ICP_LICENSE_INFO = {} LOGGING_ENV = 'sandbox' -LMS_BASE = 'localhost:18000' -LMS_ROOT_URL = "https://localhost:18000" -LMS_INTERNAL_ROOT_URL = LMS_ROOT_URL +LMS_BASE = None # Use LMS SSO for login, once enabled by setting LOGIN_URL (see docs/guides/studio_oauth.rst) SOCIAL_AUTH_STRATEGY = 'auth_backends.strategies.EdxDjangoStrategy' @@ -694,22 +682,13 @@ FRONTEND_LOGIN_URL = LOGIN_URL FRONTEND_LOGOUT_URL = '/logout/' FRONTEND_REGISTER_URL = Derived(lambda settings: settings.LMS_ROOT_URL + '/register') -LMS_ENROLLMENT_API_PATH = "/api/enrollment/v1/" -ENTERPRISE_API_URL = LMS_INTERNAL_ROOT_URL + '/enterprise/api/v1/' -ENTERPRISE_CONSENT_API_URL = LMS_INTERNAL_ROOT_URL + '/consent/api/v1/' +ENTERPRISE_API_URL = Derived(lambda settings: settings.LMS_INTERNAL_ROOT_URL + '/enterprise/api/v1/') +ENTERPRISE_CONSENT_API_URL = Derived(lambda settings: settings.LMS_INTERNAL_ROOT_URL + '/consent/api/v1/') ENTERPRISE_MARKETING_FOOTER_QUERY_PARAMS = {} -# Setting for Open API key and prompts used by edx-enterprise. -CHAT_COMPLETION_API = 'https://example.com/chat/completion' -CHAT_COMPLETION_API_KEY = 'i am a key' -LEARNER_ENGAGEMENT_PROMPT_FOR_ACTIVE_CONTRACT = '' -LEARNER_ENGAGEMENT_PROMPT_FOR_NON_ACTIVE_CONTRACT = '' -LEARNER_PROGRESS_PROMPT_FOR_ACTIVE_CONTRACT = '' -LEARNER_PROGRESS_PROMPT_FOR_NON_ACTIVE_CONTRACT = '' - # Public domain name of Studio (should be resolvable from the end-user's browser) -CMS_BASE = 'localhost:18010' -CMS_ROOT_URL = "https://localhost:18010" +CMS_BASE = None +CMS_ROOT_URL = None LOG_DIR = '/edx/var/log/edx' @@ -720,9 +699,6 @@ MAINTENANCE_BANNER_TEXT = 'Sample banner message' WIKI_ENABLED = True CERT_QUEUE = 'certificates' -# List of logout URIs for each IDA that the learner should be logged out of when they logout of -# Studio. Only applies to IDA for which the social auth flow uses DOT (Django OAuth Toolkit). -IDA_LOGOUT_URI_LIST = [] ELASTIC_SEARCH_CONFIG = [ { @@ -742,7 +718,6 @@ CSRF_COOKIE_SECURE = False CROSS_DOMAIN_CSRF_COOKIE_DOMAIN = '' CROSS_DOMAIN_CSRF_COOKIE_NAME = '' -CSRF_TRUSTED_ORIGINS = [] #################### CAPA External Code Evaluation ############################# XQUEUE_WAITTIME_BETWEEN_REQUESTS = 5 # seconds @@ -1076,16 +1051,11 @@ CODE_JAIL_REST_SERVICE_READ_TIMEOUT = 3.5 # time in seconds ############################ DJANGO_BUILTINS ################################ # Change DEBUG in your environment settings files, not here -DEBUG = False SESSION_COOKIE_SECURE = False SESSION_SAVE_EVERY_REQUEST = False SESSION_SERIALIZER = 'openedx.core.lib.session_serializers.PickleSerializer' -SESSION_COOKIE_DOMAIN = "" SESSION_COOKIE_NAME = 'sessionid' -# This is the domain that is used to set shared cookies between various sub-domains. -SHARED_COOKIE_DOMAIN = "" - # Site info SITE_NAME = "localhost" HTTPS = 'on' @@ -1096,12 +1066,6 @@ COURSE_METADATA_EXPORT_BUCKET = '' ALTERNATE_WORKER_QUEUES = 'lms' -# .. setting_name: STATIC_URL_BASE -# .. setting_default: "/static/" -# .. setting_description: The CMS uses this to construct ``STATIC_URL`` by appending -# a slash (if needed) and then ``studio/``. -STATIC_URL_BASE = '/static/' - X_FRAME_OPTIONS = 'DENY' # .. setting_name: GIT_REPO_EXPORT_DIR @@ -1120,12 +1084,7 @@ GIT_EXPORT_DEFAULT_IDENT = { # Email TECH_SUPPORT_EMAIL = 'technical@example.com' -EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' -EMAIL_HOST = 'localhost' -EMAIL_PORT = 25 -EMAIL_USE_TLS = False -EMAIL_HOST_USER = '' -EMAIL_HOST_PASSWORD = '' +EMAIL_FILE_PATH = Derived(lambda settings: path(settings.DATA_DIR) / "emails" / "studio") DEFAULT_FROM_EMAIL = 'registration@example.com' DEFAULT_FEEDBACK_EMAIL = 'feedback@example.com' TECH_SUPPORT_EMAIL = 'technical@example.com' @@ -1427,13 +1386,11 @@ CELERY_QUEUE_HA_POLICY = 'all' CELERY_CREATE_MISSING_QUEUES = True -CELERY_BROKER_TRANSPORT = 'amqp' -CELERY_BROKER_HOSTNAME = 'localhost' -CELERY_BROKER_USER = 'celery' -CELERY_BROKER_PASSWORD = 'celery' -CELERY_BROKER_VHOST = '' -CELERY_BROKER_USE_SSL = False -CELERY_EVENT_QUEUE_TTL = None +CLEAR_REQUEST_CACHE_ON_TASK_COMPLETION = True + +BROKER_USE_SSL = Derived(lambda settings: settings.CELERY_BROKER_USE_SSL) + +CELERY_ALWAYS_EAGER = False ############################## HEARTBEAT ###################################### @@ -2055,18 +2012,6 @@ CREDIT_PROVIDER_SECRET_KEYS = {} # separate paths. COMPREHENSIVE_THEME_DIRS = os.environ.get("COMPREHENSIVE_THEME_DIRS", "").split(":") -# .. setting_name: COMPREHENSIVE_THEME_LOCALE_PATHS -# .. setting_default: [] -# .. setting_description: See LMS annotation. -# "COMPREHENSIVE_THEME_LOCALE_PATHS" : ["/edx/src/edx-themes/conf/locale"]. -COMPREHENSIVE_THEME_LOCALE_PATHS = [] - -# .. setting_name: PREPEND_LOCALE_PATHS -# .. setting_default: [] -# .. setting_description: A list of the paths to locale directories to load first e.g. -# "PREPEND_LOCALE_PATHS" : ["/edx/my-locales/"]. -PREPEND_LOCALE_PATHS = [] - # .. setting_name: DEFAULT_SITE_THEME # .. setting_default: None # .. setting_description: See LMS annotation. @@ -2201,10 +2146,8 @@ PARTNER_SUPPORT_EMAIL = '' AFFILIATE_COOKIE_NAME = 'dev_affiliate_id' # API access management -API_ACCESS_MANAGER_EMAIL = 'api-access@example.com' API_ACCESS_FROM_EMAIL = 'api-requests@example.com' -API_DOCUMENTATION_URL = 'https://course-catalog-api-guide.readthedocs.io/en/latest/' -AUTH_DOCUMENTATION_URL = 'https://course-catalog-api-guide.readthedocs.io/en/latest/authentication/index.html' +API_ACCESS_MANAGER_EMAIL = 'api-access@example.com' EDX_DRF_EXTENSIONS = { # Set this value to an empty dict in order to prevent automatically updating @@ -2239,7 +2182,6 @@ USER_TASKS_MAX_AGE = timedelta(days=7) ############## Settings for the Enterprise App ###################### -ENTERPRISE_ENROLLMENT_API_URL = LMS_ROOT_URL + LMS_ENROLLMENT_API_PATH ENTERPRISE_SERVICE_WORKER_USERNAME = 'enterprise_worker' ENTERPRISE_API_CACHE_TIMEOUT = 3600 # Value is in seconds # The default value of this needs to be a 16 character string @@ -2268,23 +2210,11 @@ COURSE_ABOUT_VISIBILITY_PERMISSION = 'see_exists' DEFAULT_COURSE_VISIBILITY_IN_CATALOG = "both" DEFAULT_MOBILE_AVAILABLE = False - -# How long to cache OpenAPI schemas and UI, in seconds. -OPENAPI_CACHE_TIMEOUT = 0 - ############################# Persistent Grades #################################### # Queue to use for updating persistent grades RECALCULATE_GRADES_ROUTING_KEY = DEFAULT_PRIORITY_QUEUE -# Queue to use for updating grades due to grading policy change -POLICY_CHANGE_GRADES_ROUTING_KEY = 'edx.lms.core.default' - -# Queue to use for individual learner course regrades -SINGLE_LEARNER_COURSE_REGRADE_ROUTING_KEY = 'edx.lms.core.default' - -SOFTWARE_SECURE_VERIFICATION_ROUTING_KEY = 'edx.lms.core.default' - # Rate limit for regrading tasks that a grading policy change can kick off POLICY_CHANGE_TASK_RATE_LIMIT = '900/h' @@ -2298,13 +2228,13 @@ POLICY_CHANGE_TASK_RATE_LIMIT = '900/h' DEFAULT_GRADE_DESIGNATIONS = ['A', 'B', 'C', 'D'] ########## Settings for video transcript migration tasks ############ -VIDEO_TRANSCRIPT_MIGRATIONS_JOB_QUEUE = DEFAULT_PRIORITY_QUEUE +VIDEO_TRANSCRIPT_MIGRATIONS_JOB_QUEUE = Derived(lambda settings: settings.DEFAULT_PRIORITY_QUEUE) ########## Settings youtube thumbnails scraper tasks ############ -SCRAPE_YOUTUBE_THUMBNAILS_JOB_QUEUE = DEFAULT_PRIORITY_QUEUE +SCRAPE_YOUTUBE_THUMBNAILS_JOB_QUEUE = Derived(lambda settings: settings.DEFAULT_PRIORITY_QUEUE) ########## Settings update search index task ############ -UPDATE_SEARCH_INDEX_JOB_QUEUE = DEFAULT_PRIORITY_QUEUE +UPDATE_SEARCH_INDEX_JOB_QUEUE = Derived(lambda settings: settings.DEFAULT_PRIORITY_QUEUE) ###################### VIDEO IMAGE STORAGE ###################### @@ -2539,6 +2469,7 @@ REGISTRATION_EXTRA_FIELDS = { 'marketing_emails_opt_in': 'hidden', } EDXAPP_PARSE_KEYS = {} +PARSE_KEYS = {} ############################ AI_TRANSLATIONS ################################## AI_TRANSLATIONS_API_URL = 'http://localhost:18760/api/v1' @@ -2822,3 +2753,6 @@ SOCIAL_MEDIA_LOGO_URLS = { # .. setting_description: The default logo url for organizations that do not have a logo set. # .. setting_warning: This url is used as a placeholder for organizations that do not have a logo set. DEFAULT_ORG_LOGO_URL = Derived(lambda settings: settings.STATIC_URL + 'images/logo.png') + +# Misc +AUTHORING_API_URL = '' diff --git a/cms/envs/production.py b/cms/envs/production.py index 632cb8f1cc..12c7daed66 100644 --- a/cms/envs/production.py +++ b/cms/envs/production.py @@ -38,74 +38,6 @@ def get_env_setting(setting): error_msg = "Set the %s env variable" % setting raise ImproperlyConfigured(error_msg) # lint-amnesty, pylint: disable=raise-missing-from - -####################################################################################################################### -#### PRODUCTION DEFAULTS -#### -#### Configure some defaults (beyond what has already been configured in common.py) before loading the YAML file. -#### DO NOT ADD NEW DEFAULTS HERE! Put any new setting defaults in common.py instead, along with a setting annotation. -#### TODO: Move all these defaults into common.py. -#### - -DEBUG = False - -# 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') - -# Constant defaults (alphabetical) -AUTHORING_API_URL = '' -AWS_QUERYSTRING_AUTH = True -AWS_S3_CUSTOM_DOMAIN = 'edxuploads.s3.amazonaws.com' -AWS_STORAGE_BUCKET_NAME = 'edxuploads' -BROKER_HEARTBEAT = 60.0 -BROKER_HEARTBEAT_CHECKRATE = 2 -CELERY_ALWAYS_EAGER = False -CELERY_BROKER_HOSTNAME = "" -CELERY_BROKER_PASSWORD = "" -CELERY_BROKER_TRANSPORT = "" -CELERY_BROKER_USER = "" -CELERY_RESULT_BACKEND = 'django-cache' -CHAT_COMPLETION_API = '' -CHAT_COMPLETION_API_KEY = '' -CLEAR_REQUEST_CACHE_ON_TASK_COMPLETION = True -CMS_BASE = None -CMS_ROOT_URL = None -DEFAULT_TEMPLATE_ENGINE['OPTIONS']['debug'] = False -IDA_LOGOUT_URI_LIST = [] -LEARNER_ENGAGEMENT_PROMPT_FOR_ACTIVE_CONTRACT = '' -LEARNER_ENGAGEMENT_PROMPT_FOR_NON_ACTIVE_CONTRACT = '' -LEARNER_PROGRESS_PROMPT_FOR_ACTIVE_CONTRACT = '' -LEARNER_PROGRESS_PROMPT_FOR_NON_ACTIVE_CONTRACT = '' -LMS_BASE = None -LMS_ROOT_URL = None -OPENAPI_CACHE_TIMEOUT = 60 * 60 -PARSE_KEYS = {} -REGISTRATION_EMAIL_PATTERNS_ALLOWED = None -SESSION_COOKIE_DOMAIN = None -SESSION_COOKIE_HTTPONLY = True -SESSION_ENGINE = 'django.contrib.sessions.backends.cache' -SESSION_INACTIVITY_TIMEOUT_IN_SECONDS = None -STATIC_ROOT_BASE = None -STATIC_URL_BASE = None -VIDEO_CDN_URL = {} - -# Derived defaults (alphabetical) -BROKER_USE_SSL = Derived(lambda settings: settings.CELERY_BROKER_USE_SSL) -EMAIL_FILE_PATH = Derived(lambda settings: settings.DATA_DIR / "emails" / "studio") -ENTERPRISE_API_URL = Derived(lambda settings: settings.LMS_INTERNAL_ROOT_URL + '/enterprise/api/v1/') -ENTERPRISE_CONSENT_API_URL = Derived(lambda settings: settings.LMS_INTERNAL_ROOT_URL + '/consent/api/v1/') -LMS_INTERNAL_ROOT_URL = Derived(lambda settings: settings.LMS_ROOT_URL) -POLICY_CHANGE_GRADES_ROUTING_KEY = Derived(lambda settings: settings.DEFAULT_PRIORITY_QUEUE) -SCRAPE_YOUTUBE_THUMBNAILS_JOB_QUEUE = Derived(lambda settings: settings.DEFAULT_PRIORITY_QUEUE) -SHARED_COOKIE_DOMAIN = Derived(lambda settings: settings.SESSION_COOKIE_DOMAIN) -SINGLE_LEARNER_COURSE_REGRADE_ROUTING_KEY = Derived(lambda settings: settings.DEFAULT_PRIORITY_QUEUE) -SOFTWARE_SECURE_VERIFICATION_ROUTING_KEY = Derived(lambda settings: settings.HIGH_PRIORITY_QUEUE) -UPDATE_SEARCH_INDEX_JOB_QUEUE = Derived(lambda settings: settings.DEFAULT_PRIORITY_QUEUE) -VIDEO_TRANSCRIPT_MIGRATIONS_JOB_QUEUE = Derived(lambda settings: settings.DEFAULT_PRIORITY_QUEUE) - - ####################################################################################################################### #### YAML LOADING #### @@ -223,7 +155,7 @@ if 'staticfiles' in CACHES: # Once we have migrated to service assets off S3, then we can convert this back to # managed by the yaml file contents STATICFILES_STORAGE = os.environ.get('STATICFILES_STORAGE', STATICFILES_STORAGE) -CSRF_TRUSTED_ORIGINS = _YAML_TOKENS.get("CSRF_TRUSTED_ORIGINS", []) +CSRF_TRUSTED_ORIGINS = _YAML_TOKENS.get('CSRF_TRUSTED_ORIGINS_WITH_SCHEME', []) MKTG_URL_LINK_MAP.update(_YAML_TOKENS.get('MKTG_URL_LINK_MAP', {})) diff --git a/cms/envs/test.py b/cms/envs/test.py index a536c52b7e..deef2b8ff3 100644 --- a/cms/envs/test.py +++ b/cms/envs/test.py @@ -336,3 +336,37 @@ COURSE_LIVE_GLOBAL_CREDENTIALS["BIG_BLUE_BUTTON"] = { OPENEDX_LEARNING = { "MEDIA": {"BACKEND": "django.core.files.storage.InMemoryStorage", "OPTIONS": {"location": MEDIA_ROOT + "_private"}} } + +#### Override default production settings for testing purposes + +AWS_QUERYSTRING_AUTH = False +AWS_S3_CUSTOM_DOMAIN = "SET-ME-PLEASE (ex. bucket-name.s3.amazonaws.com)" +AWS_STORAGE_BUCKET_NAME = "SET-ME-PLEASE (ex. bucket-name)" +CELERY_BROKER_HOSTNAME = "localhost" +CELERY_BROKER_PASSWORD = "celery" +CELERY_BROKER_TRANSPORT = "amqp" +CELERY_BROKER_USER = "celery" +CHAT_COMPLETION_API = "https://example.com/chat/completion" +CHAT_COMPLETION_API_KEY = "i am a key" +del AUTHORING_API_URL +del BROKER_HEARTBEAT +del BROKER_HEARTBEAT_CHECKRATE +del BROKER_USE_SSL +del EMAIL_FILE_PATH +del PARSE_KEYS +del SESSION_INACTIVITY_TIMEOUT_IN_SECONDS +ENTERPRISE_API_URL = "https://localhost:18000/enterprise/api/v1/" +ENTERPRISE_CONSENT_API_URL = "https://localhost:18000/consent/api/v1/" +ENTERPRISE_ENROLLMENT_API_URL = "https://localhost:18000/api/enrollment/v1/" +INACTIVE_USER_URL = "http://localhost:18010" +LMS_INTERNAL_ROOT_URL = "https://localhost:18000" +OPENAPI_CACHE_TIMEOUT = 0 +POLICY_CHANGE_GRADES_ROUTING_KEY = "edx.lms.core.default" +SECURE_PROXY_SSL_HEADER = None +SESSION_COOKIE_DOMAIN = "" +SESSION_ENGINE = "django.contrib.sessions.backends.db" +SHARED_COOKIE_DOMAIN = "" +SINGLE_LEARNER_COURSE_REGRADE_ROUTING_KEY = "edx.lms.core.default" +SOFTWARE_SECURE_VERIFICATION_ROUTING_KEY = "edx.lms.core.default" +STATIC_ROOT_BASE = "/edx/var/edxapp/staticfiles" +STATIC_URL_BASE = "/static/" diff --git a/lms/envs/common.py b/lms/envs/common.py index 491f04acdf..316acdbdd2 100644 --- a/lms/envs/common.py +++ b/lms/envs/common.py @@ -77,21 +77,13 @@ from lms.djangoapps.lms_xblock.mixin import LmsBlockMixin # templates/emails/etc. PLATFORM_NAME = _('Your Platform Name Here') PLATFORM_DESCRIPTION = _('Your Platform Description Here') -CC_MERCHANT_NAME = PLATFORM_NAME +CC_MERCHANT_NAME = Derived(lambda settings: settings.PLATFORM_NAME) PLATFORM_FACEBOOK_ACCOUNT = "http://www.facebook.com/YourPlatformFacebookAccount" PLATFORM_TWITTER_ACCOUNT = "@YourPlatformTwitterAccount" ENABLE_JASMINE = False -LMS_ROOT_URL = 'https://localhost:18000' -LMS_INTERNAL_ROOT_URL = LMS_ROOT_URL -LMS_ENROLLMENT_API_PATH = "/api/enrollment/v1/" - -# List of logout URIs for each IDA that the learner should be logged out of when they logout of the LMS. Only applies to -# IDA for which the social auth flow uses DOT (Django OAuth Toolkit). -IDA_LOGOUT_URI_LIST = [] - # Features FEATURES = { # .. toggle_name: FEATURES['DISPLAY_DEBUG_INFO_TO_STAFF'] @@ -1075,6 +1067,16 @@ FEATURES = { 'BADGES_ENABLED': False, } +# .. toggle_name: ENABLE_REQUIRE_THIRD_PARTY_AUTH +# .. toggle_implementation: DjangoSetting +# .. toggle_default: False +# .. toggle_description: Set to True to prevent using username/password login and registration and only allow +# authentication with third party auth +# .. toggle_use_cases: open_edx +# .. toggle_creation_date: 2020-09-16 +# .. toggle_warning: Requires configuration of third party auth +ENABLE_REQUIRE_THIRD_PARTY_AUTH = False + # Specifies extra XBlock fields that should available when requested via the Course Blocks API # Should be a list of tuples of (block_type, field_name), where block_type can also be "*" for all block types. # e.g. COURSE_BLOCKS_API_EXTRA_FIELDS = [ ('course', 'other_course_settings'), ("problem", "weight") ] @@ -1429,23 +1431,17 @@ SEARCH_COURSEWARE_CONTENT_LOG_PARAMS = False # .. setting_description: Specifies the prefix used when naming elasticsearch indexes related to edx-search. ELASTICSEARCH_INDEX_PREFIX = "" -VIDEO_CDN_URL = { - 'EXAMPLE_COUNTRY_CODE': "http://example.com/edx/video?s3_url=" -} - -STATIC_ROOT_BASE = '/edx/var/edxapp/staticfiles' - LOGGING_ENV = 'sandbox' EDX_ROOT_URL = '' -EDX_API_KEY = "PUT_YOUR_API_KEY_HERE" +EDX_API_KEY = None LOGIN_REDIRECT_URL = EDX_ROOT_URL + '/login' LOGIN_URL = EDX_ROOT_URL + '/login' PARTNER_SUPPORT_EMAIL = '' -CERT_QUEUE = 'certificates' +CERT_QUEUE = 'test-pull' ALTERNATE_WORKER_QUEUES = 'cms' @@ -1456,11 +1452,11 @@ LOG_DIR = '/edx/var/log/edx' DATA_DIR = '/edx/var/edxapp/data' # .. setting_name: MAINTENANCE_BANNER_TEXT -# .. setting_default: 'Sample banner message' +# .. setting_default: None # .. setting_description: Specifies the text that is rendered on the maintenance banner. # .. setting_warning: Depends on the `open_edx_util.display_maintenance_warning` waffle switch. # The banner is only rendered when the switch is activated. -MAINTENANCE_BANNER_TEXT = 'Sample banner message' +MAINTENANCE_BANNER_TEXT = None DJFS = { 'type': 'osfs', @@ -1565,13 +1561,13 @@ TRACKING_SEGMENTIO_SOURCE_MAP = { ######################## GOOGLE ANALYTICS ########################### GOOGLE_ANALYTICS_ACCOUNT = None -GOOGLE_SITE_VERIFICATION_ID = '' -GOOGLE_ANALYTICS_LINKEDIN = 'GOOGLE_ANALYTICS_LINKEDIN_DUMMY' +GOOGLE_SITE_VERIFICATION_ID = None +GOOGLE_ANALYTICS_LINKEDIN = None GOOGLE_ANALYTICS_TRACKING_ID = None GOOGLE_ANALYTICS_4_ID = None ######################## BRANCH.IO ########################### -BRANCH_IO_KEY = '' +BRANCH_IO_KEY = None ######################## OPTIMIZELY ########################### OPTIMIZELY_PROJECT_ID = None @@ -1746,6 +1742,9 @@ DATABASES = { DEFAULT_AUTO_FIELD = 'django.db.models.AutoField' DEFAULT_HASHING_ALGORITHM = 'sha256' +HOSTNAME_MODULESTORE_DEFAULT_MAPPINGS = {} +MONGODB_LOG = {} + #################### Python sandbox ############################################ CODE_JAIL = { @@ -1805,29 +1804,30 @@ CODE_JAIL_REST_SERVICE_CONNECT_TIMEOUT = 0.5 # time in seconds # codejail remote service endpoint. CODE_JAIL_REST_SERVICE_READ_TIMEOUT = 3.5 # time in seconds +# .. setting_name: PYTHON_LIB_FILENAME +# .. setting_default: python_lib.zip +# .. setting_description: Name of the course file to make available to code in +# custom Python-graded problems. By default, this file will not be downloadable +# by learners. +PYTHON_LIB_FILENAME = 'python_lib.zip' ############################### DJANGO BUILT-INS ############################### # Change DEBUG in your environment settings files, not here -DEBUG = False SESSION_COOKIE_SECURE = False SESSION_SAVE_EVERY_REQUEST = False SESSION_SERIALIZER = 'openedx.core.lib.session_serializers.PickleSerializer' -SESSION_COOKIE_DOMAIN = "" SESSION_COOKIE_NAME = 'sessionid' # django-session-cookie middleware DCS_SESSION_COOKIE_SAMESITE = 'None' DCS_SESSION_COOKIE_SAMESITE_FORCE_ALL = True -# This is the domain that is used to set shared cookies between various sub-domains. -SHARED_COOKIE_DOMAIN = "" - -# CMS base -CMS_BASE = 'localhost:18010' - # LMS base LMS_BASE = 'localhost:18000' +# CMS base +CMS_BASE = 'studio.edx.org' + # Studio name STUDIO_NAME = 'Studio' STUDIO_SHORT_NAME = 'Studio' @@ -1838,12 +1838,7 @@ HTTPS = 'on' ROOT_URLCONF = 'lms.urls' # NOTE: Please set ALLOWED_HOSTS to some sane value, as we do not allow the default '*' # Platform Email -EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' -EMAIL_HOST = 'localhost' -EMAIL_PORT = 25 -EMAIL_USE_TLS = False -EMAIL_HOST_USER = '' -EMAIL_HOST_PASSWORD = '' +EMAIL_FILE_PATH = Derived(lambda settings: path(settings.DATA_DIR) / "emails" / "lms") DEFAULT_FROM_EMAIL = 'registration@example.com' DEFAULT_FEEDBACK_EMAIL = 'feedback@example.com' SERVER_EMAIL = 'devops@example.com' @@ -1866,11 +1861,6 @@ MANAGERS = ADMINS # Static content STATIC_URL = '/static/' STATIC_ROOT = os.environ.get('STATIC_ROOT_LMS', ENV_ROOT / "staticfiles") -# .. setting_name: STATIC_URL_BASE -# .. setting_default: "/static/" -# .. setting_description: The LMS uses this to construct ``STATIC_URL`` by appending -# a slash (if needed). -STATIC_URL_BASE = '/static/' STATICFILES_DIRS = [ COMMON_ROOT / "static", @@ -1910,13 +1900,8 @@ TRANSLATORS_GUIDE = 'https://docs.openedx.org/en/latest/translators/index.html' #################################### AWS ####################################### # The number of seconds that a generated URL is valid for. AWS_QUERYSTRING_EXPIRE = 10 * 365 * 24 * 60 * 60 # 10 years -AWS_SES_REGION_NAME = 'us-east-1' -AWS_SES_REGION_ENDPOINT = 'email.us-east-1.amazonaws.com' AWS_ACCESS_KEY_ID = None AWS_SECRET_ACCESS_KEY = None -AWS_QUERYSTRING_AUTH = False -AWS_STORAGE_BUCKET_NAME = "SET-ME-PLEASE (ex. bucket-name)" -AWS_S3_CUSTOM_DOMAIN = "SET-ME-PLEASE (ex. bucket-name.s3.amazonaws.com)" ################################# SIMPLEWIKI ################################### SIMPLE_WIKI_REQUIRE_LOGIN_EDIT = True @@ -1972,8 +1957,8 @@ WIKI_LINK_DEFAULT_LEVEL = 2 ##### Zendesk ##### ZENDESK_URL = '' -ZENDESK_USER = '' -ZENDESK_API_KEY = '' +ZENDESK_USER = None +ZENDESK_API_KEY = None ZENDESK_CUSTOM_FIELDS = {} ZENDESK_OAUTH_ACCESS_TOKEN = '' # A mapping of string names to Zendesk Group IDs @@ -2725,14 +2710,7 @@ CELERY_CREATE_MISSING_QUEUES = True # let logging work as configured: CELERYD_HIJACK_ROOT_LOGGER = False -CELERY_BROKER_VHOST = '' -CELERY_BROKER_USE_SSL = False -CELERY_EVENT_QUEUE_TTL = None - -CELERY_BROKER_TRANSPORT = 'amqp' -CELERY_BROKER_HOSTNAME = 'localhost' -CELERY_BROKER_USER = 'celery' -CELERY_BROKER_PASSWORD = 'celery' +BROKER_USE_SSL = False ############################## HEARTBEAT ###################################### @@ -2795,11 +2773,11 @@ BULK_EMAIL_INFINITE_RETRY_CAP = 1000 # 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. -BULK_EMAIL_ROUTING_KEY = HIGH_PRIORITY_QUEUE +BULK_EMAIL_ROUTING_KEY = Derived(lambda settings: settings.HIGH_PRIORITY_QUEUE) # We also define a queue for smaller jobs so that large courses don't block # smaller emails (see BULK_EMAIL_JOB_SIZE_THRESHOLD setting) -BULK_EMAIL_ROUTING_KEY_SMALL_JOBS = 'edx.lms.core.default' +BULK_EMAIL_ROUTING_KEY_SMALL_JOBS = Derived(lambda settings: settings.DEFAULT_PRIORITY_QUEUE) # For emails with fewer than these number of recipients, send them through # a different queue to avoid large courses blocking emails that are meant to be @@ -3196,7 +3174,6 @@ CSRF_COOKIE_AGE = 60 * 60 * 24 * 7 * 52 # It is highly recommended that you override this in any environment accessed by # end users CSRF_COOKIE_SECURE = False -CSRF_TRUSTED_ORIGINS = [] # If setting a cross-domain cookie, it's really important to choose # a name for the cookie that is DIFFERENT than the cookies used @@ -3250,9 +3227,6 @@ SWAGGER_SETTINGS = { 'DEEP_LINKING': True, } -# How long to cache OpenAPI schemas and UI, in seconds. -OPENAPI_CACHE_TIMEOUT = 0 - ######################### MARKETING SITE ############################### EDXMKTG_LOGGED_IN_COOKIE_NAME = 'edxloggedin' EDXMKTG_USER_INFO_COOKIE_NAME = 'edx-user-info' @@ -3282,11 +3256,11 @@ MKTG_URL_LINK_MAP = { STATIC_TEMPLATE_VIEW_DEFAULT_FILE_EXTENSION = 'html' SUPPORT_SITE_LINK = '' -ID_VERIFICATION_SUPPORT_LINK = '' -PASSWORD_RESET_SUPPORT_LINK = '' -ACTIVATION_EMAIL_SUPPORT_LINK = '' SEND_ACTIVATION_EMAIL_URL = '' -LOGIN_ISSUE_SUPPORT_LINK = '' +ACTIVATION_EMAIL_SUPPORT_LINK = Derived(lambda settings: settings.SUPPORT_SITE_LINK) +ID_VERIFICATION_SUPPORT_LINK = Derived(lambda settings: settings.SUPPORT_SITE_LINK) +LOGIN_ISSUE_SUPPORT_LINK = Derived(lambda settings: settings.SUPPORT_SITE_LINK) +PASSWORD_RESET_SUPPORT_LINK = Derived(lambda settings: settings.SUPPORT_SITE_LINK) # .. setting_name: SECURITY_PAGE_URL # .. setting_default: None @@ -3542,6 +3516,8 @@ REGISTRATION_FIELD_ORDER = [ # String length for the configurable part of the auto-generated username AUTO_GENERATED_USERNAME_RANDOM_STRING_LENGTH = 4 +REGISTRATION_CODE_LENGTH = 8 + ########################## CERTIFICATE NAME ######################## CERT_NAME_SHORT = "Certificate" CERT_NAME_LONG = "Certificate of Achievement" @@ -3549,16 +3525,10 @@ CERT_NAME_LONG = "Certificate of Achievement" ###################### Grade Downloads ###################### # These keys are used for all of our asynchronous downloadable files, including # the ones that contain information other than grades. -GRADES_DOWNLOAD_ROUTING_KEY = HIGH_MEM_QUEUE - -POLICY_CHANGE_GRADES_ROUTING_KEY = 'edx.lms.core.default' - -SINGLE_LEARNER_COURSE_REGRADE_ROUTING_KEY = 'edx.lms.core.default' +GRADES_DOWNLOAD_ROUTING_KEY = Derived(lambda settings: settings.HIGH_MEM_QUEUE) RECALCULATE_GRADES_ROUTING_KEY = 'edx.lms.core.default' -SOFTWARE_SECURE_VERIFICATION_ROUTING_KEY = 'edx.lms.core.default' - GRADES_DOWNLOAD = { 'STORAGE_CLASS': 'django.core.files.storage.FileSystemStorage', 'STORAGE_KWARGS': { @@ -3939,8 +3909,8 @@ CREDENTIALS_PUBLIC_SERVICE_URL = 'http://localhost:8005' # time between scheduled runs, in seconds NOTIFY_CREDENTIALS_FREQUENCY = 14400 -COMMENTS_SERVICE_URL = 'http://localhost:18080' -COMMENTS_SERVICE_KEY = 'password' +COMMENTS_SERVICE_URL = '' +COMMENTS_SERVICE_KEY = '' # Reverification checkpoint name pattern CHECKPOINT_PATTERN = r'(?P[^/]+)' @@ -4089,11 +4059,11 @@ STUDENTMODULEHISTORYEXTENDED_OFFSET = 10000 ################################ Settings for Credentials Service ################################ CREDENTIALS_SERVICE_USERNAME = 'credentials_service_user' -CREDENTIALS_GENERATION_ROUTING_KEY = DEFAULT_PRIORITY_QUEUE +CREDENTIALS_GENERATION_ROUTING_KEY = Derived(lambda settings: settings.DEFAULT_PRIORITY_QUEUE) CREDENTIALS_COURSE_COMPLETION_STATE = 'awarded' # Queue to use for award program certificates -PROGRAM_CERTIFICATES_ROUTING_KEY = 'edx.lms.core.default' +PROGRAM_CERTIFICATES_ROUTING_KEY = Derived(lambda settings: settings.DEFAULT_PRIORITY_QUEUE) # .. setting_name: COMPREHENSIVE_THEME_DIRS # .. setting_default: [] @@ -4103,19 +4073,6 @@ PROGRAM_CERTIFICATES_ROUTING_KEY = 'edx.lms.core.default' # separate paths. COMPREHENSIVE_THEME_DIRS = os.environ.get("COMPREHENSIVE_THEME_DIRS", "").split(":") -# .. setting_name: COMPREHENSIVE_THEME_LOCALE_PATHS -# .. setting_default: [] -# .. setting_description: A list of the paths to themes locale directories e.g. -# "COMPREHENSIVE_THEME_LOCALE_PATHS" : ["/edx/src/edx-themes/conf/locale"]. -COMPREHENSIVE_THEME_LOCALE_PATHS = [] - - -# .. setting_name: PREPEND_LOCALE_PATHS -# .. setting_default: [] -# .. setting_description: A list of the paths to locale directories to load first e.g. -# "PREPEND_LOCALE_PATHS" : ["/edx/my-locales/"]. -PREPEND_LOCALE_PATHS = [] - # .. setting_name: DEFAULT_SITE_THEME # .. setting_default: None # .. setting_description: Theme to use when no site or site theme is defined, for example @@ -4145,10 +4102,8 @@ ENABLE_COMPREHENSIVE_THEMING = False CUSTOM_RESOURCE_TEMPLATES_DIRECTORY = None # API access management -API_ACCESS_MANAGER_EMAIL = 'api-access@example.com' API_ACCESS_FROM_EMAIL = 'api-requests@example.com' -API_DOCUMENTATION_URL = 'https://course-catalog-api-guide.readthedocs.io/en/latest/' -AUTH_DOCUMENTATION_URL = 'https://course-catalog-api-guide.readthedocs.io/en/latest/authentication/index.html' +API_ACCESS_MANAGER_EMAIL = 'api-access@example.com' # Affiliate cookie tracking AFFILIATE_COOKIE_NAME = 'dev_affiliate_id' @@ -4171,8 +4126,9 @@ HELP_TOKENS_BOOKS = { # # Only used if FEATURES['ENABLE_ENTERPRISE_INTEGRATION'] == True. -ENTERPRISE_ENROLLMENT_API_URL = LMS_INTERNAL_ROOT_URL + LMS_ENROLLMENT_API_PATH -ENTERPRISE_PUBLIC_ENROLLMENT_API_URL = LMS_ROOT_URL + LMS_ENROLLMENT_API_PATH +ENTERPRISE_PUBLIC_ENROLLMENT_API_URL = Derived( + lambda settings: (settings.LMS_ROOT_URL or '') + settings.LMS_ENROLLMENT_API_PATH +) ENTERPRISE_COURSE_ENROLLMENT_AUDIT_MODES = ['audit', 'honor'] ENTERPRISE_SUPPORT_URL = '' ENTERPRISE_CUSTOMER_CATALOG_DEFAULT_CONTENT_FILTER = {} @@ -4190,8 +4146,20 @@ INTEGRATED_CHANNELS_API_CHUNK_TRANSMISSION_LIMIT = {} # These default settings are utilized by the LMS when interacting with the service, # and are overridden by the configuration parameter accessors defined in production.py -ENTERPRISE_API_URL = 'https://localhost:18000/enterprise/api/v1' -ENTERPRISE_CONSENT_API_URL = LMS_INTERNAL_ROOT_URL + '/consent/api/v1/' +DEFAULT_ENTERPRISE_API_URL = Derived( + lambda settings: ( + None if settings.LMS_INTERNAL_ROOT_URL is None + else settings.LMS_INTERNAL_ROOT_URL + '/enterprise/api/v1/' + ) +) +ENTERPRISE_API_URL = DEFAULT_ENTERPRISE_API_URL +DEFAULT_ENTERPRISE_CONSENT_API_URL = Derived( + lambda settings: ( + None if settings.LMS_INTERNAL_ROOT_URL is None + else settings.LMS_INTERNAL_ROOT_URL + '/consent/api/v1/' + ) +) +ENTERPRISE_CONSENT_API_URL = DEFAULT_ENTERPRISE_CONSENT_API_URL ENTERPRISE_SERVICE_WORKER_USERNAME = 'enterprise_worker' ENTERPRISE_API_CACHE_TIMEOUT = 3600 # Value is in seconds ENTERPRISE_CUSTOMER_LOGO_IMAGE_SIZE = 512 # Enterprise logo image size limit in KB's @@ -4207,14 +4175,6 @@ ENTERPRISE_ALL_SERVICE_USERNAMES = [ 'enterprise_subsidy_worker', ] -# Setting for Open API key and prompts used by edx-enterprise. -CHAT_COMPLETION_API = 'https://example.com/chat/completion' -CHAT_COMPLETION_API_KEY = 'i am a key' -LEARNER_ENGAGEMENT_PROMPT_FOR_ACTIVE_CONTRACT = '' -LEARNER_ENGAGEMENT_PROMPT_FOR_NON_ACTIVE_CONTRACT = '' -LEARNER_PROGRESS_PROMPT_FOR_ACTIVE_CONTRACT = '' -LEARNER_PROGRESS_PROMPT_FOR_NON_ACTIVE_CONTRACT = '' - ############## ENTERPRISE SERVICE LMS CONFIGURATION ################################## # The LMS has some features embedded that are related to the Enterprise service, but @@ -4606,9 +4566,9 @@ SWIFT_TEMP_URL_KEY = None SWIFT_TEMP_URL_DURATION = 1800 # seconds ############### Settings for facebook ############################## -FACEBOOK_APP_ID = 'FACEBOOK_APP_ID' -FACEBOOK_APP_SECRET = 'FACEBOOK_APP_SECRET' -FACEBOOK_API_VERSION = 'v2.1' +FACEBOOK_APP_ID = None +FACEBOOK_APP_SECRET = None +FACEBOOK_API_VERSION = None ############### Settings for django-fernet-fields ################## FERNET_KEYS = [ @@ -5026,3 +4986,16 @@ RECAPTCHA_SITE_KEYS = { # and is required for the reCAPTCHA service to function correctly. # The project ID should be obtained from the Google Cloud Console when creating a reCAPTCHA RECAPTCHA_PROJECT_ID = None + +############################## Miscellaneous ############################### + +# To limit the number of courses displayed on learner dashboard +DASHBOARD_COURSE_LIMIT = None + +ENTITLEMENTS_EXPIRATION_ROUTING_KEY = Derived(lambda settings: settings.DEFAULT_PRIORITY_QUEUE) + +# TODO: We believe these were part of the DEPR'd sysadmin dashboard, and can likely be removed. +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}" +) diff --git a/lms/envs/production.py b/lms/envs/production.py index f8b0b2f617..835abc0dcf 100644 --- a/lms/envs/production.py +++ b/lms/envs/production.py @@ -26,7 +26,7 @@ from openedx_events.event_bus import merge_producer_configs from path import Path as path from openedx.core.djangoapps.plugins.constants import ProjectType, SettingsType -from openedx.core.lib.derived import Derived, derive_settings +from openedx.core.lib.derived import derive_settings from openedx.core.lib.logsettings import get_logger_config from xmodule.modulestore.modulestore_settings import convert_module_store_setting_if_needed # lint-amnesty, pylint: disable=wrong-import-order @@ -41,125 +41,6 @@ def get_env_setting(setting): error_msg = "Set the %s env variable" % setting raise ImproperlyConfigured(error_msg) # lint-amnesty, pylint: disable=raise-missing-from - -####################################################################################################################### -#### PRODUCTION DEFAULTS -#### -#### Configure some defaults (beyond what has already been configured in common.py) before loading the YAML file. -#### DO NOT ADD NEW DEFAULTS HERE! Put any new setting defaults in common.py instead, along with a setting annotation. -#### TODO: Move all these defaults into common.py. -#### - -DEBUG = False - -# 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') - -# TODO: We believe these were part of the DEPR'd sysadmin dashboard, and can likely be removed. -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}" -) - -DEFAULT_TEMPLATE_ENGINE['OPTIONS']['debug'] = False -SESSION_ENGINE = 'django.contrib.sessions.backends.cache' -CELERY_RESULT_BACKEND = 'django-cache' -BROKER_HEARTBEAT = 60.0 -BROKER_HEARTBEAT_CHECKRATE = 2 -STATIC_ROOT_BASE = None -STATIC_URL_BASE = None -EMAIL_HOST = 'localhost' -EMAIL_PORT = 25 -EMAIL_USE_TLS = False -SESSION_COOKIE_DOMAIN = None -SESSION_COOKIE_HTTPONLY = True -AWS_SES_REGION_NAME = 'us-east-1' -AWS_SES_REGION_ENDPOINT = 'email.us-east-1.amazonaws.com' -REGISTRATION_EMAIL_PATTERNS_ALLOWED = None -LMS_ROOT_URL = None -CMS_BASE = 'studio.edx.org' -CELERY_EVENT_QUEUE_TTL = None -COMPREHENSIVE_THEME_LOCALE_PATHS = [] -PREPEND_LOCALE_PATHS = [] -COURSE_LISTINGS = {} -COMMENTS_SERVICE_URL = '' -COMMENTS_SERVICE_KEY = '' -CERT_QUEUE = 'test-pull' -PYTHON_LIB_FILENAME = 'python_lib.zip' -VIDEO_CDN_URL = {} -HOSTNAME_MODULESTORE_DEFAULT_MAPPINGS = {} -AWS_STORAGE_BUCKET_NAME = 'edxuploads' -AWS_QUERYSTRING_AUTH = True -AWS_S3_CUSTOM_DOMAIN = 'edxuploads.s3.amazonaws.com' -MONGODB_LOG = {} -ZENDESK_USER = None -ZENDESK_API_KEY = None -EDX_API_KEY = None -CELERY_BROKER_TRANSPORT = "" -CELERY_BROKER_HOSTNAME = "" -CELERY_BROKER_VHOST = "" -CELERY_BROKER_USER = "" -CELERY_BROKER_PASSWORD = "" -BROKER_USE_SSL = False -SESSION_INACTIVITY_TIMEOUT_IN_SECONDS = None -ENABLE_REQUIRE_THIRD_PARTY_AUTH = False -GOOGLE_ANALYTICS_TRACKING_ID = None -GOOGLE_ANALYTICS_LINKEDIN = None -GOOGLE_SITE_VERIFICATION_ID = None -BRANCH_IO_KEY = None -REGISTRATION_CODE_LENGTH = 8 -FACEBOOK_API_VERSION = None -FACEBOOK_APP_SECRET = None -FACEBOOK_APP_ID = None -API_ACCESS_MANAGER_EMAIL = None -API_ACCESS_FROM_EMAIL = None -CHAT_COMPLETION_API = '' -CHAT_COMPLETION_API_KEY = '' -OPENAPI_CACHE_TIMEOUT = 60 * 60 -MAINTENANCE_BANNER_TEXT = None -DASHBOARD_COURSE_LIMIT = None - -# Derived defaults (alphabetical) -ACTIVATION_EMAIL_SUPPORT_LINK = Derived(lambda settings: settings.SUPPORT_SITE_LINK) -BULK_EMAIL_ROUTING_KEY = Derived(lambda settings: settings.HIGH_PRIORITY_QUEUE) -BULK_EMAIL_ROUTING_KEY_SMALL_JOBS = Derived(lambda settings: settings.DEFAULT_PRIORITY_QUEUE) -CC_MERCHANT_NAME = Derived(lambda settings: settings.PLATFORM_NAME) -CREDENTIALS_GENERATION_ROUTING_KEY = Derived(lambda settings: settings.DEFAULT_PRIORITY_QUEUE) -CSRF_TRUSTED_ORIGINS = Derived(lambda settings: settings.CSRF_TRUSTED_ORIGINS) -DEFAULT_ENTERPRISE_API_URL = Derived( - lambda settings: ( - None if settings.LMS_INTERNAL_ROOT_URL is None - else settings.LMS_INTERNAL_ROOT_URL + '/enterprise/api/v1/' - ) -) -DEFAULT_ENTERPRISE_CONSENT_API_URL = Derived( - lambda settings: ( - None if settings.LMS_INTERNAL_ROOT_URL is None - else settings.LMS_INTERNAL_ROOT_URL + '/consent/api/v1/' - ) -) -ENTERPRISE_API_URL = DEFAULT_ENTERPRISE_API_URL -ENTERPRISE_CONSENT_API_URL = DEFAULT_ENTERPRISE_CONSENT_API_URL -ENTERPRISE_ENROLLMENT_API_URL = Derived( - lambda settings: (settings.LMS_INTERNAL_ROOT_URL or '') + settings.LMS_ENROLLMENT_API_PATH -) -ENTERPRISE_PUBLIC_ENROLLMENT_API_URL = Derived( - lambda settings: (settings.LMS_ROOT_URL or '') + settings.LMS_ENROLLMENT_API_PATH -) -EMAIL_FILE_PATH = Derived(lambda settings: settings.DATA_DIR / "emails" / "lms") -ENTITLEMENTS_EXPIRATION_ROUTING_KEY = Derived(lambda settings: settings.DEFAULT_PRIORITY_QUEUE) -GRADES_DOWNLOAD_ROUTING_KEY = Derived(lambda settings: settings.HIGH_MEM_QUEUE) -ID_VERIFICATION_SUPPORT_LINK = Derived(lambda settings: settings.SUPPORT_SITE_LINK) -LMS_INTERNAL_ROOT_URL = Derived(lambda settings: settings.LMS_ROOT_URL) -LOGIN_ISSUE_SUPPORT_LINK = Derived(lambda settings: settings.SUPPORT_SITE_LINK) -PASSWORD_RESET_SUPPORT_LINK = Derived(lambda settings: settings.SUPPORT_SITE_LINK) -PROGRAM_CERTIFICATES_ROUTING_KEY = Derived(lambda settings: settings.DEFAULT_PRIORITY_QUEUE) -SHARED_COOKIE_DOMAIN = Derived(lambda settings: settings.SESSION_COOKIE_DOMAIN) -SOFTWARE_SECURE_VERIFICATION_ROUTING_KEY = Derived(lambda settings: settings.HIGH_PRIORITY_QUEUE) - - ####################################################################################################################### #### YAML LOADING #### diff --git a/lms/envs/test.py b/lms/envs/test.py index 1be492f989..2fb61b5dc5 100644 --- a/lms/envs/test.py +++ b/lms/envs/test.py @@ -131,6 +131,8 @@ DJFS = { 'url_root': '/static/django-pyfs', } +API_ACCESS_MANAGER_EMAIL = 'api-access@example.com' + ############################ STATIC FILES ############################# # TODO (cpennington): We need to figure out how envs/test.py can inject things @@ -689,3 +691,53 @@ TOKEN_SIGNING = { } """, # noqa: E501 } + + +### Override default production settings for testing purposes + +API_ACCESS_FROM_EMAIL = "api-requests@example.com" +AWS_QUERYSTRING_AUTH = False +AWS_S3_CUSTOM_DOMAIN = "SET-ME-PLEASE (ex. bucket-name.s3.amazonaws.com)" +AWS_STORAGE_BUCKET_NAME = "SET-ME-PLEASE (ex. bucket-name)" +BRANCH_IO_KEY = "" +CC_MERCHANT_NAME = "Your Platform Name Here" +CELERY_BROKER_HOSTNAME = "localhost" +CELERY_BROKER_PASSWORD = "celery" +CELERY_BROKER_TRANSPORT = "amqp" +CELERY_BROKER_USER = "celery" +CERT_QUEUE = "certificates" +CHAT_COMPLETION_API = "https://example.com/chat/completion" +CHAT_COMPLETION_API_KEY = "i am a key" +CMS_BASE = "localhost:18010" +COMMENTS_SERVICE_KEY = "password" +del BROKER_HEARTBEAT +del BROKER_HEARTBEAT_CHECKRATE +del BROKER_USE_SSL +del DEFAULT_ENTERPRISE_API_URL +del DEFAULT_ENTERPRISE_CONSENT_API_URL +del EMAIL_FILE_PATH +del ENABLE_REQUIRE_THIRD_PARTY_AUTH +del ENTITLEMENTS_EXPIRATION_ROUTING_KEY +del PYTHON_LIB_FILENAME +del REGISTRATION_CODE_LENGTH +del SESSION_INACTIVITY_TIMEOUT_IN_SECONDS +del SSL_AUTH_DN_FORMAT_STRING +del SSL_AUTH_EMAIL_DOMAIN +EDX_API_KEY = "PUT_YOUR_API_KEY_HERE" +ENTERPRISE_ENROLLMENT_API_URL = "https://localhost:18000/api/enrollment/v1/" +ENTERPRISE_PUBLIC_ENROLLMENT_API_URL = "https://localhost:18000/api/enrollment/v1/" +GOOGLE_ANALYTICS_LINKEDIN = "GOOGLE_ANALYTICS_LINKEDIN_DUMMY" +GOOGLE_SITE_VERIFICATION_ID = "" +ID_VERIFICATION_SUPPORT_LINK = "" +LMS_INTERNAL_ROOT_URL = "https://localhost:18000" +MAINTENANCE_BANNER_TEXT = "Sample banner message" +OPENAPI_CACHE_TIMEOUT = 0 +SECURE_PROXY_SSL_HEADER = None +SESSION_COOKIE_DOMAIN = "" +SESSION_ENGINE = "django.contrib.sessions.backends.db" +SHARED_COOKIE_DOMAIN = "" +SOFTWARE_SECURE_VERIFICATION_ROUTING_KEY = "edx.lms.core.default" +STATIC_ROOT_BASE = "/edx/var/edxapp/staticfiles" +STATIC_URL_BASE = "/static/" +ZENDESK_API_KEY = "" +ZENDESK_USER = "" diff --git a/openedx/core/djangoapps/user_authn/toggles.py b/openedx/core/djangoapps/user_authn/toggles.py index 3ca3b75e97..67da464cbb 100644 --- a/openedx/core/djangoapps/user_authn/toggles.py +++ b/openedx/core/djangoapps/user_authn/toggles.py @@ -8,15 +8,6 @@ from django.conf import settings from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers from openedx.core.djangoapps.theming.helpers import get_current_request -# .. toggle_name: ENABLE_REQUIRE_THIRD_PARTY_AUTH -# .. toggle_implementation: DjangoSetting -# .. toggle_default: False -# .. toggle_description: Set to True to prevent using username/password login and registration and only allow -# authentication with third party auth -# .. toggle_use_cases: open_edx -# .. toggle_creation_date: 2020-09-16 -# .. toggle_warning: Requires configuration of third party auth - def is_require_third_party_auth_enabled(): # TODO: Replace function with SettingToggle when it is available. diff --git a/openedx/envs/common.py b/openedx/envs/common.py index 07c5384648..767bfdbd3e 100644 --- a/openedx/envs/common.py +++ b/openedx/envs/common.py @@ -83,6 +83,8 @@ def _make_locale_paths(settings): ############################# Django Built-Ins ############################# +DEBUG = False + USE_TZ = True # User-uploaded content @@ -92,6 +94,15 @@ MEDIA_URL = '/media/' # Dummy secret key for dev/test SECRET_KEY = 'dev key' +# 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_DOMAIN = None +SESSION_COOKIE_HTTPONLY = True +SESSION_ENGINE = 'django.contrib.sessions.backends.cache' + STATICI18N_OUTPUT_DIR = "js/i18n" # Sourced from http://www.localeplanet.com/icu/ and wikipedia @@ -433,7 +444,19 @@ REST_FRAMEWORK = { }, } -################################ Heartbeat ################################# +################################## Celery ################################## + +BROKER_HEARTBEAT = 60.0 +BROKER_HEARTBEAT_CHECKRATE = 2 + +CELERY_BROKER_USE_SSL = False +CELERY_BROKER_HOSTNAME = '' +CELERY_BROKER_PASSWORD = '' +CELERY_BROKER_TRANSPORT = '' +CELERY_BROKER_USER = '' +CELERY_BROKER_VHOST = '' +CELERY_RESULT_BACKEND = 'django-cache' +CELERY_EVENT_QUEUE_TTL = None # Checks run in normal mode by the heartbeat djangoapp HEARTBEAT_CHECKS = [ @@ -752,6 +775,27 @@ USE_EXTRACTED_PROBLEM_BLOCK = False # .. toggle_target_removal_date: 2025-06-01 USE_EXTRACTED_VIDEO_BLOCK = False +################################# ChatGPT ################################## + +CHAT_COMPLETION_API = '' +CHAT_COMPLETION_API_KEY = '' +LEARNER_ENGAGEMENT_PROMPT_FOR_ACTIVE_CONTRACT = '' +LEARNER_ENGAGEMENT_PROMPT_FOR_NON_ACTIVE_CONTRACT = '' +LEARNER_PROGRESS_PROMPT_FOR_ACTIVE_CONTRACT = '' +LEARNER_PROGRESS_PROMPT_FOR_NON_ACTIVE_CONTRACT = '' + +# How long to cache OpenAPI schemas and UI, in seconds. +OPENAPI_CACHE_TIMEOUT = 60 * 60 + +################################### AWS #################################### + +AWS_QUERYSTRING_AUTH = True +AWS_STORAGE_BUCKET_NAME = 'edxuploads' +AWS_S3_CUSTOM_DOMAIN = 'edxuploads.s3.amazonaws.com' + +AWS_SES_REGION_NAME = 'us-east-1' +AWS_SES_REGION_ENDPOINT = 'email.us-east-1.amazonaws.com' + ############################## Miscellaneous ############################### COURSE_MODE_DEFAULTS = { @@ -783,3 +827,58 @@ USERNAME_PATTERN = fr'(?P{USERNAME_REGEX_PARTIAL})' DISCUSSION_RATELIMIT = '100/m' SKIP_RATE_LIMIT_ON_ACCOUNT_AFTER_DAYS = 0 + +LMS_ROOT_URL = None +LMS_INTERNAL_ROOT_URL = Derived(lambda settings: settings.LMS_ROOT_URL) + +LMS_ENROLLMENT_API_PATH = "/api/enrollment/v1/" +ENTERPRISE_ENROLLMENT_API_URL = Derived( + lambda settings: (settings.LMS_INTERNAL_ROOT_URL or '') + settings.LMS_ENROLLMENT_API_PATH +) + +# This is the domain that is used to set shared cookies between various sub-domains. +SHARED_COOKIE_DOMAIN = Derived(lambda settings: settings.SESSION_COOKIE_DOMAIN) + +SESSION_INACTIVITY_TIMEOUT_IN_SECONDS = None + +STATIC_ROOT_BASE = None + +VIDEO_CDN_URL = { + # 'EXAMPLE_COUNTRY_CODE': "http://example.com/edx/video?s3_url=" +} + +# List of logout URIs for each IDA that the learner should be logged out of when they logout of the LMS +# or CMS. Only applies to IDA for which the social auth flow uses DOT (Django OAuth Toolkit). +IDA_LOGOUT_URI_LIST = [] + +SOFTWARE_SECURE_VERIFICATION_ROUTING_KEY = Derived(lambda settings: settings.HIGH_PRIORITY_QUEUE) + +# Queue to use for updating grades due to grading policy change +POLICY_CHANGE_GRADES_ROUTING_KEY = Derived(lambda settings: settings.DEFAULT_PRIORITY_QUEUE) + +# Queue to use for individual learner course regrades +SINGLE_LEARNER_COURSE_REGRADE_ROUTING_KEY = Derived(lambda settings: settings.DEFAULT_PRIORITY_QUEUE) + +# .. setting_name: STATIC_URL_BASE +# .. setting_default: "None" +# .. setting_description: The LMS and CMS use this to construct ``STATIC_URL`` by appending +# a slash (if needed), and for the CMS, ``studio/`` afterwards. +STATIC_URL_BASE = None + +# .. setting_name: COMPREHENSIVE_THEME_LOCALE_PATHS +# .. setting_default: [] +# .. setting_description: A list of the paths to themes locale directories e.g. +# "COMPREHENSIVE_THEME_LOCALE_PATHS" : ["/edx/src/edx-themes/conf/locale"]. +COMPREHENSIVE_THEME_LOCALE_PATHS = [] + +# .. setting_name: PREPEND_LOCALE_PATHS +# .. setting_default: [] +# .. setting_description: A list of the paths to locale directories to load first e.g. +# "PREPEND_LOCALE_PATHS" : ["/edx/my-locales/"]. +PREPEND_LOCALE_PATHS = [] + +# API access management +API_DOCUMENTATION_URL = 'https://course-catalog-api-guide.readthedocs.io/en/latest/' +AUTH_DOCUMENTATION_URL = 'https://course-catalog-api-guide.readthedocs.io/en/latest/authentication/index.html' + +CSRF_TRUSTED_ORIGINS = [] diff --git a/xmodule/util/sandboxing.py b/xmodule/util/sandboxing.py index a8883ba3e9..298f421b74 100644 --- a/xmodule/util/sandboxing.py +++ b/xmodule/util/sandboxing.py @@ -11,11 +11,6 @@ def course_code_library_asset_name(): """ Return the asset name to use for course code libraries, defaulting to python_lib.zip. """ - # .. setting_name: PYTHON_LIB_FILENAME - # .. setting_default: python_lib.zip - # .. setting_description: Name of the course file to make available to code in - # custom Python-graded problems. By default, this file will not be downloadable - # by learners. return getattr(settings, 'PYTHON_LIB_FILENAME', DEFAULT_PYTHON_LIB_FILENAME)