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:
16
custom_addons/encoach_ai_course/views/ai_course_menus.xml
Normal file
16
custom_addons/encoach_ai_course/views/ai_course_menus.xml
Normal file
@@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
|
||||
<menuitem id="menu_ai_generation_logs"
|
||||
name="AI Generation Logs"
|
||||
parent="encoach_core.menu_encoach_courses"
|
||||
action="encoach_ai_course.action_ai_generation_log"
|
||||
sequence="30"/>
|
||||
|
||||
<menuitem id="menu_ai_ielts_logs"
|
||||
name="IELTS Generation Logs"
|
||||
parent="encoach_core.menu_encoach_courses"
|
||||
action="encoach_ai_course.action_ai_ielts_log"
|
||||
sequence="40"/>
|
||||
|
||||
</odoo>
|
||||
@@ -0,0 +1,77 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
|
||||
<record id="view_ai_generation_log_form" model="ir.ui.view">
|
||||
<field name="name">encoach.ai.generation.log.form</field>
|
||||
<field name="model">encoach.ai.generation.log</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="AI Generation Log">
|
||||
<header>
|
||||
<field name="status" widget="statusbar" statusbar_visible="generating,quality_check,pending_review,approved"/>
|
||||
</header>
|
||||
<sheet>
|
||||
<group>
|
||||
<group>
|
||||
<field name="student_id"/>
|
||||
<field name="course_type"/>
|
||||
<field name="attempts"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="final_resource_id"/>
|
||||
<field name="approved_by"/>
|
||||
<field name="created_at"/>
|
||||
</group>
|
||||
</group>
|
||||
<notebook>
|
||||
<page string="Brief" name="brief">
|
||||
<field name="brief"/>
|
||||
</page>
|
||||
<page string="Error Log" name="error_log">
|
||||
<field name="error_log"/>
|
||||
</page>
|
||||
</notebook>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_ai_generation_log_list" model="ir.ui.view">
|
||||
<field name="name">encoach.ai.generation.log.list</field>
|
||||
<field name="model">encoach.ai.generation.log</field>
|
||||
<field name="arch" type="xml">
|
||||
<list string="AI Generation Logs">
|
||||
<field name="course_type"/>
|
||||
<field name="status" widget="badge" decoration-info="status == 'generating'" decoration-warning="status == 'pending_review'" decoration-success="status == 'approved'" decoration-danger="status == 'rejected'"/>
|
||||
<field name="attempts"/>
|
||||
<field name="student_id"/>
|
||||
<field name="created_at"/>
|
||||
</list>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_ai_generation_log_search" model="ir.ui.view">
|
||||
<field name="name">encoach.ai.generation.log.search</field>
|
||||
<field name="model">encoach.ai.generation.log</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="Search AI Generation Logs">
|
||||
<field name="student_id"/>
|
||||
<separator/>
|
||||
<filter string="Generating" name="generating" domain="[('status', '=', 'generating')]"/>
|
||||
<filter string="Quality Check" name="quality_check" domain="[('status', '=', 'quality_check')]"/>
|
||||
<filter string="Pending Review" name="pending_review" domain="[('status', '=', 'pending_review')]"/>
|
||||
<filter string="Approved" name="approved" domain="[('status', '=', 'approved')]"/>
|
||||
<filter string="Rejected" name="rejected" domain="[('status', '=', 'rejected')]"/>
|
||||
<separator/>
|
||||
<filter string="General English" name="general_english" domain="[('course_type', '=', 'general_english')]"/>
|
||||
<filter string="IELTS" name="ielts" domain="[('course_type', '=', 'ielts')]"/>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="action_ai_generation_log" model="ir.actions.act_window">
|
||||
<field name="name">AI Generation Logs</field>
|
||||
<field name="res_model">encoach.ai.generation.log</field>
|
||||
<field name="view_mode">list,form</field>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
59
custom_addons/encoach_ai_course/views/ai_ielts_log_views.xml
Normal file
59
custom_addons/encoach_ai_course/views/ai_ielts_log_views.xml
Normal file
@@ -0,0 +1,59 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
|
||||
<record id="view_ai_ielts_log_form" model="ir.ui.view">
|
||||
<field name="name">encoach.ai.ielts.generation.log.form</field>
|
||||
<field name="model">encoach.ai.ielts.generation.log</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="IELTS Generation Log">
|
||||
<header>
|
||||
<field name="status" widget="statusbar" statusbar_visible="generating,format_check,examiner_review,approved"/>
|
||||
</header>
|
||||
<sheet>
|
||||
<group>
|
||||
<group>
|
||||
<field name="skill"/>
|
||||
<field name="attempts"/>
|
||||
<field name="examiner_id"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="created_at"/>
|
||||
</group>
|
||||
</group>
|
||||
<notebook>
|
||||
<page string="Brief" name="brief">
|
||||
<field name="brief"/>
|
||||
</page>
|
||||
<page string="Format Check Result" name="format_check">
|
||||
<field name="format_check_result"/>
|
||||
</page>
|
||||
<page string="Band Check Result" name="band_check">
|
||||
<field name="band_check_result"/>
|
||||
</page>
|
||||
</notebook>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_ai_ielts_log_list" model="ir.ui.view">
|
||||
<field name="name">encoach.ai.ielts.generation.log.list</field>
|
||||
<field name="model">encoach.ai.ielts.generation.log</field>
|
||||
<field name="arch" type="xml">
|
||||
<list string="IELTS Generation Logs">
|
||||
<field name="skill"/>
|
||||
<field name="status" widget="badge" decoration-info="status == 'generating'" decoration-warning="status == 'examiner_review'" decoration-success="status == 'approved'" decoration-danger="status == 'rejected'"/>
|
||||
<field name="attempts"/>
|
||||
<field name="examiner_id"/>
|
||||
<field name="created_at"/>
|
||||
</list>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="action_ai_ielts_log" model="ir.actions.act_window">
|
||||
<field name="name">IELTS Generation Logs</field>
|
||||
<field name="res_model">encoach.ai.ielts.generation.log</field>
|
||||
<field name="view_mode">list,form</field>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
27
custom_addons/encoach_ai_course/views/ai_review_views.xml
Normal file
27
custom_addons/encoach_ai_course/views/ai_review_views.xml
Normal file
@@ -0,0 +1,27 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<odoo>
|
||||
|
||||
<record id="view_ai_review_queue_list" model="ir.ui.view">
|
||||
<field name="name">encoach.resource.ai.review.list</field>
|
||||
<field name="model">encoach.resource</field>
|
||||
<field name="arch" type="xml">
|
||||
<list string="AI Content Review Queue">
|
||||
<field name="name"/>
|
||||
<field name="type"/>
|
||||
<field name="cefr_level"/>
|
||||
<field name="grammar_topic"/>
|
||||
<field name="review_status" widget="badge" decoration-info="review_status == 'pending'" decoration-success="review_status == 'approved'" decoration-danger="review_status == 'rejected'"/>
|
||||
<field name="create_date"/>
|
||||
</list>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="action_ai_review_queue" model="ir.actions.act_window">
|
||||
<field name="name">AI Content Review</field>
|
||||
<field name="res_model">encoach.resource</field>
|
||||
<field name="view_mode">list,form</field>
|
||||
<field name="domain">[('ai_generated', '=', True)]</field>
|
||||
<field name="context">{'search_default_pending_review': 1}</field>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
52
custom_addons/encoach_ai_course/views/ielts_review_views.xml
Normal file
52
custom_addons/encoach_ai_course/views/ielts_review_views.xml
Normal file
@@ -0,0 +1,52 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<odoo>
|
||||
|
||||
<record id="view_ielts_review_form" model="ir.ui.view">
|
||||
<field name="name">encoach.ai.ielts.generation.log.review.form</field>
|
||||
<field name="model">encoach.ai.ielts.generation.log</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="IELTS Content Review">
|
||||
<header>
|
||||
<field name="review_status" widget="statusbar" statusbar_visible="draft,pending_review,approved"/>
|
||||
</header>
|
||||
<sheet>
|
||||
<group>
|
||||
<group>
|
||||
<field name="skill" readonly="1"/>
|
||||
<field name="review_status"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="examiner_id"/>
|
||||
<field name="reviewed_at"/>
|
||||
</group>
|
||||
</group>
|
||||
<group string="Examiner Notes">
|
||||
<field name="examiner_notes" nolabel="1"/>
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_ielts_review_list" model="ir.ui.view">
|
||||
<field name="name">encoach.ai.ielts.generation.log.review.list</field>
|
||||
<field name="model">encoach.ai.ielts.generation.log</field>
|
||||
<field name="arch" type="xml">
|
||||
<list string="IELTS Content Review Queue">
|
||||
<field name="skill"/>
|
||||
<field name="review_status" widget="badge" decoration-info="review_status == 'pending_review'" decoration-success="review_status == 'approved'" decoration-danger="review_status == 'rejected'" decoration-warning="review_status == 'revision_needed'"/>
|
||||
<field name="examiner_id"/>
|
||||
<field name="reviewed_at"/>
|
||||
<field name="create_date"/>
|
||||
</list>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="action_ielts_review_queue" model="ir.actions.act_window">
|
||||
<field name="name">IELTS Content Review</field>
|
||||
<field name="res_model">encoach.ai.ielts.generation.log</field>
|
||||
<field name="view_mode">list,form</field>
|
||||
<field name="domain">[('review_status', '\!=', 'draft')]</field>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
Reference in New Issue
Block a user