seed_categories.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. """显式、幂等的方案分类开发数据初始化。
  2. 执行:python -m dms.seed_categories
  3. 仅创建缺失编码,不修改或删除任何已有分类、组织、用户或文档。
  4. """
  5. from __future__ import annotations
  6. from flask import Flask
  7. from sqlalchemy import select
  8. from dms import init_dms
  9. from dms.common.enums import CategoryType, EnabledStatus
  10. from dms.extensions import db
  11. from dms.models import Category
  12. def _find(category_code: str) -> Category | None:
  13. return db.session.scalar(
  14. select(Category).where(Category.category_code == category_code)
  15. )
  16. def _create(
  17. *,
  18. category_code: str,
  19. category_name: str,
  20. category_type: CategoryType,
  21. sort_no: int,
  22. parent: Category | None,
  23. ) -> tuple[Category, bool]:
  24. existing = _find(category_code)
  25. if existing is not None:
  26. return existing, False
  27. if parent is not None and (parent.is_deleted or parent.status != "ENABLED"):
  28. raise RuntimeError(f"父分类{parent.category_code}无效,拒绝创建{category_code}")
  29. category_path = (
  30. f"{parent.category_path.rstrip('/')}/{category_name}"
  31. if parent is not None
  32. else f"/{category_name}"
  33. )
  34. category = Category(
  35. category_code=category_code,
  36. category_name=category_name,
  37. category_type=category_type.value,
  38. parent_id=parent.id if parent is not None else None,
  39. category_path=category_path,
  40. sort_no=sort_no,
  41. document_count=0,
  42. status=EnabledStatus.ENABLED.value,
  43. )
  44. db.session.add(category)
  45. db.session.flush()
  46. return category, True
  47. def seed_categories() -> tuple[int, int]:
  48. created_count = 0
  49. existing_count = 0
  50. scene_a, created = _create(
  51. category_code="SCENE_A",
  52. category_name="XXXX场景A",
  53. category_type=CategoryType.SCENE,
  54. sort_no=10,
  55. parent=None,
  56. )
  57. created_count += int(created)
  58. existing_count += int(not created)
  59. for code, name, sort_no in (
  60. ("STYLE_A1", "XXXX样式A1", 10),
  61. ("STYLE_A2", "XXXX样式A2", 20),
  62. ):
  63. _, created = _create(
  64. category_code=code,
  65. category_name=name,
  66. category_type=CategoryType.STYLE,
  67. sort_no=sort_no,
  68. parent=scene_a,
  69. )
  70. created_count += int(created)
  71. existing_count += int(not created)
  72. for code, name, sort_no in (
  73. ("SCENE_B", "XXXX场景B", 20),
  74. ("SCENE_C", "XXXX场景C", 30),
  75. ):
  76. _, created = _create(
  77. category_code=code,
  78. category_name=name,
  79. category_type=CategoryType.SCENE,
  80. sort_no=sort_no,
  81. parent=None,
  82. )
  83. created_count += int(created)
  84. existing_count += int(not created)
  85. db.session.commit()
  86. return created_count, existing_count
  87. def main() -> None:
  88. app = Flask("dms-seed-categories")
  89. init_dms(app)
  90. with app.app_context():
  91. try:
  92. created_count, existing_count = seed_categories()
  93. except Exception:
  94. db.session.rollback()
  95. raise
  96. print(
  97. f"分类初始化完成:新增{created_count}个,已存在{existing_count}个。"
  98. )
  99. if __name__ == "__main__":
  100. main()