Backend - Routes moved under /api/, JWT bearer auth via @before_request - DEV_AUTH_BYPASS escape hatch for local dev - In-memory chat history and report state replaced with Postgres tables (preferences, chat_messages, reports, feedback_events) keyed on user - SQLAlchemy 2.x + Alembic migrations run on container start - Graceful Airtable failure handling — bad creds no longer 500 the API - Per-user data isolation via g.user_email from validated token Frontend - React + Vite + TypeScript SPA at /programme-pulse/ - MSAL.js (PKCE, sessionStorage, ID token to backend) - VITE_DEV_AUTH_BYPASS mirrors backend bypass for local dev - Streaming chat via fetch ReadableStream + SSE parsing - Charts via chart.js, markdown via react-markdown + remark-gfm - Full UI parity with the original templates/index.html Deploy (optical-dev split-build pattern) - Dockerfile + docker-compose.yml (name: programme-pulse pinned; app + Postgres; 127.0.0.1 binding only) - deploy/apache-programme-pulse.conf.tmpl with flushpackets=on for SSE - deploy/deploy.sh mirrors OSOP — port auto-pick (5051..5099), apache conf render, frontend build in throwaway node container, rsync to /var/www/html/programme-pulse, /api/health poll Tests - 49 passing; new tests for DB-backed preferences and JWT auth helpers - SQLite-backed test fixture in tests/conftest.py Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
166 lines
6.6 KiB
JSON
166 lines
6.6 KiB
JSON
[
|
|
{
|
|
"Project Number": "LLD-001",
|
|
"Project Name": "Lancôme Visionnaire Campaign",
|
|
"Project Type": "Campaign",
|
|
"Brand": "LANCOME",
|
|
"Hub": "Global",
|
|
"Country": "FR",
|
|
"Division": "LLD",
|
|
"PM": "Sarah Jones",
|
|
"Current Stage": "Stage 3 - Production",
|
|
"Project Status": "On Track - OLIVER",
|
|
"Project Risk - NEW": "On Track - OLIVER",
|
|
"Current Stage Status": "In Progress",
|
|
"Project End Date": "2026-05-30",
|
|
"Current Stage Deadline": "2026-04-20",
|
|
"Action Required": "",
|
|
"Last Modified Time (on row)": "2026-04-10T09:00:00.000Z",
|
|
"Asset Count (Deliverable Roll Up)": 10,
|
|
"Completed Deliverable Count": 7,
|
|
"7. Opera Upload": "Not Started",
|
|
"7. Opera Upload DDL": "2026-05-25",
|
|
"7. Opera Upload Status": "Not Started",
|
|
"Has Deadline Slipped": false,
|
|
"Syndication Deadline Slip (Days)": 0,
|
|
"New Deadline Proposed by Oliver": "",
|
|
"Brief Submitted Date": "2026-02-01",
|
|
"Brief Acceptance Date (from Briefs Link) 2": "2026-02-03",
|
|
"Market's Action Needed": false,
|
|
"1. Missing DMI Asset Creation DDL": "2026-02-10",
|
|
"1. Missing DMI Asset Creation Status": "Complete",
|
|
"2. Mastering, Copy Creation / Extraction DDL": "2026-03-01",
|
|
"2. Mastering, Copy Creation / Extraction Status": "Complete",
|
|
"3. Global Rollout Invitation DDL": "2026-03-15",
|
|
"3. Global Rollout Invitation Status": "Complete",
|
|
"4. Translation (Salsify PDP) DDL": "2026-04-01",
|
|
"4. Translation (Salsify PDP) Status": "Complete",
|
|
"5. Translation (Asset) DDL": "2026-04-10",
|
|
"5. Translation (Asset) Status": "In Progress",
|
|
"6. Production DDL": "2026-04-20",
|
|
"6. Production Status": "In Progress"
|
|
},
|
|
{
|
|
"Project Number": "LLD-002",
|
|
"Project Name": "YSL Beauty Hero Asset",
|
|
"Project Type": "Asset Production",
|
|
"Brand": "YSL",
|
|
"Hub": "EMEA",
|
|
"Country": "UK",
|
|
"Division": "LLD",
|
|
"PM": "",
|
|
"Current Stage": "Stage 2 - Development",
|
|
"Project Status": "Attention Required - ECF",
|
|
"Project Risk - NEW": "Attention Required - OLIVER",
|
|
"Current Stage Status": "Delayed",
|
|
"Project End Date": "2026-04-01",
|
|
"Current Stage Deadline": "2026-03-25",
|
|
"Action Required": "Awaiting client feedback",
|
|
"Last Modified Time (on row)": "2026-03-28T14:00:00.000Z",
|
|
"Asset Count (Deliverable Roll Up)": 5,
|
|
"Completed Deliverable Count": 1,
|
|
"7. Opera Upload": "Not Started",
|
|
"7. Opera Upload DDL": "2026-03-28",
|
|
"7. Opera Upload Status": "Not Started",
|
|
"Has Deadline Slipped": true,
|
|
"Syndication Deadline Slip (Days)": 18,
|
|
"New Deadline Proposed by Oliver": "2026-04-15",
|
|
"Brief Submitted Date": "2026-01-15",
|
|
"Brief Acceptance Date (from Briefs Link) 2": "2026-01-22",
|
|
"Market's Action Needed": false,
|
|
"1. Missing DMI Asset Creation DDL": "2026-02-01",
|
|
"1. Missing DMI Asset Creation Status": "Complete",
|
|
"2. Mastering, Copy Creation / Extraction DDL": "2026-03-01",
|
|
"2. Mastering, Copy Creation / Extraction Status": "Delayed",
|
|
"3. Global Rollout Invitation DDL": "2026-03-15",
|
|
"3. Global Rollout Invitation Status": "Not Started",
|
|
"4. Translation (Salsify PDP) DDL": "2026-03-20",
|
|
"4. Translation (Salsify PDP) Status": "Not Started",
|
|
"5. Translation (Asset) DDL": "2026-03-25",
|
|
"5. Translation (Asset) Status": "Not Started",
|
|
"6. Production DDL": "2026-03-28",
|
|
"6. Production Status": "Not Started"
|
|
},
|
|
{
|
|
"Project Number": "LLD-003",
|
|
"Project Name": "Armani Beauty Refresh",
|
|
"Project Type": "Refresh",
|
|
"Brand": "ARMANI",
|
|
"Hub": "Global",
|
|
"Country": "IT",
|
|
"Division": "LLD",
|
|
"PM": "Tom Baker",
|
|
"Current Stage": "Stage 4 - Review",
|
|
"Project Status": "On Track - Market",
|
|
"Project Risk - NEW": "On Track - Market",
|
|
"Current Stage Status": "In Review",
|
|
"Project End Date": "2026-06-15",
|
|
"Current Stage Deadline": "2026-04-30",
|
|
"Action Required": "",
|
|
"Last Modified Time (on row)": "2026-04-11T11:00:00.000Z",
|
|
"Asset Count (Deliverable Roll Up)": 8,
|
|
"Completed Deliverable Count": 8,
|
|
"7. Opera Upload": "Not Started",
|
|
"7. Opera Upload DDL": "2026-06-10",
|
|
"7. Opera Upload Status": "Not Started",
|
|
"Has Deadline Slipped": false,
|
|
"Syndication Deadline Slip (Days)": 0,
|
|
"New Deadline Proposed by Oliver": "",
|
|
"Brief Submitted Date": "2026-01-20",
|
|
"Brief Acceptance Date (from Briefs Link) 2": "2026-01-21",
|
|
"Market's Action Needed": true,
|
|
"1. Missing DMI Asset Creation DDL": "2026-02-15",
|
|
"1. Missing DMI Asset Creation Status": "Complete",
|
|
"2. Mastering, Copy Creation / Extraction DDL": "2026-03-10",
|
|
"2. Mastering, Copy Creation / Extraction Status": "Complete",
|
|
"3. Global Rollout Invitation DDL": "2026-03-25",
|
|
"3. Global Rollout Invitation Status": "Complete",
|
|
"4. Translation (Salsify PDP) DDL": "2026-04-15",
|
|
"4. Translation (Salsify PDP) Status": "In Review",
|
|
"5. Translation (Asset) DDL": "2026-04-20",
|
|
"5. Translation (Asset) Status": "Not Started",
|
|
"6. Production DDL": "2026-04-30",
|
|
"6. Production Status": "Not Started"
|
|
},
|
|
{
|
|
"Project Number": "LLD-004",
|
|
"Project Name": "Biotherm Blue Therapy",
|
|
"Project Type": "Campaign",
|
|
"Brand": "BIOTHERM",
|
|
"Hub": "APAC",
|
|
"Country": "CN",
|
|
"Division": "LLD",
|
|
"PM": "Emma Liu",
|
|
"Current Stage": "Stage 1 - Briefing",
|
|
"Project Status": "Attention Required - Market",
|
|
"Project Risk - NEW": "",
|
|
"Current Stage Status": "",
|
|
"Project End Date": "2026-04-05",
|
|
"Current Stage Deadline": "2026-03-30",
|
|
"Action Required": "",
|
|
"Last Modified Time (on row)": "2026-03-20T08:00:00.000Z",
|
|
"Asset Count (Deliverable Roll Up)": 12,
|
|
"Completed Deliverable Count": 0,
|
|
"7. Opera Upload": "Not Started",
|
|
"7. Opera Upload DDL": "2026-04-01",
|
|
"7. Opera Upload Status": "Not Started",
|
|
"Has Deadline Slipped": true,
|
|
"Syndication Deadline Slip (Days)": 7,
|
|
"New Deadline Proposed by Oliver": "",
|
|
"Brief Submitted Date": "2026-02-10",
|
|
"Brief Acceptance Date (from Briefs Link) 2": "",
|
|
"Market's Action Needed": true,
|
|
"1. Missing DMI Asset Creation DDL": "2026-03-01",
|
|
"1. Missing DMI Asset Creation Status": "Not Started",
|
|
"2. Mastering, Copy Creation / Extraction DDL": "2026-03-15",
|
|
"2. Mastering, Copy Creation / Extraction Status": "Not Started",
|
|
"3. Global Rollout Invitation DDL": "2026-03-25",
|
|
"3. Global Rollout Invitation Status": "Not Started",
|
|
"4. Translation (Salsify PDP) DDL": "2026-03-30",
|
|
"4. Translation (Salsify PDP) Status": "Not Started",
|
|
"5. Translation (Asset) DDL": "2026-04-01",
|
|
"5. Translation (Asset) Status": "Not Started",
|
|
"6. Production DDL": "2026-04-05",
|
|
"6. Production Status": "Not Started"
|
|
}
|
|
]
|