通用资料报送用于承载非课程类的通用资料收集:上报单位/责任人按「报送单位 — 资料名称 — 责任人 — 备注」录入并上传资料文件,经审批流程归档。它与「教学课件报送」共用同一套三层模板架构与同一套提交/审批/列表代码,区别只在于它面向的是没有「授课教师 / 课程」语义的通用材料(如各类专项申报、台账、说明材料等),因此教师不能按本人课程自动看到记录,需要管理员或导入显式指定。
一个 module_key(generic_document_submission)下可以承载多个报送实例,每个实例用各自的 archive_type 区分数据、分别统计、分别发布,互不串台。
资料报送 → 通用资料报送(路由 /submissions/generic_document_submission)。该入口仅在超管显式「发布给学院」且学院在「学院模块开关」中启用该模块、并给用户分配了权限后才出现——本模块 college_default_enabled=False、user_default_enabled=False,即学院与用户默认都不开通。系统管理 → 资料报送模板管理(路由 /admin/submission_templates),用于创建/发布通用报送实例、配置列宽筛选、设置截止日期。hidden_for_student=True):school_department 类型 OrgUnit)管理员设置;但发布/撤回、草稿创建与发布、母模板编辑、实例差异、软停用、发布给学院、备份目录登记等结构类动作第一期仅超管——不要用「能进模板管理页」的宽权限去推断结构写入权。generic_document_submission(或某个已有通用实例)为源 复制 → 草稿,得到一个「编辑中实例」(草稿落在 runtime/submission_template_state/drafts.json)。key(唯一)、title、menu_label、archive_type(数据隔离键,务必唯一)、upload_subdir、materials(资料文件要求)、list_columns、import_columns 等;module_key 保持 generic_document_submission。published 仍为 False,仅本机注册)。published=True)。此后学院侧需在「学院模块开关」启用 generic_document_submission 并给用户分配权限,菜单才出现。母模板(master_templates.py+ runtime 状态)只管可继承的展示/导入/搜索字段;materials / archive_type / upload_subdir / module_key / published / deadline等是实例私有,禁止经母模板或实例差异覆盖。后台实例差异 sidecar 第一期只允许写list_columns_patch(label/width/filterable/filter_weight/order/hidden)。
/export)。bulk_archive(归档/通过)、bulk_return(退回)、bulk_reset_status(重置状态)、bulk_delete、bulk_download_attachments(打包下载附件)。/submissions/<key>/<id>/admin_correct 对单条记录修正。mark_deletion 标记、再在「待删除清单」由有权角色确认删除,避免误删。attachment_export_tasks),异步打包。通用资料报送实例的基础字段(与教学课件报送字段名复用同一张 CourseArchive 表,但 label 改为通用语义):
| 字段 | 含义 | 备注 |
|---|---|---|
teaching_unit | 报送单位 | 教学课件里是「开课单位」 |
course_name | 资料名称(必填) | 教学课件里是「课程名称」 |
teacher_name | 责任人 | 教学课件里是「授课教师 教工号」 |
remark | 备注 | 通用类专有展示列 |
submission_status | 资料报送状态 | 列标题「资料报送」 |
workflow_status | 流程状态 | 审批进度 |
报送情况口径(通用类):附件齐全且已归档 = 已报送;齐全未归档 = 报送中;缺附件 = 全缺。
关键区分字段:module_key 决定菜单/学院开关/用户授权归属;archive_type 决定数据落在哪个实例——同一 module_key 下多实例靠 archive_type 物理隔离记录与统计。category=non_course_based、uses_course_fields=False、teacher_self_record_scope=False、supports_department_change=False 是通用类与课程类的核心行为差异开关。
二者是同一套模板引擎下的两类实例,关系与区别如下:
| 维度 | 教学课件报送 | 通用资料报送 |
|---|---|---|
module_key | teaching_material_submission | generic_document_submission(阶段 9G 已解耦为独立模块) |
分类 category | course_based(课程类) | non_course_based(通用类) |
| 教师本人记录归属 | 是(按课程/授课教师自动可见) | 否(无授课教师语义,需显式指定责任人) |
| 系部变更 / 课程字段 | 启用 | 关闭 |
| 学院默认开通 | 是(全校默认开,具体项目由发布+截止日期控制) | 否(超管发布给学院后学院再手动开) |
| 列表渲染 | 走旧专用页 teaching_material_submission_list(按 key 委托) | 走通用页 submission_template_list.html |
| 备份目录 | teaching_material_submission | generic_document_submission(独立登记,避免重复打包) |
共用部分:OrgUnit 的五个 MATERIAL_ACTION_*(提交/审核/校级查看/校级管理/配置管理)权限命名空间、提交与审批链路、截止日期机制、标记删除、附件导出、模板三层架构。/submissions/<template_key>/... 这套通用路由对两者通吃,仅教学课件列表页因历史 UI 差异被特判委托到旧专用渲染。
CourseArchive 表,每条带 archive_type。列表查询、计数(如模板管理页的 archive_count)、删除/停用前置检查都按 CourseArchive.archive_type == template.archive_type 过滤,因此即使两个实例同属 generic_document_submission 模块,数据也不会互相混入。archive_type;同一 module_key 下有多个已发布实例时,系统按 iter_submission_templates() 枚举模板、以各自 archive_type 分别统计、分别渲染卡片。archive_count=0,且停用只标记 enabled=false/隐藏、保留历史 archive 与附件不物理删除,并在停用前写快照备份。generic_document_submission → 给用户分配该模块权限,三步齐全才显示。teacher_self_record_scope=False),普通教师只看到自己被指定为责任人/创建人的记录;要看全部需校级查看权限。published=True),仅本地发布不等于对学院可见。list_columns_patch;若把 materials/archive_type/published/deadline 等写进差异不会生效,这些由实例配置/发布/截止日期文件各自负责。archive_type 下仍有 archive 数据时拒绝删除/停用,需先妥善处理历史记录(不可强删)。