Files
edx-platform/pyproject.toml
Braden MacDonald 3fa779479e
Some checks failed
Pylint Checks / pylint xmodule (push) Has been cancelled
Quality checks / Quality Others (20, ubuntu-24.04, 3.11) (push) Has been cancelled
Semgrep code quality / Semgrep analysis (ubuntu-latest, 3.11) (push) Has been cancelled
ShellCheck / shellcheck (ubuntu) (push) Has been cancelled
static assets check for lms and cms / static-assets-check (7.0, 20, 10.7.x, ubuntu-24.04, 3.11) (push) Has been cancelled
unit-tests / xmodule-with-cms(py=3.11,dj=pinned,mongo=7.0) (push) Has been cancelled
unit-tests / xmodule-with-lms(py=3.11,dj=pinned,mongo=7.0) (push) Has been cancelled
unit-tests / cms-1(py=3.11,dj=pinned,mongo=7.0) (push) Has been cancelled
unit-tests / cms-2(py=3.11,dj=pinned,mongo=7.0) (push) Has been cancelled
unit-tests / common-with-cms(py=3.11,dj=pinned,mongo=7.0) (push) Has been cancelled
unit-tests / common-with-lms(py=3.11,dj=pinned,mongo=7.0) (push) Has been cancelled
unit-tests / lms-1(py=3.11,dj=pinned,mongo=7.0) (push) Has been cancelled
unit-tests / lms-2(py=3.11,dj=pinned,mongo=7.0) (push) Has been cancelled
unit-tests / lms-3(py=3.11,dj=pinned,mongo=7.0) (push) Has been cancelled
unit-tests / lms-4(py=3.11,dj=pinned,mongo=7.0) (push) Has been cancelled
unit-tests / lms-5(py=3.11,dj=pinned,mongo=7.0) (push) Has been cancelled
unit-tests / lms-6(py=3.11,dj=pinned,mongo=7.0) (push) Has been cancelled
unit-tests / openedx-1-with-cms(py=3.11,dj=pinned,mongo=7.0) (push) Has been cancelled
unit-tests / openedx-1-with-lms(py=3.11,dj=pinned,mongo=7.0) (push) Has been cancelled
unit-tests / openedx-2-with-cms(py=3.11,dj=pinned,mongo=7.0) (push) Has been cancelled
unit-tests / openedx-2-with-lms(py=3.11,dj=pinned,mongo=7.0) (push) Has been cancelled
ShellCheck / shellcheck (macos) (push) Has been cancelled
Javascript tests / JS (20, ubuntu-latest, 3.11) (push) Has been cancelled
Pylint Checks / pylint cms (push) Has been cancelled
Lint Python Imports / Lint Python Imports (push) Has been cancelled
Lockfile Version check / version-check (push) Has been cancelled
Check Django Migrations / check migrations (pinned, 7, 8, ubuntu-24.04, 3.11) (push) Has been cancelled
Pylint Checks / pylint common (push) Has been cancelled
units-test-scripts-common / test (3.12) (push) Has been cancelled
units-test-scripts-user-retirement / test (3.12) (push) Has been cancelled
Verify Dunder __init__.py Files / Verify __init__.py Files (push) Has been cancelled
Pylint Checks / pylint lms-1 (push) Has been cancelled
Pylint Checks / pylint lms-2 (push) Has been cancelled
Pylint Checks / pylint openedx-1 (push) Has been cancelled
Pylint Checks / pylint openedx-2 (push) Has been cancelled
unit-tests / cms-1(py=3.12,dj=pinned,mongo=7.0) (push) Has been cancelled
unit-tests / cms-2(py=3.12,dj=pinned,mongo=7.0) (push) Has been cancelled
unit-tests / common-with-cms(py=3.12,dj=pinned,mongo=7.0) (push) Has been cancelled
unit-tests / common-with-lms(py=3.12,dj=pinned,mongo=7.0) (push) Has been cancelled
unit-tests / lms-1(py=3.12,dj=pinned,mongo=7.0) (push) Has been cancelled
unit-tests / lms-2(py=3.12,dj=pinned,mongo=7.0) (push) Has been cancelled
unit-tests / lms-3(py=3.12,dj=pinned,mongo=7.0) (push) Has been cancelled
unit-tests / lms-4(py=3.12,dj=pinned,mongo=7.0) (push) Has been cancelled
unit-tests / lms-5(py=3.12,dj=pinned,mongo=7.0) (push) Has been cancelled
unit-tests / lms-6(py=3.12,dj=pinned,mongo=7.0) (push) Has been cancelled
unit-tests / openedx-1-with-cms(py=3.12,dj=pinned,mongo=7.0) (push) Has been cancelled
unit-tests / openedx-1-with-lms(py=3.12,dj=pinned,mongo=7.0) (push) Has been cancelled
unit-tests / openedx-2-with-cms(py=3.12,dj=pinned,mongo=7.0) (push) Has been cancelled
unit-tests / openedx-2-with-lms(py=3.12,dj=pinned,mongo=7.0) (push) Has been cancelled
unit-tests / xmodule-with-cms(py=3.12,dj=pinned,mongo=7.0) (push) Has been cancelled
unit-tests / xmodule-with-lms(py=3.12,dj=pinned,mongo=7.0) (push) Has been cancelled
unit-tests / collect-and-verify (push) Has been cancelled
Pylint Checks / Pylint checks successful (push) Has been cancelled
Check Django Migrations / Migrations checks successful (push) Has been cancelled
unit-tests / Unit tests successful (push) Has been cancelled
unit-tests / compile-warnings-report (push) Has been cancelled
unit-tests / merge-artifacts (push) Has been cancelled
unit-tests / coverage (3.11) (push) Has been cancelled
feat: update openedx-core: new catalog models + backfill migration (#38023)
* feat: use new version of openedx-core
* feat: Use openedx_catalog app, backfill it with all known courses
* feat: properly set "created" timestamp on course runs during backfill
* fix: better normalization of language codes
* feat: keep courses in sync with CourseRun/CatalogCourse
* feat: delete CourseRun/CatalogCourse when deleting a course
* refactor: course_id -> course_key, run -> run_code, display_name -> title
* fix: don't use SplitModulestoreCourseIndex for getting list of all courses
2026-03-09 17:24:02 -07:00

422 lines
24 KiB
TOML

[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"
[project]
name = "openedx-platform"
version = "0.13"
requires-python = ">=3.11"
dependencies = ["setuptools"]
[tool.setuptools]
packages = ["cms", "common", "lms", "openedx", "xmodule"]
[tool.setuptools.package-data]
xmodule = ["js/module/*"]
[project.entry-points."xblock.v1"]
about = "xmodule.html_block:AboutBlock"
book = "xmodule.template_block:TranslateCustomTagBlock"
annotatable = "xmodule.annotatable_block:AnnotatableBlock"
chapter = "xmodule.seq_block:SectionBlock"
conditional = "xmodule.conditional_block:ConditionalBlock"
course = "xmodule.course_block:CourseBlock"
course_info = "xmodule.html_block:CourseInfoBlock"
customtag = "xmodule.template_block:CustomTagBlock"
custom_tag_template = "xmodule.template_block:CustomTagTemplateBlock"
discuss = "xmodule.template_block:TranslateCustomTagBlock"
discussion = "xmodule.discussion_block:DiscussionXBlock"
error = "xmodule.error_block:ErrorBlock"
hidden = "xmodule.hidden_block:HiddenBlock"
html = "xmodule.html_block:HtmlBlock"
itembank = "xmodule.item_bank_block:ItemBankBlock"
image = "xmodule.template_block:TranslateCustomTagBlock"
library = "xmodule.library_root_xblock:LibraryRoot"
library_content = "xmodule.library_content_block:LegacyLibraryContentBlock"
lti = "xmodule.lti_block:LTIBlock"
poll_question = "xmodule.poll_block:PollBlock"
problem = "xmodule.capa_block:ProblemBlock"
randomize = "xmodule.randomize_block:RandomizeBlock"
sequential = "xmodule.seq_block:SequenceBlock"
slides = "xmodule.template_block:TranslateCustomTagBlock"
split_test = "xmodule.split_test_block:SplitTestBlock"
static_tab = "xmodule.html_block:StaticTabBlock"
unit = "xmodule.unit_block:UnitBlock"
vertical = "xmodule.vertical_block:VerticalBlock"
video = "xmodule.video_block:VideoBlock"
videoalpha = "xmodule.video_block:VideoBlock"
videodev = "xmodule.template_block:TranslateCustomTagBlock"
word_cloud = "xmodule.word_cloud_block:WordCloudBlock"
wrapper = "xmodule.wrapper_block:WrapperBlock"
[project.entry-points."xblock_asides.v1"]
tagging_aside = "cms.lib.xblock.tagging:StructuredTagsAside"
[project.entry-points."openedx.course_tab"]
ccx = "lms.djangoapps.ccx.plugins:CcxCourseTab"
courseware = "lms.djangoapps.courseware.tabs:CoursewareTab"
dates = "lms.djangoapps.courseware.tabs:DatesTab"
discussion = "lms.djangoapps.discussion.plugins:DiscussionTab"
edxnotes = "lms.djangoapps.edxnotes.plugins:EdxNotesTab"
external_discussion = "lms.djangoapps.courseware.tabs:ExternalDiscussionCourseTab"
external_link = "lms.djangoapps.courseware.tabs:ExternalLinkCourseTab"
html_textbooks = "lms.djangoapps.courseware.tabs:HtmlTextbookTabs"
instructor = "lms.djangoapps.instructor.views.instructor_dashboard:InstructorDashboardTab"
lti_discussion = "openedx.features.lti_course_tab.tab:DiscussionLtiCourseTab"
lti_live = "openedx.core.djangoapps.course_live.tab:CourseLiveTab"
lti_tab = "openedx.features.lti_course_tab.tab:LtiCourseTab"
pdf_textbooks = "lms.djangoapps.courseware.tabs:PDFTextbookTabs"
progress = "lms.djangoapps.courseware.tabs:ProgressTab"
static_tab = "xmodule.tabs:StaticTab"
syllabus = "lms.djangoapps.courseware.tabs:SyllabusTab"
teams = "lms.djangoapps.teams.plugins:TeamsTab"
textbooks = "lms.djangoapps.courseware.tabs:TextbookTabs"
wiki = "lms.djangoapps.course_wiki.tab:WikiTab"
[project.entry-points."openedx.course_app"]
calculator = "lms.djangoapps.courseware.plugins:CalculatorCourseApp"
custom_pages = "lms.djangoapps.courseware.plugins:CustomPagesCourseApp"
dates = "lms.djangoapps.courseware.plugins:DatesCourseApp"
discussion = "openedx.core.djangoapps.discussions.plugins:DiscussionCourseApp"
edxnotes = "lms.djangoapps.edxnotes.plugins:EdxNotesCourseApp"
live = "openedx.core.djangoapps.course_live.plugins:LiveCourseApp"
ora_settings = "lms.djangoapps.courseware.plugins:ORASettingsApp"
proctoring = "lms.djangoapps.courseware.plugins:ProctoringCourseApp"
progress = "lms.djangoapps.courseware.plugins:ProgressCourseApp"
teams = "lms.djangoapps.teams.plugins:TeamsCourseApp"
textbooks = "lms.djangoapps.courseware.plugins:TextbooksCourseApp"
wiki = "lms.djangoapps.course_wiki.plugins.course_app:WikiCourseApp"
[project.entry-points."openedx.course_tool"]
calendar_sync_toggle = "openedx.features.calendar_sync.plugins:CalendarSyncToggleTool"
course_bookmarks = "openedx.features.course_bookmarks.plugins:CourseBookmarksTool"
course_updates = "openedx.features.course_experience.plugins:CourseUpdatesTool"
financial_assistance = "lms.djangoapps.courseware.course_tools:FinancialAssistanceTool"
[project.entry-points."lms.djangoapp"]
ace_common = "openedx.core.djangoapps.ace_common.apps:AceCommonConfig"
content_libraries = "openedx.core.djangoapps.content_libraries.apps:ContentLibrariesConfig"
course_apps = "openedx.core.djangoapps.course_apps.apps:CourseAppsConfig"
course_live = "openedx.core.djangoapps.course_live.apps:CourseLiveConfig"
courseware_api = "openedx.core.djangoapps.courseware_api.apps:CoursewareAPIConfig"
credentials = "openedx.core.djangoapps.credentials.apps:CredentialsConfig"
discussion = "lms.djangoapps.discussion.apps:DiscussionConfig"
discussions = "openedx.core.djangoapps.discussions.apps:DiscussionsConfig"
grades = "lms.djangoapps.grades.apps:GradesConfig"
plugins = "openedx.core.djangoapps.plugins.apps:PluginsConfig"
theming = "openedx.core.djangoapps.theming.apps:ThemingConfig"
bookmarks = "openedx.core.djangoapps.bookmarks.apps:BookmarksConfig"
zendesk_proxy = "openedx.core.djangoapps.zendesk_proxy.apps:ZendeskProxyConfig"
instructor = "lms.djangoapps.instructor.apps:InstructorConfig"
password_policy = "openedx.core.djangoapps.password_policy.apps:PasswordPolicyConfig"
user_authn = "openedx.core.djangoapps.user_authn.apps:UserAuthnConfig"
program_enrollments = "lms.djangoapps.program_enrollments.apps:ProgramEnrollmentsConfig"
[project.entry-points."cms.djangoapp"]
ace_common = "openedx.core.djangoapps.ace_common.apps:AceCommonConfig"
bookmarks = "openedx.core.djangoapps.bookmarks.apps:BookmarksConfig"
course_live = "openedx.core.djangoapps.course_live.apps:CourseLiveConfig"
content_libraries = "openedx.core.djangoapps.content_libraries.apps:ContentLibrariesConfig"
content_staging = "openedx.core.djangoapps.content_staging.apps:ContentStagingAppConfig"
course_apps = "openedx.core.djangoapps.course_apps.apps:CourseAppsConfig"
# Importing an LMS app into the Studio process is not a good practice.
# We're ignoring this for Discussions here because its placement in LMS
# is a historical artifact. The eventual goal is to consolidate the multiple
# discussions-related Django apps and either put them in the openedx/ dir,
# or in another repo entirely.
discussion = "lms.djangoapps.discussion.apps:DiscussionConfig"
discussions = "openedx.core.djangoapps.discussions.apps:DiscussionsConfig"
instructor = "lms.djangoapps.instructor.apps:InstructorConfig"
olx_rest_api = "openedx.core.djangoapps.olx_rest_api.apps:OlxRestApiAppConfig"
password_policy = "openedx.core.djangoapps.password_policy.apps:PasswordPolicyConfig"
plugins = "openedx.core.djangoapps.plugins.apps:PluginsConfig"
theming = "openedx.core.djangoapps.theming.apps:ThemingConfig"
user_authn = "openedx.core.djangoapps.user_authn.apps:UserAuthnConfig"
zendesk_proxy = "openedx.core.djangoapps.zendesk_proxy.apps:ZendeskProxyConfig"
[project.entry-points."openedx.block_structure_transformer"]
library_content = "lms.djangoapps.course_blocks.transformers.library_content:ContentLibraryTransformer"
library_content_randomize = "lms.djangoapps.course_blocks.transformers.library_content:ContentLibraryOrderTransformer"
split_test = "lms.djangoapps.course_blocks.transformers.split_test:SplitTestTransformer"
start_date = "lms.djangoapps.course_blocks.transformers.start_date:StartDateTransformer"
user_partitions = "lms.djangoapps.course_blocks.transformers.user_partitions:UserPartitionTransformer"
visibility = "lms.djangoapps.course_blocks.transformers.visibility:VisibilityTransformer"
hidden_content = "lms.djangoapps.course_blocks.transformers.hidden_content:HiddenContentTransformer"
course_blocks_api = "lms.djangoapps.course_api.blocks.transformers.blocks_api:BlocksAPITransformer"
milestones = "lms.djangoapps.course_api.blocks.transformers.milestones:MilestonesAndSpecialExamsTransformer"
grades = "lms.djangoapps.grades.transformer:GradesTransformer"
completion = "lms.djangoapps.course_api.blocks.transformers.block_completion:BlockCompletionTransformer"
load_override_data = "lms.djangoapps.course_blocks.transformers.load_override_data:OverrideDataTransformer"
content_type_gate = "openedx.features.content_type_gating.block_transformers:ContentTypeGateTransformer"
access_denied_message_filter = "lms.djangoapps.course_blocks.transformers.access_denied_filter:AccessDeniedMessageFilterTransformer"
open_assessment_transformer = "lms.djangoapps.courseware.transformers:OpenAssessmentDateTransformer"
effort_estimation = "openedx.features.effort_estimation.api:EffortEstimationTransformer"
discussions_link = "openedx.core.djangoapps.discussions.transformers:DiscussionsTopicLinkTransformer"
[project.entry-points."openedx.user_partition_scheme"]
cohort = "openedx.core.djangoapps.course_groups.partition_scheme:CohortPartitionScheme"
content_type_gate = "openedx.features.content_type_gating.partitions:ContentTypeGatingPartitionScheme"
enrollment_track = "openedx.core.djangoapps.verified_track_content.partition_scheme:EnrollmentTrackPartitionScheme"
random = "openedx.core.djangoapps.user_api.partition_schemes:RandomUserPartitionScheme"
team = "lms.djangoapps.teams.team_partition_scheme:TeamPartitionScheme"
verification = "openedx.core.djangoapps.user_api.partition_schemes:ReturnGroup1PartitionScheme"
[project.entry-points."openedx.ace.policy"]
bulk_email_optout = "lms.djangoapps.bulk_email.policies:CourseEmailOptout"
course_push_notification_optout = "openedx.core.djangoapps.notifications.policies:CoursePushNotificationOptout"
disabled_user_optout = "openedx.core.djangoapps.ace_common.policies:DisableUserOptout"
[project.entry-points."openedx.call_to_action"]
personalized_learner_schedules = "openedx.features.personalized_learner_schedules.call_to_action:PersonalizedLearnerScheduleCallToAction"
[project.entry-points."openedx.learning_context"]
lib = "openedx.core.djangoapps.content_libraries.library_context:LibraryContextImpl"
[project.entry-points."openedx.dynamic_partition_generator"]
content_type_gating = "openedx.features.content_type_gating.partitions:create_content_gating_partition"
enrollment_track = "xmodule.partitions.enrollment_track_partition_generator:create_enrollment_track_partition"
team = "openedx.core.lib.teams_config:create_team_set_partition"
[project.entry-points.console_scripts]
xmodule_assets = "xmodule.static_content:main"
[tool.pytest.ini_options]
# Note: The first file of settings found is used, there is no combining, so
# this file is only used for tests that don't find a pytest.ini file first.
# Details at https://docs.pytest.org/en/latest/reference/customize.html
DJANGO_SETTINGS_MODULE = "lms.envs.test"
addopts = "--nomigrations --reuse-db --durations=20 --json-report --json-report-omit keywords streams collectors log traceback tests --json-report-file=none"
# Enable default handling for all warnings, including those that are ignored by default;
# but hide rate-limit warnings (because we deliberately don't throttle test user logins)
# and field_data deprecation warnings (because fixing them requires a major low-priority refactoring)
filterwarnings = [
"default",
"ignore:No request passed to the backend, unable to rate-limit:UserWarning",
"ignore::xblock.exceptions.FieldDataDeprecationWarning",
# Remove default_app_config warning after updating Django to 4.2
"ignore:.*You can remove default_app_config.*:PendingDeprecationWarning",
"ignore:Instead access HTTPResponse.headers directly.*:DeprecationWarning:elasticsearch",
# ABC deprecation Warning comes from libsass
"ignore:Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated.*:DeprecationWarning:sass",
"ignore:'etree' is deprecated. Use 'xml.etree.ElementTree' instead.:DeprecationWarning:wiki",
]
junit_family = "xunit2"
norecursedirs = ". .* *.egg build conf dist node_modules test_root cms/envs lms/envs openedx/envs"
python_classes = []
python_files = ["tests.py", "test_*.py", "tests_*.py", "*_tests.py", "__init__.py"]
[tool.ruff]
line-length = 120
exclude = [
"migrations",
"test_root/staticfiles",
]
[tool.ruff.lint]
select = ["E", "W"]
ignore = [
"E402", # module level import not at top of file
"E501", # line too long (pylint enforces this at 120 chars while ignoring trailing comments)
"E722", # do not use bare 'except'
"E731", # do not assign a lambda expression
"E741", # ambiguous variable name. TODO: fix the ~9 issues and re-enable this.
# The rules below were added in pycodestyle 2.9.x but we were pinned to 2.8.x,
# so they represent new findings. Keeping them ignored here to make this an
# equivalent swap; they can be cleaned up in a follow-up.
"E721", # use `isinstance()` for type comparisons
]
[tool.isort]
indent = " "
line_length = 120
multi_line_output = 3
skip = ["envs", "migrations"]
[tool.importlinter]
root_packages = ["lms", "cms", "openedx", "openedx_content", "openedx_catalog"]
include_external_packages = true
# Our custom contract which checks that we're only importing from 'api.py'
# for participating packages.
contract_types = [
"isolated_apps: openedx.testing.importlinter.isolated_apps_contract.IsolatedAppsContract",
]
[[tool.importlinter.contracts]]
name = "lms and cms are independent"
type = "independence"
modules = ["lms", "cms"]
ignore_imports = [
# lms side imports that we are ignoring for now
"lms.djangoapps.course_home_api.outline.tests.test_view -> cms.djangoapps.contentstore.outlines",
"lms.djangoapps.course_home_api.tests.utils -> cms.djangoapps.contentstore.outlines",
# lms.djangoapps.instructor.tests.test_api & lms.djangoapps.instructor.tests.test_tools
# -> openedx.core.djangoapps.course_date_signals.handlers
# -> cms.djangoapps.contentstore.config.waffle
"openedx.core.djangoapps.course_date_signals.handlers -> cms.djangoapps.contentstore.config.waffle",
# cms side imports that we are ignoring for now
"cms.djangoapps.contentstore.views.tests.test_block -> lms.djangoapps.lms_xblock.mixin",
"cms.djangoapps.contentstore.signals.handlers -> lms.djangoapps.grades.api",
"cms.djangoapps.contentstore.course_group_config -> lms.lib.utils",
"cms.djangoapps.contentstore.views.preview -> lms.djangoapps.lms_xblock.field_data",
# cms.envs.common
# -> openedx.envs.common
# -> lms.djangoapps.lms_xblock.mixin
"openedx.envs.common -> lms.djangoapps.lms_xblock.mixin",
# cms.djangoapps.contentstore.views.tests.test_group_configurations
# -> openedx.features.content_type_gating.helpers
# -> lms.djangoapps.courseware.masquerade
"openedx.features.content_type_gating.helpers -> lms.djangoapps.courseware.masquerade",
# cms.djangoapps.contentstore.utils
# -> openedx.core.djangoapps.django_comment_common.models
# -> openedx.core.djangoapps.course_groups.cohorts
# -> lms.djangoapps.courseware.courses
"openedx.core.djangoapps.course_groups.cohorts -> lms.djangoapps.courseware.courses",
# cms.djangoapps.contentstore.[various]
# -> openedx.features.content_type_gating.partitions
# -> lms.djangoapps.commerce.utils
"openedx.features.content_type_gating.partitions -> lms.djangoapps.commerce.utils",
# cms.djangoapps.contentstore.course_group_config
# -> openedx.core.djangoapps.course_groups.partition_scheme
# -> lms.djangoapps.courseware.masquerade
"openedx.core.djangoapps.course_groups.partition_scheme -> lms.djangoapps.courseware.masquerade",
# cms.djangoapps.export_course_metadata.tasks
# -> openedx.core.djangoapps.schedules.content_highlights
# -> lms.djangoapps.courseware.block_render & lms.djangoapps.courseware.model_data
"openedx.core.djangoapps.content_libraries.* -> lms.djangoapps.*.*",
# cms.djangoapps.contentstore.tasks -> openedx.core.djangoapps.content_libraries.[various]
# -> lms.djangoapps.grades.api
"openedx.core.djangoapps.xblock.*.* -> lms.djangoapps.*.*",
# cms.djangoapps.contentstore.tasks -> openedx.core.djangoapps.content_libraries.[various] -> openedx.core.djangoapps.xblock.[various]
# -> lms.djangoapps.courseware & lms.djangoapps.courseware.grades
"openedx.core.djangoapps.schedules.content_highlights -> lms.djangoapps.courseware.*",
# cms.djangoapps.contentstore.[various]
# -> openedx.core.lib.gating.api
# -> lms.djangoapps.course_blocks.api & lms.djangoapps.courseware.access & lms.djangoapps.grades.api
"openedx.core.lib.gating.api -> lms.djangoapps.*.*",
# cms.djangoapps.contentstore.[various]
# -> openedx.features.content_type_gating.partitions
# -> openedx.features.discounts.utils
# -> lms.djangoapps.courseware.utils & lms.djangoapps.experiments.models
"openedx.features.discounts.utils -> lms.djangoapps.courseware.utils",
"openedx.features.discounts.utils -> lms.djangoapps.experiments.models",
# cms.djangoapps.contentstore.signals.handlers
# -> openedx.core.djangoapps.discussions.tasks
# -> openedx.core.djangoapps.discussions.utils
# -> lms.djangoapps.courseware.access
"openedx.core.djangoapps.discussions.utils -> lms.djangoapps.courseware.access",
# cms.djangoapps.contentstore.[various]
# -> openedx.features.content_type_gating.partitions
# -> openedx.features.discounts.utils
# -> openedx.features.discounts.applicability
# -> lms.djangoapps.courseware.toggles
# & lms.djangoapps.courseware.utils
# & lms.djangoapps.experiments.models
# & lms.djangoapps.experiments.stable_bucketing
"openedx.features.discounts.applicability -> lms.djangoapps.courseware.*",
"openedx.features.discounts.applicability -> lms.djangoapps.experiments.*",
# cms.djangoapps.contentstore.[various]
# -> openedx.core.djangoapps.content.learning_sequences.api
# -> openedx.core.djangoapps.content.learning_sequences.api.outlines
# -> openedx.core.djangoapps.content.learning_sequences.api.permissions
# -> lms.djangoapps.courseware.access
"openedx.core.djangoapps.content.learning_sequences.api.permissions -> lms.djangoapps.courseware.access",
# cms.djangoapps.contentstore.[various]
# -> openedx.features.content_type_gating.partitions
# -> openedx.features.discounts.utils
# -> openedx.features.discounts.applicability
# -> openedx.features.enterprise_support.utils
"openedx.features.enterprise_support.utils -> lms.djangoapps.branding.api",
"cms.djangoapps.contentstore.rest_api.v1.views.settings -> lms.djangoapps.certificates.api",
# We are ignoring this existing import until we can refactor contenstore/helpers.
# https://github.com/openedx/edx-platform/issues/37637
"openedx.core.djangoapps.content_libraries.api.libraries -> cms.djangoapps.contentstore.helpers",
"openedx.core.djangoapps.content_libraries.api.blocks -> cms.djangoapps.contentstore.helpers",
"openedx.core.djangoapps.content_staging.serializers -> cms.djangoapps.contentstore.helpers",
# These imports will become OK once we move content_libraries into CMS
# https://github.com/openedx/edx-platform/issues/33428
"openedx.core.djangoapps.content_libraries.permissions -> cms.djangoapps.course_creators.views",
"openedx.core.djangoapps.content_libraries.tasks -> cms.djangoapps.contentstore.storage",
# Outstanding arch issue: course_overviews is tangled up with LMS
# https://github.com/openedx/edx-platform/issues/37658
"openedx.core.djangoapps.content.course_overviews.models -> lms.djangoapps.**",
# Outstanding arch issue: content_highlights uses courseware block_render
# https://github.com/openedx/edx-platform/issues/37659
"openedx.core.djangoapps.schedules.content_highlights -> lms.djangoapps.courseware.block_render",
]
[[tool.importlinter.contracts]]
name = "Do not depend on non-public API of isolated apps."
type = "isolated_apps"
isolated_apps = [
"cms.djangoapps.modulestore_migrator",
"openedx.core.djangoapps.agreements",
"openedx.core.djangoapps.bookmarks",
"openedx.core.djangoapps.content_libraries",
"openedx.core.djangoapps.content_staging",
"openedx.core.djangoapps.olx_rest_api",
"openedx.core.djangoapps.xblock",
"openedx.core.lib.xblock_serializer",
"openedx_catalog",
]
allowed_modules = [
# Only imports from api.py and data.py are allowed elsewhere in the code
# See https://open-edx-proposals.readthedocs.io/en/latest/best-practices/oep-0049-django-app-patterns.html#api-py
"api",
"models_api",
"data",
"tests",
]
[[tool.importlinter.contracts]]
name = "Do not directly import internals of openedx_content (only import from openedx_content.api)."
type = "forbidden"
source_modules = ["cms", "lms", "openedx", "common", "xmodule"]
forbidden_modules = ["openedx_content.applets", "openedx_content.backcompat"]
allow_indirect_imports = true
[[tool.importlinter.contracts]]
name = "Low-level apps should not depend on high-level apps"
type = "layers"
layers = [
# Layers from high-level to low-level. Imports should only occur from higher to lower.
"cms.lib.xblock.upstream_sync | openedx.core.djangoapps.content.search | openedx.core.djangoapps.olx_rest_api",
"openedx.core.djangoapps.content_libraries",
"openedx.core.djangoapps.content_staging",
"openedx.core.djangoapps.xblock",
"openedx.core.lib.xblock_serializer",
"openedx.core.djangoapps.content_tagging",
]
ignore_imports = [
# Test code can break these layering rules
"**.tests.** -> **",
# FIXME: the exceptions below are from before we added this import linting rule. Should refactor to eliminate them.
# In particular, the contentstore.helpers module is too big and has too many imports
# See https://github.com/openedx/edx-platform/issues/37637
# The CSV export hard-codes support for courses and libraries. Refactor to do something like learning_context.get_children()
"openedx.core.djangoapps.content_tagging.helpers.objecttag_export_helpers -> openedx.core.djangoapps.content_libraries.api",
# The permissions checking code for tagging requires libraries model data to get all the orgs that a user is using:
"openedx.core.djangoapps.content_tagging.utils -> openedx.core.djangoapps.content_libraries.api",
# Content staging POST to clipboard API uses libraries APIs. We're working on moving this code to content_libraries
"openedx.core.djangoapps.content_staging.views -> openedx.core.djangoapps.content_libraries.api",
# content_staging.serializers imports contentstore.helpers which imports contentstore.utils which imports the libraries API.
"openedx.core.djangoapps.content_staging.serializers -> cms.djangoapps.contentstore.helpers",
# content_libraries.rest_api.libraries imports cms.djangoapps.contentstore.views.course which imports
# contentstore.toggles which imports djangoapps.content.search.api
"openedx.core.djangoapps.content_libraries.rest_api.libraries -> cms.djangoapps.contentstore.views.course",
# Content libraries imports contentstore.helpers which imports upstream_sync
"openedx.core.djangoapps.content_libraries.api.blocks -> cms.djangoapps.contentstore.helpers",
"openedx.core.djangoapps.content_libraries.api.libraries -> cms.djangoapps.contentstore.helpers",
# Outstanding arch issue: course_overviews is tangled up with LMS
# https://github.com/openedx/edx-platform/issues/37658
"openedx.core.djangoapps.content.course_overviews.models -> lms.djangoapps.**",
# Outstanding arch issue: content_highlights uses courseware block_render
# https://github.com/openedx/edx-platform/issues/37659
"openedx.core.djangoapps.schedules.content_highlights -> lms.djangoapps.courseware.block_render",
# This import happens only because grading signals are defined in LMS rather than openedx-events
# https://github.com/openedx/edx-platform/issues/37660
"openedx.core.djangoapps.xblock.runtime.runtime -> lms.djangoapps.grades.api",
# These imports will become OK once we worked on the following issue:
# https://github.com/openedx/edx-platform/issues/33428
"openedx.core.djangoapps.video_config.services -> openedx.core.djangoapps.content_libraries.api",
]