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") %}