425 lines
23 KiB
XML
425 lines
23 KiB
XML
<odoo>
|
||
<!-- ===================== 课程:列表 ===================== -->
|
||
<record id="yuthon_school_course_view_list" model="ir.ui.view">
|
||
<field name="name">yuthon.school.course.list</field>
|
||
<field name="model">yuthon.school.course</field>
|
||
<field name="arch" type="xml">
|
||
<list string="课程">
|
||
<field name="name"/>
|
||
<field name="code"/>
|
||
<field name="college"/>
|
||
<field name="semester"/>
|
||
<field name="course_type"/>
|
||
<field name="hours"/>
|
||
<field name="teacher_id" column_invisible="1"/>
|
||
<field name="student_count"/>
|
||
<field name="chapter_count"/>
|
||
<field name="state"/>
|
||
</list>
|
||
</field>
|
||
</record>
|
||
|
||
<!-- ===================== 课程:表单 ===================== -->
|
||
<record id="yuthon_school_course_view_form" model="ir.ui.view">
|
||
<field name="name">yuthon.school.course.form</field>
|
||
<field name="model">yuthon.school.course</field>
|
||
<field name="arch" type="xml">
|
||
<form>
|
||
<header>
|
||
<button name="action_publish" type="object" string="发布"
|
||
class="btn-primary"
|
||
invisible="[('state', '!=', 'draft')]"/>
|
||
<button name="action_archive" type="object" string="归档"
|
||
invisible="[('state', '!=', 'published')]"/>
|
||
<button name="action_to_draft" type="object" string="转为草稿"
|
||
invisible="[('state', '=', 'draft')]"/>
|
||
<!-- <field name="state" widget="statusbar"-->
|
||
<!-- statusbar_visible="draft,published,archived"/>-->
|
||
</header>
|
||
<sheet>
|
||
<group>
|
||
<group>
|
||
<field name="name"/>
|
||
<field name="code"/>
|
||
<field name="teacher_id" invisible="1"/>
|
||
<field name="college"/>
|
||
<field name="semester"/>
|
||
</group>
|
||
<group>
|
||
<field name="course_type"/>
|
||
<field name="hours"/>
|
||
<field name="start_date"/>
|
||
<field name="end_date"/>
|
||
<field name="is_public"/>
|
||
</group>
|
||
</group>
|
||
<notebook>
|
||
<page string="课程内容">
|
||
<separator string="课程章节(每章含视频与资料)"/>
|
||
<field name="chapter_ids">
|
||
<list editable="top">
|
||
<field name="name"/>
|
||
<field name="class_hours" string="课时"/>
|
||
<field name="video_filename_display" string="视频"/>
|
||
<button name="action_open_edit" type="object"
|
||
string="编辑章节" icon="fa-pencil"
|
||
class="btn-link"
|
||
groups="college.group_teacher,base.group_system"/>
|
||
</list>
|
||
<form>
|
||
<group>
|
||
<field name="name"/>
|
||
<field name="sequence" invisible="1"/>
|
||
</group>
|
||
<group>
|
||
<field name="description" widget="html"
|
||
string="章节说明"/>
|
||
</group>
|
||
<group>
|
||
<field name="video_file" filename="video_filename"/>
|
||
<field name="video_filename" invisible="1"/>
|
||
</group>
|
||
<field name="attachment_ids" string="章节资料">
|
||
<list editable="bottom">
|
||
<field name="name" string="文件名"/>
|
||
<field name="file" filename="name"/>
|
||
</list>
|
||
</field>
|
||
</form>
|
||
</field>
|
||
</page>
|
||
<page string="选课学员" groups="college.group_teacher,base.group_system">
|
||
<field name="student_ids" widget="many2many"
|
||
context="{'default_name': name}"/>
|
||
</page>
|
||
<page string="课程介绍">
|
||
<field name="introduction"/>
|
||
</page>
|
||
<page string="课程目标">
|
||
<field name="objectives"/>
|
||
</page>
|
||
<page string="课程特色">
|
||
<field name="features"/>
|
||
</page>
|
||
<page string="业务情景">
|
||
<field name="business_scenario"/>
|
||
</page>
|
||
|
||
<page string="学习进度" groups="college.group_teacher,base.group_system">
|
||
<field name="progress_ids" mode="kanban,list" readonly="1"
|
||
context="{'kanban_view_ref': 'college.yuthon_school_progress_view_kanban', 'tree_view_ref': 'college.yuthon_school_progress_view_list'}"/>
|
||
</page>
|
||
<page string="作业布置" groups="college.group_teacher,base.group_system">
|
||
<field name="assignment_ids">
|
||
<list>
|
||
<field name="name" string="作业标题"/>
|
||
<field name="chapter_id" string="对应章节"/>
|
||
<field name="due_date" string="截止日期"/>
|
||
<field name="submission_count" string="提交数"/>
|
||
<field name="state" string="状态"/>
|
||
</list>
|
||
</field>
|
||
</page>
|
||
|
||
</notebook>
|
||
</sheet>
|
||
<chatter/>
|
||
</form>
|
||
</field>
|
||
</record>
|
||
|
||
<!-- ===================== 课程:我的课程学生只读表单(含 Chatter) ===================== -->
|
||
<record id="yuthon_school_course_view_form_student" model="ir.ui.view">
|
||
<field name="name">yuthon.school.course.form.student</field>
|
||
<field name="model">yuthon.school.course</field>
|
||
<field name="priority">15</field>
|
||
<field name="groups_id" eval="[(4, ref('college.group_student'))]"/>
|
||
<field name="arch" type="xml">
|
||
<form edit="0" create="0" delete="0" duplicate="0">
|
||
<sheet>
|
||
<div class="oe_title">
|
||
<h1><field name="name" readonly="1"/></h1>
|
||
</div>
|
||
<group>
|
||
<group>
|
||
<field name="code" readonly="1" string="课程编号"/>
|
||
<field name="college" readonly="1"/>
|
||
<field name="semester" readonly="1"/>
|
||
</group>
|
||
<group>
|
||
<field name="teacher_id" readonly="1"/>
|
||
<field name="course_type" readonly="1" string="课程模块"/>
|
||
<field name="hours" readonly="1"/>
|
||
<field name="start_date" readonly="1"/>
|
||
<field name="end_date" readonly="1"/>
|
||
<field name="is_public" readonly="1"/>
|
||
</group>
|
||
</group>
|
||
<notebook>
|
||
<page string="课程内容">
|
||
<separator string="课程章节(按顺序学习视频与资料)"/>
|
||
<field name="chapter_ids" readonly="1">
|
||
<list>
|
||
<field name="name"/>
|
||
<field name="class_hours" string="课时"/>
|
||
</list>
|
||
</field>
|
||
</page>
|
||
<page string="选课学员" groups="college.group_teacher,base.group_system">
|
||
<field name="student_ids" readonly="1"/>
|
||
</page>
|
||
<page string="课程介绍">
|
||
<field name="introduction" readonly="1"/>
|
||
</page>
|
||
<page string="课程目标">
|
||
<field name="objectives" readonly="1"/>
|
||
</page>
|
||
<page string="课程特色">
|
||
<field name="features" readonly="1"/>
|
||
</page>
|
||
<page string="业务情景">
|
||
<field name="business_scenario" readonly="1"/>
|
||
</page>
|
||
</notebook>
|
||
</sheet>
|
||
<chatter/>
|
||
</form>
|
||
</field>
|
||
</record>
|
||
|
||
<!-- ===================== 课程:搜索 ===================== -->
|
||
<record id="yuthon_school_course_view_search" model="ir.ui.view">
|
||
<field name="name">yuthon.school.course.search</field>
|
||
<field name="model">yuthon.school.course</field>
|
||
<field name="arch" type="xml">
|
||
<search>
|
||
<field name="name" string="课程名称"
|
||
filter_domain="[('name', 'ilike', self)]"/>
|
||
<field name="college"/>
|
||
<field name="semester"/>
|
||
<filter name="theory" string="理论"
|
||
domain="[('course_type', '=', 'theory')]"/>
|
||
<filter name="practice" string="实践"
|
||
domain="[('course_type', '=', 'practice')]"/>
|
||
<filter name="my_courses" string="我的课程"
|
||
domain="[('teacher_id', '=', uid)]"/>
|
||
<filter name="published" string="已发布"
|
||
domain="[('state', '=', 'published')]"/>
|
||
<group expand="0" string="分组">
|
||
<filter name="group_college" string="学院"
|
||
context="{'group_by': 'college'}"/>
|
||
<filter name="group_semester" string="学期"
|
||
context="{'group_by': 'semester'}"/>
|
||
<filter name="group_state" string="状态"
|
||
context="{'group_by': 'state'}"/>
|
||
</group>
|
||
<searchpanel>
|
||
<field name="course_type" string="课程模块" enable_counters="1"/>
|
||
<field name="college" string="学院" enable_counters="1"/>
|
||
</searchpanel>
|
||
</search>
|
||
</field>
|
||
</record>
|
||
|
||
<!-- ===================== 课程:看板 ===================== -->
|
||
<record id="yuthon_school_course_view_kanban" model="ir.ui.view">
|
||
<field name="name">yuthon.school.course.kanban</field>
|
||
<field name="model">yuthon.school.course</field>
|
||
<field name="arch" type="xml">
|
||
<kanban default_order="semester,college,name"
|
||
class="college-course-kanban college-kanban-teacher o_kanban_mobile">
|
||
<field name="name"/>
|
||
<field name="college"/>
|
||
<field name="semester"/>
|
||
<field name="course_type"/>
|
||
<field name="teacher_id"/>
|
||
<field name="student_count"/>
|
||
<field name="chapter_count"/>
|
||
<field name="state"/>
|
||
<templates>
|
||
<t t-name="kanban-box">
|
||
<div class="oe_kanban_global_click college-kanban-card"
|
||
style="padding:0; border-radius:8px; overflow:hidden;">
|
||
<!-- 顶帽:蓝调 + 课程编号 -->
|
||
<div style="background:linear-gradient(135deg,#3B82F6,#6366F1); padding:10px 14px; display:flex; align-items:center; justify-content:space-between;">
|
||
<div style="color:#fff; font-size:11px; opacity:.85; letter-spacing:.5px;">
|
||
<field name="code"/>
|
||
</div>
|
||
<span class="badge text-white"
|
||
style="font-size:10px; background:rgba(255,255,255,.25); padding:3px 8px; border-radius:6px;">
|
||
<field name="course_type"/>
|
||
</span>
|
||
</div>
|
||
<!-- 主体 -->
|
||
<div class="college-kanban-body" style="padding:10px 14px;">
|
||
<div class="college-kanban-title">
|
||
<field name="name"/>
|
||
</div>
|
||
<div class="college-kanban-meta text-muted small mb-1">
|
||
<i class="fa fa-building"/> <field name="college"/> · <field name="semester"/>
|
||
</div>
|
||
<div class="college-kanban-meta small mb-1">
|
||
<i class="fa fa-user text-muted"/> <field name="teacher_id"/>
|
||
</div>
|
||
<div style="display:flex; gap:8px; margin-top:8px;">
|
||
<span class="college-kanban-badge college-kanban-badge-hours">
|
||
<i class="fa fa-clock-o"/> <field name="hours"/> 课时
|
||
</span>
|
||
<span class="college-kanban-badge college-kanban-badge-students">
|
||
<i class="fa fa-users"/> <field name="student_count"/> 学员
|
||
</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</t>
|
||
</templates>
|
||
</kanban>
|
||
</field>
|
||
</record>
|
||
|
||
<!-- ===================== 课程:我的课程学生专属看板(按学期分组,书本风格) ===================== -->
|
||
<record id="yuthon_school_course_view_kanban_student" model="ir.ui.view">
|
||
<field name="name">yuthon.school.course.kanban.student</field>
|
||
<field name="model">yuthon.school.course</field>
|
||
<field name="priority">20</field>
|
||
<field name="groups_id" eval="[(4, ref('college.group_student'))]"/>
|
||
<field name="arch" type="xml">
|
||
<kanban default_group_by="semester"
|
||
default_order="college,name"
|
||
class="college-course-kanban college-kanban-my o_kanban_mobile">
|
||
<field name="name"/>
|
||
<field name="code"/>
|
||
<field name="college"/>
|
||
<field name="semester"/>
|
||
<field name="course_type"/>
|
||
<field name="teacher_id"/>
|
||
<field name="hours"/>
|
||
<field name="chapter_count"/>
|
||
<field name="is_public"/>
|
||
<progressbar field="chapter_count" title="章节进度"
|
||
colors='{"done": "success", "warning": "warning"}'/>
|
||
<templates>
|
||
<t t-name="kanban-box">
|
||
<div class="oe_kanban_global_click college-kanban-card"
|
||
style="padding:0; border-radius:8px; overflow:hidden;">
|
||
<!-- 顶帽:彩色条 + 课程编号 -->
|
||
<div style="background:linear-gradient(135deg,#5B86E5,#36D1DC); padding:10px 14px;">
|
||
<div style="color:#fff; font-size:11px; opacity:.85; letter-spacing:.5px;">
|
||
<field name="code"/>
|
||
</div>
|
||
<div style="color:#fff; font-size:15px; font-weight:600; margin-top:2px;">
|
||
<field name="name"/>
|
||
</div>
|
||
</div>
|
||
<!-- 主体 -->
|
||
<div class="college-kanban-body" style="padding:10px 14px;">
|
||
<div class="mb-2">
|
||
<span class="college-kanban-badge college-kanban-badge-type">
|
||
<field name="course_type"/>
|
||
</span>
|
||
<t t-if="record.is_public.raw_value">
|
||
<span class="college-kanban-badge college-kanban-badge-public ml-1">公开</span>
|
||
</t>
|
||
</div>
|
||
<div class="college-kanban-meta text-muted small mb-1">
|
||
<field name="college"/>
|
||
</div>
|
||
<div class="college-kanban-meta small mb-1">
|
||
<i class="fa fa-user-circle-o text-muted"/> <field name="teacher_id" widget="many2one_avatar_user"/>
|
||
</div>
|
||
<div class="college-kanban-meta small text-muted">
|
||
<i class="fa fa-clock-o"/> <field name="hours"/> 课时 · 共 <field name="chapter_count"/> 章节
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</t>
|
||
</templates>
|
||
</kanban>
|
||
</field>
|
||
</record>
|
||
|
||
<!-- ===================== 课程:课程学习学生专属看板(按学院分组,活力橙风格) ===================== -->
|
||
<record id="yuthon_school_course_view_kanban_study" model="ir.ui.view">
|
||
<field name="name">yuthon.school.course.kanban.study</field>
|
||
<field name="model">yuthon.school.course</field>
|
||
<field name="priority">25</field>
|
||
<field name="groups_id" eval="[(4, ref('college.group_student'))]"/>
|
||
<field name="arch" type="xml">
|
||
<kanban default_group_by="college"
|
||
default_order="semester,name"
|
||
class="college-course-kanban college-kanban-study o_kanban_mobile">
|
||
<field name="name"/>
|
||
<field name="code"/>
|
||
<field name="college"/>
|
||
<field name="semester"/>
|
||
<field name="course_type"/>
|
||
<field name="teacher_id"/>
|
||
<field name="hours"/>
|
||
<field name="chapter_count"/>
|
||
<field name="is_public"/>
|
||
<templates>
|
||
<t t-name="kanban-box">
|
||
<div class="oe_kanban_global_click college-kanban-card"
|
||
style="padding:0; border-radius:10px; overflow:hidden;">
|
||
<!-- 顶帽:橙色渐变 + 课程类型徽章 -->
|
||
<div style="background:linear-gradient(120deg,#FF9966,#FF5E62); padding:8px 14px; display:flex; align-items:center; justify-content:space-between;">
|
||
<div style="color:#fff; font-size:11px; opacity:.92;">
|
||
<i class="fa fa-book"/> <field name="code"/>
|
||
</div>
|
||
<span class="college-kanban-badge college-kanban-badge-type">
|
||
<field name="course_type"/>
|
||
</span>
|
||
</div>
|
||
<!-- 主体 -->
|
||
<div class="college-kanban-body" style="padding:12px 14px;">
|
||
<div class="college-kanban-title" style="min-height:36px;">
|
||
<field name="name"/>
|
||
</div>
|
||
<div class="college-kanban-meta text-muted small mb-2">
|
||
<i class="fa fa-calendar"/> <field name="semester"/>
|
||
</div>
|
||
<div class="college-kanban-meta small mb-1">
|
||
<i class="fa fa-user text-muted"/> <field name="teacher_id" widget="many2one_avatar_user"/>
|
||
</div>
|
||
<div style="display:flex; gap:8px; margin-top:8px;">
|
||
<span class="college-kanban-badge college-kanban-badge-hours">
|
||
<i class="fa fa-clock-o"/> <field name="hours"/> 课时
|
||
</span>
|
||
<span class="college-kanban-badge college-kanban-badge-chapters">
|
||
<i class="fa fa-list"/> <field name="chapter_count"/> 章
|
||
</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</t>
|
||
</templates>
|
||
</kanban>
|
||
</field>
|
||
</record>
|
||
|
||
<!-- ===================== 课程:动作(后置定义,显式绑定老师视图,避免学生视图靠优先级抢占) ===================== -->
|
||
<record id="action_yuthon_school_course_my" 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">[('teacher_id', '=', uid)]</field>
|
||
<field name="context">{'search_default_my_courses': 1}</field>
|
||
<field name="view_ids" eval="[(5, 0, 0),
|
||
(0, 0, {'view_mode': 'kanban', 'view_id': ref('yuthon_school_course_view_kanban')}),
|
||
(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')})]"/>
|
||
<field name="target">current</field>
|
||
</record>
|
||
|
||
<record id="action_yuthon_school_course_all" 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="view_ids" eval="[(5, 0, 0),
|
||
(0, 0, {'view_mode': 'kanban', 'view_id': ref('yuthon_school_course_view_kanban')}),
|
||
(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')})]"/>
|
||
<field name="target">current</field>
|
||
</record>
|
||
</odoo>
|