应用框架(中文译文)
原始 DeepWiki 页面:https://deepwiki.com/mayan-edms/Mayan-EDMS/3.1-application-framework
翻译时间:2026-05-27T08:44:28.007Z
翻译模型:deepseek-chat
原文字符数:14181
项目:Mayan EDMS (mayan-edms)
---
应用框架
相关源文件
以下文件被用作生成此 Wiki 页面的上下文:
mayan/apps/common/api_views.pymayan/apps/common/apps.pymayan/apps/common/classes.pymayan/apps/common/forms.pymayan/apps/common/links.pymayan/apps/common/literals.pymayan/apps/common/serializers.pymayan/apps/common/settings.pymayan/apps/common/tests/mixins.pymayan/apps/common/tests/test_api.pymayan/apps/common/tests/test_links.pymayan/apps/common/urls.pymayan/apps/common/views.pymayan/apps/django_gpg/serializers.pymayan/apps/document_parsing/serializers.pymayan/apps/events/api_views.pymayan/apps/events/tests/test_api.pymayan/settings/base.py
目的与范围
本文档介绍了支撑 Mayan EDMS 的基础应用框架。它解释了基于 Django 的架构、扩展了 Django 标准应用配置的 MayanAppConfig 系统、各应用共享的通用工具,以及各个应用的结构和初始化方式。
关于文档管理核心模型及其关系,请参阅文档管理核心。关于用户界面系统和导航框架的详细信息,请参阅用户界面系统。关于配置管理的具体内容,请参阅配置管理。
Django 基础与设置
Mayan EDMS 基于 Django 构建,遵循 Django 的应用架构,并通过自定义功能对其进行了扩展。其基础在主设置配置中建立。
设置结构
主要的 Django 配置在 mayan/settings/base.py:1-373 中定义,它建立了核心 Django 设置并集成了 Smart Settings 系统。
graph TD
subgraph "Django 配置"
BASE["base.py<br/>Django 设置"] --> SMART["SettingNamespaceSingleton<br/>Smart Settings 集成"]
BASE --> APPS["INSTALLED_APPS<br/>应用注册表"]
BASE --> MIDDLEWARE["MIDDLEWARE<br/>请求处理管线"]
end
subgraph "应用组织"
APPS --> DJANGO_APPS["Django 核心应用<br/>auth, admin, contenttypes"]
APPS --> THIRD_PARTY["第三方应用<br/>rest_framework, celery, mptt"]
APPS --> MAYAN_BASE["Mayan 基础应用<br/>events, logging, common"]
APPS --> MAYAN_DOC["Mayan 文档应用<br/>documents, sources, ocr"]
end
subgraph "配置来源"
SMART --> ENV_VARS["环境变量<br/>MAYAN_*"]
SMART --> YAML_CONFIG["YAML 配置文件"]
SMART --> DEFAULTS["默认值"]
end
设置配置过程
来源:mayan/settings/base.py:18-28
MayanAppConfig 系统
MayanAppConfig 类扩展了 Django 标准的 AppConfig,为 URL 配置、命名空间管理和应用初始化提供了增强功能。
MayanAppConfig 架构
graph TD
subgraph "Django AppConfig 生命周期"
DJANGO_READY["Django AppConfig.ready()"] --> MAYAN_READY["MayanAppConfig.ready()"]
end
subgraph "MayanAppConfig 扩展"
MAYAN_READY --> URL_CONFIG["configure_urls()<br/>动态 URL 注册"]
MAYAN_READY --> APP_INIT["应用初始化<br/>链接、菜单、权限"]
end
subgraph "URL 配置"
URL_CONFIG --> APP_URLPATTERNS["app.urls.urlpatterns<br/>标准 URL 模式"]
URL_CONFIG --> PASSTHRU_PATTERNS["app.urls.passthru_urlpatterns<br/>透传模式"]
URL_CONFIG --> NAMESPACE["app_namespace<br/>URL 命名空间"]
URL_CONFIG --> BASE_URL["app_url<br/>基础 URL 路径"]
end
subgraph "集成点"
APP_INIT --> MENU_SYSTEM["菜单系统集成"]
APP_INIT --> PERMISSION_REG["权限注册"]
APP_INIT --> SIGNAL_HANDLERS["信号处理器注册"]
end
MayanAppConfig 类结构
核心 MayanAppConfig 类为所有 Mayan 应用提供了基础:
| 属性 | 用途 | 示例 |
|---|---|---|
app_namespace | 应用的 URL 命名空间 | 'documents' |
app_url | 应用的基础 URL 路径 | 'documents' |
has_rest_api | 指示应用是否提供 REST API | True |
has_tests | 指示应用是否包含测试套件 | True |
来源:mayan/apps/common/apps.py:27-121
URL 配置过程
configure_urls() 方法处理每个 Mayan 应用的动态 URL 注册:
sequenceDiagram
participant Django as "Django 初始化"
participant MayanApp as "MayanAppConfig"
participant URLRouter as "URL 路由器"
participant AppURLs as "应用 URL 模块"
Django->>MayanApp: 调用 ready()
MayanApp->>MayanApp: configure_urls()
MayanApp->>AppURLs: 导入 urlpatterns
alt urlpatterns 存在
MayanApp->>URLRouter: 使用命名空间注册应用 URL
else urlpatterns 不存在
MayanApp->>MayanApp: 记录非严重错误
end
MayanApp->>AppURLs: 导入 passthru_urlpatterns
alt passthru_urlpatterns 存在
MayanApp->>URLRouter: 注册透传 URL
else passthru_urlpatterns 不存在
MayanApp->>MayanApp: 记录非严重错误
end
来源:mayan/apps/common/apps.py:31-117
应用结构与组织
Mayan EDMS 应用遵循一致的结构,并在 Django 的 INSTALLED_APPS 配置中按逻辑类别组织。
应用类别
graph TB
subgraph "应用层级"
subgraph "基础应用"
EVENTS["mayan.apps.events<br/>事件系统"]
APPEARANCE["mayan.apps.appearance<br/>UI 模板"]
LOGGING["mayan.apps.logging<br/>日志框架"]
TASK_MGR["mayan.apps.task_manager<br/>Celery 集成"]
end
subgraph "核心基础设施应用"
COMMON["mayan.apps.common<br/>通用工具"]
ACLS["mayan.apps.acls<br/>访问控制"]
USER_MGR["mayan.apps.user_management<br/>用户管理"]
AUTH["mayan.apps.authentication<br/>认证"]
PERMS["mayan.apps.permissions<br/>权限框架"]
end
subgraph "文档管理应用"
DOCUMENTS["mayan.apps.documents<br/>文档核心"]
SOURCES["mayan.apps.sources<br/>文档入库"]
OCR["mayan.apps.ocr<br/>文本识别"]
METADATA["mayan.apps.metadata<br/>元数据管理"]
CABINETS["mayan.apps.cabinets<br/>文档组织"]
end
subgraph "功能应用"
WORKFLOWS["mayan.apps.document_states<br/>工作流引擎"]
SEARCH["mayan.apps.dynamic_search<br/>搜索系统"]
REST_API["mayan.apps.rest_api<br/>API 框架"]
NAVIGATION["mayan.apps.navigation<br/>菜单系统"]
end
end
EVENTS --> COMMON
LOGGING --> COMMON
COMMON --> DOCUMENTS
ACLS --> DOCUMENTS
USER_MGR --> AUTH
DOCUMENTS --> SOURCES
DOCUMENTS --> OCR
DOCUMENTS --> METADATA
应用加载顺序
INSTALLED_APPS 中的顺序对于正确初始化至关重要:
- Events - 必须最先加载,以预加载所有事件定义
- Appearance - 尽早加载以允许模板覆盖
- Logging - 尽早加载以确保日志可用
- Task Manager - 在其他应用使用队列之前创建队列
- User Management - 必须在认证之前加载
- 基础基础设施 - ACL、通用工具、权限
- 文档应用 - 核心文档功能
- 功能应用 - 依赖于核心的高级功能
来源:mayan/settings/base.py:43-133
通用工具与类
mayan.apps.common 包提供了整个应用框架中使用的共享工具。
ModelCopy 系统
ModelCopy 类提供了一个复杂的对象复制系统,支持关系、唯一字段和条件逻辑:
graph TD
subgraph "ModelCopy 架构"
MODEL_COPY["ModelCopy<br/>注册表和配置"] --> COPY_METHOD["copy_instance()<br/>添加到模型类"]
MODEL_COPY --> FIELD_ANALYSIS["字段类型分析<br/>常规、唯一、外键"]
MODEL_COPY --> RELATIONSHIP_HANDLING["关系处理<br/>一对一、多对多、反向"]
end
subgraph "复制过程"
COPY_METHOD --> VALIDATION["条件校验<br/>test_condition()"]
VALIDATION --> FIELD_COPY["字段值复制<br/>常规和模板字段"]
FIELD_COPY --> UNIQUE_HANDLING["唯一字段处理<br/>追加计数器后缀"]
UNIQUE_HANDLING --> RELATIONSHIP_COPY["关系复制<br/>深度复制相关对象"]
end
subgraph "字段类型"
FIELD_ANALYSIS --> REGULAR["fields_copy<br/>标准字段"]
FIELD_ANALYSIS --> UNIQUE["fields_unique<br/>唯一字段"]
FIELD_ANALYSIS --> FK["fields_foreign_keys<br/>外键字段"]
FIELD_ANALYSIS --> M2M["fields_many_to_many<br/>多对多字段"]
FIELD_ANALYSIS --> REVERSE["fields_reverse_related<br/>反向关系"]
end
ModelCopy 注册示例
# 注册模型以支持复制
ModelCopy(
model=MyModel,
bind_link=True, # 向对象菜单添加复制链接
register_permission=True, # 注册复制权限
condition=lambda instance: instance.can_be_copied() # 复制条件
).add_fields(
field_names=['name', 'description', 'category'],
field_values={'status': 'draft'}, # 新实例的静态值
field_value_templates={'new_name': '{instance.name}_copy'} # 模板值
)
来源:mayan/apps/common/classes.py:14-294
工具类
| 类 | 用途 | 关键方法 |
|---|---|---|
MissingItem | 跟踪缺失的系统依赖 | get_missing(), condition() |
PropertyHelper | 向模型动态添加属性 | get_result(), constructor |
来源:mayan/apps/common/classes.py:296-342
URL 配置与路由
Mayan EDMS 使用一个复杂的 URL 路由系统,支持标准应用 URL 和透传模式。
URL 模式类型
graph LR
subgraph "URL 配置"
APP_CONFIG["MayanAppConfig"] --> URL_PATTERNS["urlpatterns<br/>标准应用 URL"]
APP_CONFIG --> PASSTHRU_PATTERNS["passthru_urlpatterns<br/>透传 URL"]
APP_CONFIG --> MISC_PATTERNS["urlpatterns_misc<br/>工具 URL"]
end
subgraph "URL 注册"
URL_PATTERNS --> NAMESPACED["带命名空间的 URL<br/>app_namespace/pattern"]
PASSTHRU_PATTERNS --> DIRECT["直接 URL<br/>无命名空间"]
MISC_PATTERNS --> UTILITY["工具端点<br/>favicon, i18n"]
end
subgraph "基础 URL 构建"
NAMESPACED --> ORG_BASE["组织基础路径<br/>ORGANIZATION_URL_BASE_PATH"]
DIRECT --> ORG_BASE
ORG_BASE --> FINAL_URL["最终 URL 模式"]
end
通用应用 URL 配置示例
通用应用展示了典型的 URL 模式组织方式:
- 标准 URL:带有命名空间
common:的视图 - 杂项 URL:工具端点,如 favicon、对象复制
- 透传 URL:Django 管理界面
- API URL:REST API 端点
来源:mayan/apps/common/urls.py:1-47
集成点
应用框架提供了多个集成点,用于连接不同的系统组件。
事件系统集成
graph TD
subgraph "事件系统集成"
APP_READY["MayanAppConfig.ready()"] --> SIGNAL_CONNECT["信号处理器注册"]
SIGNAL_CONNECT --> PRE_SETUP["signal_pre_initial_setup"]
SIGNAL_CONNECT --> PRE_UPGRADE["signal_pre_upgrade"]
end
subgraph "菜单系统集成"
APP_READY --> MENU_BINDING["菜单链接绑定"]
MENU_BINDING --> MENU_ABOUT["menu_about.bind_links()"]
MENU_BINDING --> MENU_TOPBAR["menu_topbar.bind_links()"]
end
subgraph "模板系统集成"
APP_READY --> AJAX_TEMPLATES["AJAX 模板注册"]
AJAX_TEMPLATES --> MENU_MAIN["menu_main 模板"]
AJAX_TEMPLATES --> MENU_TOPBAR_TPL["menu_topbar 模板"]
end
CommonApp 集成示例
CommonApp 类展示了典型的集成模式:
- Django 管理自动发现:自动注册管理界面
- AJAX 模板注册:注册可复用的模板组件
- 菜单系统绑定:将链接连接到菜单结构
- 信号处理器注册:连接到系统级事件
来源:mayan/apps/common/apps.py:134-162
权限系统集成
框架通过 ModelPermission 类和 ACL 绑定与权限系统集成:
| 集成点 | 用途 | 实现方式 |
|---|---|---|
| 模型注册 | 为模型注册权限 | ModelPermission.register() |
| 链接绑定 | 添加受权限保护的链接 | menu_object.bind_links() |
| ACL 集成 | 对象级权限检查 | acl_bind_link=True |
来源:mayan/apps/common/classes.py:59-63