Skip to content
Snippets Groups Projects
common.py 147 KiB
Newer Older
# -*- coding: utf-8 -*-
"""
This is the common settings file, intended to set sane defaults. If you have a
piece of configuration that's dependent on a set of feature flags being set,
then create a function that returns the calculated value based on the value of
FEATURES[...]. Modules that extend this one can change the feature
configuration in an environment specific config file and re-calculate those
values.

We should make a method that calls all these config methods so that you just
make one call at the end of your site-specific dev file to reset all the
dependent variables (like INSTALLED_APPS) for you.

Longer TODO:
1. Right now our treatment of static content in general and in particular
   course-specific static content is haphazard.
2. We should have a more disciplined approach to feature flagging, even if it
   just means that we stick them in a dict called FEATURES.
3. We need to handle configuration for multiple courses. This could be as
   multiple sites, but we do need a way to map their data assets.
"""
# We intentionally define lots of variables that aren't used
# pylint: disable=unused-import
# Pylint gets confused by path.py instances, which report themselves as class
# objects. As a result, pylint applies the wrong regex in validating names,
# and throws spurious errors. Therefore, we disable invalid-name checking.
# pylint: disable=invalid-name
import importlib.util
from corsheaders.defaults import default_headers as corsheaders_default_headers
from path import Path as path
from django.utils.translation import ugettext_lazy as _
from enterprise.constants import (
    ENTERPRISE_ADMIN_ROLE,
    ENTERPRISE_CATALOG_ADMIN_ROLE,
    ENTERPRISE_DASHBOARD_ADMIN_ROLE,
    ENTERPRISE_ENROLLMENT_API_ADMIN_ROLE,
    ENTERPRISE_REPORTING_CONFIG_ADMIN_ROLE,
Bill DeRusha's avatar
Bill DeRusha committed
from openedx.core.constants import COURSE_KEY_REGEX, COURSE_KEY_PATTERN, COURSE_ID_PATTERN
from openedx.core.djangoapps.theming.helpers_dirs import (
    get_themes_unchecked,
    get_theme_base_dirs_from_settings
)
from openedx.core.lib.derived import derived, derived_collection_entry
from openedx.core.release import doc_version
from xmodule.modulestore.modulestore_settings import update_module_store_settings
from xmodule.modulestore.edit_info import EditInfoMixin
from lms.djangoapps.lms_xblock.mixin import LmsBlockMixin
Calen Pennington's avatar
Calen Pennington committed

################################### FEATURES ###################################
# The display name of the platform to be used in templates/emails/etc.
PLATFORM_NAME = _('Your Platform Name Here')
PLATFORM_DESCRIPTION = _('Your Platform Description Here')
CC_MERCHANT_NAME = PLATFORM_NAME
PLATFORM_FACEBOOK_ACCOUNT = "http://www.facebook.com/YourPlatformFacebookAccount"
PLATFORM_TWITTER_ACCOUNT = "@YourPlatformTwitterAccount"
nadeemshahzad's avatar
nadeemshahzad committed
LMS_ROOT_URL = 'https://localhost:18000'
LMS_INTERNAL_ROOT_URL = LMS_ROOT_URL
LMS_ENROLLMENT_API_PATH = "/api/enrollment/v1/"
# Default choices for role dropdown in the membership tab of the instructor dashboard
# This setting is used when a site does not define its own choices via site configuration
MANUAL_ENROLLMENT_ROLE_CHOICES = ['Learner', 'Support', 'Partner']

# 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
    # .. toggle_name: DISPLAY_DEBUG_INFO_TO_STAFF
    # .. toggle_implementation: DjangoSetting
    # .. toggle_default: True
    # .. toggle_description: Add a "Staff Debug" button to course modules for debugging by course staff.
    # .. toggle_use_cases: ?
    # .. toggle_creation_date: 2015-09-04
    # .. toggle_expiration_date: None
    # .. toggle_warnings: None
    # .. toggle_tickets: https://github.com/edx/edx-platform/pull/2425
    # .. toggle_status: supported
    'DISPLAY_DEBUG_INFO_TO_STAFF': True,
    'DISPLAY_HISTOGRAMS_TO_STAFF': False,  # For large courses this slows down courseware access for staff.
    'REROUTE_ACTIVATION_EMAIL': False,  # nonempty string = address for all activation emails
    # .. toggle_name: DISABLE_START_DATES
    # .. toggle_implementation: DjangoSetting
    # .. toggle_default: False
    # .. toggle_description: When True, all courses will be active, regardless of start date.
    # .. toggle_use_cases: ?
    # .. toggle_creation_date: ?
    # .. toggle_expiration_date: None
    # .. toggle_warnings: This will cause ALL courses to be immediately visible.
    # .. toggle_tickets: https://github.com/edx/edx-platform/pull/17913
    # .. toggle_status: supported
    ## DO NOT SET TO True IN THIS FILE
    ## Doing so will cause all courses to be released on production
    'DISABLE_START_DATES': False,
    # for consistency in user-experience, keep the value of the following 3 settings
    # in sync with the corresponding ones in cms/envs/common.py
    'ENABLE_DISCUSSION_SERVICE': True,

    # .. toggle_name: ENABLE_TEXTBOOK
    # .. toggle_implementation: DjangoSetting
    # .. toggle_default: True
    # .. toggle_description: Add PDF and HTML textbook tabs to the courseware.
    # .. toggle_use_cases: ?
    # .. toggle_creation_date: 2014-03-27
    # .. toggle_expiration_date: None
    # .. toggle_warnings: None
    # .. toggle_tickets: https://github.com/edx/edx-platform/pull/3064
    # .. toggle_status: supported
    'ENABLE_TEXTBOOK': True,
    # discussion home panel, which includes a subscription on/off setting for discussion digest emails.
    # this should remain off in production until digest notifications are online.
e0d's avatar
e0d committed
    'ENABLE_DISCUSSION_HOME_PANEL': False,
    # .. toggle_name: ENABLE_DISCUSSION_EMAIL_DIGEST
    # .. toggle_implementation: DjangoSetting
    # .. toggle_default: False
    # .. toggle_description: Set this to True if you want the discussion digest emails enabled automatically for new users. This will be set on all new account registrations.
    # .. toggle_category: admin
    # .. toggle_use_cases: open_edx
    # .. toggle_creation_date: 2014-08-19
    # .. toggle_expiration_date: None
    # .. toggle_warnings: It is not recommended to enable this feature if ENABLE_DISCUSSION_HOME_PANEL is not enabled, since subscribers who receive digests in that case will only be able to unsubscribe via links embedded in their emails, and they will have no way to resubscribe.
    # .. toggle_tickets: https://github.com/edx/edx-platform/pull/4891
    # .. toggle_status: supported
    # toggle_name: ENABLE_UNICODE_USERNAME
    # toggle_implementation: DjangoSetting
    # toggle_default: False
    # toggle_description: Set this to True to allow unicode characters in username. Enabling this will also automatically enable SOCIAL_AUTH_CLEAN_USERNAMES. When this is enabled, usernames will have to match the regular expression defined by USERNAME_REGEX_PARTIAL.
    # toggle_category: admin
    # toggle_use_cases: open_edx
    # toggle_creation_date: 2017-06-27
    # toggle_expiration_date: None
    # toggle_warnings: None
    # toggle_tickets: https://github.com/edx/edx-platform/pull/14729
    # toggle_status: supported
    'ENABLE_UNICODE_USERNAME': False,

    'ENABLE_DJANGO_ADMIN_SITE': True,  # set true to enable django's admin site, even on prod (e.g. for course ops)
    'ENABLE_LMS_MIGRATION': False,

    # .. toggle_name: ENABLE_MASQUERADE
    # .. toggle_implementation: DjangoSetting
    # .. toggle_default: True
    # .. toggle_description: Allow course staff to change to student view of courseware by accessing the /course/{course_id}/masquerade url.
    # .. toggle_use_cases: ?
    # .. toggle_creation_date: 2013-04-13
    # .. toggle_expiration_date: None
    # .. toggle_warnings: None
    # .. toggle_tickets: None
    # .. toggle_status: supported
    'ENABLE_MASQUERADE': True,
    # .. toggle_name: ENABLE_SYSADMIN_DASHBOARD
    # .. toggle_implementation: DjangoSetting
    # .. toggle_default: False
    # .. toggle_description: enables dashboard at /syadmin/ for django staff, for seeing overview of system status, for deleting and loading courses, for seeing log of git imports of courseware.
    # .. toggle_category: admin
    # .. toggle_use_cases: open_edx
    # .. toggle_creation_date: 2013-12-12
    # .. toggle_expiration_date: None
    # .. toggle_warnings: some views are not performant when there are more than 100 courses
    # .. toggle_tickets: None
    # .. toggle_status: unsupported
Carson Gee's avatar
Carson Gee committed
    'ENABLE_SYSADMIN_DASHBOARD': False,  # sysadmin dashboard, to see what courses are loaded, to delete & load courses

    'DISABLE_LOGIN_BUTTON': False,  # used in systems where login is automatic, eg MIT SSL
    # .. toggle_name: ENABLE_OAUTH2_PROVIDER
    # .. toggle_implementation: DjangoSetting
    # .. toggle_default: False
    # .. toggle_description: Enable this feature to allow this Open edX platform to be an OAuth2 authentication
    #   provider. This is necessary to enable some other features, such as the REST API for the mobile application.
    # .. toggle_category: admin
    # .. toggle_use_cases: monitored_rollout
    # .. toggle_creation_date: 2014-09-09
    # .. toggle_expiration_date: None
    # .. toggle_status: supported
    # .. toggle_warnings: None
    'ENABLE_OAUTH2_PROVIDER': False,

    # .. toggle_name: ENABLE_XBLOCK_VIEW_ENDPOINT
    # .. toggle_implementation: DjangoSetting
    # .. toggle_default: False
    # .. toggle_description: Enable an API endpoint, named "xblock_view", to serve rendered XBlock views. This might be used by external applications. See for instance jquery-xblock (now unmaintained): https://github.com/edx-solutions/jquery-xblock
    # .. toggle_use_cases: ?
    # .. toggle_creation_date: 2014-03-14
    # .. toggle_expiration_date: None
    # .. toggle_warnings: None
    # .. toggle_tickets: https://github.com/edx/edx-platform/pull/2968
    # .. toggle_status: supported
    'ENABLE_XBLOCK_VIEW_ENDPOINT': False,

    # Allows to configure the LMS to provide CORS headers to serve requests from other domains
    'ENABLE_CORS_HEADERS': False,

    # Can be turned off if course lists need to be hidden. Effects views and templates.
    'COURSES_ARE_BROWSABLE': True,
    # Set to hide the courses list on the Learner Dashboard if they are not enrolled in any courses yet.
    'HIDE_DASHBOARD_COURSES_UNTIL_ACTIVATED': False,

    # Give a UI to show a student's submission history in a problem by the
    # Staff Debug tool.
    'ENABLE_STUDENT_HISTORY_VIEW': True,

    # Turn on a page that lets staff enter Python code to be run in the
    # sandbox, for testing whether it's enabled properly.
    'ENABLE_DEBUG_RUN_PYTHON': False,

    # Enable URL that shows information about the status of variuous services
    'ENABLE_SERVICE_STATUS': False,
    # Don't autoplay videos for students
    'AUTOPLAY_VIDEOS': False,
    # Move the student to next page when a video finishes. Set to True to show
    # an auto-advance button in videos. If False, videos never auto-advance.
    'ENABLE_AUTOADVANCE_VIDEOS': False,

    # Enable instructor dash to submit background tasks
    'ENABLE_INSTRUCTOR_BACKGROUND_TASKS': True,
    # Enable instructor to assign individual due dates
    # Note: In order for this feature to work, you must also add
    # 'lms.djangoapps.courseware.student_field_overrides.IndividualStudentOverrideProvider' to
    # the setting FIELD_OVERRIDE_PROVIDERS, in addition to setting this flag to
    # True.
    'INDIVIDUAL_DUE_DATES': False,

cewing's avatar
cewing committed
    # Enable Custom Courses for EdX
    'CUSTOM_COURSES_EDX': False,
    # Toggle to enable certificates of courses on dashboard
    'ENABLE_VERIFIED_CERTIFICATES': False,

    # .. toggle_name: DISABLE_HONOR_CERTIFICATES
    # .. toggle_implementation: DjangoSetting
    # .. toggle_default: False
    # .. toggle_description: Set to True to disable honor certificates. Typically used when your installation only allows verified certificates, like courses.edx.org.
    # .. toggle_category: certificates
    # .. toggle_use_cases: open_edx
    # .. toggle_creation_date: 2019-05-14
    # .. toggle_expiration_date: None
    # .. toggle_tickets: https://openedx.atlassian.net/browse/PROD-269
    # .. toggle_status: supported
    # .. toggle_warnings: ???
    'DISABLE_HONOR_CERTIFICATES': False,  # Toggle to disable honor certificates

    'DISABLE_AUDIT_CERTIFICATES': False,  # Toggle to disable audit certificates

    # for acceptance and load testing
    'AUTOMATIC_AUTH_FOR_TESTING': False,
    # .. toggle_name: RESTRICT_AUTOMATIC_AUTH
    # .. toggle_implementation: DjangoSetting
    # .. toggle_default: True
    # .. toggle_description: Prevent auto auth from creating superusers or modifying existing users. Auto auth is a mechanism where superusers can simply modify attributes of other users by accessing the "/auto_auth url" with the right querystring parameters.
    # .. toggle_category: admin
    # .. toggle_use_cases: open_edx
    # .. toggle_creation_date: 2018-05-07
    # .. toggle_expiration_date: None
    # .. toggle_tickets: https://openedx.atlassian.net/browse/TE-2545
    # .. toggle_status: supported
    'RESTRICT_AUTOMATIC_AUTH': True,

    # toggle_name: ENABLE_LOGIN_MICROFRONTEND
    # toggle_implementation: DjangoSetting
    # toggle_default: False
    # toggle_description: Enable the login micro frontend.
    # toggle_category: admin
    # toggle_use_cases: open_edx
    # toggle_creation_date: 2018-05-07
    # toggle_expiration_date: None
    # toggle_warnings: The login MFE domain name should be listed in LOGIN_REDIRECT_WHITELIST.
    # toggle_status: supported
    'ENABLE_LOGIN_MICROFRONTEND': False,

    # toggle_name: SKIP_EMAIL_VALIDATION
    # toggle_implementation: DjangoSetting
    # toggle_default: False
    # toggle_description: Turn this on to skip sending emails for user validation. Beware, as this leaves the door open to potential spam abuse.
    # toggle_category: admin
    # toggle_use_cases: open_edx
    # toggle_expiration_date: None
    # toggle_warnings: The login MFE domain name should be listed in LOGIN_REDIRECT_WHITELIST.
    # toggle_status: supported
    'SKIP_EMAIL_VALIDATION': False,

    # Toggle the availability of the shopping cart page
David Ormsbee's avatar
David Ormsbee committed
    'ENABLE_SHOPPING_CART': False,

    # Toggle storing detailed billing information
    'STORE_BILLING_INFO': False,

    # Enable flow for payments for course registration (DIFFERENT from verified student flow)
    'ENABLE_PAID_COURSE_REGISTRATION': False,
    # .. toggle_name: ENABLE_COSMETIC_DISPLAY_PRICE
    # .. toggle_implementation: DjangoSetting
    # .. toggle_default: False
    # .. toggle_description: Enable the display of "cosmetic_display_price", set in a course advanced settings. This cosmetic price is used when there is no registration price associated to the course.
    # .. toggle_use_cases: ?
    # .. toggle_creation_date: 2014-10-10
    # .. toggle_expiration_date: None
    # .. toggle_warnings: None
    # .. toggle_tickets: https://github.com/edx/edx-platform/pull/6876
    # .. toggle_status: supported
    'ENABLE_COSMETIC_DISPLAY_PRICE': False,

    # Automatically approve student identity verification attempts
    'AUTOMATIC_VERIFY_STUDENT_IDENTITY_FOR_TESTING': False,
    # Maximum number of rows to include in the csv file for downloading problem responses.
    'MAX_PROBLEM_RESPONSES_COUNT': 5000,

    'ENABLED_PAYMENT_REPORTS': [
        "refund_report",
        "itemized_purchase_report",
        "university_revenue_share",
        "certificate_status"
    ],

    # Turn off account locking if failed login attempts exceeds a limit
    'ENABLE_MAX_FAILED_LOGIN_ATTEMPTS': True,

    # Hide any Personally Identifiable Information from application logs
    'SQUELCH_PII_IN_LOGS': True,
    # Toggles the embargo functionality, which blocks users from
    # the site or courses based on their location.
    'EMBARGO': False,

    # Whether the Wiki subsystem should be accessible via the direct /wiki/ paths. Setting this to True means
    # that people can submit content and modify the Wiki in any arbitrary manner. We're leaving this as True in the
    # defaults, so that we maintain current behavior
    'ALLOW_WIKI_ROOT_ACCESS': True,
    # toggle_name: ENABLE_THIRD_PARTY_AUTH
    # toggle_implementation: DjangoSetting
    # toggle_default: False
    # toggle_description: Turn on third-party auth. Disabled for now because full implementations are not yet available. Remember to run migrations if you enable this; we don't create tables by default. This feature can be enabled on a per-site basis. When enabling this feature, remember to define the allowed authentication backends with the AUTHENTICATION_BACKENDS setting.
    # toggle_category: admin
    # toggle_use_cases: open_edx
    # toggle_creation_date: 2014-09-15
    # toggle_expiration_date: None
    # toggle_status: supported
    # toggle_warnings: None
    # .. toggle_name: ENABLE_MKTG_SITE
    # .. toggle_implementation: DjangoSetting
    # .. toggle_default: False
    # .. toggle_description: Toggle to enable alternate urls for marketing links.
    # .. toggle_use_cases: ?
    # .. toggle_creation_date: 2014-03-24
    # .. toggle_expiration_date: None
    # .. toggle_warnings: When this is enabled, the MKTG_URLS setting should be defined.
    # .. toggle_tickets: ?
    # .. toggle_status: supported
    'ENABLE_MKTG_SITE': False,

    # Prevent concurrent logins per user
    'PREVENT_CONCURRENT_LOGINS': True,
    # When a logged in user goes to the homepage ('/') should the user be
    # redirected to the dashboard - this is default Open edX behavior. Set to
    # False to not redirect the user
    'ALWAYS_REDIRECT_HOMEPAGE_TO_DASHBOARD_FOR_AUTHENTICATED_USER': True,

    # .. toggle_name: ENABLE_COURSE_SORTING_BY_START_DATE
    # .. toggle_implementation: DjangoSetting
    # .. toggle_default: True
    # .. toggle_description: When a user goes to the homepage ('/') the user sees the courses listed in the announcement dates order - this is default Open edX behavior. Set to True to change the course sorting behavior by their start dates, latest first.
    # .. toggle_use_cases: ?
    # .. toggle_creation_date: 2015-03-27
    # .. toggle_expiration_date: None
    # .. toggle_warnings: None
    # .. toggle_tickets: https://github.com/edx/edx-platform/pull/7548
    # .. toggle_status: supported
    'ENABLE_COURSE_SORTING_BY_START_DATE': True,
    # .. toggle_name: ENABLE_COURSE_HOME_REDIRECT
    # .. toggle_implementation: DjangoSetting
    # .. toggle_default: True
    # .. toggle_description: When enabled, along with the ENABLE_MKTG_SITE feature toggle, users who attempt to access a course "about" page will be redirected to the course home url. This url might be the course "info" page or the unified course tab (when the UNIFIED_COURSE_TAB_FLAG waffle is enabled).
    # .. toggle_use_cases: ?
    # .. toggle_creation_date: 2019-01-15
    # .. toggle_expiration_date: None
    # .. toggle_warnings: None
    # .. toggle_tickets: https://github.com/edx/edx-platform/pull/19604
    # .. toggle_status: supported
    'ENABLE_COURSE_HOME_REDIRECT': True,

    # Expose Mobile REST API. Note that if you use this, you must also set
    # ENABLE_OAUTH2_PROVIDER to True
    'ENABLE_MOBILE_REST_API': False,

    # .. toggle_name: ENABLE_COMBINED_LOGIN_REGISTRATION_FOOTER
    # .. toggle_implementation: DjangoSetting
    # .. toggle_default: False
    # .. toggle_description: Display the standard footer in the login page. This feature can be overridden by a site-specific configuration.
    # .. toggle_category: admin
    # .. toggle_use_cases: open_edx
    # .. toggle_creation_date: 2016-06-24
    # .. toggle_expiration_date: None
    # .. toggle_tickets: https://openedx.atlassian.net/browse/OSPR-1320
    # .. toggle_status: supported
    # .. toggle_warnings: None
    'ENABLE_COMBINED_LOGIN_REGISTRATION_FOOTER': False,
    # Enable organizational email opt-in
    'ENABLE_MKTG_EMAIL_OPT_IN': False,

    # Show the mobile app links in the footer
    'ENABLE_FOOTER_MOBILE_APP_LINKS': False,
    # Let students save and manage their annotations
    'ENABLE_EDXNOTES': False,
    # Toggle to enable coordination with the Publisher tool (keep in sync with cms/envs/common.py)
    'ENABLE_PUBLISHER': False,

    # Milestones application flag
    'MILESTONES_APP': False,

    # Organizations application flag
    'ORGANIZATIONS_APP': False,

    # Prerequisite courses feature flag
    'ENABLE_PREREQUISITE_COURSES': False,

    # For easily adding modes to courses during acceptance testing
    'MODE_CREATION_FOR_TESTING': False,
    # For caching programs in contexts where the LMS can only
    # be reached over HTTP.
    'EXPOSE_CACHE_PROGRAMS_ENDPOINT': False,

    # Courseware search feature
    'ENABLE_COURSEWARE_SEARCH': False,
    'ENABLE_COURSEWARE_SEARCH_FOR_COURSE_STAFF': False,
Davorin Sego's avatar
Davorin Sego committed
    # Dashboard search feature
    'ENABLE_DASHBOARD_SEARCH': False,

    # log all information from cybersource callbacks
    'LOG_POSTPAY_CALLBACKS': True,
    # .. toggle_name: LICENSING
    # .. toggle_implementation: DjangoSetting
    # .. toggle_default: False
    # .. toggle_description: Toggle platform-wide course licensing. The course.license attribute is then used to append license information to the courseware.
    # .. toggle_use_cases: ?
    # .. toggle_creation_date: 2015-05-14
    # .. toggle_expiration_date: None
    # .. toggle_warnings: None
    # .. toggle_tickets: https://github.com/edx/edx-platform/pull/7315
    # .. toggle_status: supported
    # Certificates Web/HTML Views
    'CERTIFICATES_HTML_VIEW': False,
    # .. toggle_name: ENABLE_COURSE_DISCOVERY
    # .. toggle_implementation: DjangoSetting
    # .. toggle_default: False
    # .. toggle_description: Add a course search widget to the LMS for searching courses. When this is enabled, the latest courses are no longer displayed on the LMS landing page. Also, an "Explore Courses" item is added to the navbar.
    # .. toggle_use_cases: ?
    # .. toggle_creation_date: 2015-04-23
    # .. toggle_expiration_date: None
    # .. toggle_warnings: The COURSE_DISCOVERY_MEANINGS setting should be properly defined.
    # .. toggle_tickets: https://github.com/edx/edx-platform/pull/7845
    # .. toggle_status: supported
    # Setting for overriding default filtering facets for Course discovery
    # COURSE_DISCOVERY_FILTERS = ["org", "language", "modes"]

    # Software secure fake page feature flag
    'ENABLE_SOFTWARE_SECURE_FAKE': False,
    'ENABLE_TEAMS': True,
Alexander Kryklia's avatar
Alexander Kryklia committed

    # Show video bumper in LMS
    'ENABLE_VIDEO_BUMPER': False,

    # How many seconds to show the bumper again, default is 7 days:
    'SHOW_BUMPER_PERIODICITY': 7 * 24 * 3600,

    # .. toggle_name: ENABLE_SPECIAL_EXAMS
    # .. toggle_implementation: DjangoSetting
    # .. toggle_default: False
    # .. toggle_description: Enable to use special exams, aka timed and proctored exams.
    # .. toggle_use_cases: ?
    # .. toggle_creation_date: 2015-09-04
    # .. toggle_expiration_date: None
    # .. toggle_warnings: None
    # .. toggle_tickets: https://github.com/edx/edx-platform/pull/9744
    # .. toggle_status: supported
    'ENABLE_SPECIAL_EXAMS': False,
    # Enable OpenBadge support. See the BADGR_* settings later in this file.
    'ENABLE_OPENBADGES': False,
    # Enable LTI Provider feature.
    'ENABLE_LTI_PROVIDER': False,
    # Show the language selector in the header
    'SHOW_HEADER_LANGUAGE_SELECTOR': False,

    # At edX it's safe to assume that English transcripts are always available
    # This is not the case for all installations.
    # The default value in {lms,cms}/envs/common.py and xmodule/tests/test_video.py should be consistent.
    'FALLBACK_TO_ENGLISH_TRANSCRIPTS': True,

    # Show the language selector in the footer
    'SHOW_FOOTER_LANGUAGE_SELECTOR': False,
    # .. toggle_name: ENABLE_CSMH_EXTENDED
    # .. toggle_implementation: DjangoSetting
    # .. toggle_default: True
    # .. toggle_description: Write Courseware Student Module History (CSMH) to the extended table: this logs all student activities to MySQL, in a separate database.
    # .. toggle_use_cases: ?
    # .. toggle_creation_date: ?
    # .. toggle_expiration_date: None
    # .. toggle_warnings: Even though most Open edX instances run with a separate CSMH database, it may not always be the case. When disabling this feature flag, remember to remove "coursewarehistoryextended" from the INSTALLED_APPS and the "StudentModuleHistoryExtendedRouter" from the DATABASE_ROUTERS.
    # .. toggle_tickets: None
    # .. toggle_status: supported
    'ENABLE_CSMH_EXTENDED': True,

    # Read from both the CSMH and CSMHE history tables.
    # This is the default, but can be disabled if all history
    # lives in the Extended table, saving the frontend from
    # making multiple queries.
    'ENABLE_READING_FROM_MULTIPLE_HISTORY_TABLES': True,
    # Set this to False to facilitate cleaning up invalid xml from your modulestore.
    'ENABLE_XBLOCK_XML_VALIDATION': True,
    # .. toggle_name: ALLOW_PUBLIC_ACCOUNT_CREATION
    # .. toggle_implementation: DjangoSetting
    # .. toggle_default: True
    # .. toggle_description: Allow public account creation. If this is disabled, users will no longer have access to the signup page.
    # .. toggle_category: admin
    # .. toggle_use_cases: open_edx
    # .. toggle_creation_date: 2017-04-12
    # .. toggle_expiration_date: None
    # .. toggle_tickets: https://openedx.atlassian.net/browse/YONK-513
    # .. toggle_status: supported
    # .. toggle_warnings: None
    'ALLOW_PUBLIC_ACCOUNT_CREATION': True,

    # Enable footer banner for cookie consent.
    # See https://cookieconsent.insites.com/ for more.
    'ENABLE_COOKIE_CONSENT': False,

    # Whether or not the dynamic EnrollmentTrackUserPartition should be registered.
    'ENABLE_ENROLLMENT_TRACK_USER_PARTITION': True,

    # Enable one click program purchase
    # See LEARNER-493
    'ENABLE_ONE_CLICK_PROGRAM_PURCHASE': False,
    # Allow users to change their email address.
    'ALLOW_EMAIL_ADDRESS_CHANGE': True,
    # Whether the bulk enrollment view is enabled.
    'ENABLE_BULK_ENROLLMENT_VIEW': False,

    # Whether course goals is enabled.
    'ENABLE_COURSE_GOALS': True,

    # Set to enable Enterprise integration
    'ENABLE_ENTERPRISE_INTEGRATION': False,

    # Whether HTML XBlocks/XModules return HTML content with the Course Blocks API student_view_data
    'ENABLE_HTML_XBLOCK_STUDENT_VIEW_DATA': False,
    # .. toggle_name: ENABLE_CHANGE_USER_PASSWORD_ADMIN
    # .. toggle_implementation: DjangoSetting
    # .. toggle_default: False
    # .. toggle_description: Whether to send an email for failed password reset attempts or not. This happens when a user asks for a password reset but they don't have an account associated to their email. This is useful for notifying users that they don't have an account associated with email addresses they believe they've registered with. This setting can be overridden by a site-specific configuration.
    # .. toggle_category: admin
    # .. toggle_use_cases: open_edx
    # .. toggle_creation_date: 2017-07-20
    # .. toggle_expiration_date: None
    # .. toggle_tickets: https://openedx.atlassian.net/browse/OSPR-1832
    # .. toggle_status: supported
    # .. toggle_warnings: None
    'ENABLE_PASSWORD_RESET_FAILURE_EMAIL': False,
    # Sets the default browser support. For more information go to http://browser-update.org/customize.html
    'UNSUPPORTED_BROWSER_ALERT_VERSIONS': "{i:10,f:-3,o:-3,s:-3,c:-3}",

    # Whether to display the account deletion section the account settings page
    'ENABLE_ACCOUNT_DELETION': True,

    # Enable feature to remove enrollments and users. Used to reset state of master's integration environments
    'ENABLE_ENROLLMENT_RESET': False,
    'DISABLE_MOBILE_COURSE_AVAILABLE': False,

    # .. toggle_name: ENABLE_CHANGE_USER_PASSWORD_ADMIN
    # .. toggle_implementation: DjangoSetting
    # .. toggle_default: False
    # .. toggle_description: Set to True to enable changing a user password through django admin. This is disabled by default because enabling allows a method to bypass password policy.
    # .. toggle_category: admin
    # .. toggle_use_cases: open_edx
    # .. toggle_creation_date: 2020-02-21
    # .. toggle_expiration_date: None
    # .. toggle_tickets: 'https://github.com/edx/edx-platform/pull/21616'
    # .. toggle_status: supported
    # .. toggle_warnings: None
    'ENABLE_CHANGE_USER_PASSWORD_ADMIN': False,

    # .. toggle_name: ENABLE_COURSEWARE_MICROFRONTEND
    # .. toggle_implementation: DjangoSetting
    # .. toggle_default: False
    # .. toggle_description: Set to True to enable the Courseware MFE at the platform level for global staff (see REDIRECT_TO_COURSEWARE_MICROFRONTEND for course rollout)
    # .. toggle_category: admin
    # .. toggle_use_cases: open_edx
    # .. toggle_creation_date: 2020-03-05
    # .. toggle_expiration_date: None
    # .. toggle_tickets: 'https://github.com/edx/edx-platform/pull/23317'
    # .. toggle_status: supported
    # .. toggle_warnings: Also set settings.LEARNING_MICROFRONTEND_URL and see REDIRECT_TO_COURSEWARE_MICROFRONTEND for rollout.
    'ENABLE_COURSEWARE_MICROFRONTEND': False,
    # .. toggle_name: ENABLE_LOGISTRATION_MICROFRONTEND
    # .. toggle_implementation: DjangoSetting
    # .. toggle_default: False
    # .. toggle_description: Supports staged rollout of a new micro-frontend-based implementation of the logistration.
    # .. toggle_category: micro-frontend
    # .. toggle_use_cases: incremental_release, open_edx
    # .. toggle_creation_date: 2020-09-08
    # .. toggle_expiration_date: None
    # .. toggle_tickets: 'https://github.com/edx/edx-platform/pull/24908'
    # .. toggle_status: supported
    # .. toggle_warnings: Also set settings.ACCOUNT_MICROFRONTEND_URL and set REDIRECT_TO_ACCOUNT_MICROFRONTEND for rollout.
    'ENABLE_LOGISTRATION_MICROFRONTEND': False,

    ### ORA Feature Flags ###

    # .. toggle_name: ENABLE_ORA_TEAM_SUBMISSIONS
    # .. toggle_implementation: DjangoSetting
    # .. toggle_default: False
    # .. toggle_description: Set to True to enable team-based ORA submissions.
    # .. toggle_category: ora
    # .. toggle_use_cases: incremental_release
    # .. toggle_creation_date: 2020-03-03
    # .. toggle_expiration_date: None
    # .. toggle_tickets: https://openedx.atlassian.net/browse/EDUCATOR-4951
    # .. toggle_status: supported
    # .. toggle_warnings: None
    'ENABLE_ORA_TEAM_SUBMISSIONS': False,

    # .. toggle_name: ENABLE_ORA_ALL_FILE_URLS
    # .. toggle_implementation: DjangoSetting
    # .. toggle_default: False
    # .. toggle_description: A "work-around" feature toggle meant to help in cases where some file uploads are not
    #      discoverable.  If enabled, will iterate through all possible file key suffixes up to the max for displaying
    #      file metadata in staff assessments.
    # .. toggle_category: ora
    # .. toggle_use_cases: graceful_degradation
    # .. toggle_creation_date: 2020-03-03
    # .. toggle_expiration_date: None
    # .. toggle_tickets: https://openedx.atlassian.net/browse/EDUCATOR-4951
    # .. toggle_status: supported
    # .. toggle_warnings: None
    'ENABLE_ORA_ALL_FILE_URLS': False,

    # .. toggle_name: ENABLE_ORA_USER_STATE_UPLOAD_DATA
    # .. toggle_implementation: DjangoSetting
    # .. toggle_default: False
    # .. toggle_description: A "work-around" feature toggle meant to help in cases where some file uploads are not
    #      discoverable.  If enabled, will pull file metadata from StudentModule.state for display in staff assessments.
    # .. toggle_category: ora
    # .. toggle_use_cases: graceful_degradation
    # .. toggle_creation_date: 2020-03-03
    # .. toggle_expiration_date: None
    # .. toggle_tickets: https://openedx.atlassian.net/browse/EDUCATOR-4951
    # .. toggle_status: supported
    # .. toggle_warnings: None
    'ENABLE_ORA_USER_STATE_UPLOAD_DATA': False,

    # .. toggle_name: ENABLE_ORA_USERNAMES_ON_DATA_EXPORT
    # .. toggle_implementation: DjangoSetting
    # .. toggle_default: False
    # .. toggle_description: Set to True to add deanonymized usernames to ORA data report.
    # .. toggle_category: ora
    # .. toggle_use_cases: incremental_release
    # .. toggle_creation_date: 2020-06-11
    # .. toggle_expiration_date: None
    # .. toggle_tickets: https://openedx.atlassian.net/browse/TNL-7273
    # .. toggle_status: supported
    # .. toggle_warnings: None
    'ENABLE_ORA_USERNAMES_ON_DATA_EXPORT': 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")  ]
COURSE_BLOCKS_API_EXTRA_FIELDS = []

# Settings for the course reviews tool template and identification key, set either to None to disable course reviews
COURSE_REVIEWS_TOOL_PROVIDER_FRAGMENT_NAME = 'coursetalk-reviews-fragment.html'
COURSE_REVIEWS_TOOL_PROVIDER_PLATFORM_KEY = 'edx'

# CDN links to CourseTalk scripts to load read and write widgets
COURSE_TALK_READ_ONLY_SOURCE = '//d3q6qq2zt8nhwv.cloudfront.net/s/js/widgets/coursetalk-read-reviews.js'
COURSE_TALK_WRITE_ONLY_SOURCE = '//d3q6qq2zt8nhwv.cloudfront.net/s/js/widgets/coursetalk-write-reviews.js'

# Ignore static asset files on import which match this pattern
ASSET_IGNORE_REGEX = r"(^\._.*$)|(^\.DS_Store$)|(^.*~$)"

# Used for A/B testing
DEFAULT_GROUPS = []

# If this is true, random scores will be generated for the purpose of debugging the profile graphs
GENERATE_PROFILE_SCORES = False

XQUEUE_WAITTIME_BETWEEN_REQUESTS = 5  # seconds
nadeemshahzad's avatar
nadeemshahzad committed
XQUEUE_INTERFACE = {
    'url': 'http://localhost:18040',
    'basic_auth': ['edx', 'edx'],
    'django_auth': {
        'username': 'lms',
        'password': 'password'
    }
}
# Used with Email sending
RETRY_ACTIVATION_EMAIL_MAX_ATTEMPTS = 5
RETRY_ACTIVATION_EMAIL_TIMEOUT = 0.5

# Software Secure request retry settings
# Time in seconds before a retry of the task should be 60 mints.
SOFTWARE_SECURE_REQUEST_RETRY_DELAY = 60 * 60
# Maximum of 6 retries before giving up.
SOFTWARE_SECURE_RETRY_MAX_ATTEMPTS = 6

RETRY_CALENDAR_SYNC_EMAIL_MAX_ATTEMPTS = 5
# Deadline message configurations
COURSE_MESSAGE_ALERT_DURATION_IN_DAYS = 14

############################# SET PATH INFORMATION #############################
PROJECT_ROOT = path(__file__).abspath().dirname().dirname()  # /edx-platform/lms
REPO_ROOT = PROJECT_ROOT.dirname()
COMMON_ROOT = REPO_ROOT / "common"
OPENEDX_ROOT = REPO_ROOT / "openedx"
ENV_ROOT = REPO_ROOT.dirname()  # virtualenv dir /edx-platform is in
COURSES_ROOT = ENV_ROOT / "data"
NODE_MODULES_ROOT = REPO_ROOT / "node_modules"

DATA_DIR = COURSES_ROOT

# TODO: Remove the rest of the sys.path modification here and in cms/envs/common.py
sys.path.append(PROJECT_ROOT / 'djangoapps')
sys.path.append(COMMON_ROOT / 'djangoapps')
system_node_path = os.environ.get("NODE_PATH", NODE_MODULES_ROOT)
node_paths = [
    COMMON_ROOT / "static/js/vendor",
    system_node_path,
]
# For geolocation ip database
adeelehsan's avatar
adeelehsan committed
GEOIP_PATH = REPO_ROOT / "common/static/data/geoip/GeoLite2-Country.mmdb"
# Where to look for a status message
STATUS_MESSAGE_PATH = ENV_ROOT / "status_message.json"
############################ Global Database Configuration #####################

DATABASE_ROUTERS = [
    'openedx.core.lib.django_courseware_routers.StudentModuleHistoryExtendedRouter',
    'edx_django_utils.db.read_replica.ReadReplicaRouter',
nadeemshahzad's avatar
nadeemshahzad committed
############################ Cache Configuration ###############################

CACHES = {
    'blockstore': {
        'KEY_PREFIX': 'blockstore',
        'KEY_FUNCTION': 'util.memcache.safe_key',
        'LOCATION': ['localhost:11211'],
        'TIMEOUT': '86400',  # This data should be long-lived for performance, BundleCache handles invalidation
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
    },
nadeemshahzad's avatar
nadeemshahzad committed
    'course_structure_cache': {
        'KEY_PREFIX': 'course_structure',
        'KEY_FUNCTION': 'util.memcache.safe_key',
        'LOCATION': ['localhost:11211'],
        'TIMEOUT': '7200',
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
    },
    'celery': {
        'KEY_PREFIX': 'celery',
        'KEY_FUNCTION': 'util.memcache.safe_key',
        'LOCATION': ['localhost:11211'],
        'TIMEOUT': '7200',
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
    },
    'mongo_metadata_inheritance': {
        'KEY_PREFIX': 'mongo_metadata_inheritance',
        'KEY_FUNCTION': 'util.memcache.safe_key',
        'LOCATION': ['localhost:11211'],
        'TIMEOUT': 300,
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
    },
    'staticfiles': {
        'KEY_FUNCTION': 'util.memcache.safe_key',
        'LOCATION': ['localhost:11211'],
        'KEY_PREFIX': 'staticfiles_general',
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
    },
    'default': {
        'VERSION': '1',
        'KEY_FUNCTION': 'util.memcache.safe_key',
        'LOCATION': ['localhost:11211'],
        'KEY_PREFIX': 'default',
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
    },
    'configuration': {
        'KEY_FUNCTION': 'util.memcache.safe_key',
        'LOCATION': ['localhost:11211'],
        'KEY_PREFIX': 'configuration',
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
    },
    'general': {
        'KEY_FUNCTION': 'util.memcache.safe_key',
        'LOCATION': ['localhost:11211'],
        'KEY_PREFIX': 'general',
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
    },
}

############################ OAUTH2 Provider ###################################
OAUTH_EXPIRE_CONFIDENTIAL_CLIENT_DAYS = 365
OAUTH_EXPIRE_PUBLIC_CLIENT_DAYS = 30
################################## DJANGO OAUTH TOOLKIT #######################################

# Scope description strings are presented to the user
# on the application authorization page. See
# lms/templates/oauth2_provider/authorize.html for details.
# Non-default scopes should be added directly to OAUTH2_PROVIDER['SCOPES'] below.
OAUTH2_DEFAULT_SCOPES = {
    'read': _('Read access'),
    'write': _('Write access'),
    'email': _('Know your email address'),
    'profile': _('Know your name and username'),
}

    'OAUTH2_VALIDATOR_CLASS': 'openedx.core.djangoapps.oauth_dispatch.dot_overrides.validators.EdxOAuth2Validator',
    # 3 months and then we expire refresh tokens using edx_clear_expired_tokens (length is mobile app driven)
    'REFRESH_TOKEN_EXPIRE_SECONDS': 7776000,
    'SCOPES_BACKEND_CLASS': 'openedx.core.djangoapps.oauth_dispatch.scopes.ApplicationModelScopes',
    'SCOPES': dict(OAUTH2_DEFAULT_SCOPES, **{
        'certificates:read': _('Retrieve your course certificates'),
        'grades:read': _('Retrieve your grades for your enrolled courses'),
        'tpa:read': _('Retrieve your third-party authentication username mapping'),
        'user_id': _('Know your user identifier'),
    }),
    'DEFAULT_SCOPES': OAUTH2_DEFAULT_SCOPES,
    'REQUEST_APPROVAL_PROMPT': 'auto_even_if_expired',
    'ERROR_RESPONSE_WITH_SCOPES': True,
# This is required for the migrations in oauth_dispatch.models
# otherwise it fails saying this attribute is not present in Settings
OAUTH2_PROVIDER_APPLICATION_MODEL = 'oauth2_provider.Application'
# Automatically clean up edx-django-oauth2-provider tokens on use
OAUTH_DELETE_EXPIRED = True
OAUTH_ID_TOKEN_EXPIRATION = 60 * 60
nadeemshahzad's avatar
nadeemshahzad committed
OAUTH_ENFORCE_SECURE = True
OAUTH_EXPIRE_CONFIDENTIAL_CLIENT_DAYS = 365
OAUTH_EXPIRE_PUBLIC_CLIENT_DAYS = 30
################################## THIRD_PARTY_AUTH CONFIGURATION #############################
TPA_PROVIDER_BURST_THROTTLE = '10/min'
TPA_PROVIDER_SUSTAINED_THROTTLE = '50/hr'

################################## TEMPLATE CONFIGURATION #####################################
# Mako templating
nadeemshahzad's avatar
nadeemshahzad committed
import tempfile  # pylint: disable=wrong-import-order
MAKO_MODULE_DIR = os.path.join(tempfile.gettempdir(), 'mako_lms')
MAKO_TEMPLATE_DIRS_BASE = [
    PROJECT_ROOT / 'templates',
    COMMON_ROOT / 'templates',
    COMMON_ROOT / 'lib' / 'capa' / 'capa' / 'templates',
    COMMON_ROOT / 'djangoapps' / 'pipeline_mako' / 'templates',
    OPENEDX_ROOT / 'core' / 'djangoapps' / 'cors_csrf' / 'templates',
    OPENEDX_ROOT / 'core' / 'djangoapps' / 'dark_lang' / 'templates',
    OPENEDX_ROOT / 'core' / 'lib' / 'license' / 'templates',
    OPENEDX_ROOT / 'features' / 'course_experience' / 'templates',
Piotr Mitros's avatar
Piotr Mitros committed

def _make_mako_template_dirs(settings):
    Derives the final Mako template directories list from other settings.
    """
    if settings.ENABLE_COMPREHENSIVE_THEMING:
        themes_dirs = get_theme_base_dirs_from_settings(settings.COMPREHENSIVE_THEME_DIRS)
        for theme in get_themes_unchecked(themes_dirs, settings.PROJECT_ROOT):
            if theme.themes_base_dir not in settings.MAKO_TEMPLATE_DIRS_BASE:
                settings.MAKO_TEMPLATE_DIRS_BASE.insert(0, theme.themes_base_dir)
    return settings.MAKO_TEMPLATE_DIRS_BASE


CONTEXT_PROCESSORS = [
    'django.template.context_processors.request',
    'django.template.context_processors.static',
    'django.template.context_processors.i18n',
    'django.contrib.auth.context_processors.auth',  # this is required for admin
    'django.template.context_processors.csrf',

    # Added for django-wiki
    'django.template.context_processors.media',
    'django.template.context_processors.tz',
    'django.contrib.messages.context_processors.messages',
    'sekizai.context_processors.sekizai',

    # Hack to get required link URLs to password reset templates
    'edxmako.shortcuts.marketing_link_context_processor',

    # Shoppingcart processor (detects if request.user has a cart)
    'shoppingcart.context_processor.user_has_cart_context_processor',

    # Timezone processor (sends language and time_zone preference)
    'lms.djangoapps.courseware.context_processor.user_timezone_locale_prefs',

    # Online contextual help
    'help_tokens.context_processor',
    'openedx.core.djangoapps.site_configuration.context_processors.configuration_context',

    # Mobile App processor (Detects if request is from the mobile app)
    'mobile_api.context_processor.is_from_mobile_app'
# Django templating
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        # Don't look for template source files inside installed applications.
        'APP_DIRS': False,
        # Instead, look for template source files in these dirs.
        'DIRS': [
            PROJECT_ROOT / "templates",
            COMMON_ROOT / 'templates',
            COMMON_ROOT / 'lib' / 'capa' / 'capa' / 'templates',
            COMMON_ROOT / 'djangoapps' / 'pipeline_mako' / 'templates',
            COMMON_ROOT / 'static',  # required to statically include common Underscore templates
        ],
        # Options specific to this backend.
        'OPTIONS': {
            'loaders': [
                # We have to use mako-aware template loaders to be able to include
                # mako templates inside django templates (such as main_django.html).
                'openedx.core.djangoapps.theming.template_loaders.ThemeTemplateLoader',
                'edxmako.makoloader.MakoFilesystemLoader',
                'edxmako.makoloader.MakoAppDirectoriesLoader',
            ],
            'context_processors': CONTEXT_PROCESSORS,
            # Change 'debug' in your environment settings files - not here.
            'debug': False
        }