feat: add OpenEduCat institutional LMS features + Odoo 19 Backend SRS
- Update ENCOACH_UNIFIED_SRS.md with 6 new feature sections: Academic Year/Term, Departments, Admission/Enrollment, Subject Registration, Institutional Exams, Assignment Submissions - Add TypeScript types: academic.ts, admission.ts, institutional-exam.ts - Add API services: academic, admission, institutional-exam - Add TanStack Query hooks: useAcademic, useAdmissions, useInstitutionalExams - Add 9 new pages: AcademicYearManager, DepartmentManager, AdmissionList, AdmissionDetail, AdmissionRegisterPage, AdmissionApplication, SubjectRegistrationPage, InstitutionalExamSessions, MarksheetManager - Update App.tsx routes, AdminLmsLayout sidebar (Institutional group), StudentLayout sidebar (Subject Registration) - Generate ENCOACH_ODOO19_BACKEND_SRS.md: complete Odoo 19 backend spec covering 200+ REST API endpoints, 31 modules, all OpenEduCat models Made-with: Cursor
This commit is contained in:
1281
docs/ENCOACH_ODOO19_BACKEND_SRS.md
Normal file
1281
docs/ENCOACH_ODOO19_BACKEND_SRS.md
Normal file
File diff suppressed because it is too large
Load Diff
@@ -53,11 +53,19 @@
|
||||
28. [Subscriptions and Payments](#28-subscriptions-and-payments)
|
||||
29. [Training Content](#29-training-content)
|
||||
|
||||
**Part VIII -- Technical Specifications**
|
||||
30. [Data Models](#30-data-models)
|
||||
31. [REST API Specification](#31-rest-api-specification)
|
||||
32. [Frontend Page Inventory](#32-frontend-page-inventory)
|
||||
33. [Non-Functional Requirements](#33-non-functional-requirements)
|
||||
**Part VIII -- Institutional LMS (OpenEduCat)**
|
||||
30. [Academic Year and Term Management](#30-academic-year-and-term-management)
|
||||
31. [Department Management](#31-department-management)
|
||||
32. [Admission and Enrollment](#32-admission-and-enrollment)
|
||||
33. [Subject Registration](#33-subject-registration)
|
||||
34. [Institutional Exam Sessions](#34-institutional-exam-sessions)
|
||||
35. [Assignment File Submissions](#35-assignment-file-submissions)
|
||||
|
||||
**Part IX -- Technical Specifications**
|
||||
36. [Data Models](#36-data-models)
|
||||
37. [REST API Specification](#37-rest-api-specification)
|
||||
38. [Frontend Page Inventory](#38-frontend-page-inventory)
|
||||
39. [Non-Functional Requirements](#39-non-functional-requirements)
|
||||
|
||||
---
|
||||
|
||||
@@ -344,7 +352,7 @@ The current permission model is IELTS-hardcoded (`generate_reading`, `createWrit
|
||||
| FR-SIDE-03 | Logout ends session and clears state |
|
||||
| FR-SIDE-04 | Ticket badge shows assigned count |
|
||||
|
||||
**Student sidebar:** Dashboard, Subjects, Courses, Assignments, Grades, Attendance, Timetable, Profile
|
||||
**Student sidebar:** Dashboard, Subjects, Courses, Subject Registration, Assignments, Grades, Attendance, Timetable, Profile
|
||||
|
||||
**Teacher sidebar:** Dashboard, Courses, Assignments, Attendance, Students, Timetable, Profile
|
||||
|
||||
@@ -354,6 +362,7 @@ The current permission model is IELTS-hardcoded (`generate_reading`, `createWrit
|
||||
|-------|-------|
|
||||
| **LMS** | Dashboard, Courses, Students, Teachers, Batches, Timetable, Reports, Settings |
|
||||
| **Platform** | Platform Dashboard |
|
||||
| **Institutional** | Academic Years, Departments, Admissions, Exam Sessions, Marksheets |
|
||||
| **Academic** | Assignments, Exams List, Exam Structures, Rubrics, Generation, Approval Workflows |
|
||||
| **Management** | Users, Entities, Classrooms, Taxonomy Manager, Resource Manager |
|
||||
| **Reports** | Student Performance, Stats Corporate, Record |
|
||||
@@ -962,11 +971,469 @@ Each simulated AI component in the new frontend maps to a real backend service:
|
||||
|
||||
---
|
||||
|
||||
# Part VIII -- Technical Specifications
|
||||
# Part VIII -- Institutional LMS (OpenEduCat)
|
||||
|
||||
## 30. Data Models
|
||||
All LMS features in this part are backed by OpenEduCat community modules (ported to Odoo 19). The `encoach_lms_api` module extends these models and exposes them via REST API to the React frontend.
|
||||
|
||||
### 30.1 Existing Models (from `ielts-be-v0`)
|
||||
---
|
||||
|
||||
## 30. Academic Year and Term Management
|
||||
|
||||
### 30.1 Overview
|
||||
|
||||
Academic years define the institutional calendar. Each year contains terms (semesters, quarters) that govern course scheduling, batch periods, and exam sessions.
|
||||
|
||||
### 30.2 Data Models (OpenEduCat)
|
||||
|
||||
**`op.academic.year`**
|
||||
|
||||
| Field | Type | Description |
|
||||
|-------|------|-------------|
|
||||
| `name` | Char | Academic year name (e.g., "2026-2027") |
|
||||
| `start_date` | Date | Year start |
|
||||
| `end_date` | Date | Year end |
|
||||
| `term_structure` | Selection | `two_sem`, `two_sem_qua`, `three_sem`, `four_Quarter`, `final_year`, `others` |
|
||||
| `academic_term_ids` | One2many | Terms within this year |
|
||||
|
||||
**`op.academic.term`**
|
||||
|
||||
| Field | Type | Description |
|
||||
|-------|------|-------------|
|
||||
| `name` | Char | Term name (e.g., "Semester 1") |
|
||||
| `term_start_date` | Date | Term start |
|
||||
| `term_end_date` | Date | Term end |
|
||||
| `academic_year_id` | Many2one | Parent academic year |
|
||||
| `parent_term` | Many2one | Parent term (for quarters within semesters) |
|
||||
|
||||
### 30.3 Functional Requirements
|
||||
|
||||
| ID | Requirement | Route | Role |
|
||||
|----|-------------|-------|------|
|
||||
| FR-AY-01 | List academic years with terms | `/admin/academic-years` | Admin |
|
||||
| FR-AY-02 | Create academic year with term structure selection | `/admin/academic-years` | Admin |
|
||||
| FR-AY-03 | Auto-generate terms based on selected structure | `/admin/academic-years` | Admin |
|
||||
| FR-AY-04 | Edit/delete academic years and terms | `/admin/academic-years` | Admin |
|
||||
| FR-AY-05 | Link batches and courses to academic terms | Related pages | Admin |
|
||||
|
||||
### 30.4 API Endpoints
|
||||
|
||||
| Method | Path | Description |
|
||||
|--------|------|-------------|
|
||||
| `GET` | `/api/academic-years` | List academic years |
|
||||
| `POST` | `/api/academic-years` | Create academic year |
|
||||
| `GET` | `/api/academic-years/{id}` | Get year with terms |
|
||||
| `PATCH` | `/api/academic-years/{id}` | Update year |
|
||||
| `DELETE` | `/api/academic-years/{id}` | Delete year |
|
||||
| `POST` | `/api/academic-years/{id}/generate-terms` | Auto-generate terms from structure |
|
||||
| `GET` | `/api/academic-terms` | List terms (filter by year) |
|
||||
| `POST` | `/api/academic-terms` | Create term |
|
||||
| `PATCH` | `/api/academic-terms/{id}` | Update term |
|
||||
| `DELETE` | `/api/academic-terms/{id}` | Delete term |
|
||||
|
||||
---
|
||||
|
||||
## 31. Department Management
|
||||
|
||||
### 31.1 Overview
|
||||
|
||||
Departments organize faculty, courses, and subjects into academic units (e.g., "Department of Mathematics", "Department of IT").
|
||||
|
||||
### 31.2 Data Model (OpenEduCat)
|
||||
|
||||
**`op.department`**
|
||||
|
||||
| Field | Type | Description |
|
||||
|-------|------|-------------|
|
||||
| `name` | Char | Department name |
|
||||
| `code` | Char | Department code |
|
||||
| `parent_id` | Many2one | Parent department (for hierarchy) |
|
||||
|
||||
### 31.3 Functional Requirements
|
||||
|
||||
| ID | Requirement | Route | Role |
|
||||
|----|-------------|-------|------|
|
||||
| FR-DEPT-01 | List departments | `/admin/departments` | Admin |
|
||||
| FR-DEPT-02 | Create/edit department | `/admin/departments` | Admin |
|
||||
| FR-DEPT-03 | Delete department | `/admin/departments` | Admin |
|
||||
| FR-DEPT-04 | Assign department to courses and faculty | Related pages | Admin |
|
||||
|
||||
### 31.4 API Endpoints
|
||||
|
||||
| Method | Path | Description |
|
||||
|--------|------|-------------|
|
||||
| `GET` | `/api/departments` | List departments |
|
||||
| `POST` | `/api/departments` | Create department |
|
||||
| `PATCH` | `/api/departments/{id}` | Update department |
|
||||
| `DELETE` | `/api/departments/{id}` | Delete department |
|
||||
|
||||
---
|
||||
|
||||
## 32. Admission and Enrollment
|
||||
|
||||
### 32.1 Overview
|
||||
|
||||
The admission workflow manages student applications from submission through confirmation to enrollment. Admission registers define open enrollment windows.
|
||||
|
||||
### 32.2 Data Models (OpenEduCat)
|
||||
|
||||
**`op.admission.register`**
|
||||
|
||||
| Field | Type | Description |
|
||||
|-------|------|-------------|
|
||||
| `name` | Char | Register name (e.g., "Fall 2026 Admissions") |
|
||||
| `course_id` | Many2one | Target course |
|
||||
| `start_date` | Date | Application window start |
|
||||
| `end_date` | Date | Application window end |
|
||||
| `min_count` | Integer | Minimum applications to proceed |
|
||||
| `max_count` | Integer | Maximum applications accepted |
|
||||
| `state` | Selection | `draft`, `confirm`, `cancel`, `done` |
|
||||
| `product_id` | Many2one | Fee product for admission |
|
||||
|
||||
**`op.admission`**
|
||||
|
||||
| Field | Type | Description |
|
||||
|-------|------|-------------|
|
||||
| `name` | Char | Applicant name |
|
||||
| `application_number` | Char | Auto-generated application number |
|
||||
| `register_id` | Many2one | Admission register |
|
||||
| `course_id` | Many2one | Applied course |
|
||||
| `batch_id` | Many2one | Target batch |
|
||||
| `first_name` | Char | First name |
|
||||
| `middle_name` | Char | Middle name |
|
||||
| `last_name` | Char | Last name |
|
||||
| `email` | Char | Email |
|
||||
| `phone` | Char | Phone |
|
||||
| `birth_date` | Date | Date of birth |
|
||||
| `gender` | Selection | `m`, `f`, `o` |
|
||||
| `nationality` | Many2one | Country |
|
||||
| `state` | Selection | `draft`, `submit`, `confirm`, `admission`, `reject`, `cancel`, `done` |
|
||||
| `fees` | Float | Admission fee amount |
|
||||
| `image` | Binary | Applicant photo |
|
||||
| `student_id` | Many2one | Created student record (after admission) |
|
||||
|
||||
### 32.3 Functional Requirements
|
||||
|
||||
| ID | Requirement | Route | Role |
|
||||
|----|-------------|-------|------|
|
||||
| FR-ADM-01 | List admission registers with status | `/admin/admission-register` | Admin |
|
||||
| FR-ADM-02 | Create/edit admission register (course, dates, capacity) | `/admin/admission-register` | Admin |
|
||||
| FR-ADM-03 | Open/close admission register | `/admin/admission-register` | Admin |
|
||||
| FR-ADM-04 | List admissions with filters (status, course, register) | `/admin/admissions` | Admin |
|
||||
| FR-ADM-05 | View admission detail | `/admin/admissions/:id` | Admin |
|
||||
| FR-ADM-06 | Transition admission status (submit, confirm, admit, reject) | `/admin/admissions/:id` | Admin |
|
||||
| FR-ADM-07 | On admit: auto-create `op.student` and `op.student.course` records | Backend | System |
|
||||
| FR-ADM-08 | Public admission application form | `/apply` | Public/Student |
|
||||
| FR-ADM-09 | Applicant status tracking | `/apply/status` | Public |
|
||||
|
||||
### 32.4 API Endpoints
|
||||
|
||||
| Method | Path | Description |
|
||||
|--------|------|-------------|
|
||||
| `GET` | `/api/admission-registers` | List registers |
|
||||
| `POST` | `/api/admission-registers` | Create register |
|
||||
| `PATCH` | `/api/admission-registers/{id}` | Update register |
|
||||
| `POST` | `/api/admission-registers/{id}/confirm` | Confirm register |
|
||||
| `POST` | `/api/admission-registers/{id}/close` | Close register |
|
||||
| `GET` | `/api/admissions` | List admissions |
|
||||
| `GET` | `/api/admissions/{id}` | Get admission detail |
|
||||
| `POST` | `/api/admissions` | Submit admission application |
|
||||
| `POST` | `/api/admissions/{id}/submit` | Submit for review |
|
||||
| `POST` | `/api/admissions/{id}/confirm` | Confirm admission |
|
||||
| `POST` | `/api/admissions/{id}/admit` | Admit applicant (creates student) |
|
||||
| `POST` | `/api/admissions/{id}/reject` | Reject admission |
|
||||
|
||||
---
|
||||
|
||||
## 33. Subject Registration
|
||||
|
||||
### 33.1 Overview
|
||||
|
||||
Within enrolled courses, students register for specific subjects. This is required for timetable, attendance, and exam eligibility.
|
||||
|
||||
### 33.2 Data Model (OpenEduCat)
|
||||
|
||||
**`op.subject.registration`**
|
||||
|
||||
| Field | Type | Description |
|
||||
|-------|------|-------------|
|
||||
| `student_id` | Many2one | Student |
|
||||
| `course_id` | Many2one | Course |
|
||||
| `batch_id` | Many2one | Batch |
|
||||
| `subject_ids` | Many2many | Selected subjects |
|
||||
| `min_unit_load` | Float | Minimum units from course config |
|
||||
| `max_unit_load` | Float | Maximum units from course config |
|
||||
| `state` | Selection | `draft`, `confirm`, `reject`, `done` |
|
||||
|
||||
### 33.3 Functional Requirements
|
||||
|
||||
| ID | Requirement | Route | Role |
|
||||
|----|-------------|-------|------|
|
||||
| FR-SR-01 | Students view available subjects for enrolled courses | `/student/subject-registration` | Student |
|
||||
| FR-SR-02 | Students select subjects within unit load limits | `/student/subject-registration` | Student |
|
||||
| FR-SR-03 | Submit registration for approval | `/student/subject-registration` | Student |
|
||||
| FR-SR-04 | Admin/teacher view and approve/reject registrations | `/admin/students` | Admin |
|
||||
| FR-SR-05 | Confirmed registration updates `op.student.course.subject_ids` | Backend | System |
|
||||
|
||||
### 33.4 API Endpoints
|
||||
|
||||
| Method | Path | Description |
|
||||
|--------|------|-------------|
|
||||
| `GET` | `/api/subject-registrations` | List registrations (filter by student, course, status) |
|
||||
| `POST` | `/api/subject-registrations` | Create registration |
|
||||
| `PATCH` | `/api/subject-registrations/{id}` | Update subjects |
|
||||
| `POST` | `/api/subject-registrations/{id}/confirm` | Confirm registration |
|
||||
| `POST` | `/api/subject-registrations/{id}/reject` | Reject registration |
|
||||
| `GET` | `/api/subject-registrations/available` | Get available subjects for current student |
|
||||
|
||||
---
|
||||
|
||||
## 34. Institutional Exam Sessions
|
||||
|
||||
### 34.1 Overview
|
||||
|
||||
Institutional exam sessions group traditional exams (midterms, finals) for a course/batch. These are separate from EnCoach AI-powered exams. They use the OpenEduCat exam, marksheet, and grading system.
|
||||
|
||||
### 34.2 Data Models (OpenEduCat)
|
||||
|
||||
**`op.exam.session`**
|
||||
|
||||
| Field | Type | Description |
|
||||
|-------|------|-------------|
|
||||
| `name` | Char | Session name (e.g., "Fall 2026 Midterms") |
|
||||
| `course_id` | Many2one | Course |
|
||||
| `batch_id` | Many2one | Batch |
|
||||
| `exam_code` | Char | Session code |
|
||||
| `start_date` | Date | Session start |
|
||||
| `end_date` | Date | Session end |
|
||||
| `exam_type` | Many2one | Exam type (midterm, final, quiz) |
|
||||
| `evaluation_type` | Selection | `normal` or `grade` |
|
||||
| `venue` | Many2one | Venue partner |
|
||||
| `state` | Selection | `draft`, `schedule`, `held`, `cancel`, `done` |
|
||||
| `exam_ids` | One2many | Exams in this session |
|
||||
|
||||
**`op.exam` (institutional)**
|
||||
|
||||
| Field | Type | Description |
|
||||
|-------|------|-------------|
|
||||
| `name` | Char | Exam name |
|
||||
| `session_id` | Many2one | Parent session |
|
||||
| `subject_id` | Many2one | Subject being examined |
|
||||
| `exam_code` | Char | Exam code |
|
||||
| `start_time` | Datetime | Exam start |
|
||||
| `end_time` | Datetime | Exam end |
|
||||
| `total_marks` | Integer | Maximum marks |
|
||||
| `min_marks` | Integer | Passing marks |
|
||||
| `state` | Selection | `draft`, `schedule`, `held`, `result_updated`, `cancel`, `done` |
|
||||
| `responsible_id` | Many2many | Responsible faculty |
|
||||
| `attendees_line` | One2many | Exam attendees with marks |
|
||||
|
||||
**`op.exam.type`**
|
||||
|
||||
| Field | Type | Description |
|
||||
|-------|------|-------------|
|
||||
| `name` | Char | Type name (Midterm, Final, Quiz, Lab) |
|
||||
|
||||
**`op.exam.room`**
|
||||
|
||||
| Field | Type | Description |
|
||||
|-------|------|-------------|
|
||||
| `name` | Char | Room name |
|
||||
| `classroom_id` | Many2one | Linked classroom |
|
||||
| `capacity` | Integer | Room capacity |
|
||||
|
||||
**`op.exam.attendees`**
|
||||
|
||||
| Field | Type | Description |
|
||||
|-------|------|-------------|
|
||||
| `exam_id` | Many2one | Exam |
|
||||
| `student_id` | Many2one | Student |
|
||||
| `room_id` | Many2one | Assigned room |
|
||||
| `marks` | Integer | Obtained marks |
|
||||
| `status` | Selection | `pass`, `fail` (computed from marks vs min_marks) |
|
||||
|
||||
**`op.marksheet.register`**
|
||||
|
||||
| Field | Type | Description |
|
||||
|-------|------|-------------|
|
||||
| `name` | Char | Register name |
|
||||
| `exam_session_id` | Many2one | Exam session |
|
||||
| `marksheet_line` | One2many | Marksheet lines per student |
|
||||
| `result_template_id` | Many2one | Result template |
|
||||
| `state` | Selection | `draft`, `validated`, `cancelled` |
|
||||
| `total_pass` | Integer | Computed pass count |
|
||||
| `total_failed` | Integer | Computed fail count |
|
||||
|
||||
**`op.marksheet.line`**
|
||||
|
||||
| Field | Type | Description |
|
||||
|-------|------|-------------|
|
||||
| `student_id` | Many2one | Student |
|
||||
| `marksheet_reg_id` | Many2one | Parent register |
|
||||
| `result_line` | One2many | Per-exam results |
|
||||
| `total_marks` | Integer | Computed total |
|
||||
| `percentage` | Float | Computed percentage |
|
||||
| `grade` | Char | Computed grade (if grade evaluation) |
|
||||
| `status` | Selection | `pass`, `fail` (computed) |
|
||||
|
||||
**`op.result.line`**
|
||||
|
||||
| Field | Type | Description |
|
||||
|-------|------|-------------|
|
||||
| `marksheet_line_id` | Many2one | Parent marksheet line |
|
||||
| `exam_id` | Many2one | Exam |
|
||||
| `student_id` | Many2one | Student |
|
||||
| `marks` | Integer | Marks obtained |
|
||||
| `grade` | Char | Computed grade |
|
||||
| `status` | Selection | `pass`, `fail` (computed from marks vs min_marks) |
|
||||
|
||||
**`op.result.template`**
|
||||
|
||||
| Field | Type | Description |
|
||||
|-------|------|-------------|
|
||||
| `name` | Char | Template name |
|
||||
| `exam_session_id` | Many2one | Exam session |
|
||||
| `grade_ids` | Many2many | Grade configuration rules |
|
||||
| `result_date` | Date | Result publication date |
|
||||
| `state` | Selection | `draft`, `result_generated` |
|
||||
|
||||
**`op.grade.configuration`**
|
||||
|
||||
| Field | Type | Description |
|
||||
|-------|------|-------------|
|
||||
| `min_per` | Integer | Minimum percentage |
|
||||
| `max_per` | Integer | Maximum percentage |
|
||||
| `result` | Char | Grade display (e.g., "A", "B+", "Pass") |
|
||||
|
||||
### 34.3 Functional Requirements
|
||||
|
||||
| ID | Requirement | Route | Role |
|
||||
|----|-------------|-------|------|
|
||||
| FR-IEX-01 | List exam sessions with status filters | `/admin/exam-sessions` | Admin |
|
||||
| FR-IEX-02 | Create exam session (course, batch, dates, type) | `/admin/exam-sessions` | Admin |
|
||||
| FR-IEX-03 | Add exams to session (subject, time, marks) | `/admin/exam-sessions` | Admin |
|
||||
| FR-IEX-04 | Schedule and manage session state transitions | `/admin/exam-sessions` | Admin |
|
||||
| FR-IEX-05 | Enter marks for exam attendees | `/admin/exam-sessions` | Admin/Teacher |
|
||||
| FR-IEX-06 | Configure grade scales | `/admin/marksheets` | Admin |
|
||||
| FR-IEX-07 | Create result templates and generate marksheets | `/admin/marksheets` | Admin |
|
||||
| FR-IEX-08 | View marksheet results (pass/fail, grades, percentages) | `/admin/marksheets` | Admin |
|
||||
| FR-IEX-09 | Students view institutional exam results | `/student/grades` | Student |
|
||||
|
||||
### 34.4 API Endpoints
|
||||
|
||||
| Method | Path | Description |
|
||||
|--------|------|-------------|
|
||||
| `GET` | `/api/inst-exam-sessions` | List exam sessions |
|
||||
| `POST` | `/api/inst-exam-sessions` | Create session |
|
||||
| `GET` | `/api/inst-exam-sessions/{id}` | Get session with exams |
|
||||
| `PATCH` | `/api/inst-exam-sessions/{id}` | Update session |
|
||||
| `DELETE` | `/api/inst-exam-sessions/{id}` | Delete session |
|
||||
| `POST` | `/api/inst-exam-sessions/{id}/schedule` | Schedule session |
|
||||
| `POST` | `/api/inst-exam-sessions/{id}/done` | Mark session done |
|
||||
| `POST` | `/api/inst-exams` | Add exam to session |
|
||||
| `PATCH` | `/api/inst-exams/{id}` | Update exam |
|
||||
| `POST` | `/api/inst-exams/{id}/attendees` | Add attendees |
|
||||
| `PATCH` | `/api/inst-exams/{id}/marks` | Enter marks |
|
||||
| `GET` | `/api/exam-types` | List exam types |
|
||||
| `POST` | `/api/exam-types` | Create exam type |
|
||||
| `GET` | `/api/grade-config` | List grade configurations |
|
||||
| `POST` | `/api/grade-config` | Create grade config |
|
||||
| `GET` | `/api/result-templates` | List result templates |
|
||||
| `POST` | `/api/result-templates` | Create result template |
|
||||
| `POST` | `/api/result-templates/{id}/generate` | Generate marksheets |
|
||||
| `GET` | `/api/marksheets` | List marksheets |
|
||||
| `GET` | `/api/marksheets/{id}` | Get marksheet with results |
|
||||
| `POST` | `/api/marksheets/{id}/validate` | Validate marksheet |
|
||||
|
||||
---
|
||||
|
||||
## 35. Assignment File Submissions
|
||||
|
||||
### 35.1 Overview
|
||||
|
||||
Traditional course assignments where students submit files and teachers grade them. Coexists with EnCoach exam-wrapper assignments (`encoach.assignment`).
|
||||
|
||||
### 35.2 Data Models (OpenEduCat)
|
||||
|
||||
**`grading.assignment.type`**
|
||||
|
||||
| Field | Type | Description |
|
||||
|-------|------|-------------|
|
||||
| `name` | Char | Type name (Homework, Project, Lab Report, Presentation) |
|
||||
|
||||
**`grading.assignment`**
|
||||
|
||||
| Field | Type | Description |
|
||||
|-------|------|-------------|
|
||||
| `name` | Char | Assignment title |
|
||||
| `course_id` | Many2one | Course |
|
||||
| `subject_id` | Many2one | Subject |
|
||||
| `issued_date` | Datetime | Issue date |
|
||||
| `assignment_type` | Many2one | Assignment type |
|
||||
| `faculty_id` | Many2one | Issuing faculty |
|
||||
| `point` | Float | Maximum points |
|
||||
|
||||
**`op.assignment` (extends `grading.assignment`)**
|
||||
|
||||
| Field | Type | Description |
|
||||
|-------|------|-------------|
|
||||
| `batch_id` | Many2one | Batch |
|
||||
| `marks` | Float | Maximum marks |
|
||||
| `description` | Text | Assignment description |
|
||||
| `state` | Selection | `draft`, `publish`, `finish`, `cancel` |
|
||||
| `submission_date` | Datetime | Submission deadline |
|
||||
| `allocation_ids` | Many2many | Allocated students |
|
||||
| `assignment_sub_line` | One2many | Student submissions |
|
||||
| `reviewer` | Many2one | Reviewing faculty |
|
||||
|
||||
**`op.assignment.sub.line`**
|
||||
|
||||
| Field | Type | Description |
|
||||
|-------|------|-------------|
|
||||
| `assignment_id` | Many2one | Parent assignment |
|
||||
| `student_id` | Many2one | Submitting student |
|
||||
| `description` | Text | Submission notes |
|
||||
| `submission_date` | Datetime | Actual submission time |
|
||||
| `attachment_ids` | Many2many | Uploaded files |
|
||||
| `marks` | Float | Awarded marks |
|
||||
| `state` | Selection | `draft`, `submit`, `accept`, `reject`, `change_req` |
|
||||
| `faculty_id` | Many2one | Grading faculty |
|
||||
| `note` | Text | Faculty feedback |
|
||||
|
||||
### 35.3 Functional Requirements
|
||||
|
||||
| ID | Requirement | Route | Role |
|
||||
|----|-------------|-------|------|
|
||||
| FR-SUB-01 | Teacher creates course assignment with description, deadline, files | `/teacher/assignments` | Teacher |
|
||||
| FR-SUB-02 | Teacher publishes assignment (visible to allocated students) | `/teacher/assignments` | Teacher |
|
||||
| FR-SUB-03 | Student views assigned course assignments with deadlines | `/student/assignments` | Student |
|
||||
| FR-SUB-04 | Student uploads files as submission | `/student/assignments` | Student |
|
||||
| FR-SUB-05 | Teacher views submissions per assignment | `/teacher/assignments/:id` | Teacher |
|
||||
| FR-SUB-06 | Teacher grades submission (marks, feedback, accept/reject/change request) | `/teacher/assignments/:id` | Teacher |
|
||||
| FR-SUB-07 | Admin views all course assignments across batches | `/admin/assignments` | Admin |
|
||||
|
||||
### 35.4 API Endpoints
|
||||
|
||||
| Method | Path | Description |
|
||||
|--------|------|-------------|
|
||||
| `GET` | `/api/course-assignments` | List course assignments |
|
||||
| `POST` | `/api/course-assignments` | Create assignment |
|
||||
| `GET` | `/api/course-assignments/{id}` | Get assignment with submissions |
|
||||
| `PATCH` | `/api/course-assignments/{id}` | Update assignment |
|
||||
| `POST` | `/api/course-assignments/{id}/publish` | Publish assignment |
|
||||
| `POST` | `/api/course-assignments/{id}/finish` | Close assignment |
|
||||
| `GET` | `/api/course-assignments/{id}/submissions` | List submissions |
|
||||
| `POST` | `/api/course-assignments/{id}/submit` | Student submits (multipart file upload) |
|
||||
| `PATCH` | `/api/submissions/{id}` | Grade submission (marks, feedback, status) |
|
||||
| `GET` | `/api/assignment-types` | List assignment types |
|
||||
| `POST` | `/api/assignment-types` | Create assignment type |
|
||||
|
||||
---
|
||||
|
||||
# Part IX -- Technical Specifications
|
||||
|
||||
## 36. Data Models
|
||||
|
||||
### 36.1 Existing Models (from `ielts-be-v0`)
|
||||
|
||||
| Model | Module | Purpose |
|
||||
|-------|--------|---------|
|
||||
@@ -994,7 +1461,7 @@ Each simulated AI component in the new frontend maps to a real backend service:
|
||||
| `encoach.elai.avatar` | `encoach_ai_media` | ELAI avatar profiles |
|
||||
| `encoach.registration` | `encoach_registration` | Batch registration mixin |
|
||||
|
||||
### 30.2 New Models (Adaptive Learning Engine)
|
||||
### 36.2 New Models (Adaptive Learning Engine)
|
||||
|
||||
| Model | Module | Purpose | Key Fields |
|
||||
|-------|--------|---------|------------|
|
||||
@@ -1009,14 +1476,14 @@ Each simulated AI component in the new frontend maps to a real backend service:
|
||||
| `encoach.resource.completion` | `encoach_adaptive` | Resource viewing tracking | `student_id`, `resource_id`, `viewed`, `time_spent_minutes`, `rating` |
|
||||
| `encoach.ai.content.cache` | `encoach_adaptive` | Cached AI-generated content | `topic_id`, `content_type`, `difficulty_level`, `content`, `model_used`, `review_status` |
|
||||
|
||||
### 30.3 New Models (SIS Integration)
|
||||
### 36.3 New Models (SIS Integration)
|
||||
|
||||
| Model | Module | Purpose |
|
||||
|-------|--------|---------|
|
||||
| `encoach.sis.sync` | `encoach_sis` | SIS sync job tracking |
|
||||
| `encoach.sis.mapping` | `encoach_sis` | Field mapping between SIS and EnCoach |
|
||||
|
||||
### 30.4 New Models (Branding)
|
||||
### 36.4 New Models (Branding)
|
||||
|
||||
| Model | Module | Purpose |
|
||||
|-------|--------|---------|
|
||||
@@ -1024,9 +1491,9 @@ Each simulated AI component in the new frontend maps to a real backend service:
|
||||
|
||||
---
|
||||
|
||||
## 31. REST API Specification
|
||||
## 37. REST API Specification
|
||||
|
||||
### 31.1 Existing Endpoints (81+)
|
||||
### 37.1 Existing Endpoints (81+)
|
||||
|
||||
All existing endpoints from the Odoo 19 backend remain. Key groups:
|
||||
|
||||
@@ -1049,7 +1516,7 @@ All existing endpoints from the Odoo 19 backend remain. Key groups:
|
||||
| Storage | `/api/storage` | 2 |
|
||||
| Approvals | `/api/approval-workflows` | 3 |
|
||||
|
||||
### 31.2 New Endpoints (Adaptive Learning Engine, 40+)
|
||||
### 37.2 New Endpoints (Adaptive Learning Engine, 40+)
|
||||
|
||||
| Group | Method | Path | Description |
|
||||
|-------|--------|------|-------------|
|
||||
@@ -1101,7 +1568,7 @@ All existing endpoints from the Odoo 19 backend remain. Key groups:
|
||||
| | `GET` | `/api/analytics/subject` | Subject analytics |
|
||||
| | `GET` | `/api/analytics/content-gaps` | Content gap report |
|
||||
|
||||
### 31.3 New Endpoints (LMS API Bridge)
|
||||
### 37.3 New Endpoints (LMS API Bridge)
|
||||
|
||||
| Method | Path | Description |
|
||||
|--------|------|-------------|
|
||||
@@ -1114,7 +1581,7 @@ All existing endpoints from the Odoo 19 backend remain. Key groups:
|
||||
| `GET/POST` | `/api/attendance` | Attendance records |
|
||||
| `GET` | `/api/grades` | Gradebook |
|
||||
|
||||
### 31.4 New Endpoints (SIS Integration)
|
||||
### 37.4 New Endpoints (SIS Integration)
|
||||
|
||||
| Method | Path | Description |
|
||||
|--------|------|-------------|
|
||||
@@ -1123,11 +1590,61 @@ All existing endpoints from the Odoo 19 backend remain. Key groups:
|
||||
| `GET` | `/api/sis/mappings` | Field mappings |
|
||||
| `PATCH` | `/api/sis/mappings` | Update mappings |
|
||||
|
||||
### 37.5 New Endpoints (OpenEduCat Institutional LMS, 60+)
|
||||
|
||||
| Group | Method | Path | Description |
|
||||
|-------|--------|------|-------------|
|
||||
| **Academic Years** | `GET/POST` | `/api/academic-years` | List/create years |
|
||||
| | `GET/PATCH/DELETE` | `/api/academic-years/{id}` | Year CRUD |
|
||||
| | `POST` | `/api/academic-years/{id}/generate-terms` | Auto-generate terms |
|
||||
| | `GET/POST` | `/api/academic-terms` | List/create terms |
|
||||
| | `PATCH/DELETE` | `/api/academic-terms/{id}` | Term CRUD |
|
||||
| **Departments** | `GET/POST` | `/api/departments` | List/create |
|
||||
| | `PATCH/DELETE` | `/api/departments/{id}` | CRUD |
|
||||
| **Admissions** | `GET/POST` | `/api/admission-registers` | List/create registers |
|
||||
| | `PATCH` | `/api/admission-registers/{id}` | Update |
|
||||
| | `POST` | `/api/admission-registers/{id}/confirm` | Confirm register |
|
||||
| | `POST` | `/api/admission-registers/{id}/close` | Close register |
|
||||
| | `GET/POST` | `/api/admissions` | List/create admissions |
|
||||
| | `GET` | `/api/admissions/{id}` | Admission detail |
|
||||
| | `POST` | `/api/admissions/{id}/submit` | Submit for review |
|
||||
| | `POST` | `/api/admissions/{id}/confirm` | Confirm |
|
||||
| | `POST` | `/api/admissions/{id}/admit` | Admit (creates student) |
|
||||
| | `POST` | `/api/admissions/{id}/reject` | Reject |
|
||||
| **Subject Registration** | `GET/POST` | `/api/subject-registrations` | List/create |
|
||||
| | `PATCH` | `/api/subject-registrations/{id}` | Update subjects |
|
||||
| | `POST` | `/api/subject-registrations/{id}/confirm` | Confirm |
|
||||
| | `POST` | `/api/subject-registrations/{id}/reject` | Reject |
|
||||
| | `GET` | `/api/subject-registrations/available` | Available subjects |
|
||||
| **Inst. Exam Sessions** | `GET/POST` | `/api/inst-exam-sessions` | List/create |
|
||||
| | `GET/PATCH/DELETE` | `/api/inst-exam-sessions/{id}` | CRUD |
|
||||
| | `POST` | `/api/inst-exam-sessions/{id}/schedule` | Schedule |
|
||||
| | `POST` | `/api/inst-exam-sessions/{id}/done` | Mark done |
|
||||
| | `POST` | `/api/inst-exams` | Add exam |
|
||||
| | `PATCH` | `/api/inst-exams/{id}` | Update exam |
|
||||
| | `POST` | `/api/inst-exams/{id}/attendees` | Add attendees |
|
||||
| | `PATCH` | `/api/inst-exams/{id}/marks` | Enter marks |
|
||||
| | `GET/POST` | `/api/exam-types` | List/create types |
|
||||
| | `GET/POST` | `/api/grade-config` | Grade configuration |
|
||||
| | `GET/POST` | `/api/result-templates` | Result templates |
|
||||
| | `POST` | `/api/result-templates/{id}/generate` | Generate marksheets |
|
||||
| | `GET` | `/api/marksheets` | List marksheets |
|
||||
| | `GET` | `/api/marksheets/{id}` | Marksheet detail |
|
||||
| | `POST` | `/api/marksheets/{id}/validate` | Validate |
|
||||
| **Course Assignments** | `GET/POST` | `/api/course-assignments` | List/create |
|
||||
| | `GET/PATCH` | `/api/course-assignments/{id}` | CRUD |
|
||||
| | `POST` | `/api/course-assignments/{id}/publish` | Publish |
|
||||
| | `POST` | `/api/course-assignments/{id}/finish` | Close |
|
||||
| | `GET` | `/api/course-assignments/{id}/submissions` | List submissions |
|
||||
| | `POST` | `/api/course-assignments/{id}/submit` | Student submits |
|
||||
| | `PATCH` | `/api/submissions/{id}` | Grade submission |
|
||||
| | `GET/POST` | `/api/assignment-types` | Assignment types |
|
||||
|
||||
---
|
||||
|
||||
## 32. Frontend Page Inventory
|
||||
## 38. Frontend Page Inventory
|
||||
|
||||
### 32.1 Auth Pages (3)
|
||||
### 38.1 Auth Pages (3)
|
||||
|
||||
| Route | Page | API Dependencies |
|
||||
|-------|------|-----------------|
|
||||
@@ -1135,7 +1652,7 @@ All existing endpoints from the Odoo 19 backend remain. Key groups:
|
||||
| `/register` | Register | `POST /api/register` |
|
||||
| `/forgot-password` | Forgot Password | `POST /api/reset/sendVerification` |
|
||||
|
||||
### 32.2 Student Pages (10+)
|
||||
### 38.2 Student Pages (12+)
|
||||
|
||||
| Route | Page | Key APIs | AI Components |
|
||||
|-------|------|----------|---------------|
|
||||
@@ -1152,8 +1669,9 @@ All existing endpoints from the Odoo 19 backend remain. Key groups:
|
||||
| `/student/attendance` | Attendance | `/api/attendance` | -- |
|
||||
| `/student/timetable` | Timetable | `/api/timetable` | -- |
|
||||
| `/student/profile` | Profile | `/api/user` | -- |
|
||||
| `/student/subject-registration` | **NEW:** Subject Registration | `/api/subject-registrations/available`, `/api/subject-registrations` | -- |
|
||||
|
||||
### 32.3 Teacher Pages (10)
|
||||
### 38.3 Teacher Pages (10)
|
||||
|
||||
| Route | Page | Key APIs | AI Components |
|
||||
|-------|------|----------|---------------|
|
||||
@@ -1168,7 +1686,14 @@ All existing endpoints from the Odoo 19 backend remain. Key groups:
|
||||
| `/teacher/timetable` | Timetable | `/api/timetable` | -- |
|
||||
| `/teacher/profile` | Profile | `/api/user` | -- |
|
||||
|
||||
### 32.4 Admin Pages (30+)
|
||||
### 38.4 Public Pages (2)
|
||||
|
||||
| Route | Page | Key APIs | AI Components |
|
||||
|-------|------|----------|---------------|
|
||||
| `/apply` | **NEW:** Admission Application | `/api/admissions`, `/api/admission-registers` | -- |
|
||||
| `/apply/status` | **NEW:** Application Status | `/api/admissions/{id}` | -- |
|
||||
|
||||
### 38.5 Admin Pages (38+)
|
||||
|
||||
| Route | Page | Key APIs | AI Components |
|
||||
|-------|------|----------|---------------|
|
||||
@@ -1204,10 +1729,17 @@ All existing endpoints from the Odoo 19 backend remain. Key groups:
|
||||
| `/admin/settings-platform` | Platform Settings | Settings APIs | -- |
|
||||
| `/admin/exam` | Exam Runner | `/api/exam`, `/api/sessions` | -- |
|
||||
| `/admin/profile` | Admin Profile | `/api/user` | -- |
|
||||
| `/admin/academic-years` | **NEW:** Academic Year Manager | `/api/academic-years`, `/api/academic-terms` | -- |
|
||||
| `/admin/departments` | **NEW:** Department Manager | `/api/departments` | -- |
|
||||
| `/admin/admissions` | **NEW:** Admission List | `/api/admissions` | -- |
|
||||
| `/admin/admissions/:id` | **NEW:** Admission Detail | `/api/admissions/{id}` | -- |
|
||||
| `/admin/admission-register` | **NEW:** Admission Register | `/api/admission-registers` | -- |
|
||||
| `/admin/exam-sessions` | **NEW:** Institutional Exam Sessions | `/api/inst-exam-sessions`, `/api/inst-exams` | -- |
|
||||
| `/admin/marksheets` | **NEW:** Marksheet Manager | `/api/marksheets`, `/api/result-templates`, `/api/grade-config` | -- |
|
||||
|
||||
---
|
||||
|
||||
## 33. Non-Functional Requirements
|
||||
## 39. Non-Functional Requirements
|
||||
|
||||
| ID | Requirement |
|
||||
|----|-------------|
|
||||
@@ -1258,11 +1790,19 @@ All existing endpoints from the Odoo 19 backend remain. Key groups:
|
||||
| 18 | `encoach_adaptive` | **NEW** | Proficiency, learning plans, progress tracking, content cache |
|
||||
| 19 | `encoach_adaptive_api` | **NEW** | REST controllers for adaptive learning |
|
||||
| 20 | `encoach_adaptive_ai` | **NEW** | AI services for diagnostics, plans, coaching, content |
|
||||
| 21 | `encoach_lms_api` | **NEW** | REST API bridge for OpenEduCat models |
|
||||
| 21 | `encoach_lms_api` | **NEW** | REST API bridge for OpenEduCat models (extends `op.course`, `op.batch`, adds missing fields) |
|
||||
| 22 | `encoach_sis` | **NEW** | UTAS SIS integration (sync, mapping) |
|
||||
| 23 | `encoach_branding` | **NEW** | Whitelabeling configuration |
|
||||
| 24 | `openeducat_core` | **OpenEduCat (port to v19)** | `op.course`, `op.batch`, `op.student`, `op.faculty`, `op.subject`, `op.department`, `op.category`, `op.academic.year`, `op.academic.term`, `op.student.course`, `op.subject.registration` |
|
||||
| 25 | `openeducat_timetable` | **OpenEduCat (port to v19)** | `op.session`, `op.timing` |
|
||||
| 26 | `openeducat_attendance` | **OpenEduCat (port to v19)** | `op.attendance.register`, `op.attendance.sheet`, `op.attendance.line`, `op.attendance.type` |
|
||||
| 27 | `openeducat_classroom` | **OpenEduCat (port to v19)** | `op.classroom` (physical rooms) |
|
||||
| 28 | `openeducat_exam` | **OpenEduCat (port to v19)** | `op.exam.session`, `op.exam`, `op.exam.type`, `op.exam.attendees`, `op.exam.room`, `op.marksheet.register`, `op.marksheet.line`, `op.result.line`, `op.result.template`, `op.grade.configuration` |
|
||||
| 29 | `openeducat_assignment` | **OpenEduCat (port to v19)** | `op.assignment`, `op.assignment.sub.line`, `grading.assignment`, `grading.assignment.type` |
|
||||
| 30 | `openeducat_admission` | **OpenEduCat (port to v19)** | `op.admission`, `op.admission.register` |
|
||||
| 31 | `openeducat_facility` | **OpenEduCat (port to v19)** | `op.facility`, `op.facility.line` (dependency of classroom) |
|
||||
|
||||
**Total: 15 existing + 8 new = 23 modules**
|
||||
**Total: 15 existing EnCoach + 8 new EnCoach + 8 OpenEduCat = 31 modules**
|
||||
|
||||
---
|
||||
|
||||
@@ -1273,11 +1813,14 @@ All existing endpoints from the Odoo 19 backend remain. Key groups:
|
||||
| **P0** | Auth, core user management, taxonomy models, resource model | Platform foundation; blocks everything |
|
||||
| **P1** | Diagnostic engine, proficiency profile, learning plan generation | Core adaptive learning loop |
|
||||
| **P1** | Exam engine with multi-subject support | Exam generation and delivery |
|
||||
| **P2** | LMS API bridge (OpenEduCat), course/batch/timetable/attendance | LMS functionality |
|
||||
| **P2** | OpenEduCat porting (v17→v19), LMS API bridge, course/batch/timetable/attendance | LMS functionality |
|
||||
| **P2** | Academic years/terms, departments, admission workflow | Institutional operations |
|
||||
| **P2** | Content delivery (hybrid), practice questions, mastery quizzes | Learning content consumption |
|
||||
| **P2** | AI components wiring (all 15 frontend components to real backend) | AI integration |
|
||||
| **P3** | AI coaching (hints, explanations, study suggestions) | Learning enhancement |
|
||||
| **P3** | Spaced repetition, analytics dashboards | Progress optimization |
|
||||
| **P3** | Institutional exam sessions, marksheets, subject registration | Institutional assessment |
|
||||
| **P3** | Course assignment submissions (file upload, grading) | Homework workflow |
|
||||
| **P3** | SIS integration, whitelabeling | University integration |
|
||||
| **P4** | Content gap detection, FAISS tips per subject, batch optimizer | Operational efficiency |
|
||||
| **P4** | Payment system, subscription management | Commercial features |
|
||||
|
||||
Reference in New Issue
Block a user