Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
2b6b3eb
feat: make MFE URLs site aware.
anfbermudezme Oct 17, 2025
ae91de9
feat: add SessionJWTCreationRequested filter call.
cesarsilvaedunext Apr 7, 2025
28c0005
chore: add openedx-events ulmo branch
luisfelipec95 Dec 5, 2025
1370b76
feat: adding custom registration extension point and custom email tem…
anfbermudezme May 20, 2022
c93e8fc
feat: add course created event signals
JuanDavidBuitrago Nov 27, 2023
7af0008
feat: adding CCX support to gradebook API
alexjmpb Dec 26, 2023
4b68c99
feat: adding global staff to allowed users in ccx gradebook
alexjmpb Mar 19, 2024
2271c04
fix: CSS style to email templates to make them compatible with email.
nandodev-net Apr 28, 2025
c619309
feat: add license_enforcement filters.
anfbermudezme Dec 29, 2025
703c0f6
feat: create an openedx-filter to provide enroll emails with extra pa…
nandodev-net Apr 22, 2025
6cfef49
feat: Modify the course_url parameter used in the enrollment email te…
sergivalero20 Oct 29, 2025
49e38e6
feat: add filter in CourseEnrollmentAllowed and fix filter changes.
anfbermudezme Jan 2, 2026
6a530ce
feat: adds a new custom content jsonfield to ccx model
JuanDavidBuitrago Oct 4, 2024
2372818
Merge pull request #183 from Pearson-Advance/vue/PADV-2749
JuanDavidBuitrago Jan 13, 2026
4c9c719
User full name generation on IES authentication.
ivanvgh Sep 17, 2021
35e09ad
Merge pull request #184 from Pearson-Advance/vue/PADV-2733.2
luisfelipec95 Jan 15, 2026
479f50e
fix: add multiple_ccx_per_coach validation to the ccx view
JuanDavidBuitrago Jan 17, 2026
aaea040
Merge pull request #185 from Pearson-Advance/multiple_ccx_per_coach
JuanDavidBuitrago Jan 19, 2026
4bf6a2b
feat: set STUDENT_FILEUPLOAD_MAX_SIZE via site configurations or plat…
Nekenhei Mar 12, 2025
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/check-consistent-dependencies.yml
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ jobs:
make compile-requirements

