Няма описание

kpi_dashboard_routes.py 3.2KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import json
  2. import urllib.parse
  3. import urllib.request
  4. from flask import Blueprint, render_template, redirect, url_for, current_app, request, Response
  5. from app.blueprints.access_controls import ac_requires, ac_api_requires
  6. from app.models.authorization import Permissions
  7. kpi_dashboard_blueprint = Blueprint(
  8. 'kpi_dashboard', __name__, template_folder='templates'
  9. )
  10. def _soc_url() -> str:
  11. return current_app.config.get('SOC_INTEGRATOR_URL', 'http://soc-integrator:8000')
  12. def _soc_get(path: str, params: dict) -> tuple[bytes, int, str]:
  13. qs = urllib.parse.urlencode({k: v for k, v in params.items() if v is not None})
  14. url = f"{_soc_url()}{path}{'?' + qs if qs else ''}"
  15. with urllib.request.urlopen(url, timeout=30) as r:
  16. return r.read(), r.status, r.headers.get('Content-Type', 'application/json')
  17. def _soc_post(path: str, body: dict) -> tuple[bytes, int]:
  18. url = f"{_soc_url()}{path}"
  19. data = json.dumps(body).encode()
  20. req = urllib.request.Request(url, data=data, headers={'Content-Type': 'application/json'})
  21. with urllib.request.urlopen(req, timeout=20) as r:
  22. return r.read(), r.status
  23. @kpi_dashboard_blueprint.route('/kpi-dashboard')
  24. @ac_requires(no_cid_required=True)
  25. def kpi_dashboard(caseid, url_redir):
  26. if url_redir:
  27. return redirect(url_for('index.index', cid=caseid if caseid is not None else 1, redirect=True))
  28. return render_template('kpi_dashboard.html')
  29. @kpi_dashboard_blueprint.route('/kpi-dashboard/api/alerts')
  30. @ac_api_requires(Permissions.alerts_read)
  31. def proxy_list_alerts():
  32. content, status, _ = _soc_get('/iris/alerts', request.args)
  33. return Response(content, status=status, content_type='application/json')
  34. @kpi_dashboard_blueprint.route('/kpi-dashboard/api/alerts/<int:alert_id>')
  35. @ac_api_requires(Permissions.alerts_read)
  36. def proxy_get_alert(alert_id):
  37. content, status, _ = _soc_get(f'/iris/alerts/{alert_id}', {})
  38. return Response(content, status=status, content_type='application/json')
  39. @kpi_dashboard_blueprint.route('/kpi-dashboard/api/alerts/<int:alert_id>/assign', methods=['POST'])
  40. @ac_api_requires(Permissions.alerts_write)
  41. def proxy_assign_alert(alert_id):
  42. content, status = _soc_post(f'/iris/alerts/{alert_id}/assign', request.get_json() or {})
  43. return Response(content, status=status, content_type='application/json')
  44. @kpi_dashboard_blueprint.route('/kpi-dashboard/api/alerts/export-csv')
  45. @ac_api_requires(Permissions.alerts_read)
  46. def proxy_export_csv():
  47. content, status, _ = _soc_get('/iris/alerts/export-csv', request.args)
  48. return Response(
  49. content,
  50. status=status,
  51. content_type='text/csv',
  52. headers={'Content-Disposition': 'attachment; filename=iris_alerts.csv'},
  53. )
  54. @kpi_dashboard_blueprint.route('/kpi-dashboard/api/cases')
  55. @ac_api_requires(Permissions.alerts_read)
  56. def proxy_list_cases():
  57. content, status, _ = _soc_get('/iris/cases', request.args)
  58. return Response(content, status=status, content_type='application/json')
  59. @kpi_dashboard_blueprint.route('/kpi-dashboard/api/cases/<int:case_id>')
  60. @ac_api_requires(Permissions.alerts_read)
  61. def proxy_get_case(case_id):
  62. content, status, _ = _soc_get(f'/iris/cases/{case_id}', {})
  63. return Response(content, status=status, content_type='application/json')