应用框架
应用框架
相关源文件
本章引用的主要源码文件:
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 系统。
设置配置过程
来源:mayan/settings/base.py:18-28
MayanAppConfig 系统
MayanAppConfig 类扩展了 Django 标准的 AppConfig,为 URL 配置、命名空间管理和应用初始化提供了增强功能。
MayanAppConfig 架构
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 注册:
来源:mayan/apps/common/apps.py:31-117
应用结构与组织
Mayan EDMS 应用遵循一致的结构,并在 Django 的 INSTALLED_APPS 配置中按逻辑类别组织。
应用类别
应用加载顺序
INSTALLED_APPS 中的顺序对于正确初始化至关重要:
- Events - 必须最先加载,以预加载所有事件定义
- Appearance - 尽早加载以允许模板覆盖
- Logging - 尽早加载以确保日志可用
- Task Manager - 在其他应用使用队列之前创建队列
- User Management - 必须在认证之前加载
- 基础设施 - ACL、通用工具、权限
- 文档应用 - 核心文档功能
- 功能应用 - 依赖于核心的高级功能
来源:mayan/settings/base.py:43-133
通用工具与类
mayan.apps.common 包提供了整个应用框架中使用的共享工具。
ModelCopy 系统
ModelCopy 类提供了一个复杂的对象复制系统,支持关系、唯一字段和条件逻辑:
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 模式类型
通用应用 URL 配置示例
通用应用展示了典型的 URL 模式组织方式:
- 标准 URL:带有命名空间
common:的视图 - 杂项 URL:工具端点,如 favicon、对象复制
- 透传 URL:Django 管理界面
- API URL:REST API 端点
来源:mayan/apps/common/urls.py:1-47
集成点
应用框架提供了多个集成点,用于连接不同的系统组件。
事件系统集成
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