Files
shcool/college/views/menus.xml
T
2026-08-27 19:53:56 +08:00

391 lines
19 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<odoo>
<!-- ===================== 产品介绍(顶级菜单,置顶,位于「我的实训」上方) ===================== -->
<!-- 在当前页面的内容区以表单形式打开预置记录 about_page_product,
其 content 富文本字段即为 H5 页面内容(介绍本教育产品本身)。 -->
<record id="action_yuthon_product_intro" model="ir.actions.act_window">
<field name="name">产品介绍</field>
<field name="res_model">yuthon.about.page</field>
<field name="view_mode">form</field>
<field name="res_id" ref="about_page_product"/>
<field name="target">current</field>
</record>
<menuitem id="menu_yuthon_product_intro"
name="产品介绍"
web_icon="college,static/src/img/product_intro.png"
sequence="0"
action="action_yuthon_product_intro"
groups="college.group_teacher,college.group_student,base.group_system"/>
<!-- ===================== 我的实训(顶级菜单,置顶) ===================== -->
<menuitem id="menu_yuthon_training"
name="我的实训"
web_icon="college,static/src/img/training.png"
sequence="1"
action="action_yuthon_school_training"
groups="college.group_teacher,college.group_student,base.group_system"/>
<!-- ===================== 我的课程(统一入口,按用户角色路由) ===================== -->
<!-- 老师 / 管理员 → action_yuthon_school_course_my(老师端我的课程) -->
<!-- 学生 → action_yuthon_school_my_course_student(学生端我的课程) -->
<!-- 这样管理员只看到一个「我的课程」菜单,避免与学生端重复 -->
<record id="action_yuthon_school_course_router" model="ir.actions.server">
<field name="name">我的课程(按角色路由)</field>
<field name="model_id" search="[('model', '=', 'yuthon.school.progress')]"/>
<field name="state">code</field>
<field name="code"><![CDATA[
if env.user.has_group('college.group_teacher') or env.user.has_group('base.group_system'):
action = env.ref('college.action_yuthon_school_course_my').sudo().read()[0]
else:
action = env.ref('college.action_yuthon_school_my_course_student').sudo().read()[0]
]]></field>
</record>
<!-- ===================== 我的课程(学生端父菜单;老师/管理员入口见下方 menu_yuthon_course_my_teacher) ===================== -->
<menuitem id="menu_yuthon_course_my"
name="我的课程"
web_icon="college,static/src/img/my_course.png"
sequence="3"
groups="college.group_student"/>
<!-- 老师/管理员端的「我的课程」入口(我教的课程),与学生端父菜单分离,避免角色路由歧义 -->
<menuitem id="menu_yuthon_course_my_teacher"
name="我的课程"
web_icon="college,static/src/img/my_course.png"
action="action_yuthon_school_course_my"
sequence="4"
groups="college.group_teacher,base.group_system"/>
<!-- ===================== 隐藏 Odoo 默认「讨论」菜单 ===================== -->
<record id="mail.menu_root_discuss" model="ir.ui.menu">
<field name="active" eval="False"/>
</record>
<!-- ===================== 「设置」菜单:仅超级管理员可见 ===================== -->
<record id="base.menu_management" model="ir.ui.menu">
<field name="active" eval="True"/>
<field name="groups_id" eval="[(6, 0, [ref('base.group_system')])]"/>
</record>
<!-- ===================== 原生「应用」菜单:师生可见 =====================
让老师、学生都能在左侧看到 Odoo 默认的「应用」菜单(模块列表)。
由于「应用」挂在「设置」下,这里单独给 base.menu_apps 追加
teacher/student 组,菜单会脱离隐藏的父菜单提升到顶层。
权限区分:
- 老师:group_teacher 隐含 base.group_erp_manager,可安装/升级/卸载模块
(模块按钮已放开到 group_erp_manager),但看不到「设置」菜单;
- 学生:仅 group_user,只读浏览,无法安装/升级/卸载。 -->
<record id="base.menu_apps" model="ir.ui.menu">
<field name="groups_id" eval="[
(6, 0, [
ref('base.group_system'),
ref('college.group_teacher'),
ref('college.group_student'),
])
]"/>
</record>
<!-- ===================== 隐藏学生的「请求访问」按钮 =====================
base_install_request 给所有非系统管理员都加了「Request Access」按钮,
学生点了会发起安装申请。这里把该按钮限定为仅管理员可见,让学生彻底只读。 -->
<record id="view_module_kanban_hide_request_access" model="ir.ui.view">
<field name="name">ir.module.module.kanban.hide.request.access</field>
<field name="model">ir.module.module</field>
<field name="inherit_id" ref="base_install_request.ir_module_module_view_kanban"/>
<field name="arch" type="xml">
<xpath expr="//button[@name='action_open_install_request']" position="attributes">
<attribute name="groups">base.group_system</attribute>
</xpath>
</field>
</record>
<!-- ===================== 模块按钮放开给「访问权限」组 =====================
原生模块安装/升级/卸载按钮 groups="base.group_system",导致只有设置组
(管理员)可见。为了让老师(group_erp_manager)能安装模块、又不用进
「设置」,把这些按钮的 groups 从 group_system 改为 group_erp_manager。
老师属于 group_erp_manager,可见可点;学生只属于 group_user,仍不可见。 -->
<!-- 看板视图(应用列表卡片) -->
<record id="view_module_kanban_teacher_install" model="ir.ui.view">
<field name="name">ir.module.module.kanban.teacher.install</field>
<field name="model">ir.module.module</field>
<field name="inherit_id" ref="base.module_view_kanban"/>
<field name="arch" type="xml">
<xpath expr="//button[@name='button_immediate_install']" position="attributes">
<attribute name="groups">base.group_erp_manager</attribute>
</xpath>
<xpath expr="//a[@name='button_immediate_upgrade']" position="attributes">
<attribute name="groups">base.group_erp_manager</attribute>
</xpath>
<xpath expr="//a[@name='button_uninstall_wizard']" position="attributes">
<attribute name="groups">base.group_erp_manager</attribute>
</xpath>
<xpath expr="//button[@name='button_uninstall_cancel']" position="attributes">
<attribute name="groups">base.group_erp_manager</attribute>
</xpath>
<xpath expr="//button[@name='button_install_cancel']" position="attributes">
<attribute name="groups">base.group_erp_manager</attribute>
</xpath>
</field>
</record>
<!-- 表单视图(模块详情页) -->
<record id="view_module_form_teacher_install" model="ir.ui.view">
<field name="name">ir.module.module.form.teacher.install</field>
<field name="model">ir.module.module</field>
<field name="inherit_id" ref="base.module_form"/>
<field name="arch" type="xml">
<xpath expr="//button[@name='button_immediate_install']" position="attributes">
<attribute name="groups">base.group_erp_manager</attribute>
</xpath>
<xpath expr="//button[@name='button_immediate_upgrade']" position="attributes">
<attribute name="groups">base.group_erp_manager</attribute>
</xpath>
<xpath expr="//button[@name='button_uninstall_wizard']" position="attributes">
<attribute name="groups">base.group_erp_manager</attribute>
</xpath>
<xpath expr="//button[@name='button_uninstall_cancel']" position="attributes">
<attribute name="groups">base.group_erp_manager</attribute>
</xpath>
<xpath expr="//button[@name='button_upgrade_cancel']" position="attributes">
<attribute name="groups">base.group_erp_manager</attribute>
</xpath>
<xpath expr="//button[@name='button_install_cancel']" position="attributes">
<attribute name="groups">base.group_erp_manager</attribute>
</xpath>
</field>
</record>
<!-- ===================== 课程管理(直接指向全部课程的 action,不再有子菜单) ===================== -->
<menuitem id="menu_yuthon_course_root"
name="课程管理"
web_icon="college,static/src/img/Course Management.png"
action="action_yuthon_school_course_all"
sequence="10"
groups="college.group_teacher,base.group_system"/>
<!-- ===================== 考试(与课程管理同级,顶级菜单,无 parent 才能带 web_icon) ===================== -->
<menuitem id="menu_yuthon_exam_root"
name="考试"
web_icon="college,static/src/img/exam.png"
sequence="15"/>
<menuitem id="menu_yuthon_exam_question"
name="题库"
parent="menu_yuthon_exam_root"
action="action_yuthon_school_exam_question"
sequence="10"
groups="college.group_teacher,base.group_system"/>
<menuitem id="menu_yuthon_exam_manage"
name="考试管理"
parent="menu_yuthon_exam_root"
action="action_yuthon_school_exam"
sequence="20"
groups="college.group_teacher,base.group_system"/>
<menuitem id="menu_yuthon_exam_grade"
name="评阅试卷"
parent="menu_yuthon_exam_root"
action="action_yuthon_school_exam_paper_grade"
sequence="30"
groups="college.group_teacher,base.group_system"/>
<menuitem id="menu_yuthon_exam_result"
name="考试结果"
parent="menu_yuthon_exam_root"
action="action_yuthon_school_exam_result"
sequence="40"
groups="college.group_teacher,base.group_system"/>
<menuitem id="menu_yuthon_exam_my"
name="我的考试"
parent="menu_yuthon_exam_root"
action="action_yuthon_school_exam_paper_student"
sequence="50"
groups="college.group_student"/>
<!-- 课程学习:原「我的学习」迁移为学生端「我的课程」的子菜单 -->
<menuitem id="menu_yuthon_course_study"
name="课程学习"
parent="menu_yuthon_course_my"
action="action_yuthon_school_course_study"
sequence="10"
groups="college.group_student"/>
<!-- 课程管理:原学生端「我的课程」迁移为学生端「我的课程」的子菜单 -->
<menuitem id="menu_yuthon_course_my_student"
name="课程管理"
parent="menu_yuthon_course_my"
action="action_yuthon_school_my_course_student"
sequence="20"
groups="college.group_student"/>
<!-- ===================== 班级管理(顶级菜单,仅老师/管理员;下含「师生管理」+「学习管理」两个分组) ===================== -->
<menuitem id="menu_yuthon_org_root"
name="班级管理"
web_icon="college,static/src/img/organization.png"
sequence="20"
groups="college.group_teacher,base.group_system"/>
<!-- 师生管理(分组容器,承载班级/老师/学生) -->
<menuitem id="menu_yuthon_org_staff"
name="师生管理"
parent="menu_yuthon_org_root"
sequence="10"/>
<menuitem id="menu_yuthon_class"
name="班级"
parent="menu_yuthon_org_staff"
action="action_yuthon_school_class"
sequence="10"
groups="college.group_teacher,base.group_system"/>
<menuitem id="menu_yuthon_teacher"
name="老师"
parent="menu_yuthon_org_staff"
action="action_yuthon_school_teacher"
sequence="20"
groups="college.group_teacher,base.group_system"/>
<menuitem id="menu_yuthon_student"
name="学生"
parent="menu_yuthon_org_staff"
action="action_yuthon_school_student"
sequence="30"
groups="college.group_teacher,base.group_system"/>
<!-- 学习管理(原顶级菜单迁移至此,与「师生管理」并列;父级仅老师/管理员可见) -->
<menuitem id="menu_yuthon_education_root"
name="学习管理"
parent="menu_yuthon_org_root"
sequence="20"/>
<!-- 学习进展:仅老师/管理员(学生侧改由顶层「我的作业」承载) -->
<menuitem id="menu_yuthon_progress"
name="学习进展"
parent="menu_yuthon_education_root"
action="action_yuthon_school_progress_router"
sequence="20"
groups="college.group_teacher,base.group_system"/>
<!-- 作业习题 -->
<menuitem id="menu_yuthon_homework"
name="作业习题"
parent="menu_yuthon_education_root"
sequence="30"/>
<!-- 作业布置:仅老师 -->
<menuitem id="menu_yuthon_homework_assignment"
name="作业布置"
parent="menu_yuthon_homework"
action="action_yuthon_school_assignment"
sequence="10"
groups="college.group_teacher,base.group_system"/>
<!-- 作业提交:仅老师(原学生入口迁移到顶层「我的作业」) -->
<menuitem id="menu_yuthon_homework_submit"
name="作业提交"
parent="menu_yuthon_homework"
action="action_yuthon_school_my_submission"
sequence="20"
groups="college.group_teacher,base.group_system"/>
<!-- 作业批改:仅老师(无提交入口) -->
<menuitem id="menu_yuthon_homework_grade"
name="作业批改"
parent="menu_yuthon_homework"
action="action_yuthon_school_assignment_submission"
sequence="30"
groups="college.group_teacher,base.group_system"/>
<menuitem id="menu_yuthon_class_notes"
name="随堂笔记"
parent="menu_yuthon_homework"
action="action_yuthon_school_class_notes"
sequence="40"
groups="college.group_teacher,base.group_system"/>
<!-- ===================== 我的作业(顶级菜单,仅学生可见;承载从「学习管理」迁移出的学生侧入口,保证学生不断流) ===================== -->
<menuitem id="menu_yuthon_student_homework"
name="我的作业"
web_icon="college,static/src/img/education.png"
sequence="6"
groups="college.group_student"/>
<menuitem id="menu_yuthon_student_homework_submit"
name="作业提交"
parent="menu_yuthon_student_homework"
action="action_yuthon_school_my_submission"
sequence="10"
groups="college.group_student"/>
<menuitem id="menu_yuthon_student_class_notes"
name="随堂笔记"
parent="menu_yuthon_student_homework"
action="action_yuthon_school_class_notes"
sequence="20"
groups="college.group_student"/>
<menuitem id="menu_yuthon_student_progress"
name="学习进展"
parent="menu_yuthon_student_homework"
action="action_yuthon_school_progress_router"
sequence="30"
groups="college.group_student"/>
<!-- ===================== 关于系统说明 ===================== -->
<!-- 系统说明:打开预置记录 about_page_system -->
<record id="action_yuthon_about_system" model="ir.actions.act_window">
<field name="name">系统说明</field>
<field name="res_model">yuthon.about.page</field>
<field name="view_mode">form</field>
<field name="res_id" ref="about_page_system"/>
<field name="target">current</field>
</record>
<!-- 操作手册:打开预置记录 about_page_operation -->
<record id="action_yuthon_about_operation" model="ir.actions.act_window">
<field name="name">操作手册</field>
<field name="res_model">yuthon.about.page</field>
<field name="view_mode">form</field>
<field name="res_id" ref="about_page_operation"/>
<field name="target">current</field>
</record>
<!-- 课程导入动作(关联 yuthon.school.course.import.wizard) -->
<record id="action_yuthon_school_course_import_wizard" model="ir.actions.act_window">
<field name="name">课程导入</field>
<field name="res_model">yuthon.school.course.import.wizard</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
<!-- ===================== 关于(顶级菜单,排在最后) ===================== -->
<menuitem id="menu_yuthon_about"
name="关于"
web_icon="college,static/src/img/about.png"
sequence="99"
groups="college.group_teacher,college.group_student,base.group_system"/>
<menuitem id="menu_yuthon_about_system"
name="系统说明"
parent="menu_yuthon_about"
action="action_yuthon_about_system"
sequence="10"/>
<menuitem id="menu_yuthon_about_operation"
name="操作手册"
parent="menu_yuthon_about"
action="action_yuthon_about_operation"
sequence="20"/>
<menuitem id="menu_yuthon_import_wizard"
name="导入师生"
parent="menu_yuthon_about"
action="action_yuthon_school_import_wizard"
sequence="30"
groups="college.group_teacher,base.group_system"/>
<menuitem id="menu_yuthon_course_import_wizard"
name="课程导入"
parent="menu_yuthon_about"
action="action_yuthon_school_course_import_wizard"
sequence="40"
groups="college.group_teacher,base.group_system"/>
<!-- 题库导入:打开批量导入向导弹窗(按题型下载模板 → 上传文件 → 写入题库) -->
<record id="action_yuthon_about_question_import" model="ir.actions.act_window">
<field name="name">题库导入</field>
<field name="res_model">yuthon.school.question.import.wizard</field>
<field name="view_mode">form</field>
<field name="target">new</field>
<field name="context">{}</field>
<field name="res_id" eval="False"/>
</record>
<menuitem id="menu_yuthon_about_question_import"
name="题库导入"
parent="menu_yuthon_about"
action="action_yuthon_about_question_import"
sequence="50"
groups="college.group_teacher,base.group_system"/>
</odoo>