test_permission.py 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. import os
  2. import django
  3. import random
  4. from datetime import datetime
  5. import sys
  6. def setup_django():
  7. """设置Django环境"""
  8. # project_path = "D:/Document/code/vue/greater_wms"
  9. project_path = "D:/code/vue/greater_wms"
  10. sys.path.append(project_path)
  11. os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'greaterwms.settings')
  12. django.setup()
  13. print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] Django环境已设置")
  14. # 定义系统中的页面和组件
  15. PAGES = [
  16. # 角色管理
  17. {"primary_page": "staff", "path": "/permission/roles", "components": ["add_role", "edit_role", "delete_role"]},
  18. # 库存管理
  19. {"primary_page": "stock","path": "/stock/management", "components": ["create_stock", "adjust_stock", "delete_stock"]},
  20. {"primary_page": "stock","path": "/stock/stocklist", "components": ["view_stock", "export_stock"]},
  21. {"primary_page": "stock","path": "/stock/stockbinlist", "components": ["view_bin", "edit_bin"]},
  22. {"primary_page": "stock","path": "/stock/emptybin", "components": ["view_empty", "mark_empty"]},
  23. {"primary_page": "stock","path": "/stock/occupiedbin", "components": ["view_occupied", "release_bin"]},
  24. {"primary_page": "stock","path": "/stock/binset", "components": ["add_bin", "edit_bin", "delete_bin"]},
  25. {"primary_page": "stock","path": "/stock/handcount", "components": ["start_count", "record_count", "finish_count"]},
  26. # ERP管理
  27. {"primary_page": "erp","path": "/erp/erpasn", "components": ["create_asn", "edit_asn", "delete_asn"]},
  28. {"primary_page": "erp","path": "/erp/erpasnmaterial", "components": ["add_material", "edit_material", "delete_material"]},
  29. {"primary_page": "erp","path": "/erp/erpdnmaterial", "components": ["add_dn_material", "edit_dn_material", "delete_dn_material"]},
  30. {"primary_page": "erp","path": "/erp/erpasnaudit", "components": ["approve_asn", "reject_asn"]},
  31. {"primary_page": "erp","path": "/erp/erpdn", "components": ["create_dn", "edit_dn", "delete_dn"]},
  32. {"primary_page": "erp","path": "/erp/erpsortstock", "components": ["view_sorted", "export_sorted"]},
  33. # 入库管理
  34. {"primary_page": "inbound","path": "/inbound/asn", "components": ["create_asn", "edit_asn", "delete_asn"]},
  35. {"primary_page": "inbound","path": "/inbound/predeliverystock", "components": ["view_pre_delivery", "confirm_delivery"]},
  36. {"primary_page": "inbound","path": "/inbound/preloadstock", "components": ["view_pre_load", "confirm_load"]},
  37. {"primary_page": "inbound","path": "/inbound/presortstock", "components": ["view_pre_sort", "confirm_sort"]},
  38. {"primary_page": "inbound","path": "/inbound/sortstock", "components": ["view_sorted", "export_sorted"]},
  39. {"primary_page": "inbound","path": "/inbound/shortage", "components": ["report_shortage", "resolve_shortage"]},
  40. {"primary_page": "inbound","path": "/inbound/more", "components": ["view_additional", "add_additional"]},
  41. {"primary_page": "inbound","path": "/inbound/asnfinish", "components": ["confirm_finish", "export_finish"]},
  42. # 容器管理
  43. {"primary_page":"container","path": "/container/containerlist", "components": ["view_container", "add_container"]},
  44. {"primary_page":"container","path": "/container/containerdetail", "components": ["view_detail", "edit_detail"]},
  45. {"primary_page":"container","path": "/container/containercategory", "components": ["view_category", "add_category"]},
  46. {"primary_page":"container","path": "/container/containeroperate", "components": ["operate_container", "confirm_operation"]},
  47. # 仪表盘
  48. {"primary_page": "dashboard","path": "/dashboard/inboundAndOutbound", "components": ["view_chart", "export_data"]},
  49. {"primary_page": "dashboard","path": "/dashboard/flows_statements", "components": ["view_flow", "filter_flow"]},
  50. {"primary_page": "dashboard","path": "/dashboard/flows", "components": ["view_flow_detail", "export_flow"]},
  51. {"primary_page": "dashboard","path": "/dashboard/flows_complex", "components": ["view_complex_flow", "analyze_flow"]},
  52. {"primary_page": "dashboard","path": "/dashboard/batchlog", "components": ["view_log", "search_log"]},
  53. {"primary_page": "dashboard","path": "/dashboard/ContainerDetailLogModel", "components": ["view_container_log", "export_log"]},
  54. {"primary_page": "dashboard","path": "/dashboard/MaterialChangeHistory", "components": ["view_history", "compare_history"]},
  55. # 统计管理
  56. {"primary_page":"count","path": "/count/detaillog", "components": ["view_log", "search_log"]},
  57. {"primary_page":"count","path": "/count/batchoperatelog", "components": ["view_batch_log", "export_log"]},
  58. {"primary_page":"count","path": "/count/countbatchlog", "components": ["view_count_log", "analyze_log"]},
  59. {"primary_page":"count","path": "/count/presortstock", "components": ["view_pre_sort", "export_pre_sort"]},
  60. {"primary_page":"count","path": "/count/sortstock", "components": ["view_sorted", "export_sorted"]},
  61. {"primary_page":"count","path": "/count/shortage", "components": ["view_shortage", "resolve_shortage"]},
  62. {"primary_page":"count","path": "/count/containerDetail", "components": ["view_container", "export_container"]},
  63. {"primary_page":"count","path": "/count/batch", "components": ["view_batch", "manage_batch"]},
  64. {"primary_page":"count","path": "/count/asnfinish", "components": ["view_finish", "export_finish"]},
  65. # 出库管理
  66. {"primary_page":"outbound","path": "/outbound/dn", "components": ["create_dn", "edit_dn", "delete_dn"]},
  67. {"primary_page":"outbound","path": "/outbound/freshorder", "components": ["view_fresh", "process_fresh"]},
  68. {"primary_page":"outbound","path": "/outbound/neworder", "components": ["view_new", "process_new"]},
  69. {"primary_page":"outbound","path": "/outbound/pickstock", "components": ["view_pick", "confirm_pick"]},
  70. {"primary_page":"outbound","path": "/outbound/pickedstock", "components": ["view_picked", "confirm_picked"]},
  71. {"primary_page":"outbound","path": "/outbound/pickinglist", "components": ["view_list", "export_list"]},
  72. {"primary_page":"outbound","path": "/outbound/shippedstock", "components": ["view_shipped", "confirm_shipped"]},
  73. {"primary_page":"outbound","path": "/outbound/backorder", "components": ["view_backorder", "process_backorder"]},
  74. {"primary_page":"outbound","path": "/outbound/pod", "components": ["view_pod", "confirm_pod"]},
  75. {"primary_page":"outbound","path": "/outbound/container_check", "components": ["check_container", "confirm_check"]},
  76. # 商品管理
  77. {"primary_page":"goods","path": "/goods/goodslist", "components": ["view_goods", "add_goods"]},
  78. {"primary_page":"goods","path": "/goods/goodsunit", "components": ["view_unit", "add_unit"]},
  79. {"primary_page":"goods","path": "/goods/goodsclass", "components": ["view_class", "add_class"]},
  80. {"primary_page":"goods","path": "/goods/goodsbrand", "components": ["view_brand", "add_brand"]},
  81. {"primary_page":"goods","path": "/goods/goodscolor", "components": ["view_color", "add_color"]},
  82. {"primary_page":"goods","path": "/goods/goodsspecs", "components": ["view_specs", "add_specs"]},
  83. {"primary_page":"goods","path": "/goods/goodsshape", "components": ["view_shape", "add_shape"]},
  84. {"primary_page":"goods","path": "/goods/goodsorigin", "components": ["view_origin", "add_origin"]},
  85. # 任务管理
  86. {"primary_page":"taskpage","path": "/taskpage/task", "components": ["view_task", "create_task", "assign_task"]},
  87. # 仓库管理
  88. {"primary_page":"warehouse","path": "/warehouse/warehouseset", "components": ["view_setting", "edit_setting"]},
  89. {"primary_page":"warehouse","path": "/warehouse/department", "components": ["view_department", "add_department"]},
  90. {"primary_page":"warehouse","path": "/warehouse/boundcodetype", "components": ["view_code_type", "add_code_type"]},
  91. {"primary_page":"warehouse","path": "/warehouse/boundtype", "components": ["view_bound_type", "add_bound_type"]},
  92. {"primary_page":"warehouse","path": "/warehouse/boundbusiness", "components": ["view_business", "add_business"]},
  93. {"primary_page":"warehouse","path": "/warehouse/status", "components": ["view_status", "edit_status"]},
  94. {"primary_page":"warehouse","path": "/warehouse/product", "components": ["view_product", "add_product"]},
  95. # 员工管理
  96. {"primary_page":"staff","path": "/staff/stafflist", "components": ["view_staff", "add_staff"]},
  97. {"primary_page":"staff","path": "/staff/stafflist_check_code", "components": ["check_code", "reset_code"]},
  98. {"primary_page":"staff","path": "/staff/stafftype", "components": ["view_type", "add_type"]},
  99. # 上传中心
  100. {"primary_page":"uploadcenter","path": "/uploadcenter/initializeupload", "components": ["init_upload", "process_init"]},
  101. {"primary_page":"uploadcenter","path": "/uploadcenter/addupload", "components": ["add_upload", "process_add"]},
  102. # 下载中心
  103. {"primary_page":"downloadcenter","path": "/downloadcenter/downloadinbound", "components": ["download_inbound"]},
  104. {"primary_page":"downloadcenter","path": "/downloadcenter/downloadoutbound", "components": ["download_outbound"]},
  105. {"primary_page":"downloadcenter","path": "/downloadcenter/downloadstocklist", "components": ["download_stock"]},
  106. {"primary_page":"downloadcenter","path": "/downloadcenter/downloadgoodslist", "components": ["download_goods"]},
  107. {"primary_page":"downloadcenter","path": "/downloadcenter/downloadbinlist", "components": ["download_bin"]},
  108. ]
  109. # 定义角色及其权限配置
  110. ROLES = {
  111. "管理员": {
  112. "description": "系统管理员,拥有所有权限",
  113. "page_access": "all", # 所有页面
  114. "component_access": "all" # 所有组件
  115. },
  116. "经理": {
  117. "description": "部门经理,拥有大部分管理权限",
  118. "page_access": [
  119. "/dashboard", "/stock", "/inbound", "/outbound",
  120. "/count", "/container", "/goods", "/warehouse", "/staff"
  121. ],
  122. "component_access": "all" # 所有组件
  123. },
  124. "主管": {
  125. "description": "仓库主管,负责日常运营管理",
  126. "page_access": [
  127. "/stock", "/inbound", "/outbound", "/count", "/container"
  128. ],
  129. "component_access": [
  130. "view", "edit", "add", "delete", "export", "confirm"
  131. ]
  132. },
  133. "操作员": {
  134. "description": "仓库操作员,负责具体操作",
  135. "page_access": [
  136. "/stock/stocklist", "/stock/stockbinlist", "/inbound/asn",
  137. "/outbound/pickstock", "/outbound/pickedstock"
  138. ],
  139. "component_access": [
  140. "view", "confirm", "process"
  141. ]
  142. },
  143. "查看员": {
  144. "description": "数据查看员,只能查看数据",
  145. "page_access": [
  146. "/dashboard", "/stock/stocklist", "/count/detaillog", "/count","/erp"
  147. ],
  148. "component_access": ["view"]
  149. }
  150. }
  151. def create_permissions():
  152. """创建所有页面和组件的权限"""
  153. from staff.models import Permission
  154. print("🚀 开始创建权限...")
  155. created_count = 0
  156. for page_info in PAGES:
  157. primary_page = page_info.get("primary_page")
  158. page_path = page_info["path"]
  159. components = page_info["components"]
  160. # 创建页面访问权限
  161. page_permission, created = Permission.objects.get_or_create(
  162. primary_page=primary_page,
  163. page=page_path,
  164. component=None,
  165. defaults={
  166. "name": f"{page_path} 页面访问",
  167. "description": f"访问 {page_path} 页面的权限",
  168. "enabled": True
  169. }
  170. )
  171. if created:
  172. created_count += 1
  173. print(f"✅ 创建页面权限: {page_path}")
  174. # 创建组件权限
  175. for component in components:
  176. comp_permission, created = Permission.objects.get_or_create(
  177. primary_page=primary_page,
  178. page=page_path,
  179. component=component,
  180. defaults={
  181. "name": f"{page_path} - {component} 组件",
  182. "description": f"在 {page_path} 页面使用 {component} 组件的权限",
  183. "enabled": True
  184. }
  185. )
  186. if created:
  187. created_count += 1
  188. print(f" ✅ 创建组件权限: {page_path} - {component}")
  189. print(f"📊 权限创建完成! 共创建 {created_count} 个权限")
  190. return created_count
  191. def create_roles_and_assign_permissions():
  192. """创建角色并分配权限"""
  193. from staff.models import ListModel, Permission, Role
  194. print("\n🚀 开始创建角色并分配权限...")
  195. role_count = 0
  196. permission_count = 0
  197. # 获取所有权限
  198. all_permissions = Permission.objects.all()
  199. for role_name, role_config in ROLES.items():
  200. # 创建角色
  201. role, created = Role.objects.get_or_create(
  202. name=role_name,
  203. defaults={
  204. "description": role_config["description"]
  205. }
  206. )
  207. if role:
  208. role_count += 1
  209. print(f"✅ 创建角色: {role_name}")
  210. # 分配权限
  211. if role_config["page_access"] == "all":
  212. # 分配所有权限
  213. role.permissions.set(all_permissions)
  214. permission_count += all_permissions.count()
  215. print(f" 🔄 分配所有权限 ({all_permissions.count()} 个)")
  216. else:
  217. # 分配特定权限
  218. assigned_permissions = []
  219. # 处理页面访问权限
  220. for page_path in role_config["page_access"]:
  221. # 获取匹配该路径的所有页面权限
  222. page_perms = all_permissions.filter(
  223. page__startswith=page_path,
  224. component=None
  225. )
  226. assigned_permissions.extend(page_perms)
  227. # 获取匹配该路径的组件权限
  228. comp_perms = all_permissions.filter(
  229. page__startswith=page_path,
  230. component__isnull=False
  231. )
  232. # 根据组件访问规则过滤
  233. if role_config["component_access"] == "all":
  234. assigned_permissions.extend(comp_perms)
  235. else:
  236. for perm in comp_perms:
  237. # 检查组件权限是否在允许的列表中
  238. if any(access in perm.component for access in role_config["component_access"]):
  239. assigned_permissions.append(perm)
  240. # 分配权限
  241. role.permissions.set(assigned_permissions)
  242. permission_count += len(assigned_permissions)
  243. print(f" 🔄 分配 {len(assigned_permissions)} 个权限")
  244. print(f"📊 角色创建完成! 共创建 {role_count} 个角色,分配 {permission_count} 个权限")
  245. return role_count, permission_count
  246. def main():
  247. setup_django()
  248. print("=" * 50)
  249. print("🔐 权限与角色批量创建工具")
  250. print("=" * 50)
  251. print("此脚本将根据预定义的页面和角色配置批量创建:")
  252. print("1. 所有页面的访问权限")
  253. print("2. 所有组件的操作权限")
  254. print("3. 不同角色的权限配置")
  255. print("=" * 50)
  256. confirm = input("是否开始批量创建? (y/n): ").lower()
  257. if confirm == 'y':
  258. start_time = datetime.now()
  259. # 创建权限
  260. perm_count = create_permissions()
  261. # 创建角色并分配权限
  262. role_count, perm_assigned_count = create_roles_and_assign_permissions()
  263. end_time = datetime.now()
  264. duration = (end_time - start_time).total_seconds()
  265. print("\n" + "=" * 50)
  266. print("🎉 批量创建完成!")
  267. print(f"⏱️ 耗时: {duration:.2f} 秒")
  268. print(f"✅ 创建权限: {perm_count} 个")
  269. print(f"👥 创建角色: {role_count} 个")
  270. print(f"🔗 分配权限: {perm_assigned_count} 次")
  271. print("=" * 50)
  272. else:
  273. print("操作已取消")
  274. if __name__ == "__main__":
  275. main()