feat: initial backend codebase — EnCoach v3

Complete Odoo 19 backend with 25 custom addons:
- encoach_core: user/entity/role management
- encoach_api: REST API + JWT auth
- encoach_ai: OpenAI integration, AI settings, generation
- encoach_ai_course: AI-powered English & IELTS course generation
- encoach_exam_template/session: exam creation, structures, sessions
- encoach_scoring: AI auto-grading + manual approval
- encoach_vector: pgvector RAG integration
- encoach_adaptive: adaptive learning engine
- encoach_placement: placement testing
- encoach_taxonomy/resources: content taxonomy & resource management
- Plus 14 more modules for courses, branding, portal, etc.

Includes docs: user guide, generation report, developer workflow.

Made-with: Cursor
This commit is contained in:
Yamen Ahmad
2026-04-11 15:44:20 +04:00
commit 982d4bca30
371 changed files with 35211 additions and 0 deletions

View File

@@ -0,0 +1,78 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="view_encoach_resource_form" model="ir.ui.view">
<field name="name">encoach.resource.form</field>
<field name="model">encoach.resource</field>
<field name="arch" type="xml">
<form string="Resource">
<header>
<field name="review_status" widget="statusbar" statusbar_visible="pending,approved,rejected"/>
</header>
<sheet>
<group>
<group>
<field name="name"/>
<field name="type"/>
<field name="difficulty"/>
<field name="duration_minutes"/>
<field name="cefr_level"/>
</group>
<group>
<field name="subject_id"/>
<field name="topic_ids" widget="many2many_tags"/>
<field name="grammar_topic"/>
<field name="vocab_band"/>
<field name="ai_generated"/>
<field name="approved"/>
</group>
</group>
<group string="Content">
<field name="url"/>
<field name="file" filename="name"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="view_encoach_resource_list" model="ir.ui.view">
<field name="name">encoach.resource.list</field>
<field name="model">encoach.resource</field>
<field name="arch" type="xml">
<list string="Resources">
<field name="name"/>
<field name="type"/>
<field name="cefr_level"/>
<field name="difficulty"/>
<field name="duration_minutes"/>
<field name="review_status" widget="badge" decoration-info="review_status == 'pending'" decoration-success="review_status == 'approved'" decoration-danger="review_status == 'rejected'"/>
<field name="ai_generated"/>
</list>
</field>
</record>
<record id="view_encoach_resource_search" model="ir.ui.view">
<field name="name">encoach.resource.search</field>
<field name="model">encoach.resource</field>
<field name="arch" type="xml">
<search string="Search Resources">
<field name="name"/>
<filter string="AI Generated" name="ai_generated" domain="[('ai_generated', '=', True)]"/>
<filter string="Pending Review" name="pending_review" domain="[('review_status', '=', 'pending')]"/>
<filter string="Approved" name="approved" domain="[('review_status', '=', 'approved')]"/>
<separator/>
<filter string="Type" name="group_type" context="{'group_by': 'type'}"/>
<filter string="CEFR Level" name="group_cefr" context="{'group_by': 'cefr_level'}"/>
<filter string="Review Status" name="group_review" context="{'group_by': 'review_status'}"/>
</search>
</field>
</record>
<record id="action_encoach_resource" model="ir.actions.act_window">
<field name="name">Resources</field>
<field name="res_model">encoach.resource</field>
<field name="view_mode">list,form</field>
</record>
</odoo>