test_permission.py 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  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": "stock","path": "/stock/management", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  18. {"primary_page": "stock","path": "/stock/stocklist", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  19. {"primary_page": "stock","path": "/stock/stockbinlist", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  20. {"primary_page": "stock","path": "/stock/emptybin", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  21. {"primary_page": "stock","path": "/stock/occupiedbin", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  22. {"primary_page": "stock","path": "/stock/binset", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  23. {"primary_page": "stock","path": "/stock/handcount", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  24. # ERP管理
  25. {"primary_page": "erp","path": "/erp/erpasn", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  26. {"primary_page": "erp","path": "/erp/erpasnmaterial", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  27. {"primary_page": "erp","path": "/erp/erpdnmaterial", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  28. {"primary_page": "erp","path": "/erp/erpasnaudit", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  29. {"primary_page": "erp","path": "/erp/erpdn", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  30. {"primary_page": "erp","path": "/erp/erpsortstock", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  31. # 入库管理
  32. {"primary_page": "inbound","path": "/inbound/asn", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  33. {"primary_page": "inbound","path": "/inbound/predeliverystock", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  34. {"primary_page": "inbound","path": "/inbound/preloadstock", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  35. {"primary_page": "inbound","path": "/inbound/presortstock", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  36. {"primary_page": "inbound","path": "/inbound/sortstock", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  37. {"primary_page": "inbound","path": "/inbound/shortage", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  38. {"primary_page": "inbound","path": "/inbound/more", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  39. {"primary_page": "inbound","path": "/inbound/asnfinish", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  40. # 托盘管理
  41. {"primary_page":"container","path": "/container/containerlist", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  42. {"primary_page":"container","path": "/container/containerdetail", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  43. {"primary_page":"container","path": "/container/containercategory", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  44. {"primary_page":"container","path": "/container/containeroperate", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  45. # 仪表盘
  46. {"primary_page": "dashboard","path": "/dashboard/inboundAndOutbound", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  47. {"primary_page": "dashboard","path": "/dashboard/flows_statements", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  48. {"primary_page": "dashboard","path": "/dashboard/flows", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  49. {"primary_page": "dashboard","path": "/dashboard/flows_complex", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  50. {"primary_page": "dashboard","path": "/dashboard/batchlog", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  51. {"primary_page": "dashboard","path": "/dashboard/ContainerDetailLogModel", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  52. {"primary_page": "dashboard","path": "/dashboard/MaterialChangeHistory", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  53. # 统计管理
  54. {"primary_page":"count","path": "/count/detaillog", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  55. {"primary_page":"count","path": "/count/batchoperatelog", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  56. {"primary_page":"count","path": "/count/countbatchlog", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  57. {"primary_page":"count","path": "/count/presortstock", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  58. {"primary_page":"count","path": "/count/sortstock", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  59. {"primary_page":"count","path": "/count/shortage", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  60. {"primary_page":"count","path": "/count/containerDetail", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  61. {"primary_page":"count","path": "/count/batch", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  62. {"primary_page":"count","path": "/count/asnfinish", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  63. # 出库管理
  64. {"primary_page":"outbound","path": "/outbound/dn", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  65. {"primary_page":"outbound","path": "/outbound/freshorder", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  66. {"primary_page":"outbound","path": "/outbound/neworder", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  67. {"primary_page":"outbound","path": "/outbound/pickstock", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  68. {"primary_page":"outbound","path": "/outbound/pickedstock", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  69. {"primary_page":"outbound","path": "/outbound/pickinglist", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  70. {"primary_page":"outbound","path": "/outbound/shippedstock", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  71. {"primary_page":"outbound","path": "/outbound/backorder", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  72. {"primary_page":"outbound","path": "/outbound/pod", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  73. {"primary_page":"outbound","path": "/outbound/container_check", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  74. # 商品管理
  75. {"primary_page":"goods","path": "/goods/goodslist", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  76. {"primary_page":"goods","path": "/goods/goodsunit", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  77. {"primary_page":"goods","path": "/goods/goodsclass", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  78. {"primary_page":"goods","path": "/goods/goodsbrand", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  79. {"primary_page":"goods","path": "/goods/goodscolor", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  80. {"primary_page":"goods","path": "/goods/goodsspecs", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  81. {"primary_page":"goods","path": "/goods/goodsshape", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  82. {"primary_page":"goods","path": "/goods/goodsorigin", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  83. # 任务管理
  84. {"primary_page":"taskpage","path": "/taskpage/task", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  85. # 仓库管理
  86. {"primary_page":"warehouse","path": "/warehouse/warehouseset", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  87. {"primary_page":"warehouse","path": "/warehouse/department", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  88. {"primary_page":"warehouse","path": "/warehouse/boundcodetype", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  89. {"primary_page":"warehouse","path": "/warehouse/boundtype", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  90. {"primary_page":"warehouse","path": "/warehouse/boundbusiness", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  91. {"primary_page":"warehouse","path": "/warehouse/status", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  92. {"primary_page":"warehouse","path": "/warehouse/product", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  93. # 员工管理
  94. {"primary_page": "staff", "path": "/permission/roles", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  95. {"primary_page":"staff","path": "/staff/stafflist", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  96. {"primary_page":"staff","path": "/staff/stafflist_check_code", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  97. {"primary_page":"staff","path": "/staff/stafftype", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  98. # 上传中心
  99. {"primary_page":"uploadcenter","path": "/uploadcenter/initializeupload", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  100. {"primary_page":"uploadcenter","path": "/uploadcenter/addupload", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  101. # 下载中心
  102. {"primary_page":"downloadcenter","path": "/downloadcenter/downloadinbound", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  103. {"primary_page":"downloadcenter","path": "/downloadcenter/downloadoutbound", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  104. {"primary_page":"downloadcenter","path": "/downloadcenter/downloadstocklist", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  105. {"primary_page":"downloadcenter","path": "/downloadcenter/downloadgoodslist", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  106. {"primary_page":"downloadcenter","path": "/downloadcenter/downloadbinlist", "components": ["view", "edit", "add", "delete", "export", "confirm","adjust","download"]},
  107. ]
  108. # 定义角色及其权限配置
  109. ROLES = {
  110. "管理员": {
  111. "description": "系统管理员,拥有所有权限",
  112. "page_access": "all", # 所有页面
  113. "component_access": "all" # 所有组件
  114. },
  115. "经理": {
  116. "description": "部门经理,拥有大部分管理权限",
  117. "page_access": [
  118. "/stock/management","/stock/stockbinlist","/stock/stocklist",
  119. "/erp/erpasn","/erp/erpasnmaterial","/erp/erpdnmaterial","/erp/erpdn","/erp/erpsortstock",
  120. "/inbound/asn","/inbound/predeliverystock","/inbound/sortstock",
  121. "/container/containerlist","/container/containerdetail","/container/containercategory","/container/containeroperate",
  122. "/outbound/dn","/outbound/backorder","/outbound/container_check",
  123. "/taskpage/task",
  124. "/count/batch","/count/countbatchlog","/count/detaillog","/count/batchoperatelog",
  125. "/dashboard/flows_statements","/dashboard/flows","/dashboard/MaterialChangeHistory","/dashboard/batchlog","/dashboard/ContainerDetailLogModel",
  126. "/warehouse/department","/warehouse/boundcodetype","/warehouse/boundtype","/warehouse/boundbusiness","/warehouse/status","/warehouse/product",
  127. "/staff/stafflist","/staff/stafflist_check_code","/staff/stafftype"
  128. ],
  129. "component_access": "all" # 所有组件
  130. },
  131. "主管": {
  132. "description": "仓库主管,负责日常运营管理",
  133. "page_access": [
  134. "/stock/management","/stock/stockbinlist","/stock/stocklist",
  135. "/erp/erpasn","/erp/erpasnmaterial","/erp/erpdnmaterial","/erp/erpdn","/erp/erpsortstock",
  136. "/inbound/asn","/inbound/predeliverystock","/inbound/sortstock",
  137. "/container/containerlist","/container/containerdetail","/container/containercategory",
  138. "/outbound/dn","/outbound/backorder","/outbound/container_check",
  139. "/taskpage/task",
  140. "/count/batch","/count/countbatchlog","/count/detaillog","/count/batchoperatelog",
  141. "/dashboard/flows_statements","/dashboard/flows","/dashboard/MaterialChangeHistory","/dashboard/batchlog","/dashboard/ContainerDetailLogModel",
  142. # "/warehouse/department","/warehouse/boundcodetype","/warehouse/boundtype","/warehouse/boundbusiness","/warehouse/status","/warehouse/product",
  143. "/staff/stafflist","/staff/stafftype"
  144. ],
  145. "component_access": [
  146. "view", "edit", "add", "delete", "export", "confirm","adjust","download"
  147. ]
  148. },
  149. "操作员": {
  150. "description": "仓库操作员,负责具体操作",
  151. "page_access": [
  152. "/stock/management","/stock/stockbinlist","/stock/stocklist",
  153. "/erp/erpasn","/erp/erpasnmaterial","/erp/erpdnmaterial","/erp/erpdn","/erp/erpsortstock",
  154. "/inbound/asn","/inbound/predeliverystock","/inbound/sortstock",
  155. "/container/containerlist","/container/containercategory",
  156. "/outbound/dn","/outbound/backorder","/outbound/container_check",
  157. "/taskpage/task",
  158. "/count/batch","/count/countbatchlog","/count/detaillog","/count/batchoperatelog",
  159. "/dashboard/flows_statements","/dashboard/flows"
  160. # "/warehouse/department","/warehouse/boundcodetype","/warehouse/boundtype","/warehouse/boundbusiness","/warehouse/status","/warehouse/product",
  161. # "/staff/stafflist","/staff/stafftype"
  162. ],
  163. "component_access": [
  164. "view", "edit", "add","download","confirm"
  165. ]
  166. },
  167. "查看员": {
  168. "description": "数据查看员,只能查看数据",
  169. "page_access": [
  170. "/stock/management","/stock/stockbinlist",
  171. "/erp/erpasn","/erp/erpasnmaterial","/erp/erpdnmaterial","/erp/erpdn","/erp/erpsortstock",
  172. "/inbound/asn","/inbound/predeliverystock","/inbound/sortstock",
  173. "/container/containerlist","/container/containercategory",
  174. "/outbound/dn","/outbound/backorder","/outbound/container_check",
  175. "/taskpage/task",
  176. "/count/batch","/count/countbatchlog","/count/detaillog","/count/batchoperatelog",
  177. "/dashboard/flows_statements","/dashboard/flows"
  178. # "/warehouse/department","/warehouse/boundcodetype","/warehouse/boundtype","/warehouse/boundbusiness","/warehouse/status","/warehouse/product",
  179. # "/staff/stafflist","/staff/stafftype"
  180. ],
  181. "component_access": ["view","download"]
  182. }
  183. }
  184. def create_permissions():
  185. """创建所有页面和组件的权限"""
  186. from staff.models import Permission
  187. print("🚀 开始创建权限...")
  188. created_count = 0
  189. for page_info in PAGES:
  190. primary_page = page_info.get("primary_page")
  191. page_path = page_info["path"]
  192. components = page_info["components"]
  193. # 创建页面访问权限
  194. page_permission, created = Permission.objects.get_or_create(
  195. primary_page=primary_page,
  196. page=page_path,
  197. component=None,
  198. defaults={
  199. "name": f"{page_path} 页面访问",
  200. "description": f"访问 {page_path} 页面的权限",
  201. "enabled": True
  202. }
  203. )
  204. if created:
  205. created_count += 1
  206. print(f"✅ 创建页面权限: {page_path}")
  207. # 创建组件权限
  208. for component in components:
  209. comp_permission, created = Permission.objects.get_or_create(
  210. primary_page=primary_page,
  211. page=page_path,
  212. component=component,
  213. defaults={
  214. "name": f"{page_path} - {component} 组件",
  215. "description": f"在 {page_path} 页面使用 {component} 组件的权限",
  216. "enabled": True
  217. }
  218. )
  219. if created:
  220. created_count += 1
  221. print(f" ✅ 创建组件权限: {page_path} - {component}")
  222. print(f"📊 权限创建完成! 共创建 {created_count} 个权限")
  223. return created_count
  224. def create_roles_and_assign_permissions():
  225. """创建角色并分配权限"""
  226. from staff.models import ListModel, Permission, Role
  227. print("\n🚀 开始创建角色并分配权限...")
  228. role_count = 0
  229. permission_count = 0
  230. # 获取所有权限
  231. all_permissions = Permission.objects.all()
  232. for role_name, role_config in ROLES.items():
  233. # 创建角色
  234. role, created = Role.objects.get_or_create(
  235. name=role_name,
  236. defaults={
  237. "description": role_config["description"]
  238. }
  239. )
  240. if role:
  241. role_count += 1
  242. print(f"✅ 创建角色: {role_name}")
  243. # 分配权限
  244. if role_config["page_access"] == "all":
  245. # 分配所有权限
  246. role.permissions.set(all_permissions)
  247. permission_count += all_permissions.count()
  248. print(f" 🔄 分配所有权限 ({all_permissions.count()} 个)")
  249. else:
  250. # 分配特定权限
  251. assigned_permissions = []
  252. # 处理页面访问权限
  253. for page_path in role_config["page_access"]:
  254. # 获取精确匹配该路径的所有页面权限
  255. page_perms = all_permissions.filter(
  256. page=page_path, # 使用精确匹配
  257. component=None
  258. )
  259. assigned_permissions.extend(page_perms)
  260. # 获取精确匹配该路径的组件权限
  261. comp_perms = all_permissions.filter(
  262. page=page_path, # 使用精确匹配
  263. component__isnull=False
  264. )
  265. # 根据组件访问规则过滤
  266. if role_config["component_access"] == "all":
  267. assigned_permissions.extend(comp_perms)
  268. else:
  269. for perm in comp_perms:
  270. # 检查组件权限是否在允许的列表中
  271. if any(access in perm.component for access in role_config["component_access"]):
  272. assigned_permissions.append(perm)
  273. # 分配权限
  274. role.permissions.set(assigned_permissions)
  275. permission_count += len(assigned_permissions)
  276. print(f" 🔄 分配 {len(assigned_permissions)} 个权限")
  277. print(f"📊 角色创建完成! 共创建 {role_count} 个角色,分配 {permission_count} 个权限")
  278. return role_count, permission_count
  279. def main():
  280. setup_django()
  281. print("=" * 50)
  282. print("🔐 权限与角色批量创建工具")
  283. print("=" * 50)
  284. print("此脚本将根据预定义的页面和角色配置批量创建:")
  285. print("1. 所有页面的访问权限")
  286. print("2. 所有组件的操作权限")
  287. print("3. 不同角色的权限配置")
  288. print("=" * 50)
  289. confirm = input("是否开始批量创建? (y/n): ").lower()
  290. if confirm == 'y':
  291. start_time = datetime.now()
  292. # 创建权限
  293. perm_count = create_permissions()
  294. # 创建角色并分配权限
  295. role_count, perm_assigned_count = create_roles_and_assign_permissions()
  296. end_time = datetime.now()
  297. duration = (end_time - start_time).total_seconds()
  298. print("\n" + "=" * 50)
  299. print("🎉 批量创建完成!")
  300. print(f"⏱️ 耗时: {duration:.2f} 秒")
  301. print(f"✅ 创建权限: {perm_count} 个")
  302. print(f"👥 创建角色: {role_count} 个")
  303. print(f"🔗 分配权限: {perm_assigned_count} 次")
  304. print("=" * 50)
  305. else:
  306. print("操作已取消")
  307. if __name__ == "__main__":
  308. main()