Hello everyone,
I am currently working with the Open edX Teak release, and I have an external application that evaluates learners’ writing skills. This external app uses Open edX OAuth authentication for secure access.
After the learner completes the assessment, I want to send their writing score or level back to Open edX and display it on the learner’s profile page inside the LMS.
My main goal is to
-
Save the external writing level or score inside the learner’s Open edX profile
-
Display that score on the user profile page in the LMS
-
Keep the process clean, efficient, and upgrade-safe without modifying core files
Environment
-
Open edX Release: Teak
-
Deployment: Tutor (Docker-based setup on Ubuntu VM)
-
External App: Custom writing assessment web app using Open edX OAuth authentication
-
Goal: Store writing score in Open edX and show it on the learner profile
What I Have Tried
1. Using Site Configuration via Django Admin
I added custom fields through Site Configuration at
/admin/site_configuration/siteconfiguration/
Example JSON added in “Site Values”
{
"ENABLE_EXTENDED_PROFILE_FIELDS": true,
"extended_profile_fields": [
{
"name": "writing_score",
"label": "Writing Score",
"type": "text",
"default": "",
"visible_to_staff_only": false
}
]
}
This added the field to the profile data model but did not display it automatically on the LMS profile page.
2. Updating the Profile Model
I explored extending the UserProfile model in openedx.core.djangoapps.user_api.models through a custom Django app or Tutor plugin. However, I am looking for a recommended way in the Teak release to extend the user model safely without editing core files.
3. External App Integration
The external app can already access learner information using Open edX OAuth.
Now I want it to send the learner’s writing score back to Open edX using a custom REST API endpoint that updates the profile field.
For example
POST /api/user_profile/v1/update/
{
"username": "learner123",
"writing_score": "B2"
}
What I Am Looking For
I would appreciate guidance or best practices on the following points
-
Safest way to extend the user profile model for additional fields like writing_score in Teak
-
How to display that field on the learner’s LMS profile page and in the MFE profile view
-
Recommended way to receive data from an external system through REST API or plugin integration
-
Whether creating a custom Tutor plugin is the best long-term approach
Expected Result
-
After the learner completes the assessment in the external app
-
Their Writing Level or Writing Score appears under their profile (for example, Writing Score B2)
-
Admins or instructors can also view this value in the LMS
Example Workflow
Step 1: Learner logs into the external app using Open edX OAuth
Step 2: The external app calculates the writing level, for example “Intermediate B2”
Step 3: The app calls an Open edX API endpoint to update the user’s profile field
Step 4: The learner’s LMS profile page displays “Writing Score: B2”
Question
What is the recommended method in the Teak release to
-
Add and persist a new profile field such as writing_score
-
Update it from an external application
-
Display it safely on the profile UI
Should I
-
Use extended profile fields through Site Configuration
-
Create a custom Django app or Tutor plugin to manage REST updates and UI changes
-
Modify the MFE Profile microfrontend to include this new field
Any implementation references or examples would be very helpful.
Additional Information
-
Open edX Teak deployed via Tutor version 18 or above
-
External service hosted separately using Open edX OAuth
-
Full access to LMS and Studio containers
-
Comfortable working with Django models, Tutor plugins, and API extensions
Thanks
Thank you to the Open edX community for your time and guidance.
If anyone has implemented a similar integration for external results, badges, or analytics data, I would appreciate any insights or examples specific to Teak and Tutor environments.