- name: Fail if compiling requirements caused changes
if: ${{ env.RELEVANT == 'true' }}
if: ${{ env.RELEVANT == 'true' && github.repository == 'openedx/edx-platform' }}
run: |
SUMMARY_HELP=$(cat <<'EOMARKDOWN'
# Inconsistent Python dependencies
Expand Down
15 changes: 12 additions & 3 deletions cms/djangoapps/contentstore/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -293,7 +293,10 @@ def get_studio_home_url():
"""
Gets course authoring microfrontend URL for Studio Home view.
"""
mfe_base_url = settings.COURSE_AUTHORING_MICROFRONTEND_URL
mfe_base_url = configuration_helpers.get_value(
'COURSE_AUTHORING_MICROFRONTEND_URL',
settings.COURSE_AUTHORING_MICROFRONTEND_URL,
)
if mfe_base_url:
studio_home_url = f'{mfe_base_url}/home'
return studio_home_url
Expand Down Expand Up @@ -540,7 +543,10 @@ def get_taxonomy_list_url() -> str | None:
if is_tagging_feature_disabled():
return None

mfe_base_url = settings.COURSE_AUTHORING_MICROFRONTEND_URL
mfe_base_url = configuration_helpers.get_value(
'COURSE_AUTHORING_MICROFRONTEND_URL',
settings.COURSE_AUTHORING_MICROFRONTEND_URL,
)

if not mfe_base_url:
return None
Expand All @@ -560,7 +566,10 @@ def get_taxonomy_tags_widget_url(course_locator=None) -> str | None:
if course_locator:
mfe_base_url = get_course_authoring_url(course_locator)
else:
mfe_base_url = settings.COURSE_AUTHORING_MICROFRONTEND_URL
mfe_base_url = configuration_helpers.get_value(
'COURSE_AUTHORING_MICROFRONTEND_URL',
settings.COURSE_AUTHORING_MICROFRONTEND_URL,
)

if not mfe_base_url:
return None
Expand Down
7 changes: 6 additions & 1 deletion cms/djangoapps/contentstore/views/checklists.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@

from common.djangoapps.student.auth import has_course_author_access

from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers

__all__ = ['checklists_handler']


Expand All @@ -20,7 +22,10 @@ def checklists_handler(request, course_key_string=None):
course_key = CourseKey.from_string(course_key_string)
if not has_course_author_access(request.user, course_key):
raise PermissionDenied()
mfe_base_url = settings.COURSE_AUTHORING_MICROFRONTEND_URL
mfe_base_url = configuration_helpers.get_value(
'COURSE_AUTHORING_MICROFRONTEND_URL',
settings.COURSE_AUTHORING_MICROFRONTEND_URL,
)
if mfe_base_url:
studio_checklist_url = f'{mfe_base_url}/course/{course_key_string}/checklists'
return redirect(studio_checklist_url)
Expand Down
6 changes: 5 additions & 1 deletion cms/djangoapps/contentstore/views/preview.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
from common.djangoapps.edxmako.services import MakoService
from common.djangoapps.xblock_django.user_service import DjangoXBlockUserService
from lms.djangoapps.lms_xblock.field_data import LmsFieldData
from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers
from openedx.core.lib.license import wrap_with_license
from openedx.core.lib.cache_utils import CacheService
from openedx.core.lib.xblock_utils import (
Expand Down Expand Up @@ -340,7 +341,10 @@ def _studio_wrap_xblock(xblock, view, frag, context, display_name_only=False):
'is_reorderable': is_reorderable,
'can_edit': can_edit,
'can_edit_visibility': can_edit and context.get('can_edit_visibility', is_course),
'course_authoring_url': settings.COURSE_AUTHORING_MICROFRONTEND_URL,
'course_authoring_url': configuration_helpers.get_value(
'COURSE_AUTHORING_MICROFRONTEND_URL',
settings.COURSE_AUTHORING_MICROFRONTEND_URL,
),
'is_loading': context.get('is_loading', False),
'is_selected': context.get('is_selected', False),
'selectable': context.get('selectable', False),
Expand Down
7 changes: 6 additions & 1 deletion cms/djangoapps/contentstore/views/public.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@

from common.djangoapps.edxmako.shortcuts import render_to_response

from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers

from ..config.waffle import ENABLE_ACCESSIBILITY_POLICY_PAGE
from ..toggles import use_legacy_logged_out_home

Expand Down Expand Up @@ -76,7 +78,10 @@ def accessibility(request):
Display the accessibility accommodation form.
"""
if ENABLE_ACCESSIBILITY_POLICY_PAGE.is_enabled():
mfe_base_url = settings.COURSE_AUTHORING_MICROFRONTEND_URL
mfe_base_url = configuration_helpers.get_value(
'COURSE_AUTHORING_MICROFRONTEND_URL',
settings.COURSE_AUTHORING_MICROFRONTEND_URL,
)
if mfe_base_url:
studio_accessbility_url = f'{mfe_base_url}/accessibility'
return redirect(studio_accessbility_url)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
from openedx.core.djangoapps.content_tagging.toggles import is_tagging_feature_disabled
from openedx.core.djangoapps.discussions.models import DiscussionsConfiguration
from openedx.core.djangoapps.video_config.toggles import PUBLIC_VIDEO_SHARE
from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers
from openedx.core.lib.gating import api as gating_api
from openedx.core.lib.cache_utils import request_cached
from openedx.core.lib.xblock_utils import get_icon
Expand Down Expand Up @@ -1366,7 +1367,10 @@ def create_xblock_info( # lint-amnesty, pylint: disable=too-many-statements
xblock_info["is_tagging_feature_disabled"] = is_tagging_feature_disabled()
if not is_tagging_feature_disabled():
xblock_info["taxonomy_tags_widget_url"] = get_taxonomy_tags_widget_url()
xblock_info["course_authoring_url"] = settings.COURSE_AUTHORING_MICROFRONTEND_URL
xblock_info["course_authoring_url"] = configuration_helpers.get_value(
'COURSE_AUTHORING_MICROFRONTEND_URL',
settings.COURSE_AUTHORING_MICROFRONTEND_URL,
)

if course_outline:
if xblock_info["has_explicit_staff_lock"]:
Expand Down
12 changes: 10 additions & 2 deletions cms/lib/xblock/upstream_sync.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@

from xmodule.util.keys import BlockKey

from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers

if t.TYPE_CHECKING:
from django.contrib.auth.models import User # pylint: disable=imported-auth-user

Expand Down Expand Up @@ -420,7 +422,10 @@ def _get_library_xblock_url(usage_key: LibraryUsageLocatorV2):
Gets authoring url for given library_key.
"""
library_url = None
if mfe_base_url := settings.COURSE_AUTHORING_MICROFRONTEND_URL: # type: ignore
if mfe_base_url := configuration_helpers.get_value( # type: ignore
'COURSE_AUTHORING_MICROFRONTEND_URL',
settings.COURSE_AUTHORING_MICROFRONTEND_URL,
):
library_key = usage_key.lib_key
library_url = f'{mfe_base_url}/library/{library_key}/components?usageKey={usage_key}'
return library_url
Expand All @@ -431,7 +436,10 @@ def _get_library_container_url(container_key: LibraryContainerLocator):
Gets authoring url for given container_key.
"""
library_url = None
if mfe_base_url := settings.COURSE_AUTHORING_MICROFRONTEND_URL: # type: ignore
if mfe_base_url := configuration_helpers.get_value( # type: ignore
'COURSE_AUTHORING_MICROFRONTEND_URL',
settings.COURSE_AUTHORING_MICROFRONTEND_URL,
):
library_key = container_key.lib_key
if container_key.container_type == "unit":
library_url = f'{mfe_base_url}/library/{library_key}/units/{container_key}'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,10 @@ def send_password_reset_email(self, user, site):
message_context = get_base_template_context(site)
email = user.email
if should_redirect_to_authn_microfrontend():
site_url = settings.AUTHN_MICROFRONTEND_URL
site_url = configuration_helpers.get_value(
'AUTHN_MICROFRONTEND_URL',
settings.AUTHN_MICROFRONTEND_URL,
)
else:
site_url = configuration_helpers.get_value('SITE_NAME', settings.SITE_NAME)
message_context.update({
Expand Down
25 changes: 20 additions & 5 deletions common/djangoapps/student/views/dashboard.py
Original file line number Diff line number Diff line change
Expand Up @@ -528,10 +528,16 @@ def student_dashboard(request): # lint-amnesty, pylint: disable=too-many-statem
"""
user = request.user
if not UserProfile.objects.filter(user=user).exists():
return redirect(settings.ACCOUNT_MICROFRONTEND_URL)

return redirect(configuration_helpers.get_value(
'ACCOUNT_MICROFRONTEND_URL',
settings.ACCOUNT_MICROFRONTEND_URL,
))

if learner_home_mfe_enabled():
return redirect(settings.LEARNER_HOME_MICROFRONTEND_URL)
return redirect(configuration_helpers.get_value(
'LEARNER_HOME_MICROFRONTEND_URL',
settings.LEARNER_HOME_MICROFRONTEND_URL,
))

platform_name = configuration_helpers.get_value("platform_name", settings.PLATFORM_NAME)

Expand Down Expand Up @@ -633,7 +639,10 @@ def student_dashboard(request): # lint-amnesty, pylint: disable=too-many-statem
"Go to {link_start}your Account Settings{link_end}.")
).format(
link_start=HTML("<a href='{account_setting_page}'>").format(
account_setting_page=settings.ACCOUNT_MICROFRONTEND_URL,
account_setting_page=configuration_helpers.get_value(
'ACCOUNT_MICROFRONTEND_URL',
settings.ACCOUNT_MICROFRONTEND_URL,
),
),
link_end=HTML("</a>")
)
Expand Down Expand Up @@ -902,7 +911,13 @@ def student_dashboard(request): # lint-amnesty, pylint: disable=too-many-statem
except DashboardRenderStarted.RenderInvalidDashboard as exc:
response = render_to_response(exc.dashboard_template, exc.template_context)
except DashboardRenderStarted.RedirectToPage as exc:
response = HttpResponseRedirect(exc.redirect_to or settings.ACCOUNT_MICROFRONTEND_URL)
response = HttpResponseRedirect(
exc.redirect_to or
configuration_helpers.get_value(
'ACCOUNT_MICROFRONTEND_URL',
settings.ACCOUNT_MICROFRONTEND_URL,
)
)
except DashboardRenderStarted.RenderCustomResponse as exc:
response = exc.response
else:
Expand Down
5 changes: 4 additions & 1 deletion common/djangoapps/student/views/management.py
Original file line number Diff line number Diff line change
Expand Up @@ -680,7 +680,10 @@ def activate_account(request, key):
if redirect_url:
params['next'] = redirect_url
url_path = '/login?{}'.format(urllib.parse.urlencode(params))
return redirect(settings.AUTHN_MICROFRONTEND_URL + url_path)
return redirect(configuration_helpers.get_value(
'AUTHN_MICROFRONTEND_URL',
settings.AUTHN_MICROFRONTEND_URL,
) + url_path)

