feat(v3): restructure project + add complete frontend
- Restructure: move backend from new_project/ to backend/ - Add full React/TypeScript frontend (37 pages, 17 services, 16 type defs, 11 query hooks) - Add docs/ with SRS specs, user stories, and workflow documentation - Update .gitignore for new directory layout Workflows implemented: WF1 User Signup, WF2 Placement Test, WF3 Exam Configuration, WF4 General English Exam, WF5 Course Generation, WF6 Entity Student Onboarding, AI Course Generation, Adaptive Learning Engine UI, White-Label Branding, Score Release Made-with: Cursor
This commit is contained in:
46
custom_addons/encoach_exam_template/models/passage.py
Normal file
46
custom_addons/encoach_exam_template/models/passage.py
Normal file
@@ -0,0 +1,46 @@
|
||||
from odoo import models, fields, api
|
||||
|
||||
|
||||
class EncoachPassage(models.Model):
|
||||
_name = 'encoach.passage'
|
||||
_description = 'Reading Passage'
|
||||
|
||||
exam_type = fields.Selection([
|
||||
('academic', 'Academic'),
|
||||
('general_training', 'General Training'),
|
||||
('general_english', 'General English'),
|
||||
], required=True)
|
||||
section_num = fields.Integer(required=True)
|
||||
topic_category = fields.Char(size=100, required=True)
|
||||
body_text = fields.Text(required=True)
|
||||
difficulty = fields.Selection([
|
||||
('easy', 'Easy'),
|
||||
('medium', 'Medium'),
|
||||
('hard', 'Hard'),
|
||||
], required=True)
|
||||
status = fields.Selection([
|
||||
('draft', 'Draft'),
|
||||
('active', 'Active'),
|
||||
('retired', 'Retired'),
|
||||
('flagged', 'Flagged'),
|
||||
], default='draft', required=True)
|
||||
word_count = fields.Integer(compute='_compute_word_count', store=True)
|
||||
ai_generated = fields.Boolean(default=False)
|
||||
approved = fields.Boolean(default=False)
|
||||
ielts_certified = fields.Boolean(default=False)
|
||||
generation_brief = fields.Text()
|
||||
validation_errors = fields.Text()
|
||||
cefr_level = fields.Selection([
|
||||
('pre_a1', 'Pre-A1'),
|
||||
('a1', 'A1'),
|
||||
('a2', 'A2'),
|
||||
('b1', 'B1'),
|
||||
('b2', 'B2'),
|
||||
('c1', 'C1'),
|
||||
('c2', 'C2'),
|
||||
])
|
||||
|
||||
@api.depends('body_text')
|
||||
def _compute_word_count(self):
|
||||
for record in self:
|
||||
record.word_count = len(record.body_text.split()) if record.body_text else 0
|
||||
Reference in New Issue
Block a user