Skip to content

Release 0.39.3 #2423

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 15 commits into from
Aug 11, 2025
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
2 changes: 1 addition & 1 deletion .github/workflows/openapi-diff.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ jobs:
issue-number: ${{ github.event.pull_request.number }}
body-includes: "## OpenAPI Changes"
- name: Post changes as comment
uses: peter-evans/create-or-update-comment@23ff15729ef2fc348714a3bb66d2f655ca9066f2 # v3
uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4
# Even if no changes, make sure to update old comment if it was found.
if: steps.oasdif_summary.outputs.summary || steps.find_comment.outputs.comment-id
with:
Expand Down
1 change: 1 addition & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ COPY apt.txt /tmp/apt.txt
RUN apt-get update && \
apt-get install -y --no-install-recommends $(grep -vE "^\s*#" apt.txt | tr "\n" " ") && \
apt-get install libpq-dev postgresql-client -y --no-install-recommends && \
apt-get install poppler-utils -y && \
apt-get clean && \
apt-get purge && \
rm -rf /var/lib/apt/lists/*
Expand Down
17 changes: 17 additions & 0 deletions RELEASE.rst
Original file line number Diff line number Diff line change
@@ -1,6 +1,23 @@
Release Notes
=============

Version 0.39.3
--------------

- Regenerate course metadata when course information updates (#2419)
- properly mock posthog.capture (#2409)
- Populate more fields for canvas courses (#2404)
- change problem set list permissions (#2406)
- fix(deps): update dependency ruff to v0.12.7 (#2413)
- fix(deps): update dependency litellm to v1.74.14 (#2412)
- raise page size of userlists and learning paths (#2408)
- Add support for ProgramCollection (#2369)
- Backgrounds for video buttons (#2405)
- fix(deps): update django-health-check digest to b0500d1 (#2391)
- chore(deps): update peter-evans/create-or-update-comment action to v4 (#2396)
- Process pdf problem sets (#2402)
- call user_created plugin method for SCIM users (#2387)

Version 0.39.0 (Released August 04, 2025)
--------------

Expand Down
2 changes: 1 addition & 1 deletion frontends/api/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
"ol-test-utilities": "0.0.0"
},
"dependencies": {
"@mitodl/mitxonline-api-axios": "^2025.6.23",
"@mitodl/mitxonline-api-axios": "2025.7.28",
"@tanstack/react-query": "^5.66.0",
"axios": "^1.6.3"
}
Expand Down
7 changes: 7 additions & 0 deletions frontends/api/src/mitxonline/clients.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import {
B2bApi,
CoursesApi,
EnrollmentsApi,
ProgramCollectionsApi,
ProgramsApi,
UsersApi,
} from "@mitodl/mitxonline-api-axios/v1"
Expand All @@ -23,13 +24,19 @@ const usersApi = new UsersApi(undefined, BASE_PATH, axiosInstance)
const b2bApi = new B2bApi(undefined, BASE_PATH, axiosInstance)
const enrollmentsApi = new EnrollmentsApi(undefined, BASE_PATH, axiosInstance)
const programsApi = new ProgramsApi(undefined, BASE_PATH, axiosInstance)
const programCollectionsApi = new ProgramCollectionsApi(
undefined,
BASE_PATH,
axiosInstance,
)
const coursesApi = new CoursesApi(undefined, BASE_PATH, axiosInstance)

export {
usersApi,
b2bApi,
enrollmentsApi,
programsApi,
programCollectionsApi,
coursesApi,
axiosInstance,
}
4 changes: 2 additions & 2 deletions frontends/api/src/mitxonline/hooks/courses/queries.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { queryOptions } from "@tanstack/react-query"
import type {
CoursesApiApiV2CoursesListRequest,
PaginatedCourseWithCourseRunsList,
PaginatedV2CourseWithCourseRunsList,
} from "@mitodl/mitxonline-api-axios/v1"
import { coursesApi } from "../../clients"

Expand All @@ -18,7 +18,7 @@ const coursesQueries = {
coursesList: (opts?: CoursesApiApiV2CoursesListRequest) =>
queryOptions({
queryKey: coursesKeys.coursesList(opts),
queryFn: async (): Promise<PaginatedCourseWithCourseRunsList> => {
queryFn: async (): Promise<PaginatedV2CourseWithCourseRunsList> => {
return coursesApi.apiV2CoursesList(opts).then((res) => res.data)
},
}),
Expand Down
4 changes: 2 additions & 2 deletions frontends/api/src/mitxonline/hooks/programs/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
import { programsQueries } from "./queries"
import { programsQueries, programCollectionQueries } from "./queries"

export { programsQueries }
export { programsQueries, programCollectionQueries }
37 changes: 35 additions & 2 deletions frontends/api/src/mitxonline/hooks/programs/queries.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,39 @@
import { queryOptions } from "@tanstack/react-query"
import type {
PaginatedV2ProgramCollectionList,
PaginatedV2ProgramList,
ProgramCollectionsApiProgramCollectionsListRequest,
ProgramsApiProgramsListV2Request,
ProgramsApiProgramsRetrieveV2Request,
V2Program,
} from "@mitodl/mitxonline-api-axios/v1"
import { programsApi } from "../../clients"
import { programCollectionsApi, programsApi } from "../../clients"

const programsKeys = {
root: ["mitxonline", "programs"],
programDetail: (opts: ProgramsApiProgramsRetrieveV2Request) => [
...programsKeys.root,
"detail",
opts,
],
programsList: (opts?: ProgramsApiProgramsListV2Request) => [
...programsKeys.root,
"list",
opts,
],
programCollectionsList: (
opts?: ProgramCollectionsApiProgramCollectionsListRequest,
) => [...programsKeys.root, "collections", "list", opts],
}

const programsQueries = {
programDetail: (opts: ProgramsApiProgramsRetrieveV2Request) =>
queryOptions({
queryKey: programsKeys.programDetail(opts),
queryFn: async (): Promise<V2Program> => {
return programsApi.programsRetrieveV2(opts).then((res) => res.data)
},
}),
programsList: (opts: ProgramsApiProgramsListV2Request) =>
queryOptions({
queryKey: programsKeys.programsList(opts),
Expand All @@ -24,4 +43,18 @@ const programsQueries = {
}),
}

export { programsQueries, programsKeys }
const programCollectionQueries = {
programCollectionsList: (
opts: ProgramCollectionsApiProgramCollectionsListRequest,
) =>
queryOptions({
queryKey: programsKeys.programCollectionsList(opts),
queryFn: async (): Promise<PaginatedV2ProgramCollectionList> => {
return programCollectionsApi
.programCollectionsList(opts)
.then((res) => res.data)
},
}),
}

export { programsQueries, programCollectionQueries, programsKeys }
12 changes: 8 additions & 4 deletions frontends/api/src/mitxonline/test-utils/factories/courses.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import { mergeOverrides, makePaginatedFactory } from "ol-test-utilities"
import type { PartialFactory } from "ol-test-utilities"
import type { CourseWithCourseRuns } from "@mitodl/mitxonline-api-axios/v1"
import type { V2CourseWithCourseRuns } from "@mitodl/mitxonline-api-axios/v1"
import { faker } from "@faker-js/faker/locale/en"
import { UniqueEnforcer } from "enforce-unique"

const uniqueCourseId = new UniqueEnforcer()
const uniqueCourseRunId = new UniqueEnforcer()

const course: PartialFactory<CourseWithCourseRuns> = (overrides = {}) => {
const defaults: CourseWithCourseRuns = {
const course: PartialFactory<V2CourseWithCourseRuns> = (overrides = {}) => {
const defaults: V2CourseWithCourseRuns = {
id: uniqueCourseId.enforce(() => faker.number.int()),
title: faker.lorem.words(3),
readable_id: faker.lorem.slug(),
Expand Down Expand Up @@ -80,9 +80,13 @@ const course: PartialFactory<CourseWithCourseRuns> = (overrides = {}) => {
approved_flexible_price_exists: faker.datatype.boolean(),
},
],
min_price: faker.number.int({ min: 0, max: 1000 }),
max_price: faker.number.int({ min: 1000, max: 2000 }),
include_in_learn_catalog: faker.datatype.boolean(),
ingest_content_files_for_ai: faker.datatype.boolean(),
}

return mergeOverrides<CourseWithCourseRuns>(defaults, overrides)
return mergeOverrides<V2CourseWithCourseRuns>(defaults, overrides)
}

const courses = makePaginatedFactory(course)
Expand Down
34 changes: 30 additions & 4 deletions frontends/api/src/mitxonline/test-utils/factories/programs.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import { mergeOverrides, makePaginatedFactory } from "ol-test-utilities"
import type { PartialFactory } from "ol-test-utilities"
import type { V2Program } from "@mitodl/mitxonline-api-axios/v1"
import type {
V2Program,
V2ProgramCollection,
} from "@mitodl/mitxonline-api-axios/v1"
import { faker } from "@faker-js/faker/locale/en"
import { UniqueEnforcer } from "enforce-unique"

Expand Down Expand Up @@ -33,10 +36,17 @@ const program: PartialFactory<V2Program> = (overrides = {}) => {
],
live: faker.datatype.boolean(),
courses: [],
collections: [],
req_tree: [],
requirements: {
required: [faker.number.int()],
electives: [faker.number.int()],
courses: {
required: [faker.number.int()],
electives: [faker.number.int()],
},
programs: {
required: [faker.number.int()],
electives: [faker.number.int()],
},
},
certificate_type: faker.lorem.word(),
topics: [
Expand All @@ -52,11 +62,27 @@ const program: PartialFactory<V2Program> = (overrides = {}) => {
availability: faker.helpers.arrayElement(["anytime", "dated"]),
min_weekly_hours: `${faker.number.int({ min: 1, max: 5 })} hours`,
max_weekly_hours: `${faker.number.int({ min: 6, max: 10 })} hours`,
start_date: faker.date.past().toISOString(),
}

return mergeOverrides<V2Program>(defaults, overrides)
}

const programs = makePaginatedFactory(program)

export { program, programs }
const programCollection: PartialFactory<V2ProgramCollection> = (
overrides = {},
) => {
const defaults: V2ProgramCollection = {
id: uniqueProgramId.enforce(() => faker.number.int()),
description: faker.lorem.paragraph(),
programs: programs({ count: 2 }).results.map((p) => p.id),
title: faker.lorem.words(3),
created_on: faker.date.past().toISOString(),
updated_on: faker.date.recent().toISOString(),
}

return mergeOverrides<V2ProgramCollection>(defaults, overrides)
}

export { program, programs, programCollection }
19 changes: 18 additions & 1 deletion frontends/api/src/mitxonline/test-utils/urls.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import type {
CoursesApiApiV2CoursesListRequest,
ProgramCollectionsApiProgramCollectionsListRequest,
ProgramsApiProgramsListV2Request,
} from "@mitodl/mitxonline-api-axios/v1"
import { RawAxiosRequestConfig } from "axios"
Expand All @@ -13,6 +14,7 @@ const currentUser = {
}

const enrollment = {
enrollmentsList: () => `${API_BASE_URL}/api/v1/enrollments/`,
courseEnrollment: (id?: number) =>
`${API_BASE_URL}/api/v1/enrollments/${id ? `${id}/` : ""}`,
}
Expand All @@ -25,6 +27,13 @@ const b2b = {
const programs = {
programsList: (opts?: ProgramsApiProgramsListV2Request) =>
`${API_BASE_URL}/api/v2/programs/${queryify(opts)}`,
programDetail: (id: number) => `${API_BASE_URL}/api/v2/programs/${id}/`,
}

const programCollections = {
programCollectionsList: (
opts?: ProgramCollectionsApiProgramCollectionsListRequest,
) => `${API_BASE_URL}/api/v2/program-collections/${queryify(opts)}`,
}

const courses = {
Expand All @@ -37,4 +46,12 @@ const organization = {
`${API_BASE_URL}/api/v0/b2b/organizations/${organizationSlug}/`,
}

export { b2b, currentUser, enrollment, programs, courses, organization }
export {
b2b,
currentUser,
enrollment,
programs,
programCollections,
courses,
organization,
}
2 changes: 1 addition & 1 deletion frontends/main/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
"@emotion/cache": "^11.13.1",
"@emotion/styled": "^11.11.0",
"@mitodl/course-search-utils": "3.3.2",
"@mitodl/mitxonline-api-axios": "^2025.6.23",
"@mitodl/mitxonline-api-axios": "2025.7.28",
"@mitodl/smoot-design": "^6.10.0",
"@next/bundle-analyzer": "^14.2.15",
"@remixicon/react": "^4.2.0",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,11 @@ import {
} from "ol-components"
import NextLink from "next/link"
import { EnrollmentStatus, EnrollmentMode } from "./types"
import type { DashboardCourse, DashboardCourseEnrollment } from "./types"
import type {
DashboardResource,
DashboardCourse,
DashboardCourseEnrollment,
} from "./types"
import { ActionButton, Button, ButtonLink } from "@mitodl/smoot-design"
import {
RiArrowRightLine,
Expand Down Expand Up @@ -309,7 +313,7 @@ const CourseStartCountdown: React.FC<{

type DashboardCardProps = {
Component?: React.ElementType
dashboardResource: DashboardCourse
dashboardResource: DashboardResource
showNotComplete?: boolean
className?: string
courseNoun?: string
Expand All @@ -319,6 +323,7 @@ type DashboardCardProps = {
titleHref?: string | null
buttonHref?: string | null
}

const DashboardCard: React.FC<DashboardCardProps> = ({
dashboardResource,
showNotComplete = true,
Expand All @@ -331,7 +336,8 @@ const DashboardCard: React.FC<DashboardCardProps> = ({
titleHref,
buttonHref,
}) => {
const { title, marketingUrl, enrollment, run } = dashboardResource
const course = dashboardResource as DashboardCourse
const { title, marketingUrl, enrollment, run } = course
const titleSection = isLoading ? (
<>
<Skeleton variant="text" width="95%" height={16} />
Expand Down Expand Up @@ -373,7 +379,7 @@ const DashboardCard: React.FC<DashboardCardProps> = ({
/>
<CoursewareButton
data-testid="courseware-button"
coursewareId={dashboardResource.coursewareId}
coursewareId={course.coursewareId}
startDate={run.startDate}
enrollmentStatus={enrollment?.status}
href={buttonHref ? buttonHref : run.coursewareUrl}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,7 @@ const EmailSettingsDialogInner: React.FC<DashboardDialogProps> = ({
})
const updateEnrollment = useUpdateEnrollment({
id: enrollment.id,
PatchedCourseRunEnrollmentRequest: {
//@ts-expect-error This will be fixed after https://github.com/mitodl/mitxonline/pull/2737 is released
PatchedUpdateCourseRunEnrollmentRequest: {
receive_emails: formik.values.receive_emails,
},
})
Expand Down
Loading
Loading