response = redirect(redirect_url) if redirect_url and is_enterprise_learner(request.user) else redirect('dashboard')
if show_account_activation_popup:
Expand Down
6 changes: 5 additions & 1 deletion common/djangoapps/third_party_auth/api/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
BearerAuthenticationAllowInactiveUser
)
from openedx.core.lib.api.permissions import ApiKeyHeaderPermission
from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers
from common.djangoapps.third_party_auth import pipeline
from common.djangoapps.third_party_auth.api import serializers
from common.djangoapps.third_party_auth.api.permissions import TPA_PERMISSIONS
Expand Down Expand Up @@ -468,7 +469,10 @@ def get(self, request):
state.provider.provider_id,
pipeline.AUTH_ENTRY_ACCOUNT_SETTINGS,
# The url the user should be directed to after the auth process has completed.
redirect_url=settings.ACCOUNT_MICROFRONTEND_URL,
redirect_url=configuration_helpers.get_value(
'ACCOUNT_MICROFRONTEND_URL',
settings.ACCOUNT_MICROFRONTEND_URL,
),
),
'accepts_logins': state.provider.accepts_logins,
# If the user is connected, sending a POST request to this url removes the connection
Expand Down
15 changes: 15 additions & 0 deletions common/djangoapps/third_party_auth/pipeline.py
Original file line number Diff line number Diff line change
Expand Up @@ -908,6 +908,21 @@ def user_details_force_sync(auth_entry, strategy, details, user=None, *args, **k
changed[provider_field] = current_value
setattr(model, field, provider_value)

# Generate fullname only for IES IDP.
ies_entity_ids = getattr(settings, 'SAML_IES_ENTITIES_IDS', [])
first_name = details.get('first_name')
last_name = details.get('last_name')

if (
first_name and
last_name and
current_provider.entity_id in ies_entity_ids
):
fullname_value = f'{first_name} {last_name}'
changed['fullname'] = fullname_value

setattr(user.profile, 'name', fullname_value) # pylint: disable=literal-used-as-attribute

if changed:
logger.info(
'[THIRD_PARTY_AUTH] User performed SSO and data was synchronized. '
Expand Down
4 changes: 2 additions & 2 deletions common/djangoapps/third_party_auth/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,8 @@ def inactive_user_view(request):
user.is_active = True
user.save()
activated = True
if not activated:
compose_and_send_activation_email(user, profile)
# if not activated:
compose_and_send_activation_email(user, profile)

request_params = request.GET
redirect_to = request_params.get('next')
Expand Down
5 changes: 4 additions & 1 deletion common/djangoapps/util/course.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,10 @@ def get_link_for_about_page(course):
).get('CUSTOM_COURSE_URLS')

if use_catalog_mfe():
about_base_url = settings.CATALOG_MICROFRONTEND_URL
about_base_url = configuration_helpers.get_value(
'CATALOG_MICROFRONTEND_URL',
settings.CATALOG_MICROFRONTEND_URL,
)
else:
about_base_url = configuration_helpers.get_value('LMS_ROOT_URL', settings.LMS_ROOT_URL)

Expand Down
79 changes: 37 additions & 42 deletions common/templates/student/edx_ace/accountactivation/email/body.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
{% load i18n %}
{% load static %}
{% block content %}
<table width="100%" align="left" border="0" cellpadding="0" cellspacing="0" role="presentation">
<table width="100%" align="left" border="0" cellpadding="0" cellspacing="0" role="presentation" style="box-shadow: 0px 0px 10px 2px #c8c8c8;">
{% if route_enabled %}
<tr>
<td>
Expand All @@ -18,51 +18,46 @@
</tr>
{% endif %}
<tr>
<td>
<h1>
{% trans "Account activation" as header_msg %}{{ header_msg | force_escape }}
</h1>
<p style="color: rgba(0,0,0,.75);">
{% filter force_escape %}
{% blocktrans %}You're almost there! Use the link below to activate your account to access engaging, high-quality {{ platform_name }} courses. Note that you will not be able to log back into your account until you have activated it.{% endblocktrans %}
{% endfilter %}
<br />
</p>
<td style="width: 100%;
max-width: 800px;
background-color: #FFF;
color: #000000;
margin: auto;
text-align: center;
padding: 20px;
">

{% filter force_escape %}
{% blocktrans asvar course_cta_text %}Activate your account{% endblocktrans %}
{% endfilter %}
{% include "ace_common/edx_ace/common/return_to_course_cta.html" with course_cta_text=course_cta_text course_cta_url=confirm_activation_link %}
</td>
</tr>
<tr>
<td>
<p style="color: rgba(0,0,0,.75);">
{% filter force_escape %}
{% blocktrans %}Enjoy learning with {{ platform_name }}.{% endblocktrans %}
{% endfilter %}
<br />
</p>
</td>
</tr>
<td>
<p style="color: rgba(0,0,0,.75);">
{% blocktrans trimmed asvar assist_msg %}
If you need help, please use our web form at {start_anchor_web}{{ support_url }}{end_anchor} or email {start_anchor_email}{{ support_email }}{end_anchor}.
{% endblocktrans %}
{% interpolate_html assist_msg start_anchor_web='<a href="'|add:support_url|add:'">'|safe start_anchor_email='<a href="mailto:'|add:support_email|add:'">'|safe end_anchor='</a>'|safe %}
<br />
</p>
</td>
<tr>
<img src="https://partner-courses.pearson.com/static/pearson-theme/images/logo.png" style="width: 150px; padding: 5px; margin: auto;" />

<div style="width: 90%;
text-align: left;
padding: 2% 5%;
background-color: #D4EAE4;
background-size: 50%;
background-position: right bottom;
background-repeat: no-repeat;">

<h1 style="font-family:'Playfair Display', serif; font-weight: 700; font-size: 1.7em; margin-top: 30px; margin-bottom: 20px;">
{% trans "You're Nearly Signed Up" %}
</h1>
<p style="padding: 0px;
width: 50%;
min-width: 300px;
margin-top: 20px;
">
{% blocktrans %}To validate your new account, please click on the Validate Account button below.{% endblocktrans %}
<br />
</p>

{% trans "Validate Account" as course_cta_text %}
{% include "ace_common/edx_ace/common/return_to_course_cta.html" with course_cta_text=course_cta_text course_cta_url=confirm_activation_link %}
</div>
</td>
</tr>
<tr>
<tr style="background-color: #FFF;">
<td>
<p style="color: rgba(0,0,0,.75);">
{% filter force_escape %}
{% blocktrans %}This email message was automatically sent by {{ lms_url }} because someone attempted to create an account on {{ platform_name }} using this email address.{% endblocktrans %}
{% endfilter %}
<p style="margin: 0 40px 40px 40px; text-align: center; color: #444; font-size: 0.9em;">
{% blocktrans %}This email message was automatically sent because someone attempted to create an account on {{ site_name }} using this email address.{% endblocktrans %}
<br />
</p>
</td>
Expand Down
Loading