operation_route.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. from flask import request, current_app, jsonify
  2. from flask_jwt_extended import jwt_required, get_jwt_identity
  3. from app.constants import UserRole
  4. from app.decorators import login_required
  5. from app.models import Operation, User, db
  6. from app.routes import operation_routes
  7. from app.utils import adjust_page_if_needed, get_pagination_params
  8. @operation_routes.route('/detail/<int:operation_id>', methods=['GET'])
  9. @jwt_required()
  10. @login_required
  11. def detail(operation_id):
  12. # 获取当前用户身份(使用 access token)
  13. current_user_id = get_jwt_identity()
  14. current_user = User.query.get(current_user_id)
  15. # 获取指定操作日志
  16. operation = Operation.query.get(operation_id)
  17. # 校验字段
  18. validation_checks = [
  19. (not operation, f"【获取操作 ID={operation_id} 详情失败】该操作不存在", 404),
  20. (operation and operation.owner_id != current_user_id and current_user.role != UserRole.ADMIN
  21. and current_user.role != UserRole.DEVELOPER,
  22. f"【获取操作 ID={operation_id} 详情失败】您非管理员/开发人员,权限不足", 403),
  23. ]
  24. for condition, message, code in validation_checks:
  25. if condition:
  26. current_app.logger.warning(message + f', operator: {current_user}')
  27. return jsonify({
  28. 'failure_message': message,
  29. }), code
  30. return jsonify({
  31. 'operation': operation.to_dict(),
  32. }), 200
  33. @operation_routes.route('/delete/<int:operation_id>', methods=['DELETE'])
  34. @jwt_required()
  35. @login_required
  36. def delete_operation(operation_id):
  37. # 获取当前用户身份(使用 access token)
  38. current_user_id = get_jwt_identity()
  39. current_user = User.query.get(current_user_id)
  40. # 获取指定操作
  41. deleted_operation = Operation.query.get(operation_id)
  42. # 校验字段
  43. validation_checks = [
  44. (current_user.role != UserRole.ADMIN and current_user.role != UserRole.DEVELOPER,
  45. f"【删除操作 ID={operation_id} 日志失败】您非管理员/开发人员,权限不足", 403),
  46. (not deleted_operation, f"【删除操作 ID={operation_id} 日志失败】该操作不存在", 404),
  47. ]
  48. for condition, message, code in validation_checks:
  49. if condition:
  50. current_app.logger.warning(message + f', operator: {current_user}')
  51. return jsonify({
  52. 'failure_message': message,
  53. }), code
  54. # 删除操作日志
  55. db.session.delete(deleted_operation)
  56. db.session.commit()
  57. current_app.logger.info(
  58. f"【删除操作 ID={operation_id} 日志成功】deleted_operation: {deleted_operation}, operator: {current_user}")
  59. return jsonify({
  60. 'deleted_operation': deleted_operation.to_dict(),
  61. }), 200
  62. @operation_routes.route('/clear', methods=['DELETE'])
  63. @jwt_required()
  64. @login_required
  65. def clear():
  66. # 获取当前用户身份(使用 access token)
  67. current_user_id = get_jwt_identity()
  68. current_user = User.query.get(current_user_id)
  69. # 校验字段
  70. validation_checks = [
  71. (current_user.role != UserRole.ADMIN and current_user.role != UserRole.DEVELOPER,
  72. f"【清空操作日志失败】您非管理员/开发人员,权限不足", 403),
  73. ]
  74. for condition, message, code in validation_checks:
  75. if condition:
  76. current_app.logger.warning(message + f', operator: {current_user}')
  77. return jsonify({
  78. 'failure_message': message,
  79. }), code
  80. # 清空所有操作日志
  81. Operation.query.delete()
  82. db.session.commit()
  83. current_app.logger.info(f"【清空操作日志成功】operator: {current_user}")
  84. return jsonify({
  85. 'operator': current_user.to_dict(),
  86. }), 200
  87. @operation_routes.route('/operations/all', methods=['GET'])
  88. @jwt_required()
  89. @login_required
  90. def all_operations():
  91. # 获取分页参数(从请求中获取,默认为第 1 页,每页 5 条记录)
  92. default_page = request.args.get('page', 1, type=int)
  93. default_per_page = request.args.get('per_page', 5, type=int)
  94. page, per_page = get_pagination_params(default_page, default_per_page)
  95. # 获取当前用户身份(使用 access token)
  96. current_user_id = get_jwt_identity()
  97. current_user = User.query.get(current_user_id)
  98. # 校验字段
  99. validation_checks = [
  100. (current_user.role != UserRole.ADMIN and current_user.role != UserRole.DEVELOPER,
  101. f"【获取所有操作失败】您非管理员/开发人员,权限不足", 403),
  102. ]
  103. for condition, message, code in validation_checks:
  104. if condition:
  105. current_app.logger.warning(message + f', operator: {current_user}')
  106. return jsonify({
  107. 'failure_message': message,
  108. }), code
  109. # 获取所有操作(包括 owner_id 为 NULL 的记录)
  110. query = (
  111. Operation.query
  112. .outerjoin(User, Operation.owner_id == User.user_id)
  113. .add_columns(User.username.label('owner_username'))
  114. .order_by(Operation.operation_id.asc())
  115. )
  116. page, operations_total, pages = adjust_page_if_needed(query, page, per_page)
  117. paginated = query.paginate(page=page, per_page=per_page, error_out=False)
  118. operations = []
  119. for operation, owner_username in paginated.items:
  120. operation_dict = operation.to_dict()
  121. # 如果 owner_id 为 NULL,设置为 0
  122. if operation.owner_id is None:
  123. operation_dict['owner_id'] = 0
  124. operation_dict.update({'owner_username': owner_username or '无'})
  125. operations.append(operation_dict)
  126. current_app.logger.info(
  127. f"【获取所有操作成功】total: {operations_total}, per_page: {per_page}, page: {page}, pages: {pages}, operations: {operations}, operator: {current_user}")
  128. return jsonify({
  129. 'operations': operations,
  130. 'total': operations_total,
  131. 'per_page': per_page,
  132. 'page': page,
  133. 'pages': pages,
  134. }), 200