Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions frontends/api/src/generated/api.ts

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ const learningResource: Factory<LearningResource> = (
certification: faker.lorem.word(),
offered_by: faker.lorem.word(),
course: {
extra_course_numbers: maybe(() => repeat(faker.lorem.word)) ?? null,
course_numbers: maybe(() => repeat(faker.datatype.json)) ?? [],
},
}
} else if (type === ResourceTypeEnum.Program) {
Expand Down
7 changes: 7 additions & 0 deletions learning_resources/etl/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,3 +48,10 @@ class ETLSource(Enum):
ocw = "ocw"
prolearn = "prolearn"
podcast = "podcast"


class CourseNumberType(Enum):
"""Enum of course number types"""

primary = "primary"
cross_listed = "cross-listed"
22 changes: 11 additions & 11 deletions learning_resources/etl/loaders_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -123,12 +123,12 @@ def test_load_program(
platform = LearningResourcePlatformFactory.create()

program = (
ProgramFactory.create(courses=[], platform=platform)
ProgramFactory.create(courses=[], platform=platform.platform)
if program_exists
else ProgramFactory.build(courses=[], platform=platform)
else ProgramFactory.build(courses=[], platform=platform.platform)
)

LearningResourcePlatformFactory.create(platform=platform)
LearningResourcePlatformFactory.create(platform=platform.platform)

if program_exists:
learning_resource = program.learning_resource
Expand All @@ -138,16 +138,16 @@ def test_load_program(
learning_resource.save()

courses = (
CourseFactory.create_batch(2, platform=platform)
CourseFactory.create_batch(2, platform=platform.platform)
if courses_exist
else CourseFactory.build_batch(2, platform=platform)
else CourseFactory.build_batch(2, platform=platform.platform)
)

before_course_count = len(courses) if courses_exist else 0
after_course_count = len(courses)

if program_exists and has_retired_course:
course = CourseFactory.create(platform=platform)
course = CourseFactory.create(platform=platform.platform)
before_course_count += 1
after_course_count += 1
program.learning_resource.resources.set(
Expand Down Expand Up @@ -262,9 +262,9 @@ def test_load_course( # noqa: PLR0913
platform = LearningResourcePlatformFactory.create()

course = (
CourseFactory.create(runs=[], platform=platform)
CourseFactory.create(runs=[], platform=platform.platform)
if course_exists
else CourseFactory.build(runs=[], platform=platform)
else CourseFactory.build(runs=[], platform=platform.platform)
)

learning_resource = course.learning_resource
Expand All @@ -283,7 +283,7 @@ def test_load_course( # noqa: PLR0913

props = {
"readable_id": learning_resource.readable_id,
"platform": platform,
"platform": platform.platform,
"professional": True,
"title": learning_resource.title,
"image": {"url": learning_resource.image.url},
Expand Down Expand Up @@ -375,13 +375,13 @@ def test_load_duplicate_course(
platform = LearningResourcePlatformFactory.create()

course = (
CourseFactory.create(runs=[], platform=platform)
CourseFactory.create(runs=[], platform=platform.platform)
if course_exists
else CourseFactory.build()
)

duplicate_course = (
CourseFactory.create(runs=[], platform=platform)
CourseFactory.create(runs=[], platform=platform.platform)
if duplicate_course_exists
else CourseFactory.build()
)
Expand Down
6 changes: 6 additions & 0 deletions learning_resources/etl/mitxonline.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
from learning_resources.etl.constants import ETLSource
from learning_resources.etl.utils import (
extract_valid_department_from_id,
generate_course_numbers_json,
transform_topics,
)

Expand Down Expand Up @@ -146,6 +147,11 @@ def _transform_course(course):
"runs": [
_transform_run(course_run, course) for course_run in course["courseruns"]
],
"course": {
"course_numbers": generate_course_numbers_json(
course["readable_id"], is_ocw=False
),
},
"published": bool(
parse_page_attribute(course, "page_url")
), # a course is only considered published if it has a page url
Expand Down
21 changes: 20 additions & 1 deletion learning_resources/etl/mitxonline_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,14 @@
# pylint: disable=redefined-outer-name
from datetime import datetime
from itertools import chain
from unittest.mock import ANY
from urllib.parse import urljoin

import pytest

from learning_resources.constants import LearningResourceType, PlatformType
from learning_resources.etl import mitxonline
from learning_resources.etl.constants import ETLSource
from learning_resources.etl.constants import CourseNumberType, ETLSource
from learning_resources.etl.mitxonline import (
_transform_image,
parse_page_attribute,
Expand Down Expand Up @@ -194,6 +195,15 @@ def test_mitxonline_transform_programs(mock_mitxonline_programs_data):
}
for course_run_data in course_data["courseruns"]
],
"course": {
"course_numbers": [
{
"value": course_data["readable_id"],
"department": ANY,
"listing_type": CourseNumberType.primary.value,
}
]
},
}
for course_data in program_data["courses"]
if "PROCTORED EXAM" not in course_data["title"]
Expand Down Expand Up @@ -271,6 +281,15 @@ def test_mitxonline_transform_courses(settings, mock_mitxonline_courses_data):
}
for course_run_data in course_data["courseruns"]
],
"course": {
"course_numbers": [
{
"value": course_data["readable_id"],
"department": ANY,
"listing_type": CourseNumberType.primary.value,
}
]
},
}
for course_data in mock_mitxonline_courses_data
if "PROCTORED EXAM" not in course_data["title"]
Expand Down
9 changes: 7 additions & 2 deletions learning_resources/etl/ocw.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
from learning_resources.etl.constants import ETLSource
from learning_resources.etl.utils import (
extract_text_metadata,
generate_course_numbers_json,
get_content_type,
)
from learning_resources.models import ContentFile, LearningResource
Expand Down Expand Up @@ -286,7 +287,7 @@ def transform_course(course_data: dict) -> dict:
else:
extra_course_numbers = []

readable_id = f"{course_data.get(PRIMARY_COURSE_ID)}+{slugify(course_data.get('term'))}_{course_data.get('year')}" # noqa: E501
readable_id = f"{course_data[PRIMARY_COURSE_ID]}+{slugify(course_data.get('term'))}_{course_data.get('year')}" # noqa: E501
topics = [
{"name": topic_name}
for topic_name in list(
Expand Down Expand Up @@ -321,7 +322,11 @@ def transform_course(course_data: dict) -> dict:
"last_modified": course_data.get("last_modified"),
"published": True,
"course": {
"extra_course_numbers": extra_course_numbers,
"course_numbers": generate_course_numbers_json(
course_data[PRIMARY_COURSE_ID],
extra_nums=extra_course_numbers,
is_ocw=True,
),
},
"topics": topics,
"runs": [transform_run(course_data)],
Expand Down
25 changes: 22 additions & 3 deletions learning_resources/etl/ocw_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@
from moto import mock_s3

from learning_resources.conftest import OCW_TEST_PREFIX, setup_s3_ocw
from learning_resources.etl.constants import ETLSource
from learning_resources.constants import DEPARTMENTS
from learning_resources.etl.constants import CourseNumberType, ETLSource
from learning_resources.etl.ocw import (
transform_content_files,
transform_contentfile,
Expand Down Expand Up @@ -195,8 +196,26 @@ def test_transform_course(settings, legacy_uid, site_uid, expected_uid, has_extr
assert transformed_json["image"]["alt"] == (
"Illustration of an aircraft wing showing connections between the disciplines of the course."
)
assert transformed_json["course"]["extra_course_numbers"] == (
["1", "2"] if has_extra_num else []
assert transformed_json["course"]["course_numbers"][0] == {
"value": "16.01",
"department": {"department_id": "16", "name": DEPARTMENTS["16"]},
"listing_type": CourseNumberType.primary.value,
}
assert transformed_json["course"]["course_numbers"][1:] == (
[
{
"value": "1",
"department": {"department_id": "1", "name": DEPARTMENTS["1"]},
"listing_type": CourseNumberType.cross_listed.value,
},
{
"value": "2",
"department": {"department_id": "2", "name": DEPARTMENTS["2"]},
"listing_type": CourseNumberType.cross_listed.value,
},
]
if has_extra_num
else []
)
else:
assert transformed_json is None
8 changes: 7 additions & 1 deletion learning_resources/etl/openedx.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,10 @@

from learning_resources.constants import LearningResourceType
from learning_resources.etl.constants import COMMON_HEADERS
from learning_resources.etl.utils import extract_valid_department_from_id
from learning_resources.etl.utils import (
extract_valid_department_from_id,
generate_course_numbers_json,
)
from learning_resources.utils import get_year_and_semester

MIT_OWNER_KEYS = ["MITx", "MITx_PRO"]
Expand Down Expand Up @@ -262,6 +265,9 @@ def _transform_course(config, course):
for course_run in course.get("course_runs", [])
if _filter_course_run(course_run)
],
"course": {
"course_numbers": generate_course_numbers_json(course.get("key")),
},
"published": any(
run["status"] == "published" for run in course.get("course_runs", [])
),
Expand Down
14 changes: 13 additions & 1 deletion learning_resources/etl/openedx_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import pytest

from learning_resources.constants import LearningResourceType
from learning_resources.etl.constants import COMMON_HEADERS
from learning_resources.etl.constants import COMMON_HEADERS, CourseNumberType
from learning_resources.etl.openedx import (
OpenEdxConfiguration,
openedx_extract_transform_factory,
Expand Down Expand Up @@ -170,6 +170,18 @@ def test_transform_course( # noqa: PLR0913
"published": True,
}
],
"course": {
"course_numbers": [
{
"value": "MITx+15.071x",
"department": {
"department_id": "15",
"name": "Sloan School of Management",
},
"listing_type": CourseNumberType.primary.value,
}
]
},
}
if not is_course_run_deleted:
assert transformed_courses[1]["published"] is False
Expand Down
7 changes: 6 additions & 1 deletion learning_resources/etl/pipelines_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,12 @@ def test_ocw_courses_etl(settings, mocker):

resource = LearningResource.objects.first()
assert resource.readable_id == "16.01+fall_2005"
assert resource.course.extra_course_numbers == ["16.02", "16.03", "16.04"]
assert [num["value"] for num in resource.course.course_numbers] == [
"16.01",
"16.02",
"16.03",
"16.04",
]
assert resource.platform.platform == PlatformType.ocw.name
assert resource.offered_by.code == OfferedBy.ocw.name
assert resource.departments.first().department_id == "16"
Expand Down
3 changes: 3 additions & 0 deletions learning_resources/etl/prolearn.py
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,9 @@ def _transform_course(
"url": parse_url(course),
"image": parse_image(course),
"description": course["body"],
"course": {
"course_numbers": [],
},
"published": True,
"topics": parse_topic(course),
"runs": _transform_runs(course),
Expand Down
1 change: 1 addition & 0 deletions learning_resources/etl/prolearn_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,7 @@ def test_prolearn_transform_courses(mock_mitpe_courses_data):
course["start_value"], course["end_value"]
)
],
"course": {"course_numbers": []},
}
for course in extracted_data
]
Expand Down
Loading