wraps.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. from collections.abc import Callable
  2. from functools import wraps
  3. from typing import Optional
  4. from flask import request
  5. from flask_restful import reqparse
  6. from pydantic import BaseModel
  7. from extensions.ext_database import db
  8. from models.account import Tenant
  9. def get_tenant(view: Optional[Callable] = None):
  10. def decorator(view_func):
  11. @wraps(view_func)
  12. def decorated_view(*args, **kwargs):
  13. # fetch json body
  14. parser = reqparse.RequestParser()
  15. parser.add_argument("tenant_id", type=str, required=True, location="json")
  16. parser.add_argument("user_id", type=str, required=True, location="json")
  17. kwargs = parser.parse_args()
  18. user_id = kwargs.get("user_id")
  19. tenant_id = kwargs.get("tenant_id")
  20. del kwargs["tenant_id"]
  21. del kwargs["user_id"]
  22. try:
  23. tenant_model = (
  24. db.session.query(Tenant)
  25. .filter(
  26. Tenant.id == tenant_id,
  27. )
  28. .first()
  29. )
  30. except Exception:
  31. raise ValueError("tenant not found")
  32. if not tenant_model:
  33. raise ValueError("tenant not found")
  34. kwargs["tenant_model"] = tenant_model
  35. kwargs["user_id"] = user_id
  36. return view_func(*args, **kwargs)
  37. return decorated_view
  38. if view is None:
  39. return decorator
  40. else:
  41. return decorator(view)
  42. def plugin_data(view: Optional[Callable] = None, *, payload_type: type[BaseModel]):
  43. def decorator(view_func):
  44. def decorated_view(*args, **kwargs):
  45. try:
  46. data = request.get_json()
  47. except Exception:
  48. raise ValueError("invalid json")
  49. try:
  50. payload = payload_type(**data)
  51. except Exception as e:
  52. raise ValueError(f"invalid payload: {str(e)}")
  53. kwargs["payload"] = payload
  54. return view_func(*args, **kwargs)
  55. return decorated_view
  56. if view is None:
  57. return decorator
  58. else:
  59. return decorator(view)