feat: institutional + support + training admin sections (backend + frontend)
Ship three fully-wired admin areas end-to-end with APIs, seeds, tests and docs. Backend (new `encoach_lms_api` addon + existing addons): - Institutional: academic years/terms, departments, admission registers & admissions, courses/batches, lessons, fees (terms + student fees + invoicing with income-account auto-wiring), gradebook (assignments/grades), library, facilities (encoach.asset), student leave, result templates + marksheets (incl. delete-with-cascade). - Support: `encoach.ticket` model + CRUD/assignee routes; payment records derived from `op.student.fees.details` and `account.move`; platform settings backed by `encoach.code` and `ir.config_parameter` (packages + grading config). - Training: `encoach.vocab.item` + `encoach.grammar.rule` (plus progress models) with CRUD, pagination, search/level filters, and upsert-style progress endpoints. Odoo 19 compatibility: `_sql_constraints` replaced with `@api.constrains`; `ValidationError`/`UserError` mapped to HTTP 400. Frontend: - Rewire institutional admin pages (Academic Year Manager, Admissions, Courses, Lessons, Fees, Gradebook, Library, Facilities, Student Leave, Marksheets, Taxonomy, Resources) to real APIs with React Query invalidation and dialogs. - New typed services: `payments.service.ts`, `platformSettings.service.ts`, `training.service.ts`. Updated `fees/gradebook/lms/courseware/taxonomy/ resources/student-progress/generation` services + related types. - Rewrite `VocabularyPage`, `GrammarPage`, `PaymentRecordPage`, `SettingsPage`, `TicketsPage` to consume live data with search/filter/progress/CRUD flows. - New shared components: `TaxonomyCascade`, `MaterialViewer`, `teacher/TeacherLibrary`. - Favicons/branding assets and misc. UX polish across teacher/student pages. Tooling & QA: - Seeders: `seed_demo.py`, `seed_demo_data.py`, `seed_institutional.py` (idempotent, covers institutional + support + training fixtures incl. income-account wiring). - API write-flow test suites: `test_write_flows.py` (institutional), `test_support_flows.py` (support), `test_training_flows.py` (training), `test_ai_full.py`. All suites pass end-to-end. - Docs: add `docs/PROJECT_SUMMARY.md` with per-section scope, artifacts and QA. - `.gitignore`: ignore `pgdata_bak_*/`, `frontend/.vite/`, `frontend/dist/`, `frontend/node_modules/`. Made-with: Cursor
This commit is contained in:
25
custom_addons/encoach_lms_api/security/ir.model.access.csv
Normal file
25
custom_addons/encoach_lms_api/security/ir.model.access.csv
Normal file
@@ -0,0 +1,25 @@
|
||||
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
||||
access_encoach_lesson_all,encoach.lesson.all,model_encoach_lesson,base.group_user,1,1,1,1
|
||||
access_encoach_student_leave_type_all,encoach.student.leave.type.all,model_encoach_student_leave_type,base.group_user,1,1,1,1
|
||||
access_encoach_student_leave_all,encoach.student.leave.all,model_encoach_student_leave,base.group_user,1,1,1,1
|
||||
access_encoach_gradebook_all,encoach.gradebook.all,model_encoach_gradebook,base.group_user,1,1,1,1
|
||||
access_encoach_gradebook_line_all,encoach.gradebook.line.all,model_encoach_gradebook_line,base.group_user,1,1,1,1
|
||||
access_encoach_discussion_board_all,encoach.discussion.board.all,model_encoach_discussion_board,base.group_user,1,1,1,1
|
||||
access_encoach_discussion_post_all,encoach.discussion.post.all,model_encoach_discussion_post,base.group_user,1,1,1,1
|
||||
access_encoach_announcement_all,encoach.announcement.all,model_encoach_announcement,base.group_user,1,1,1,1
|
||||
access_encoach_message_all,encoach.message.all,model_encoach_message,base.group_user,1,1,1,1
|
||||
access_encoach_course_chapter_all,encoach.course.chapter.all,model_encoach_course_chapter,base.group_user,1,1,1,1
|
||||
access_encoach_chapter_material_all,encoach.chapter.material.all,model_encoach_chapter_material,base.group_user,1,1,1,1
|
||||
access_encoach_chapter_progress_all,encoach.chapter.progress.all,model_encoach_chapter_progress,base.group_user,1,1,1,1
|
||||
access_encoach_notification_all,encoach.notification.all,model_encoach_notification,base.group_user,1,1,1,1
|
||||
access_encoach_notification_rule_all,encoach.notification.rule.all,model_encoach_notification_rule,base.group_user,1,1,1,1
|
||||
access_encoach_notification_pref_all,encoach.notification.preference.all,model_encoach_notification_preference,base.group_user,1,1,1,1
|
||||
access_encoach_faq_category_all,encoach.faq.category.all,model_encoach_faq_category,base.group_user,1,1,1,1
|
||||
access_encoach_faq_item_all,encoach.faq.item.all,model_encoach_faq_item,base.group_user,1,1,1,1
|
||||
access_encoach_course_completion_all,encoach.course.completion.all,model_encoach_course_completion,base.group_user,1,1,1,1
|
||||
access_encoach_asset_all,encoach.asset.all,model_encoach_asset,base.group_user,1,1,1,1
|
||||
access_encoach_ticket_all,encoach.ticket.all,model_encoach_ticket,base.group_user,1,1,1,1
|
||||
access_encoach_vocab_item_all,encoach.vocab.item.all,model_encoach_vocab_item,base.group_user,1,1,1,1
|
||||
access_encoach_vocab_progress_all,encoach.vocab.progress.all,model_encoach_vocab_progress,base.group_user,1,1,1,1
|
||||
access_encoach_grammar_rule_all,encoach.grammar.rule.all,model_encoach_grammar_rule,base.group_user,1,1,1,1
|
||||
access_encoach_grammar_progress_all,encoach.grammar.progress.all,model_encoach_grammar_progress,base.group_user,1,1,1,1
|
||||
|
Reference in New Issue
Block a user