shcool/learning_center/models/learning_course.py
2026-06-15 23:57:01 +08:00

113 lines
4.8 KiB
Python

from odoo import api, fields, models
class LearningCourse(models.Model):
_name = 'learning.course'
_description = '课程'
_inherit = ['mail.thread', 'mail.activity.mixin']
name = fields.Char(string='课程名称', required=True)
code = fields.Char(string='课程代码', required=True, index=True)
english_name = fields.Char(string='英文名称')
credit = fields.Float(string='学分', required=True)
exam_type = fields.Selection([
('exam', '考试'),
('assessment', '考查'),
], string='考核方式')
description = fields.Html(string='课程简介')
objectives = fields.Html(string='教学目标')
state = fields.Selection([
('draft', '草稿'),
('published', '已发布'),
], default='draft', required=True)
# ==================== 关联章节 ====================
chapter_ids = fields.One2many('course.chapter', 'course_id', string='章节')
chapter_count = fields.Integer(string='章节数', compute='_compute_chapter_count', store=True)
# ==================== 关联教学大纲/教案 ====================
syllabus_ids = fields.One2many('course.syllabus', 'course_id', string='教学大纲/教案')
syllabus_count = fields.Integer(string='大纲/教案数', compute='_compute_syllabus_count', store=True)
# 按类型统计
syllabus_count_total = fields.Integer(string='大纲总数', compute='_compute_syllabus_count')
lesson_plan_count = fields.Integer(string='教案总数', compute='_compute_syllabus_count')
# ==================== 统计资源(通过章节关联) ====================
resource_count = fields.Integer(string='资源总数', compute='_compute_resource_count', store=True)
video_count = fields.Integer(string='视频数', compute='_compute_resource_count', store=True)
doc_count = fields.Integer(string='文档数', compute='_compute_resource_count', store=True)
# 汇总所有章节的资源
resource_all_ids = fields.One2many(
comodel_name='course.chapter.resource',
inverse_name=None,
compute='_compute_resource_all_ids',
string='资源列表',
readonly=True
)
@api.depends('chapter_ids', 'chapter_ids.resource_ids')
def _compute_resource_all_ids(self):
for record in self:
# 取出所有章节下的资源记录
all_resources = record.chapter_ids.mapped('resource_ids')
record.resource_all_ids = all_resources
# ==================== 计算字段方法 ====================
@api.depends('chapter_ids')
def _compute_chapter_count(self):
for record in self:
record.chapter_count = len(record.chapter_ids)
@api.depends('syllabus_ids', 'syllabus_ids.syllabus_type')
def _compute_syllabus_count(self):
for record in self:
record.syllabus_count = len(record.syllabus_ids)
record.syllabus_count_total = len(record.syllabus_ids.filtered(lambda s: s.syllabus_type == 'syllabus'))
record.lesson_plan_count = len(record.syllabus_ids.filtered(lambda s: s.syllabus_type == 'lesson_plan'))
@api.depends('chapter_ids.resource_ids', 'chapter_ids.resource_ids.resource_type')
def _compute_resource_count(self):
for record in self:
resources = record.chapter_ids.mapped('resource_ids')
record.resource_count = len(resources)
record.video_count = len(resources.filtered(lambda r: r.resource_type == 'video'))
record.doc_count = len(resources.filtered(lambda r: r.resource_type in ['pdf', 'ppt']))
# ==================== 业务方法 ====================
def action_publish(self):
"""发布课程"""
self.state = 'published'
def action_draft(self):
"""退回草稿"""
self.state = 'draft'
def action_view_chapters(self):
"""查看章节"""
return {
'type': 'ir.actions.act_window',
'name': '课程章节',
'res_model': 'course.chapter',
'view_mode': 'list,form',
'domain': [('course_id', '=', self.id)],
'context': {'default_course_id': self.id},
}
def action_view_syllabus(self):
"""查看教学大纲/教案"""
return {
'type': 'ir.actions.act_window',
'name': '教学大纲/教案',
'res_model': 'course.syllabus',
'view_mode': 'list,form',
'domain': [('course_id', '=', self.id)],
'context': {'default_course_id': self.id},
}
def action_view_resources(self):
"""查看所有资源"""
return {
'type': 'ir.actions.act_window',
'name': '教学资源',
'res_model': 'course.chapter.resource',
'view_mode': 'list,form',
'domain': [('chapter_id.course_id', '=', self.id)],
}