Files
shcool/college/views/chapter_views.xml
T
2026-09-16 15:34:00 +08:00

304 lines
17 KiB
XML

<odoo>
<!-- ===================== 章节:老师编辑表单(默认) ===================== -->
<record id="yuthon_school_course_chapter_form_view" model="ir.ui.view">
<field name="name">yuthon.school.course.chapter.form.view</field>
<field name="model">yuthon.school.course.chapter</field>
<field name="priority">30</field>
<field name="groups_id" eval="[(4, ref('college.group_teacher')), (4, ref('base.group_system'))]"/>
<field name="arch" type="xml">
<form>
<group>
<group>
<field name="name"/>
<field name="course_id" readonly="1"/>
<field name="sequence" invisible="1"/>
</group>
<group>
<field name="class_hours" string="课时"/>
</group>
</group>
<group>
<field name="description" widget="html" string="章节说明"/>
<field name="notes" widget="html" string="随堂笔记"/>
</group>
<separator string="训练习题(均为简答题,可添加多道;学生可自由作答,不计分)"/>
<field name="exercise_ids" string="训练习题">
<list editable="bottom" decoration-muted="sequence &lt; 0">
<field name="sequence" widget="handle" string="排序"/>
<field name="question" string="题目"/>
<field name="analysis" string="参考解析" optional="show"/>
<field name="answer_count" string="作答人数"/>
<button name="action_view_answers" type="object"
string="查看作答" class="btn-link"
icon="fa-comments"
title="查看本题所有学员的回答"/>
</list>
</field>
<separator string="任务列表"/>
<field name="task_ids" string="任务列表">
<list editable="bottom" decoration-muted="is_done == True">
<field name="sequence" widget="handle" string="排序"/>
<field name="name" string="任务名称"/>
<field name="is_done" string="已完成" optional="show"/>
</list>
</field>
<group>
<field name="video_file" filename="video_filename"/>
<field name="video_filename" invisible="1"/>
<field name="video_filename_display" invisible="1"/>
</group>
<field name="attachment_ids" string="章节资料">
<list editable="bottom">
<field name="name" string="文件名"/>
<field name="file" filename="name"/>
</list>
</field>
</form>
</field>
</record>
<!-- ===================== 章节:学生学习表单(全屏播放视频/下载附件) ===================== -->
<record id="yuthon_school_course_chapter_study_form" model="ir.ui.view">
<field name="name">yuthon.school.course.chapter.study.form</field>
<field name="model">yuthon.school.course.chapter</field>
<field name="priority">20</field>
<field name="groups_id" eval="[(4, ref('college.group_student')), (4, ref('base.group_system'))]"/>
<field name="arch" type="xml">
<form>
<header>
<button name="action_toggle_complete" type="object"
string="标记已学完" class="btn-primary"
invisible="is_done_for_me"/>
<button name="action_toggle_complete" type="object"
string="取消完成" class="btn-secondary"
invisible="not is_done_for_me"/>
<field name="is_done_for_me" invisible="1"/>
</header>
<sheet>
<h2><field name="name" readonly="1"/></h2>
<div class="text-muted mb-3">
所属课程:<field name="course_id" readonly="1"/>
</div>
<group>
<field name="description" widget="html" readonly="1"/>
</group>
<!-- 有视频时直接播放 -->
<field name="video_embed_html" widget="html" readonly="1"
invisible="not video_file"/>
<!-- 没有视频但有附件时,只显示附件 -->
<separator string="章节资料" invisible="not attachment_ids"/>
<field name="attachment_ids" readonly="1"
invisible="not attachment_ids">
<list editable="bottom" create="0" delete="0">
<field name="name" string="文件名" readonly="1"/>
<field name="download_link_html" widget="html"
nolabel="1"/>
</list>
</field>
<!-- 训练习题:可自由作答,不计分 -->
<separator string="训练习题(可自由作答,不计分)" invisible="not exercise_ids"/>
<field name="exercise_ids" readonly="1"
invisible="not exercise_ids">
<list editable="bottom" create="0" delete="0">
<field name="sequence" string="序号"/>
<field name="question" string="题目" readonly="1"/>
<field name="my_answer_preview" string="我的回答"
placeholder="(未作答)" optional="show"/>
<field name="my_answer_content" string="我的回答(详细)"
optional="hide"/>
<field name="answer_count" string="已作答人数" optional="show"/>
<button name="action_answer" type="object"
string="作答 / 修改" class="btn-primary"
icon="fa-pencil"/>
</list>
</field>
</sheet>
</form>
</field>
</record>
<!-- ===================== 学员作答:弹窗表单 ===================== -->
<record id="yuthon_school_course_chapter_exercise_answer_form" model="ir.ui.view">
<field name="name">yuthon.school.course.chapter.exercise.answer.form</field>
<field name="model">yuthon.school.course.chapter.exercise.answer</field>
<field name="arch" type="xml">
<form>
<sheet>
<group>
<field name="exercise_id" invisible="1"/>
<field name="student_id" invisible="1"/>
<field name="user_id" invisible="1"/>
<field name="submit_time" invisible="1"/>
</group>
<div class="text-muted small mb-1">
所属课程:<field name="course_id" readonly="1" nolabel="1" class="oe_inline"/>
· 所属章节:<field name="chapter_id" readonly="1" nolabel="1" class="oe_inline"/>
</div>
<separator string="题目"/>
<field name="question_display" widget="html" readonly="1" nolabel="1"/>
<separator string="我的回答(自由作答,不计分,可随时修改)"/>
<field name="content" widget="html" nolabel="1"
placeholder="请输入你的回答..."/>
<div class="text-muted small mt-2" invisible="not submit_time">
上次作答时间:<field name="submit_time" readonly="1" nolabel="1" class="oe_inline"/>
</div>
</sheet>
</form>
</field>
</record>
<!-- ===================== 学员作答:老师只读列表(弹窗查看用) ===================== -->
<record id="yuthon_school_course_chapter_exercise_answer_view_tree_teacher" model="ir.ui.view">
<field name="name">yuthon.school.course.chapter.exercise.answer.tree.teacher</field>
<field name="model">yuthon.school.course.chapter.exercise.answer</field>
<field name="groups_id" eval="[(4, ref('college.group_teacher')), (4, ref('base.group_system'))]"/>
<field name="arch" type="xml">
<list editable="bottom" create="0" delete="0">
<field name="student_id" string="学员" readonly="1"/>
<field name="content" string="回答内容" readonly="1"/>
<field name="submit_time" string="作答时间" readonly="1"/>
</list>
</field>
</record>
<!-- ===================== 课程学习:学生专用表单(仅学生可见,避免覆盖老师默认表单) ===================== -->
<record id="yuthon_school_course_study_form" model="ir.ui.view">
<field name="name">yuthon.school.course.study.form</field>
<field name="model">yuthon.school.course</field>
<field name="priority">10</field>
<field name="groups_id" eval="[(4, ref('college.group_student'))]"/>
<field name="arch" type="xml">
<form>
<header>
<field name="name" readonly="1"/>
<field name="chapter_count" readonly="1" string="章节数"/>
</header>
<sheet>
<div class="text-muted mb-3">
任课教师:<field name="teacher_id" readonly="1"/>
· 课时:<field name="hours" readonly="1"/>
</div>
<group>
<field name="introduction" widget="html" readonly="1"/>
</group>
<separator string="课程章节(点击「去学习」观看视频与资料)"/>
<field name="chapter_ids" readonly="1">
<kanban class="o_college_chapter_kanban">
<templates>
<t t-name="kanban-box">
<div class="oe_kanban_global_click o_college_chapter_card">
<div class="o_college_chapter_head">
<span class="o_college_chapter_title"><field name="name"/></span>
</div>
<div class="o_college_chapter_video" t-if="record.video_filename_display.raw_value">
<i class="fa fa-play-circle mr-1"/>
<field name="video_filename_display"/>
</div>
<div class="o_college_chapter_foot">
<button name="action_open_study" type="object"
class="btn btn-primary btn-sm" icon="fa-play">去学习</button>
</div>
</div>
</t>
</templates>
</kanban>
</field>
</sheet>
</form>
</field>
</record>
<!-- ===================== 学生「课程学习」入口动作 ===================== -->
<record id="action_yuthon_school_course_study" model="ir.actions.act_window">
<field name="name">课程学习</field>
<field name="res_model">yuthon.school.course</field>
<field name="view_mode">kanban,list,form</field>
<field name="domain">[('student_ids.user_id', '=', uid), ('state', '=', 'published')]</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'kanban', 'view_id': ref('yuthon_school_course_view_kanban_study')}),
(0, 0, {'view_mode': 'list', 'view_id': ref('yuthon_school_course_view_list')}),
(0, 0, {'view_mode': 'form', 'view_id': ref('yuthon_school_course_study_form')})]"/>
<field name="target">current</field>
</record>
<!-- ===================== 学生「我的课程」入口(用老师完整表单 + 只看自己的课程) ===================== -->
<record id="action_yuthon_school_my_course_student" model="ir.actions.act_window">
<field name="name">我的课程</field>
<field name="res_model">yuthon.school.course</field>
<field name="view_mode">kanban,list,form</field>
<field name="domain">[('student_ids.user_id', '=', uid), ('state', '=', 'published')]</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'kanban', 'view_id': ref('yuthon_school_course_view_kanban_student')}),
(0, 0, {'view_mode': 'list', 'view_id': ref('yuthon_school_course_view_list')}),
(0, 0, {'view_mode': 'form', 'view_id': ref('yuthon_school_course_view_form_student')})]"/>
<field name="target">current</field>
</record>
<!-- ===================== 随堂笔记:列表(按课程分组) ===================== -->
<record id="yuthon_school_course_chapter_notes_list" model="ir.ui.view">
<field name="name">yuthon.school.course.chapter.notes.list</field>
<field name="model">yuthon.school.course.chapter</field>
<field name="priority">40</field>
<field name="groups_id" eval="[(4, ref('college.group_teacher')), (4, ref('college.group_student')), (4, ref('base.group_system'))]"/>
<field name="arch" type="xml">
<list>
<field name="course_id"/>
<field name="name"/>
<field name="sequence"/>
</list>
</field>
</record>
<!-- ===================== 随堂笔记:编辑表单 ===================== -->
<record id="yuthon_school_course_chapter_notes_form" model="ir.ui.view">
<field name="name">yuthon.school.course.chapter.notes.form</field>
<field name="model">yuthon.school.course.chapter</field>
<field name="priority">40</field>
<field name="groups_id" eval="[(4, ref('college.group_teacher')), (4, ref('college.group_student')), (4, ref('base.group_system'))]"/>
<field name="arch" type="xml">
<form>
<sheet>
<h2><field name="name" readonly="1"/></h2>
<div class="text-muted mb-3">
所属课程:<field name="course_id" readonly="1"/>
</div>
<group>
<field name="notes" widget="html" groups="college.group_teacher,base.group_system"/>
<field name="notes" widget="html" readonly="1" groups="college.group_student"/>
</group>
</sheet>
</form>
</field>
</record>
<!-- ===================== 随堂笔记:搜索视图(按课程分组) ===================== -->
<record id="yuthon_school_course_chapter_notes_search" model="ir.ui.view">
<field name="name">yuthon.school.course.chapter.notes.search</field>
<field name="model">yuthon.school.course.chapter</field>
<field name="priority">40</field>
<field name="groups_id" eval="[(4, ref('college.group_teacher')), (4, ref('college.group_student')), (4, ref('base.group_system'))]"/>
<field name="arch" type="xml">
<search>
<field name="course_id"/>
<field name="name"/>
<filter name="group_by_course" string="按课程分组" context="{'group_by': 'course_id'}"/>
</search>
</field>
</record>
<!-- ===================== 随堂笔记:动作 ===================== -->
<record id="action_yuthon_school_class_notes" model="ir.actions.act_window">
<field name="name">随堂笔记</field>
<field name="res_model">yuthon.school.course.chapter</field>
<field name="view_mode">list,form</field>
<field name="domain">['|', ('course_id.teacher_id', '=', uid), ('course_id.student_ids.user_id', '=', uid)]</field>
<field name="context">{'search_default_group_by_course': 1}</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('yuthon_school_course_chapter_notes_list')}),
(0, 0, {'view_mode': 'form', 'view_id': ref('yuthon_school_course_chapter_notes_form')})]"/>
<field name="search_view_id" ref="yuthon_school_course_chapter_notes_search"/>
<field name="target">current</field>
</record>
</odoo>