errors.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. """DMS业务异常。"""
  2. from __future__ import annotations
  3. from typing import Any
  4. class DmsError(Exception):
  5. code = "INTERNAL_ERROR"
  6. status_code = 500
  7. default_message = "服务器内部错误"
  8. def __init__(
  9. self,
  10. message: str | None = None,
  11. *,
  12. details: Any = None,
  13. code: str | None = None,
  14. ) -> None:
  15. super().__init__(message or self.default_message)
  16. self.message = message or self.default_message
  17. self.details = details
  18. self.code = code or self.code
  19. class InvalidArgumentError(DmsError):
  20. code = "INVALID_ARGUMENT"
  21. status_code = 400
  22. default_message = "请求参数错误"
  23. class AuthenticationError(DmsError):
  24. code = "TOKEN_INVALID"
  25. status_code = 401
  26. default_message = "未认证或登录凭证无效"
  27. class InvalidCredentialsError(AuthenticationError):
  28. code = "INVALID_CREDENTIALS"
  29. default_message = "用户名或密码错误"
  30. class TokenExpiredError(AuthenticationError):
  31. code = "TOKEN_EXPIRED"
  32. default_message = "登录凭证已过期"
  33. class UserDisabledError(AuthenticationError):
  34. code = "USER_DISABLED"
  35. default_message = "用户已被禁用"
  36. class AuthVersionMismatchError(AuthenticationError):
  37. code = "AUTH_VERSION_MISMATCH"
  38. default_message = "登录状态已失效,请重新登录"
  39. class ForbiddenError(DmsError):
  40. code = "FORBIDDEN"
  41. status_code = 403
  42. default_message = "无权限执行此操作"
  43. class SecurityLevelForbiddenError(ForbiddenError):
  44. code = "SECURITY_LEVEL_FORBIDDEN"
  45. default_message = "用户密级不足,无法查看该文档"
  46. class DocumentViewForbiddenError(ForbiddenError):
  47. code = "DOCUMENT_VIEW_FORBIDDEN"
  48. default_message = "无权查看该文档"
  49. class DocumentDownloadForbiddenError(ForbiddenError):
  50. code = "DOCUMENT_DOWNLOAD_FORBIDDEN"
  51. default_message = "无权下载该文档"
  52. class ResourceNotFoundError(DmsError):
  53. code = "RESOURCE_NOT_FOUND"
  54. status_code = 404
  55. default_message = "请求的资源不存在"
  56. class ConflictError(DmsError):
  57. code = "DATA_VERSION_CONFLICT"
  58. status_code = 409
  59. default_message = "数据冲突"
  60. class CategoryInUseError(ConflictError):
  61. code = "CATEGORY_IN_USE"
  62. default_message = "分类仍被子分类或方案文档占用"
  63. class MainPlanNotFoundError(ResourceNotFoundError):
  64. code = "MAIN_PLAN_NOT_FOUND"
  65. default_message = "主案不存在"
  66. class FileNotFoundError(ResourceNotFoundError):
  67. code = "FILE_NOT_FOUND"
  68. default_message = "文档文件不存在"
  69. class PreviewUnavailableError(DmsError):
  70. code = "PREVIEW_UNAVAILABLE"
  71. status_code = 415
  72. default_message = "当前文件类型不支持在线预览"
  73. class BatchManifestMismatchError(InvalidArgumentError):
  74. code = "BATCH_MANIFEST_MISMATCH"
  75. default_message = "批量文件数量与元数据数量不一致"
  76. class MainPlanHasChildrenError(ConflictError):
  77. code = "MAIN_PLAN_HAS_CHILDREN"
  78. default_message = "主案仍存在有效子方案"
  79. class AttachmentInUseError(ConflictError):
  80. code = "ATTACHMENT_IN_USE"
  81. default_message = "共享附件仍被主案挂载"
  82. class AttachmentHasNoAclError(InvalidArgumentError):
  83. code = "ATTACHMENT_HAS_NO_ACL"
  84. default_message = "共享附件不配置访问权限"
  85. class SubPlanPermissionInheritedError(ConflictError):
  86. code = "SUB_PLAN_PERMISSION_INHERITED"
  87. default_message = "子方案动态继承主案权限,不能独立配置"
  88. class DuplicatePermissionSubjectError(InvalidArgumentError):
  89. code = "DUPLICATE_PERMISSION_SUBJECT"
  90. default_message = "权限主体不能重复"
  91. class UnsupportedFileTypeError(DmsError):
  92. code = "UNSUPPORTED_FILE_TYPE"
  93. status_code = 415
  94. default_message = "不支持的文件类型"
  95. class PayloadTooLargeError(DmsError):
  96. code = "PAYLOAD_TOO_LARGE"
  97. status_code = 413
  98. default_message = "请求内容过大"
  99. class InternalError(DmsError):
  100. code = "INTERNAL_ERROR"
  101. status_code = 500
  102. default_message = "服务器内部错误"
  103. class DocumentNotDeletedError(ConflictError):
  104. code = "DOCUMENT_NOT_DELETED"
  105. default_message = "文档当前不在回收站中"
  106. class FileIntegrityMismatchError(ConflictError):
  107. code = "FILE_INTEGRITY_MISMATCH"
  108. default_message = "文档文件完整性校验失败"
  109. class FilePathInvalidError(InternalError):
  110. code = "FILE_PATH_INVALID"
  111. default_message = "文档存储路径异常"
  112. class RestoreFileChangedError(ConflictError):
  113. code = "RESTORE_FILE_CHANGED"
  114. default_message = "校验期间文件发生变化"
  115. class RestoreCategoryInvalidError(ConflictError):
  116. code = "RESTORE_CATEGORY_INVALID"
  117. default_message = "原方案分类无效,无法恢复"
  118. class RestoreParentInvalidError(ConflictError):
  119. code = "RESTORE_PARENT_INVALID"
  120. default_message = "原所属主案无效,无法恢复"
  121. class RestorePermissionInvalidError(ConflictError):
  122. code = "RESTORE_PERMISSION_INVALID"
  123. default_message = "恢复后无法形成有效权限配置"
  124. class RestoreRelationConflictError(ConflictError):
  125. code = "RESTORE_RELATION_CONFLICT"
  126. default_message = "历史权限或挂载关系与当前有效关系冲突"