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,150 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Subject Views -->
<record id="view_encoach_subject_list" model="ir.ui.view">
<field name="name">encoach.subject.list</field>
<field name="model">encoach.subject</field>
<field name="arch" type="xml">
<list string="Subjects" editable="bottom">
<field name="sequence" widget="handle"/>
<field name="name"/>
<field name="code"/>
<field name="active" column_invisible="True"/>
</list>
</field>
</record>
<record id="view_encoach_subject_form" model="ir.ui.view">
<field name="name">encoach.subject.form</field>
<field name="model">encoach.subject</field>
<field name="arch" type="xml">
<form string="Subject">
<sheet>
<div class="oe_title">
<h1><field name="name" placeholder="Subject Name"/></h1>
</div>
<group>
<group>
<field name="code"/>
<field name="sequence"/>
<field name="active"/>
</group>
<group>
<field name="description"/>
</group>
</group>
<notebook>
<page string="Domains">
<field name="domain_ids">
<list>
<field name="sequence" widget="handle"/>
<field name="name"/>
<field name="description"/>
</list>
</field>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
<record id="action_encoach_subject" model="ir.actions.act_window">
<field name="name">Subjects</field>
<field name="res_model">encoach.subject</field>
<field name="view_mode">list,form</field>
</record>
<!-- Domain Views -->
<record id="view_encoach_domain_list" model="ir.ui.view">
<field name="name">encoach.domain.list</field>
<field name="model">encoach.domain</field>
<field name="arch" type="xml">
<list string="Domains">
<field name="sequence" widget="handle"/>
<field name="name"/>
<field name="subject_id"/>
<field name="description"/>
</list>
</field>
</record>
<record id="view_encoach_domain_form" model="ir.ui.view">
<field name="name">encoach.domain.form</field>
<field name="model">encoach.domain</field>
<field name="arch" type="xml">
<form string="Domain">
<sheet>
<div class="oe_title">
<h1><field name="name" placeholder="Domain Name"/></h1>
</div>
<group>
<group>
<field name="subject_id"/>
<field name="sequence"/>
</group>
<group>
<field name="description"/>
</group>
</group>
<notebook>
<page string="Topics">
<field name="topic_ids">
<list>
<field name="sequence" widget="handle"/>
<field name="name"/>
<field name="description"/>
</list>
</field>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
<record id="action_encoach_domain" model="ir.actions.act_window">
<field name="name">Domains</field>
<field name="res_model">encoach.domain</field>
<field name="view_mode">list,form</field>
</record>
<!-- Topic Views -->
<record id="view_encoach_topic_list" model="ir.ui.view">
<field name="name">encoach.topic.list</field>
<field name="model">encoach.topic</field>
<field name="arch" type="xml">
<list string="Topics">
<field name="sequence" widget="handle"/>
<field name="name"/>
<field name="domain_id"/>
<field name="description"/>
</list>
</field>
</record>
<record id="action_encoach_topic" model="ir.actions.act_window">
<field name="name">Topics</field>
<field name="res_model">encoach.topic</field>
<field name="view_mode">list,form</field>
</record>
<!-- Menu Items under Content -->
<menuitem id="menu_taxonomy_subjects"
name="Subjects"
parent="encoach_core.menu_encoach_content"
action="action_encoach_subject"
sequence="10"/>
<menuitem id="menu_taxonomy_domains"
name="Domains"
parent="encoach_core.menu_encoach_content"
action="action_encoach_domain"
sequence="11"/>
<menuitem id="menu_taxonomy_topics"
name="Topics"
parent="encoach_core.menu_encoach_content"
action="action_encoach_topic"
sequence="12"/>
</odoo>