Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
12a2ce3
chore(deps): mitol-django-observability 2026.3.11 -> 2026.8.19 (#3796)
blarghmatey Aug 20, 2026
084bb2f
adding fix for hiding offeror facets in hybrid search (#3786)
shanbady Aug 20, 2026
0c69a40
Clear redis cache on a schedule (#3789)
abeglova Aug 20, 2026
762976e
feat: add a Failed filter tab to the B2B contract admin page (#3778)
daniellefrappier18 Aug 21, 2026
6af35c7
get rid of duplicate course checks (#3803)
abeglova Aug 21, 2026
378b4b2
Drive React Query staleTime from the CDN TTL (#3804)
ChristopherChudzicki Aug 21, 2026
9529aa7
Update apache/apisix Docker tag to v3.17.0 (#2708)
renovate[bot] Aug 21, 2026
ab6ab34
Update dependency drf-spectacular to >=0.30,<0.31 (#3812)
renovate[bot] Aug 21, 2026
c9c3139
Update dependency litellm to v1.95.0 (#3813)
renovate[bot] Aug 21, 2026
690f08d
Update dependency llama-index-llms-openai to >=0.7.10,<0.8 (#3814)
renovate[bot] Aug 21, 2026
cdb6619
Update dependency ruff to v0.16.2 (#3815)
renovate[bot] Aug 21, 2026
7d90b07
Update dependency tiktoken to >=0.13,<0.14 (#3816)
renovate[bot] Aug 21, 2026
2f304af
Revert broken Renovate merges (#3812-#3816) (#3822)
shaidar Aug 21, 2026
fe1ed67
fix: bullet lists and mailto links in About section (#3802)
daniellefrappier18 Aug 24, 2026
e390c41
Update Django to 5.2 (#3768)
mbertrand Aug 24, 2026
7c1c64d
Update dependency posthog to v7 (#2765)
renovate[bot] Aug 24, 2026
edef145
Merge branch 'release'
odlbot Aug 24, 2026
33c00ee
Update dependency llama-index-llms-openai to >=0.7.10,<0.8 (#3826)
abeglova Aug 24, 2026
6c9617d
feat(cohort-1): StarRocks warehouse-pull ETL machinery (#3807)
blarghmatey Aug 24, 2026
c061340
vector search completeness penalty (#3805)
shanbady Aug 24, 2026
5ed3880
fix: bump version for arithmix game (#3832)
ahtesham-quraish Aug 25, 2026
5e5afdb
Release 0.77.11
odlbot Aug 25, 2026
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
19 changes: 18 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ jobs:
# Label used to access the service container
db:
# Docker Hub image
image: postgres:12.22
image: postgres:15
# Set health checks to wait until postgres has started
options: >-
--health-cmd pg_isready
Expand All @@ -31,6 +31,20 @@ jobs:
ports:
- 6379:6379

starrocks:
# All-in-one FE+BE image, for CI/local dev only — see
# learning_resources.lib.warehouse for what this backs.
image: starrocks/allin1-ubuntu:4.1.4
options: >-
--health-cmd "bash -c 'echo > /dev/tcp/127.0.0.1/9030'"
--health-interval 10s
--health-timeout 5s
--health-retries 30
--health-start-period 30s
ports:
- 9030:9030
- 8030:8030

steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
Expand Down Expand Up @@ -78,6 +92,9 @@ jobs:
MAILGUN_SENDER_DOMAIN: other.fake.site
OPENSEARCH_INDEX: testindex
INDEXING_API_USERNAME: mitodl
STARROCKS_HOST: localhost
STARROCKS_PORT: "9030"
STARROCKS_USER: root
MITOL_COOKIE_DOMAIN: localhost
MITOL_COOKIE_NAME: cookie_monster
UNSUBSCRIBE_SECRET_KEY: fake_unsubscribe_secret
Expand Down
24 changes: 24 additions & 0 deletions RELEASE.rst
Original file line number Diff line number Diff line change
@@ -1,6 +1,30 @@
Release Notes
=============

Version 0.77.11
---------------

- fix: bump version for arithmix game (#3832)
- vector search completeness penalty (#3805)
- feat(cohort-1): StarRocks warehouse-pull ETL machinery (#3807)
- Update dependency llama-index-llms-openai to >=0.7.10,<0.8 (#3826)
- Update dependency posthog to v7 (#2765)
- Update Django to 5.2 (#3768)
- fix: bullet lists and mailto links in About section (#3802)
- Revert broken Renovate merges (#3812-#3816) (#3822)
- Update dependency tiktoken to >=0.13,<0.14 (#3816)
- Update dependency ruff to v0.16.2 (#3815)
- Update dependency llama-index-llms-openai to >=0.7.10,<0.8 (#3814)
- Update dependency litellm to v1.95.0 (#3813)
- Update dependency drf-spectacular to >=0.30,<0.31 (#3812)
- Update apache/apisix Docker tag to v3.17.0 (#2708)
- Drive React Query staleTime from the CDN TTL (#3804)
- get rid of duplicate course checks (#3803)
- feat: add a Failed filter tab to the B2B contract admin page (#3778)
- Clear redis cache on a schedule (#3789)
- adding fix for hiding offeror facets in hybrid search (#3786)
- chore(deps): mitol-django-observability 2026.3.11 -> 2026.8.19 (#3796)

Version 0.77.10 (Released August 24, 2026)
---------------

Expand Down
17 changes: 17 additions & 0 deletions channels/migrations/0017_channelgrouprole_index.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Generated by Django 5.2.16 on 2026-08-13 14:09

from django.db import migrations


class Migration(migrations.Migration):
dependencies = [
("channels", "0016_alter_channel_featured_list"),
]

operations = [
migrations.RenameIndex(
model_name="channelgrouprole",
new_name="channelgrouprole_ch_role_idx",
old_fields=("channel", "role"),
),
]
6 changes: 5 additions & 1 deletion channels/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,11 @@ class ChannelGroupRole(TimestampedModel):

class Meta:
unique_together = (("channel", "group", "role"),)
index_together = (("channel", "role"),)
indexes = [
models.Index(
fields=["channel", "role"], name="channelgrouprole_ch_role_idx"
)
]

def __str__(self):
return (
Expand Down
18 changes: 17 additions & 1 deletion docker-compose.services.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,22 @@ services:
retries: 10
ports:
- "6379"
starrocks:
profiles:
- backend
# All-in-one FE+BE image, for local dev/test only — production StarRocks
# is a separately-operated cluster (see learning_resources.lib.warehouse).
image: starrocks/allin1-ubuntu:4.1.4
ports:
- "9030:9030" # FE MySQL-protocol query port
- "8030:8030" # FE HTTP port
healthcheck:
test: ["CMD-SHELL", "bash -c 'echo > /dev/tcp/127.0.0.1/9030'"]
interval: 5s
timeout: 5s
retries: 60
start_period: 30s

qdrant:
image: qdrant/qdrant:latest
ports:
Expand Down Expand Up @@ -123,7 +139,7 @@ services:
apigateway:
profiles:
- apisix
image: apache/apisix:3.13.0-debian # versions above this drop the local port on redirects
image: apache/apisix:3.17.0-debian@sha256:0e5377839f4ff5e322a5686ab6ce6797ba768008aca1bfc9b71149c3b326c4df # versions above this drop the local port on redirects
<<: *default-extra-hosts
environment:
- CSRF_COOKIE_DOMAIN=${CSRF_COOKIE_DOMAIN:-.odl.local}
Expand Down
8 changes: 8 additions & 0 deletions fixtures/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,14 @@ def warnings_as_errors():
module=".*(api_jwt|api_jws|rest_framework_jwt|astroid|bs4|celery|factory|botocore|posthog|pydantic).*",
category=DeprecationWarning,
)
# django-safedelete 1.4.1 (latest) still calls LogEntry.objects.log_action(),
# deprecated in Django 5.2. Drop once upstream moves to log_actions().
warnings.filterwarnings(
"ignore",
message=r"LogEntryManager\.log_action\(\) is deprecated.*",
module=r"safedelete\.admin",
category=DeprecationWarning,
)
yield
finally:
warnings.resetwarnings()
Expand Down
2 changes: 1 addition & 1 deletion frontends/main/Dockerfile.web
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
# -e NEXT_PUBLIC_MITX_ONLINE_LEGACY_BASE_URL=http://mitxonline.odl.local:8065/ \
# -e NEXT_PUBLIC_MITX_ONLINE_BASE_URL=https://api.learn.mit.edu/mitxonline \
# -e NEXT_PUBLIC_MITX_ONLINE_CSRF_COOKIE_NAME=csrf_mitxonline \
# -e NEXT_CACHE_S_MAXAGE_SECONDS=7200 \
# -e NEXT_PUBLIC_CACHE_S_MAXAGE_SECONDS=7200 \
# -e NEXT_PUBLIC_MITOL_AXIOS_WITH_CREDENTIALS=true \
# mit-learn-nextjs:test

Expand Down
2 changes: 1 addition & 1 deletion frontends/main/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
"@emotion/cache": "^11.13.1",
"@emotion/styled": "^11.11.0",
"@floating-ui/react": "^0.27.16",
"@mitodl/arithmix": "^0.2.4",
"@mitodl/arithmix": "^0.2.5",
"@mitodl/course-search-utils": "^3.5.2",
"@mitodl/hacksnack": "^0.1.2",
"@mitodl/mitxonline-api-axios": "2026.8.18",
Expand Down
71 changes: 69 additions & 2 deletions frontends/main/src/app-pages/ChannelPage/ChannelSearch.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,10 @@ import {
user,
} from "@/test-utils"
import { setMockResponse, urls, factories, makeRequest } from "api/test-utils"
import type { LearningResourcesSearchResponse } from "api"
import type {
LearningResourcesSearchResponse,
PaginatedLearningResourceOfferorDetailList,
} from "api"
import invariant from "tiny-invariant"
import type { Channel } from "api/v0"
import { ChannelTypeEnum } from "api/v0"
Expand All @@ -16,9 +19,11 @@ import ChannelPage from "./ChannelPage"
const setMockApiResponses = ({
search,
channelPatch = {},
offerors,
}: {
search?: Partial<LearningResourcesSearchResponse>
channelPatch?: Partial<Channel>
offerors?: PaginatedLearningResourceOfferorDetailList
}) => {
const channel = factories.channels.channel(channelPatch)
const urlParams = new URLSearchParams(channelPatch?.search_filter)
Expand Down Expand Up @@ -58,7 +63,7 @@ const setMockApiResponses = ({

setMockResponse.get(
urls.offerors.list(),
factories.learningResources.offerors({ count: 5 }),
offerors ?? factories.learningResources.offerors({ count: 5 }),
)

setMockResponse.get(expect.stringContaining(urls.search.resources()), {
Expand Down Expand Up @@ -201,6 +206,68 @@ describe("ChannelSearch", () => {
expect(apiSearchParams.get("q")).toBe("python")
expect(apiSearchParams.get("topic")).toBe("Economics")
})

test("Hybrid search 'Offered By' facet only shows facets with 'display_facet' set to true", async () => {
const offerors = factories.learningResources.offerors({ count: 3 })
offerors.results[0]!.display_facet = true
offerors.results[1]!.display_facet = false
offerors.results[2]!.display_facet = false

const resources = factories.learningResources.resources({
count: 3,
}).results
resources.forEach((resource, i) => {
resource.professional = true
resource.offered_by = {
code: offerors.results[i]!.code,
name: offerors.results[i]!.name,
channel_url: null,
}
})

const { channel } = setMockApiResponses({
channelPatch: { channel_type: ChannelTypeEnum.Topic },
offerors,
search: {
count: resources.length,
results: resources,
metadata: {
aggregations: {
offered_by: offerors.results.map((o, i) => ({
key: o.code,
doc_count: 10 + i,
})),
},
suggestions: [],
},
},
})

renderWithProviders(<ChannelPage />, {
url: `/c/${channel.channel_type}/${channel.name}?q=python&professional=true`,
})

const showFacetButton = await screen.findByRole("button", {
name: /Offered By/i,
})
await user.click(showFacetButton)

const offeror0 = await screen.findByRole("checkbox", {
name: new RegExp(`^${offerors.results[0]!.name}`),
})
expect(offeror0).toBeVisible()
expect(
screen.queryByRole("checkbox", {
name: new RegExp(`^${offerors.results[1]!.name}`),
}),
).not.toBeInTheDocument()
expect(
screen.queryByRole("checkbox", {
name: new RegExp(`^${offerors.results[2]!.name}`),
}),
).not.toBeInTheDocument()
})

test.each([
{
searchFilter: "offered_by=ocw",
Expand Down
Loading
Loading