from odoo import fields, models, api class Course(models.Model): _name = 'yuthon.school.course' _description = '课程' _order = 'sequence, name' name = fields.Char( string='课程名称', required=True, help='如:Odoo 18 全栈开发工程师认证课程', ) code = fields.Char( string='课程编号', help='如:ODOO-101', ) sequence = fields.Integer( string='排序', default=10, ) category_id = fields.Many2one( 'yuthon.school.category', string='学习分类', ondelete='restrict', ) teacher_id = fields.Many2one( 'yuthon.school.teacher', string='授课教师', ) difficulty = fields.Selection( [('beginner', '入门'), ('intermediate', '进阶'), ('advanced', '高级')], string='难度等级', default='beginner', ) state = fields.Selection( [('draft', '草稿'), ('recruiting', '招生中'), ('ongoing', '进行中'), ('finished', '已结课')], string='状态', default='draft', ) description = fields.Text( string='课程简介', help='课程目标、适合人群、考核方式等', ) textbook_ids = fields.Many2many( 'yuthon.school.textbook', 'yuthon_course_textbook_rel', 'course_id', 'textbook_id', string='关联教材', help='本课程涵盖的教材(Many2many 演示)', ) syllabus_ids = fields.One2many( 'yuthon.school.syllabus', 'course_id', string='课程大纲', ) student_ids = fields.Many2many( 'yuthon.school.student', 'yuthon_course_student_rel', 'course_id', 'student_id', string='选课学生', help='选修本课程的学生(Many2many 演示)', ) total_hours = fields.Float( string='总学时', compute='_compute_total_hours', store=True, help='自动汇总关联教材各章学时', ) enrollment_count = fields.Integer( string='选课人数', compute='_compute_counts', store=True, ) syllabus_count = fields.Integer( string='大纲条目', compute='_compute_counts', store=True, ) active = fields.Boolean( string='启用', default=True, ) @api.depends('textbook_ids.chapter_ids.hours') def _compute_total_hours(self): for record in self: record.total_hours = sum( chapter.hours for textbook in record.textbook_ids for chapter in textbook.chapter_ids ) @api.depends('student_ids', 'syllabus_ids') def _compute_counts(self): for record in self: record.enrollment_count = len(record.student_ids) record.syllabus_count = len(record.syllabus_ids) def action_recruit(self): """开始招生""" self.write({'state': 'recruiting'}) def action_start(self): """开课""" self.write({'state': 'ongoing'}) def action_finish(self): """结课""" self.write({'state': 'finished'})