Integrated course-launch system: compose and send/schedule email + Telegram announcements, templates on course create, cohort schedules linked to module/project START times
まだ誰も着手していません。
評価
- 難易度
- 5/5
- 見積もり時間
- 1週間以上
- 初心者へのやさしさ
- 25/100
調査の方向性
Start with the authoritative course, email, and admin API specs named in the issue, then inspect the existing Course/Cohort and curriculum placement models, Relay delivery boundary, capability registry, and deploy/cli.py. Map those contracts before tracing where nullable starts and migrations belong. Done means the listed API, Studio, CLI, schedule, safety, and verification criteria pass; this is a broad, multi-system project best suited to an experienced contributor.
索引モデルが issue の本文から書いたものです。
説明
Integrated course-launch system (website)
Raw reporter intent preserved: compose and explicitly send/schedule email + Telegram announcements; choose announcement templates on course create; launching COHORT (never self-paced) auto-generates durable schedules linked to module/project START times with missing-starts migration + documented backfill; everything editable via API/CLI incl templates/assignments/announcements/schedules/starts (inspect CLI, add AISL/DataOps-style auth CLI if absent); no public or real-user sends during development.
Groomed spec (PM, 2026-10-17 — replaces raw intake above)
Normative links
- Playbooks (source of announcement content + timing intent):
playbooks/02-course-launch-social-system.md— phased campaign (T-relative dates, module/project announcements, channel adaptation incl Slack/Telegram operational reminders)playbooks/01-course-platform-setup.md— Monday 23:00 UTC deadlines, course create → campaign → outline, copy-previous-cohort scheduleplaybooks/01-launch-checklist.md,00-cohort-brief.md,course.yaml+copy-bank/email/,copy-bank/telegram/(module-email-template, module-announcement-template, welcome/certificate/project emails)
- Website specs (authoritative):
_docs/specs/04-courses-and-cohorts.md— Course→Cohort,delivery_modelive/self_paced,curriculum_format, cohort-owned assessment, Studio coverage, Relay-backed communications_docs/specs/05-events-registration-email.md— Relay-only sends, durableEmailDelivery+ leased job, preference enforcement, dev sendercourses_docs/specs/06-studio-and-admin-api.md— Studio +/api/v1/admin/parity via capability registry, Bearer scoped/expiring principals, idempotency +If-Match, audit_docs/specs/open-decisions.md§10/§11 (Relay), §19 (Slack join-URL secrecy — Telegram destination config must follow same no-secret-retention pattern)
- Ownership contracts (coordinator-confirmed):
- C-LAUNCH-1: website canonical for current cohort/module/project scheduling; website engineer owns native start fields/migrations. CMP worker adds live legacy Homework/Project
starts_at+ API/CLI and start preservation at import boundaries. No new cross-service scheduler. - DataOps process templates use existing
offset_dayswith one Card per START anchor (separate DataOps worker — not this issue).
- C-LAUNCH-1: website canonical for current cohort/module/project scheduling; website engineer owns native start fields/migrations. CMP worker adds live legacy Homework/Project
Scope (website repo only)
- Announcement templates: CRUD + versioned immutable publish; assign defaults on Course create (email + Telegram per module/project/course-event kind); per-Cohort override. Seed from playbook
copy-bankwith{{ }}placeholders (module_number/title/urls, homework links/deadlines, course_platform_url); placeholders render only from typed Relay context. - Announcements: compose from template + cohort context; explicit two-step operator action — draft → approved/scheduled → send. Generated schedules are created unarmed (require explicit approve/schedule); edits invalidate prior approval.
- Cohort launch schedules: launching a COHORT with
delivery_mode=liveauto-generates durable schedule rows anchored to module/project START times (cohort placement-owned starts; shared curriculum never stores starts).self_pacedandgithub_archivenever generate schedules or announcements. - Native starts: add offset-aware
starts_atto cohort-owned timing owners (Cohort + Module placement / shared-module placement + Project; coordinator/launch-starts thread to confirm exact set incl whether Cohort/Homework course-level starts are in scope). Null-preserving; naive datetimes rejected;start <= end/deadline; explicit start edits never mutate deadlines. - Missing-starts migration + backfill doc: migration adds nullable starts (all NULL, no invented times); documented backfill runbook maps each known cohort/module/project boundary to explicit starts with provenance (no deadline-minus-N inference).
- Studio + Admin API parity for every capability above (registry entries, OpenAPI, permissions, audit, redaction).
- CLI: inspect existing CLIs (
deploy/cli.pyis release-only — not an operator CLI); add operator CLI with named flags,--json/human output, stable exit codes, and AISL/DataOps-style auth (stored Bearer profile,login/logout/whoami,DATAOPS_TOKEN-style env override, 0600 perms). CLI covers templates/assignments/announcements/schedules/starts. No credentials in URLs. - Safety: no public/real-user sends in dev — Relay dev sender
coursesallowlist/simulation only; controlled test-send to operator address only; Telegram adapter quarantines uncertain acknowledgement (no auto-retry ofambiguous).
Non-goals
- No CMP changes in this issue (separate CMP starts worker owns legacy Homework/Project
starts_at, API/CLI, import-boundary preservation). - No DataOps process-task extraction (separate worker).
- No new distributed scheduler/celery beat; reuse
community_base.jobsleaseddispatch_after_commit(available_at)+ Relay idempotency. - No self-paced schedules, deadlines, leaderboard, peer review, scores, certificates (spec 04 phase-one boundary).
- No marketing/newsletter expansion beyond course launch announcements; no Slack-invite changes (§19 secret-at-send preserved).
- No production sender/domain configuration, no broad recipients, no live sends.
Dependencies
- Relay email boundary +
EmailDeliverydurable model (spec 05) — reuse, do not reimplement. - Course/Cohort + curriculum placement models (spec 04) — native starts attach here.
- Capability registry + management_auth Bearer principals (spec 06) — CLI + API auth reuses these.
- Blocked by: none for grooming/build (CMP starts contract coordinated in parallel; website must not duplicate CMP runtime).
Acceptance criteria
- Templates: operator can create/edit/publish immutable versions of email + Telegram templates per kind; Course-create flow offers template assignment (defaults preselected, changeable); per-Cohort override works; seed content matches playbook copy-bank placeholders.
- Announcements: operator can compose from template + cohort context with preview; announcement stays draft until explicit approve; approved announcement can be sent now or scheduled; scheduled announcement fires once via leased job + Relay idempotency key (no duplicates on retry).
- Schedules: launching a live COHORT auto-creates durable schedule rows for each module/project START; rows are unarmed until operator approves/schedules;
self_paced/github_archivecohorts create zero rows and their announce actions fail closed with a safe message. - Starts: every timing owner exposes offset-aware
starts_at(null allowed); naive input rejected 400;start > end/deadlinerejected; start edits never change deadlines; concurrent edits use revision/If-Match(stale → 409). - Migration:
starts_atcolumns nullable; migration leaves all existing rows NULL; backfill runbook documents each explicit start + source/provenance; no inferred times;make migrate+ drift check pass. - API/CLI parity: Studio +
/api/v1/admin/+ CLI cover templates/assignments/announcements/schedules/starts with identical results; negative auth tests (no token / wrong scope / disabled principal → 401/403, no existence leak); idempotency-key replay returns same logical row; audit redacts bodies/secrets. - CLI auth:
login/logout/whoamiwork against dev host; token stored 0600, env override works;--jsonon every command;--helpwith examples. - No-send safety: dev/test sends use only Relay sender
coursesallowlist/simulation; no Amazon SES/Datamailer path; Telegram uncertain-ack becomes quarantined/ambiguous, never auto-resent; test-send requires explicit operator destination + confirmation. - Permissions:
course_operator(+email_operatorfor send/test) enforced in Studio, API, CLI;support_operatorsees masked PII only; all denials render safe messages (no stack/secret). - Empty/error states: no templates, no schedules, missing starts, past-due schedule, Relay unavailable, Telegram failure each render explicit operator guidance (no silent no-op, no 500 prose leak).
Django/integration scenarios
- Live cohort launch → schedules exist per module/project START, all unarmed; approve one → leased job → single Relay idempotency key → one logical delivery.
- Double-submit approve/schedule with same
Idempotency-Key→ one row/job; stale revision → 409. - Self-paced cohort launch → zero schedules; announce attempt → clean denial.
- Migration on production-like copy → all starts NULL; backfill script applies documented explicit starts only.
Browser scenarios (desktop + mobile, tester captures both)
- Studio course-create with template assignment; cohort-launch → schedule list (unarmed badge); announcement compose → preview → approve → schedule; past/missing-start rows show guidance, not broken layout.
- Denied principal sees safe denial; unauthenticated Studio redirects to login.
Repository/operations scenarios
uv run --frozen python scripts/ci.py test-playwright-core(render impact) or smoke tier if backend-only, plus focused Django tests for changed contracts; migration-drift check; versioned verification plan with base/head + digests.- No
.env/tokens/DB/screenshots committed; scratch under.tmp/; no live sends, secrets, or cloud mutations.
Roles
- Engineer:
launch-web(Codex,/home/alexey/git/dtc-website-wt-course-launch-system) — implement only after this grooming; leave worktree uncommitted/frozen for tester. - Tester: independent cross-engine — must pass before PM acceptance.
- PM acceptance: after tester passes; checks UX, denials, empty/error states, API/CLI/core parity.
- 主要言語
- Python
- スター
- 0
- フォーク
- 0
- PR マージ指標
- 30日以内にマージされた PR はありません
環境構築
- Dockerfile または Docker Compose ファイルあり
- プルリクエストのテンプレートなし
- コントリビューションガイドなし
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
DataTalksClub/website のほかの issue
-
bug infra operations P1 testing
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
DataTalksClub/website#329 ·
-
bug content data-migration documentation events operations P1
難易度 2/5 1〜3時間 初心者へのやさしさ 84/100
DataTalksClub/website#327 ·
-
bug frontend P0 testing
難易度 2/5 1〜3時間 初心者へのやさしさ 90/100
DataTalksClub/website#300 · コメント 7 件 ·
-
bug data-migration events P0 testing
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
DataTalksClub/website#295 · コメント 6 件 ·
-
admin courses data-migration email enhancement integration operations P1
難易度 4/5 3〜5日 初心者へのやさしさ 35/100
DataTalksClub/website#468 · コメント 6 件 ·
DataTalksClub/website の issue をすべて見る
似ている issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
SwiftKickMobile/skai#84 ·
-
難易度 1/5 1時間未満 初心者へのやさしさ 82/100
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
jxxghp/MoviePilot#7070 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
flop-labs/technocore-chat#997 ·
メンテナーはふだん 1 日以内に返信
-
tunneld on Windows: Wi-Fi devices are not discovered because uvicorn runs on a ProactorEventLoopオープン
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
doronz88/pymobiledevice3#2051 ·
メンテナーはふだん 1 日以内に返信