You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The Authoring Roles and Permissions spec only grants manage_advanced_settings and manage_certificates to Course Staff and Course Admin. No view-only variant exists for either permission. As a result, Course Auditor and Course Editor receive a 403 from both APIs and cannot access the data at all — the pages fall back to <Placeholder /> ("Under Construction / Coming Soon"). The frontend designs require a view-only permission to be defined and shipped in the backend first; without it, the frontend changes below cannot be implemented.
Here are previous backend PRs that attempted to add view_advanced_settings. This requires broader discussion:
Already in src/authz/constants.ts as COURSE_PERMISSIONS.MANAGE_ADVANCED_SETTINGS and in src/authz/permissionHelpers.ts as getAdvancedSettingsPermissions(courseId).
Already resolved in advanced-settings/AdvancedSettings.tsx via useUserPermissions as userPermissions?.canManageAdvancedSettings. The page currently returns <PermissionDeniedAlert /> for users without permission; the new design shows the page in view-only mode: a banner below SubHeader and all textarea inputs set to readOnly.
Certificates
Permission used: courses.manage_certificates
Not yet in src/authz/constants.ts or src/authz/permissionHelpers.ts; both must be added as a prerequisite. The page currently shows <Placeholder /> on 403 (loadingStatus === RequestStatus.DENIED). The new design shows the page with a view-only banner and all management actions hidden (Add, edit, delete, mode dropdown, activate/deactivate); only "Preview certificate" remains.
UI location 1 — Advanced Settings page: view-only banner for Course Auditor and Course Editor
viewOnlyAlert: {id: 'course-authoring.advanced-settings.alert.view-only',defaultMessage: 'You have view-only access to this page. Contact your organization admin to request editing permissions.',description: 'Alert shown to users who can view but cannot manage advanced settings',},
advanced-settings/AdvancedSettings.tsx — add Alert to paragon imports, add Lock icon, replace the PermissionDeniedAlert early-return with a canManageAdvancedSettings bool, show banner, and pass readOnly to each SettingCard:
// paragon imports — add Alertimport{Container,Alert,Button,Layout,StatefulButton,TransitionReplace,}from'@openedx/paragon';// icons imports — add Lockimport{CheckCircle,Info,LockasLockIcon,Warning}from'@openedx/paragon/icons';// remove: import PermissionDeniedAlert from 'CourseAuthoring/generic/PermissionDeniedAlert';
...
// replace the authzIsEnabledAndNoPermission block (lines ~152–158) with:constcanManageAdvancedSettings=!isAuthzEnabled||!!userPermissions?.canManageAdvancedSettings;
...
// in JSX — after <SubHeader .../>, before <article>:<SubHeadersubtitle={intl.formatMessage(messages.headingSubtitle)}title={intl.formatMessage(messages.headingTitle)}contentTitle={intl.formatMessage(messages.policy)}/>{!canManageAdvancedSettings&&(<Alertvariant="info"icon={LockIcon}>{intl.formatMessage(messages.viewOnlyAlert)}</Alert>)}<article>
...
// pass disabled to SettingCard:
<SettingCardkey={settingName}settingData={settingData}name={settingName}showSaveSettingsPrompt={showSaveSettingsPrompt}saveSettingsPrompt={saveSettingsPrompt}setEdited={setEditedSettings}handleBlur={handleSettingBlur}isEditableState={isEditableState}setIsEditableState={setIsEditableState}disabled={!canManageAdvancedSettings}/>
UI location 2 — Advanced Settings page: disabled textarea inputs for Course Auditor and Course Editor
viewOnlyAlert: {id: 'course-authoring.certificates.alert.view-only',defaultMessage: 'You have view-only access to this page. Contact your organization admin to request editing permissions.',description: 'Alert shown to users who can view but cannot manage certificates',},
certificates/Certificates.tsx — resolve canManageCertificates via hook, thread it to MainLayout and the active mode component:
certificates/messages.ts — add new view-only empty-state message:
noCertificatesViewOnlyText: {id: 'course-authoring.certificates.no-certificates.view-only',defaultMessage: 'No certificates have been set up for this course yet.',description: 'Empty state message shown to view-only users on the certificates page',},
certificates/empty-certificates-with-modes/EmptyCertificatesWithModes.jsx — accept canManageCertificates; swap message and hide the Add button when false:
@bra-i-am thanks for bringing the caution message. I just opened #328 and #329, so this card will be blocked for those two. We need to improve the enforcement points and provide the frontend with enough information so you can properly configure the ui.
Please feel free to enter those tickets and leave a message if you have a preference or an idea for how we can send that information to you more effectively.
I just opened #328 and #329, so this card will be blocked for those two
right, thank you... I'm looking forward to the resolution so I can implement the changes.
Please feel free to enter those tickets and leave a message if you have a preference or an idea for how we can send that information to you more effectively.
I think that just following the current code structure is enough for both: they're blocked mainly because the request responds with 403, and that fixes the frontend in an unwanted view; I'll do some review and let you know in the tickets whatever I get
Activity
bra-i-am commentedon Jun 5, 2026
Refinement
Caution
The Authoring Roles and Permissions spec only grants
manage_advanced_settingsandmanage_certificatesto Course Staff and Course Admin. Noview-onlyvariant exists for either permission. As a result, Course Auditor and Course Editor receive a 403 from both APIs and cannot access the data at all — the pages fall back to<Placeholder />("Under Construction / Coming Soon"). The frontend designs require a view-only permission to be defined and shipped in the backend first; without it, the frontend changes below cannot be implemented.Here are previous backend PRs that attempted to add
view_advanced_settings. This requires broader discussion:cc. @MaferMazu
Role matrix:
Advanced Settings
Permission used:
courses.manage_advanced_settingsAlready in
src/authz/constants.tsasCOURSE_PERMISSIONS.MANAGE_ADVANCED_SETTINGSand insrc/authz/permissionHelpers.tsasgetAdvancedSettingsPermissions(courseId).Already resolved in
advanced-settings/AdvancedSettings.tsxviauseUserPermissionsasuserPermissions?.canManageAdvancedSettings. The page currently returns<PermissionDeniedAlert />for users without permission; the new design shows the page in view-only mode: a banner belowSubHeaderand all textarea inputs set toreadOnly.Certificates
Permission used:
courses.manage_certificatesNot yet in
src/authz/constants.tsorsrc/authz/permissionHelpers.ts; both must be added as a prerequisite. The page currently shows<Placeholder />on 403 (loadingStatus === RequestStatus.DENIED). The new design shows the page with a view-only banner and all management actions hidden (Add, edit, delete, mode dropdown, activate/deactivate); only "Preview certificate" remains.UI location 1 — Advanced Settings page: view-only banner for Course Auditor and Course Editor
Files:
advanced-settings/messages.ts→advanced-settings/AdvancedSettings.tsxadvanced-settings/messages.ts— add view-only alert message:advanced-settings/AdvancedSettings.tsx— addAlertto paragon imports, addLockicon, replace thePermissionDeniedAlertearly-return with acanManageAdvancedSettingsbool, show banner, and passreadOnlyto eachSettingCard:UI location 2 — Advanced Settings page: disabled textarea inputs for Course Auditor and Course Editor
File:
advanced-settings/setting-card/SettingCard.tsxadvanced-settings/setting-card/SettingCard.tsx— acceptdisabledprop and apply it toForm.Control(uses Paragon's disabled visual style — grayed out, non-interactive):Prerequisite for Certificates —
src/authz/constants.tsandsrc/authz/permissionHelpers.tsUI location 3 — Certificates page: view-only banner for Course Auditor and Course Editor
Files:
certificates/messages.ts→certificates/Certificates.tsx→certificates/layout/MainLayout.jsxcertificates/messages.ts— add view-only alert message:certificates/Certificates.tsx— resolvecanManageCertificatesvia hook, thread it toMainLayoutand the active mode component:certificates/layout/MainLayout.jsx— acceptcanManageCertificates, show banner belowSubHeader, forward toHeaderButtons:UI location 4 — Certificates page: disable mode dropdown and hide activate/deactivate button for Course Auditor and Course Editor
File:
certificates/layout/header-buttons/HeaderButtons.jsxcertificates/layout/header-buttons/HeaderButtons.jsx— acceptcanManageCertificates; disable (not hide) the modeDropdownButton; hide the Activate/DeactivateButton; keep the PreviewHyperlinkvisible and functional:UI location 5 — Certificates page: replace empty-state message and hide Add button for Course Auditor and Course Editor
Files:
certificates/messages.ts→certificates/empty-certificates-with-modes/EmptyCertificatesWithModes.jsxcertificates/messages.ts— add new view-only empty-state message:certificates/empty-certificates-with-modes/EmptyCertificatesWithModes.jsx— acceptcanManageCertificates; swap message and hide the Add button when false:UI location 6 — Certificates page: hide edit and delete icons per certificate for Course Auditor and Course Editor
Files:
certificates/certificates-list/CertificatesList.jsx→certificates/certificate-details/CertificateDetails.jsxcertificates/certificates-list/CertificatesList.jsx— accept and forwardcanManageCertificatestoCertificateDetails:certificates/certificate-details/CertificateDetails.jsx— acceptcanManageCertificates, passnullasactionswhen false:UI location 7 — Certificates page: hide edit icon on each signatory for Course Auditor and Course Editor
Files:
certificates/certificates-list/CertificatesList.jsx→certificates/certificate-signatories/CertificateSignatories.jsx→certificates/certificate-signatories/signatory/Signatory.jsxcertificates/certificates-list/CertificatesList.jsx— forwardcanManageCertificatestoCertificateSignatories(inside the existingFieldArrayrender prop):certificates/certificate-signatories/CertificateSignatories.jsx— accept and forwardcanManageCertificatesto eachSignatory:certificates/certificate-signatories/signatory/Signatory.jsx— acceptcanManageCertificates, hide the editIconButtonWithTooltipwhen false:courses.view_advanced_settingspermission #328courses.view_certificatespermission #329MaferMazu commentedon Jun 5, 2026
@bra-i-am thanks for bringing the caution message. I just opened #328 and #329, so this card will be blocked for those two. We need to improve the enforcement points and provide the frontend with enough information so you can properly configure the ui.
Please feel free to enter those tickets and leave a message if you have a preference or an idea for how we can send that information to you more effectively.
bra-i-am commentedon Jun 5, 2026
@MaferMazu, thanks for your time reviewing this!
right, thank you... I'm looking forward to the resolution so I can implement the changes.
I think that just following the current code structure is enough for both: they're blocked mainly because the request responds with 403, and that fixes the frontend in an unwanted view; I'll do some review and let you know in the tickets whatever I get