Summary
When a learner's enrollment has a certificate, the enrollment page should show how to add that certificate to LinkedIn, with the values they need ready to paste. Certificate holders are finishers; collecting the certificate is a good moment to ask them to publicize the course.
The idea and the source text come from the retired per-repo certificates.md quoted in the original intake (preserved in this issue's history). Only the LinkedIn-sharing part is in scope; the certificate-ID/URL retrieval instructions are not, because the website already serves certificates live.
Normative references
Scope and behavior
- Surface: only the learner's enrollment settings page,
courses/views/course_enrollment.py::enrollment_view (template courses/templates/courses/enrollment.html). The view is @login_required and queries the enrollment by request.user, so the section can only show the viewer's own data.
- When
enrollment.certificate_url is set, the existing certificate block gains an "Add to LinkedIn" subsection containing:
- the ordered steps below;
- the two known values rendered for easy copying: the certification name (the course title as shown for this enrollment) and the certification URL (the learner's
certificate_url, rendered as a link);
- the optional fields left as instructions with no server-provided value.
- When
certificate_url is unset or empty, the page renders exactly as today ("Not available"); no new empty state, prompt, or banner.
- Server-rendered template HTML only; no new JS behavior is required. If a small progressive enhancement is proposed it must carry its own tests and stay inside the design system.
Exact steps text, adapted from the retired certificates.md (wording may be tuned without changing meaning):
- Log in to your LinkedIn account, then go to your profile.
- On the right, in the "Add profile section" dropdown, choose "Background" and select the drop-down triangle next to "Licenses & Certifications".
- In "Name", enter the course title shown below.
- In "Issuing Organization", enter "DataTalksClub".
- (Optional) In "Issue Date", enter when you earned the certificate, and select "This certification does not expire".
- (Optional) In "Credential ID", enter the certificate ID — the identifying code in your certificate URL.
- In "Certification URL", enter your certificate URL shown below.
Step 6's phrasing assumes the legacy convention that the URL slug is the credential ID (see intake history). Do not add retrieval instructions, and do not derive, validate, or store IDs in code.
Non-goals
- No one-time modal or seen-state tracking. Certificates arrive through the CMP learner-history import, so there is no issuing event to key a one-time prompt on; the prompt is a persistent section.
- No pre-filled LinkedIn "add to profile" deep link or one-click share. External LinkedIn URL formats are not part of any spec; the steps are manual.
- No share buttons for other networks, no email/notification, no badge or OG-image generation.
- No changes to the course page "Download Certificate" button, the member homepage, dashboard aggregates, certificate import, models, migrations, URLs, APIs, or admin.
- No public-content change: this is private, authenticated UI help text in the template, not database-owned public content.
Dependencies
None; everything needed exists on current main.
Acceptance criteria
Meaningful verification scenarios
- Django/integration: render the enrollment view with and without
certificate_url; assert the section markup, the two values, and that the no-certificate page is unchanged.
- Browser (tester): a signed-in learner with a certificate, desktop 1440×900 and mobile 390×844, light and dark: the section renders under the certificate value, text wraps naturally, and the certificate link opens. A signed-in learner without a certificate sees the unchanged page. Template-only change with render impact: applicable Playwright tier per process, plus route/state screenshots under
.tmp/screenshots/.
- Repository/operations: the diff stays confined to the enrollment template and its focused tests; no model, migration, or URL changes.
Summary
When a learner's enrollment has a certificate, the enrollment page should show how to add that certificate to LinkedIn, with the values they need ready to paste. Certificate holders are finishers; collecting the certificate is a good moment to ask them to publicize the course.
The idea and the source text come from the retired per-repo
certificates.mdquoted in the original intake (preserved in this issue's history). Only the LinkedIn-sharing part is in scope; the certificate-ID/URL retrieval instructions are not, because the website already serves certificates live.Normative references
_docs/specs/04-courses-and-cohorts.md. Certificates are legacy cohort-scoped URL data onEnrollment; this change adds no certificate state or issuing behavior._docs/design/design-system.md; the new content joins the existing.enrollment-certificateblock and its mono-label/dashed-divider pattern._docs/PROCESS.md,_docs/specs/10-verification-strategy.md,_docs/ci/change-selective-ci.md.Scope and behavior
courses/views/course_enrollment.py::enrollment_view(templatecourses/templates/courses/enrollment.html). The view is@login_requiredand queries the enrollment byrequest.user, so the section can only show the viewer's own data.enrollment.certificate_urlis set, the existing certificate block gains an "Add to LinkedIn" subsection containing:certificate_url, rendered as a link);certificate_urlis unset or empty, the page renders exactly as today ("Not available"); no new empty state, prompt, or banner.Exact steps text, adapted from the retired
certificates.md(wording may be tuned without changing meaning):Step 6's phrasing assumes the legacy convention that the URL slug is the credential ID (see intake history). Do not add retrieval instructions, and do not derive, validate, or store IDs in code.
Non-goals
Dependencies
None; everything needed exists on current main.
Acceptance criteria
certificate_urlrenders the LinkedIn section with the seven steps and both known values; the values match that enrollment's course title and certificate URL.certificate_urlrenders exactly as today, with no LinkedIn section and no new empty state._docs/ci/change-selective-ci.md.Meaningful verification scenarios
certificate_url; assert the section markup, the two values, and that the no-certificate page is unchanged..tmp/screenshots/.