diff --git a/CHANGELOG.md b/CHANGELOG.md
index 497463be..e079f6a2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -19,6 +19,20 @@ instructions, because git commits are used to generate release notes:
+
+## v17.0.0 (2023-12-09)
+
+- π₯Upgrade to Quince (by @regisb).
+- [Improvement] Added Makefile and test action to repository and formatted code with Black and isort. (by @CodeWithEmad)
+- [Feature] Add support for the Learner Dashboard MFE. (by @arbrandes)
+- [Bugfix] Append trailing slash to PUBLIC_PATH, as its absence breaks some MFEs. (by @arbrandes)
+- [Feature] Added patch to allow changes to Dockerfile after the npm build has completed. (by @Danyal-Faheem)
+- [Bugfix] Auto-build "mfe" image during `dev/local launch` in nightly. (by @regisb)
+- [Bugfix] Specify port for dev server to listen on (by @michaelwheeler)
+- [Feature] Enable the new per-unit discussions sidebar in the Learning MFE. (by @arbrandes)
+- [Bugfix] Support MFE remotes that are not on GitHub. (by @gabor-boros and @regisb)
+- π₯[Bugfix] Bypass rate-limiting when checking for upstream git changes. To achieve that, we use the `ADD --keep-git-dir` option, which is only compatible with BuildKit 0.11, from January 2023. Also, we get rid of the `get_github_refs_path` function. (by @gabor-boros and @regisb)
+
## v16.1.3 (2023-12-07)
diff --git a/README.rst b/README.rst
index a37ac945..a81121d6 100644
--- a/README.rst
+++ b/README.rst
@@ -11,6 +11,7 @@ In addition, this plugin comes with a few MFEs which are enabled by default:
- `Course Authoring `__
- `Discussions `__
- `Gradebook `__
+- `Learner Dashboard `__
- `Learning `__
- `ORA Grading `__
- `Profile `__
@@ -52,7 +53,7 @@ Account
.. image:: https://raw.githubusercontent.com/overhangio/tutor-mfe/master/screenshots/account.png
:alt: Account MFE screenshot
-An MFE to manage account-specific information for every LMS user. Each user's account page is available at ``http(s)://{{ MFE_HOST }}/account``. For instance, when running locally: https://apps.local.overhang.io/account.
+An MFE to manage account-specific information for every LMS user. Each user's account page is available at ``http(s)://{{ MFE_HOST }}/account``. For instance, when running locally: https://apps.local.edly.io/account.
Communications
~~~~~~~~~~~~~~
@@ -84,7 +85,15 @@ Gradebook
.. image:: https://raw.githubusercontent.com/overhangio/tutor-mfe/master/screenshots/gradebook.png
:alt: Gradebook MFE screenshot
-This instructor-only MFE is for viewing individual and aggregated grade results for a course. To access this MFE, go to a course β Instructor tab β Student Admin β View gradebook. The URL should be: ``http(s)://{{ MFE_HOST }}/gradebook/{{ course ID }}``. When running locally, the gradebook of the demo course is available at: http://apps.local.overhang.io/gradebook/course-v1:edX+DemoX+Demo_Course
+This instructor-only MFE is for viewing individual and aggregated grade results for a course. To access this MFE, go to a course β Instructor tab β Student Admin β View gradebook. The URL should be: ``http(s)://{{ MFE_HOST }}/gradebook/{{ course ID }}``. When running locally, the gradebook of the demo course is available at: http://apps.local.edly.io/gradebook/course-v1:edX+DemoX+Demo_Course
+
+Learner Dashboard
+~~~~~~~~~~~~~~~~~
+
+.. image:: https://raw.githubusercontent.com/overhangio/tutor-mfe/master/screenshots/learner-dashboard.png
+ :alt: Learner Dashboard MFE screenshot
+
+The Learner Dashboard MFE provides a clean and functional interface to allow learners to view all of their open enrollments, as well as take relevant actions on those enrollments.
Learning
~~~~~~~~
@@ -108,7 +117,7 @@ Profile
.. image:: https://raw.githubusercontent.com/overhangio/tutor-mfe/master/screenshots/profile.png
:alt: Profile MFE screenshot
-Edit and display user-specific profile information. The profile page of every user is visible at ``http(s)://{{ MFE_HOST }}/profile/u/{{ username }}``. For instance, when running locally, the profile page of the "admin" user is: http://apps.local.overhang.io/profile/u/admin.
+Edit and display user-specific profile information. The profile page of every user is visible at ``http(s)://{{ MFE_HOST }}/profile/u/{{ username }}``. For instance, when running locally, the profile page of the "admin" user is: http://apps.local.edly.io/profile/u/admin.
MFE management
@@ -129,14 +138,10 @@ Other MFE developers can take advantage of this plugin to deploy their own MFEs.
"repository": "https://github.com/myorg/mymfe",
"port": 2001,
"version": "me/my-custom-branch", # optional, will default to the Open edX current tag.
- "refs": https://api.github.com/repos/myorg/mymfe/git/refs/heads", # optional
}
return mfes
-The MFE assets will then be bundled in the "mfe" Docker image whenever it is rebuilt with ``tutor images build mfe``. Providing a ``refs`` URL will ensure the build cache for that MFE is invalidated whenever a change is detected upstream at the git version in question. You can use the `GitHub references API`_ or the `GitLab branches API`_ for this.
-
-.. _GitHub references API: https://docs.github.com/en/rest/git/refs?apiVersion=2022-11-28#get-a-reference
-.. _GitLab branches API: https://docs.gitlab.com/ee/api/branches.html#get-single-repository-branch
+The MFE assets will then be bundled in the "mfe" Docker image whenever it is rebuilt with ``tutor images build mfe``.
Assets will be served at ``http(s)://{{ MFE_HOST }}/mymfe``. Developers are free to add extra template patches to their plugins, as usual: for instance LMS setting patches to make sure that the LMS correctly connects to the MFEs.
@@ -314,7 +319,7 @@ Tutor makes it possible to run any MFE in development mode. For instance, to run
tutor dev start profile
-Then, access http://apps.local.overhang.io:1995/profile/u/YOURUSERNAME
+Then, access http://apps.local.edly.io:1995/profile/u/YOURUSERNAME
You can also bind-mount your own fork of an MFE. For example::
diff --git a/changelog.d/20231208_112435_danyal.faheem_mfe_post_npm_build_patch.md b/changelog.d/20231208_112435_danyal.faheem_mfe_post_npm_build_patch.md
deleted file mode 100644
index 8d5bf3cb..00000000
--- a/changelog.d/20231208_112435_danyal.faheem_mfe_post_npm_build_patch.md
+++ /dev/null
@@ -1 +0,0 @@
-- [Feature] Added patch to allow changes to Dockerfile after the npm build has completed. (by @Danyal-Faheem)
\ No newline at end of file
diff --git a/changelog.d/20231208_112710_regis_nightly_auto_build_mfe.md b/changelog.d/20231208_112710_regis_nightly_auto_build_mfe.md
deleted file mode 100644
index 453cf083..00000000
--- a/changelog.d/20231208_112710_regis_nightly_auto_build_mfe.md
+++ /dev/null
@@ -1 +0,0 @@
-- [Bugfix] Auto-build "mfe" image during `dev/local launch` in nightly. (by @regisb)
diff --git a/changelog.d/20231208_132545_mpwheel_mfe_dev_ports.md b/changelog.d/20231208_132545_mpwheel_mfe_dev_ports.md
deleted file mode 100644
index 4d959bf8..00000000
--- a/changelog.d/20231208_132545_mpwheel_mfe_dev_ports.md
+++ /dev/null
@@ -1 +0,0 @@
-- [Bugfix] Specify port for dev server to listen on (by @michaelwheeler)
diff --git a/screenshots/learner-dashboard.png b/screenshots/learner-dashboard.png
new file mode 100644
index 00000000..a94c00ee
Binary files /dev/null and b/screenshots/learner-dashboard.png differ
diff --git a/setup.py b/setup.py
index 9346bb82..1234f35c 100644
--- a/setup.py
+++ b/setup.py
@@ -40,8 +40,8 @@ def load_about():
packages=find_packages(exclude=["tests*"]),
include_package_data=True,
python_requires=">=3.8",
- install_requires=["tutor>=16.1.2,<17.0.0"],
- extras_require={"dev": ["tutor[dev]>=16.1.2,<17.0.0"]},
+ install_requires=["tutor>=17.0.0,<18.0.0"],
+ extras_require={"dev": ["tutor[dev]>=17.0.0,<18.0.0"]},
entry_points={"tutor.plugin.v1": ["mfe = tutormfe.plugin"]},
classifiers=[
"Development Status :: 5 - Production/Stable",
diff --git a/tutormfe/__about__.py b/tutormfe/__about__.py
index ce2be6bd..a08b09c5 100644
--- a/tutormfe/__about__.py
+++ b/tutormfe/__about__.py
@@ -1 +1 @@
-__version__ = "16.1.3"
+__version__ = "17.0.0"
diff --git a/tutormfe/hooks.py b/tutormfe/hooks.py
index c7a6b5e2..e62c2eb2 100644
--- a/tutormfe/hooks.py
+++ b/tutormfe/hooks.py
@@ -9,6 +9,6 @@
from tutor.core.hooks import Filter
-MFE_ATTRS_TYPE = t.Dict[t.Literal["repository", "refs", "port"], t.Union["str", int]]
+MFE_ATTRS_TYPE = t.Dict[t.Literal["repository", "port", "version"], t.Union["str", int]]
MFE_APPS: Filter[dict[str, MFE_ATTRS_TYPE], []] = Filter()
diff --git a/tutormfe/patches/openedx-cms-development-settings b/tutormfe/patches/openedx-cms-development-settings
index b4659012..bfbf031e 100644
--- a/tutormfe/patches/openedx-cms-development-settings
+++ b/tutormfe/patches/openedx-cms-development-settings
@@ -2,4 +2,4 @@
COURSE_AUTHORING_MICROFRONTEND_URL = "http://{{ MFE_HOST }}:{{ get_mfe('course-authoring')["port"] }}/course-authoring"
CORS_ORIGIN_WHITELIST.append("http://{{ MFE_HOST }}:{{ get_mfe('course-authoring')["port"] }}")
LOGIN_REDIRECT_WHITELIST.append("{{ MFE_HOST }}:{{ get_mfe('course-authoring')["port"] }}")
-CSRF_TRUSTED_ORIGINS.append("{{ MFE_HOST }}:{{ get_mfe('course-authoring')["port"] }}")
+CSRF_TRUSTED_ORIGINS.append("http://{{ MFE_HOST }}:{{ get_mfe('course-authoring')["port"] }}")
diff --git a/tutormfe/patches/openedx-cms-production-settings b/tutormfe/patches/openedx-cms-production-settings
index d86061e5..b1b5e163 100644
--- a/tutormfe/patches/openedx-cms-production-settings
+++ b/tutormfe/patches/openedx-cms-production-settings
@@ -5,4 +5,4 @@ COURSE_AUTHORING_MICROFRONTEND_URL = "{% if ENABLE_HTTPS %}https://{% else %}htt
LOGIN_REDIRECT_WHITELIST.append("{{ MFE_HOST }}")
CORS_ORIGIN_WHITELIST.append("{% if ENABLE_HTTPS %}https://{% else %}http://{% endif %}{{ MFE_HOST }}")
-CSRF_TRUSTED_ORIGINS.append("{{ MFE_HOST }}")
+CSRF_TRUSTED_ORIGINS.append("{% if ENABLE_HTTPS %}https://{% else %}http://{% endif %}{{ MFE_HOST }}")
diff --git a/tutormfe/patches/openedx-lms-common-settings b/tutormfe/patches/openedx-lms-common-settings
index 9a28ec75..328b25eb 100644
--- a/tutormfe/patches/openedx-lms-common-settings
+++ b/tutormfe/patches/openedx-lms-common-settings
@@ -11,3 +11,6 @@ FEATURES['ENABLE_AUTHN_MICROFRONTEND'] = True
{% if get_mfe("communications") %}
FEATURES['ENABLE_NEW_BULK_EMAIL_EXPERIENCE'] = True
{% endif %}
+{% if get_mfe("learner-dashboard") %}
+LEARNER_HOME_MFE_REDIRECT_PERCENTAGE = 100
+{% endif %}
diff --git a/tutormfe/patches/openedx-lms-development-settings b/tutormfe/patches/openedx-lms-development-settings
index f56610de..bf633746 100644
--- a/tutormfe/patches/openedx-lms-development-settings
+++ b/tutormfe/patches/openedx-lms-development-settings
@@ -31,7 +31,7 @@ MFE_CONFIG["DISABLE_ENTERPRISE_LOGIN"] = True
{% endif %}
{% if get_mfe("account") %}
-ACCOUNT_MICROFRONTEND_URL = "http://{{ MFE_HOST }}:{{ get_mfe("account")["port"] }}/account"
+ACCOUNT_MICROFRONTEND_URL = "http://{{ MFE_HOST }}:{{ get_mfe("account")["port"] }}/account/"
MFE_CONFIG["ACCOUNT_SETTINGS_URL"] = ACCOUNT_MICROFRONTEND_URL
{% endif %}
@@ -42,6 +42,7 @@ MFE_CONFIG["ENABLE_PROGRESS_GRAPH_SETTINGS"] = True
{% if get_mfe("discussions") %}
DISCUSSIONS_MICROFRONTEND_URL = "http://{{ MFE_HOST }}:{{ get_mfe("discussions")["port"] }}/discussions"
+MFE_CONFIG["DISCUSSIONS_MFE_BASE_URL"] = DISCUSSIONS_MICROFRONTEND_URL
DISCUSSIONS_MFE_FEEDBACK_URL = None
{% endif %}
@@ -49,6 +50,10 @@ DISCUSSIONS_MFE_FEEDBACK_URL = None
WRITABLE_GRADEBOOK_URL = "http://{{ MFE_HOST }}:{{ get_mfe("gradebook")["port"] }}/gradebook"
{% endif %}
+{% if get_mfe("learner-dashboard") %}
+LEARNER_HOME_MICROFRONTEND_URL = "http://{{ MFE_HOST }}:{{ get_mfe("learner-dashboard")["port"] }}/learner-dashboard/"
+{% endif %}
+
{% if get_mfe("learning") %}
LEARNING_MICROFRONTEND_URL = "http://{{ MFE_HOST }}:{{ get_mfe("learning")["port"] }}/learning"
MFE_CONFIG["LEARNING_BASE_URL"] = "http://{{ MFE_HOST }}:{{ get_mfe("learning")["port"] }}"
@@ -73,7 +78,7 @@ MFE_CONFIG["SCHEDULE_EMAIL_SECTION"] = True
# {{ app_name }} MFE
CORS_ORIGIN_WHITELIST.append("http://{{ MFE_HOST }}:{{ app["port"] }}")
LOGIN_REDIRECT_WHITELIST.append("{{ MFE_HOST }}:{{ app["port"] }}")
-CSRF_TRUSTED_ORIGINS.append("{{ MFE_HOST }}:{{ app["port"] }}")
+CSRF_TRUSTED_ORIGINS.append("http://{{ MFE_HOST }}:{{ app["port"] }}")
{% endfor %}
{{ patch("mfe-lms-common-settings") }}
diff --git a/tutormfe/patches/openedx-lms-production-settings b/tutormfe/patches/openedx-lms-production-settings
index 9e73b1e8..1df4bcfe 100644
--- a/tutormfe/patches/openedx-lms-production-settings
+++ b/tutormfe/patches/openedx-lms-production-settings
@@ -32,7 +32,7 @@ MFE_CONFIG["DISABLE_ENTERPRISE_LOGIN"] = True
{% endif %}
{% if get_mfe("account") %}
-ACCOUNT_MICROFRONTEND_URL = "{% if ENABLE_HTTPS %}https://{% else %}http://{% endif %}{{ MFE_HOST }}/account"
+ACCOUNT_MICROFRONTEND_URL = "{% if ENABLE_HTTPS %}https://{% else %}http://{% endif %}{{ MFE_HOST }}/account/"
MFE_CONFIG["ACCOUNT_SETTINGS_URL"] = ACCOUNT_MICROFRONTEND_URL
{% endif %}
@@ -43,6 +43,7 @@ MFE_CONFIG["ENABLE_PROGRESS_GRAPH_SETTINGS"] = True
{% if get_mfe("discussions") %}
DISCUSSIONS_MICROFRONTEND_URL = "{% if ENABLE_HTTPS %}https://{% else %}http://{% endif %}{{ MFE_HOST }}/discussions"
+MFE_CONFIG["DISCUSSIONS_MFE_BASE_URL"] = DISCUSSIONS_MICROFRONTEND_URL
DISCUSSIONS_MFE_FEEDBACK_URL = None
{% endif %}
@@ -50,6 +51,10 @@ DISCUSSIONS_MFE_FEEDBACK_URL = None
WRITABLE_GRADEBOOK_URL = "{% if ENABLE_HTTPS %}https://{% else %}http://{% endif %}{{ MFE_HOST }}/gradebook"
{% endif %}
+{% if get_mfe("learner-dashboard") %}
+LEARNER_HOME_MICROFRONTEND_URL = "{% if ENABLE_HTTPS %}https://{% else %}http://{% endif %}{{ MFE_HOST }}/learner-dashboard/"
+{% endif %}
+
{% if get_mfe("learning") %}
LEARNING_MICROFRONTEND_URL = "{% if ENABLE_HTTPS %}https://{% else %}http://{% endif %}{{ MFE_HOST }}/learning"
MFE_CONFIG["LEARNING_BASE_URL"] = "{{ "https" if ENABLE_HTTPS else "http" }}://{{ MFE_HOST }}/learning"
@@ -71,7 +76,7 @@ MFE_CONFIG["SCHEDULE_EMAIL_SECTION"] = True
LOGIN_REDIRECT_WHITELIST.append("{{ MFE_HOST }}")
CORS_ORIGIN_WHITELIST.append("{% if ENABLE_HTTPS %}https://{% else %}http://{% endif %}{{ MFE_HOST }}")
-CSRF_TRUSTED_ORIGINS.append("{{ MFE_HOST }}")
+CSRF_TRUSTED_ORIGINS.append("{% if ENABLE_HTTPS %}https://{% else %}http://{% endif %}{{ MFE_HOST }}")
{{ patch("mfe-lms-common-settings") }}
{{ patch("mfe-lms-production-settings") }}
diff --git a/tutormfe/plugin.py b/tutormfe/plugin.py
index e2205567..421761af 100644
--- a/tutormfe/plugin.py
+++ b/tutormfe/plugin.py
@@ -29,65 +29,45 @@
},
}
-
-def get_github_refs_path(name: str) -> str:
- """
- Generate a URL to access refs in heads (nightly) or tags (stable) via Github API.
- Args:
- name (str): Consisted of the repository owner and the repository name, as a string in 'owner/repo' format.
-
- Returns:
- str: A string URL to the Github API, pointing to heads if version_suffix is set, tags otherwise.
-
- """
-
- return f"https://api.github.com/repos/{name}/git/refs/{'heads' if __version_suffix__ else 'tags'}"
-
-
CORE_MFE_APPS: dict[str, MFE_ATTRS_TYPE] = {
"authn": {
- "repository": "https://github.com/openedx/frontend-app-authn",
- "refs": get_github_refs_path("openedx/frontend-app-authn"),
+ "repository": "https://github.com/openedx/frontend-app-authn.git",
"port": 1999,
},
"account": {
- "repository": "https://github.com/openedx/frontend-app-account",
- "refs": get_github_refs_path("openedx/frontend-app-account"),
+ "repository": "https://github.com/openedx/frontend-app-account.git",
"port": 1997,
},
"communications": {
- "repository": "https://github.com/openedx/frontend-app-communications",
- "refs": get_github_refs_path("openedx/frontend-app-communications"),
+ "repository": "https://github.com/openedx/frontend-app-communications.git",
"port": 1984,
},
"course-authoring": {
- "repository": "https://github.com/openedx/frontend-app-course-authoring",
- "refs": get_github_refs_path("openedx/frontend-app-course-authoring"),
+ "repository": "https://github.com/openedx/frontend-app-course-authoring.git",
"port": 2001,
},
"discussions": {
- "repository": "https://github.com/openedx/frontend-app-discussions",
- "refs": get_github_refs_path("openedx/frontend-app-discussions"),
+ "repository": "https://github.com/openedx/frontend-app-discussions.git",
"port": 2002,
},
"gradebook": {
- "repository": "https://github.com/openedx/frontend-app-gradebook",
- "refs": get_github_refs_path("openedx/frontend-app-gradebook"),
+ "repository": "https://github.com/openedx/frontend-app-gradebook.git",
"port": 1994,
},
+ "learner-dashboard": {
+ "repository": "https://github.com/openedx/frontend-app-learner-dashboard.git",
+ "port": 1996,
+ },
"learning": {
- "repository": "https://github.com/openedx/frontend-app-learning",
- "refs": get_github_refs_path("openedx/frontend-app-learning"),
+ "repository": "https://github.com/openedx/frontend-app-learning.git",
"port": 2000,
},
"ora-grading": {
- "repository": "https://github.com/openedx/frontend-app-ora-grading",
- "refs": get_github_refs_path("openedx/frontend-app-ora-grading"),
+ "repository": "https://github.com/openedx/frontend-app-ora-grading.git",
"port": 1993,
},
"profile": {
- "repository": "https://github.com/openedx/frontend-app-profile",
- "refs": get_github_refs_path("openedx/frontend-app-profile"),
+ "repository": "https://github.com/openedx/frontend-app-profile.git",
"port": 1995,
},
}
@@ -109,6 +89,14 @@ def get_mfes() -> dict[str, MFE_ATTRS_TYPE]:
return MFE_APPS.apply({})
+@tutor_hooks.Actions.PLUGIN_LOADED.add()
+def _clear_get_mfes_cache(_name: str) -> None:
+ """
+ Don't forget to clear cache, or we'll have some strange surprises...
+ """
+ get_mfes.cache_clear()
+
+
def iter_mfes() -> t.Iterable[tuple[str, MFE_ATTRS_TYPE]]:
"""
Yield:
diff --git a/tutormfe/templates/mfe/build/mfe/Dockerfile b/tutormfe/templates/mfe/build/mfe/Dockerfile
index 2a55fb0a..d637d97a 100644
--- a/tutormfe/templates/mfe/build/mfe/Dockerfile
+++ b/tutormfe/templates/mfe/build/mfe/Dockerfile
@@ -1,5 +1,6 @@
+# syntax=docker/dockerfile:1
# https://hub.docker.com/_/node/tags
-FROM docker.io/node:18.16.0-bullseye-slim AS base
+FROM docker.io/node:18.19.0-bullseye-slim AS base
RUN apt update \
&& apt install -y git \
@@ -17,7 +18,7 @@ RUN apt update \
RUN mkdir -p /openedx/app /openedx/env
WORKDIR /openedx/app
-ENV PATH ./node_modules/.bin:${PATH}
+ENV PATH /openedx/app/node_modules/.bin:${PATH}
######## i18n strings
FROM base AS i18n
@@ -34,10 +35,7 @@ RUN echo "copying i18n data" \
######## {{ app_name }} (git)
FROM base AS {{ app_name }}-git
{#- Invalidate the build cache if a change is detected upstream #}
-{%- if app.get("refs") %}
-ADD {{ app["refs"] }}/{{ app.get("version", MFE_COMMON_VERSION) }} /tmp/gitref-{{ app_name }}
-{%- endif %}
-RUN git clone {{ app["repository"] }} --branch {{ app.get("version", MFE_COMMON_VERSION) }} --depth 1 .
+ADD --keep-git-dir=true {{ app["repository"] }}#{{ app.get("version", MFE_COMMON_VERSION) }} .
######## {{ app_name }} (src)
# Empty layer with just the repo at the root, for build-time bind-mounts
@@ -63,11 +61,18 @@ ARG NPM_REGISTRY={{ NPM_REGISTRY }}
ENV CPPFLAGS=-DPNG_ARM_NEON_OPT=0
{#- We define this environment variable to bypass an issue with the installation of pact https://github.com/pact-foundation/pact-js-core/issues/264 #}
ENV PACT_SKIP_BINARY_INSTALL=true
-RUN {% if is_buildkit_enabled() %}--mount=type=cache,target=/root/.npm,sharing=shared {% endif %}npm clean-install --no-audit --no-fund --registry=$NPM_REGISTRY
+RUN --mount=type=cache,target=/root/.npm,sharing=shared npm clean-install --no-audit --no-fund --registry=$NPM_REGISTRY
{{ patch("mfe-dockerfile-post-npm-install") }}
{{ patch("mfe-dockerfile-post-npm-install-{}".format(app_name)) }}
COPY --from={{ app_name }}-src / /openedx/app
COPY --from={{ app_name }}-i18n /openedx/app/src/i18n/messages /openedx/app/src/i18n/messages
+
+# Whenever a new MFE supports Atlas, it should be added to this list.
+# When all MFEs support Atlas, this if-statement should be removed.
+{% if app_name in ["communications"] %}
+RUN make OPENEDX_ATLAS_PULL=true pull_translations
+{% endif %}
+
EXPOSE {{ app['port'] }}
# Configuration needed at build time
diff --git a/tutormfe/templates/mfe/tasks/lms/init b/tutormfe/templates/mfe/tasks/lms/init
index 9e6db52b..69e364f0 100644
--- a/tutormfe/templates/mfe/tasks/lms/init
+++ b/tutormfe/templates/mfe/tasks/lms/init
@@ -16,6 +16,12 @@ site-configuration unset --domain={{ LMS_HOST }}:8000 ENABLE_PROFILE_MICROFRONTE
./manage.py lms waffle_delete --flags learner_profile.redirect_to_microfrontend
{% endif %}
+{% if is_mfe_enabled("learner-dashboard") %}
+(./manage.py lms waffle_flag --list | grep learner_home_mfe.enabled) || ./manage.py lms waffle_flag learner_home_mfe.enabled --create --everyone
+{% else %}
+./manage.py lms waffle_delete --flags learner_home_mfe.enabled
+{% endif %}
+
{% if is_mfe_enabled("learning") %}
(./manage.py lms waffle_flag --list | grep course_home.course_home_mfe_progress_tab) || ./manage.py lms waffle_flag --create --everyone course_home.course_home_mfe_progress_tab
{% else %}
@@ -40,12 +46,14 @@ site-configuration unset --domain={{ LMS_HOST }}:8000 ENABLE_PROFILE_MICROFRONTE
(./manage.py lms waffle_flag --list | grep discussions.enable_moderation_reason_codes ) || ./manage.py lms waffle_flag --create --everyone discussions.enable_moderation_reason_codes
(./manage.py lms waffle_flag --list | grep discussions.enable_reported_content_email_notifications ) || ./manage.py lms waffle_flag --create --everyone discussions.enable_reported_content_email_notifications
(./manage.py lms waffle_flag --list | grep discussions.enable_learners_stats ) || ./manage.py lms waffle_flag --create --everyone discussions.enable_learners_stats
+(./manage.py lms waffle_flag --list | grep discussions.enable_new_structure_discussions ) || ./manage.py lms waffle_flag --create --everyone discussions.enable_new_structure_discussions
{% else %}
./manage.py lms waffle_delete --flags discussions.enable_discussions_mfe
./manage.py lms waffle_delete --flags discussions.enable_learners_tab_in_discussions_mfe
./manage.py lms waffle_delete --flags discussions.enable_moderation_reason_codes
./manage.py lms waffle_delete --flags discussions.enable_reported_content_email_notifications
./manage.py lms waffle_delete --flags discussions.enable_learners_stats
+./manage.py lms waffle_delete --flags discussions.enable_new_structure_discussions
{% endif %}
{% if is_mfe_enabled("ora-grading") %}