v4 #4
Reference in New Issue
Block a user
Delete Branch "v4"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Audit of the admin Configuration section (FAQ Manager, Notification Rules, Approval Config) surfaced three contract mismatches and one missing schema. FAQ * Backend `encoach.faq.category.audience` / `encoach.faq.item.audience` rejected the `both` and `entity` values emitted by the FAQ Manager UI. Widened the Selection so the UI's full vocabulary round-trips. * FAQ item `video_url` was already accepted by the UI but silently dropped by the controller; now persisted via a new `video_url` field on `encoach.faq.item` and serialized on list/get responses. Notification Rules * Added `days_before`, `frequency`, `channel`, `entity_id` to `encoach.notification.rule`. These are the exact fields the admin form collects; prior to this change they were serialized into the JSON body, ignored by the controller, and omitted from responses, leaving the Active switch permanently off and the table columns blank. * Controller now translates `active` <-> `is_active` both ways so the new frontend contract and legacy callers coexist. Missing required fields return HTTP 400 instead of 500. Approval Workflows * The controller had been hand-rolling raw SQL against three tables (`encoach_approval_workflow`, `_stage`, `_request`) that no Odoo model declared, so the tables never existed. List() was guarded and returned empty; create() would 500 with "relation does not exist". * Introduced real ORM models in `encoach_exam_template/models/approval.py` plus access rights, which auto-provision the tables on -u. * Rewrote the controller to use ORM, added PATCH, and emitted both `items` and `results` in the list envelope so the frontend's PaginatedResponse reader and legacy callers both work. Step payloads now carry `max_days`, `auto_escalate`, and `notification_email` end to end. * Frontend `approvalsService` and `ApprovalWorkflowConfig` updated to send the full stage shape + `allow_bypass`, tolerate both envelope keys, and validate at least one approver before submit. Schema delta applied via `./run.sh -u encoach_exam_template,encoach_lms_api`. Verified with new `test_config_flows.py`: 24/24 passing. Regression runs on `test_support_flows.py` (29/29) and `test_training_flows.py` (26/26) remain green. Made-with: CursorRoadmap P0 — platform safety & ops - Merge duplicate encoach.student.attempt/answer models into encoach_scoring and drop the stale encoach_exam_template copies. - Remove duplicate /api/exam/* routes; canonicalize on one controller tree. - Gate raw-SQL seeds in seed_demo_data.py behind an explicit env flag. - Add /api/health and /api/health/ready (DB + LLM reachability) endpoints. - Fix docker-compose + ship odoo-docker.conf for container-local runs. - Enforce OpenAI request_timeout=30s and @jwt_required on all AI/coach routes. - Promote canonical cefr_mapper to encoach_ai.services.cefr_mapper. - JWT cache TTL=30s + invalidation hook on user mutation. Roadmap P1 — exam correctness & data provenance - Wire QualityChecker + IeltsValidator into exam submit with a pending_review gate (encoach_ai.services.question_validator). - Populate RAG metadata (course_id, subject_id, entity_id, taxonomy) on encoach_vector embeddings and add a chunking pipeline (>2000 chars). - Add provenance fields on encoach.question (model, prompt_hash, log_id) and validate LLM output with schema before DB insert. - Unify response envelope to {items,total,page,size}. - Approval reject rollback with savepoint atomicity. - Ticket notifications on status/assignee change. Roadmap P2 — performance & observability - Reports: replace Python loops with SQL read_group aggregations. - X-Request-ID middleware + structured JSON logs. - In-process/Prometheus counters and openapi.py controller exporting a spec by scanning @http.route decorators. - Paymob real checkout + HMAC-SHA512 webhook verification, backed by a new encoach.paymob.order model and ir.config_parameter credentials. - JWT refresh tokens + revocation table. - Composite DB indexes on hot report/ticket/attempt paths. Roadmap P3 — human-in-the-loop & compliance - Human-in-the-loop exam review workflow (pending_review → publish) with new review controller and status transitions. - encoach.ai.prompt model + versioning + admin editor endpoints (one active version per key, render-preview dry run). - Student feedback loop → encoach.ai.feedback (upsert per user/subject, admin triage + resolve endpoints). - GDPR export (/api/gdpr/export) and right-to-erasure (/api/gdpr/delete) with anonymization, tombstone record, and admin-self-erasure guard. - HttpCase smoke tests for /api/health and /api/health/ready. Made-with: CursorRoadmap P0 - Ship /logo.svg fallback and rewire asset references (superseded later by the project-manager PNG in a separate commit). Roadmap P1 - Response envelope alignment ({items,total,page,size}) across services and query hooks. - Approval/ticket UX updates tied to the new backend rollback semantics. Roadmap P2 - React.lazy + Vite manualChunks to split vendor-radix/charts/icons/forms from the main bundle and cut initial JS. - Fix the 181 tsc errors (PaginationParams class + per-service generics). - Auto-refresh flow for JWT refresh tokens wired into api-client.ts. Roadmap P3 - i18n: i18next + language detector, en/ar locales, RTL auto-switch, LanguageToggle component in RoleLayout and AdminLmsLayout. - GDPR: PrivacyCenter page for data export and right-to-erasure, backed by gdpr.service.ts; logout via AuthContext after erasure. - Human-in-the-loop exam review UI: admin ExamReviewQueue + ExamReviewDetail pages, useExamReview hooks, exam-review.service.ts. - AI quality loop: AIPromptEditor (versioning + render preview), AIFeedbackButtons for students, AIFeedbackTriage admin page, dedicated services, hooks, and types. - Dark mode: ThemeProvider + ThemeToggle + chart color tokens. - Accessibility: DialogDescription on every DialogContent; alert-dialog and sheet updates. - Retire dead pages: ExamPage marketing, Index, ProfilePage import. - Playwright e2e scaffolding: playwright.config.ts + e2e/login.spec.ts smoke tests, npm scripts test:e2e / test:e2e:install. Made-with: Cursor