wraps.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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 = db.session.query(Tenant).filter(
  24. Tenant.id == tenant_id,
  25. ).first()
  26. except Exception:
  27. raise ValueError('tenant not found')
  28. if not tenant_model:
  29. raise ValueError('tenant not found')
  30. kwargs['tenant_model'] = tenant_model
  31. kwargs['user_id'] = user_id
  32. return view_func(*args, **kwargs)
  33. return decorated_view
  34. if view is None:
  35. return decorator
  36. else:
  37. return decorator(view)
  38. def plugin_data(view: Optional[Callable] = None, *, payload_type: type[BaseModel]):
  39. def decorator(view_func):
  40. def decorated_view(*args, **kwargs):
  41. try:
  42. data = request.get_json()
  43. except Exception:
  44. raise ValueError('invalid json')
  45. try:
  46. payload = payload_type(**data)
  47. except Exception as e:
  48. raise ValueError(f'invalid payload: {str(e)}')
  49. kwargs['payload'] = payload
  50. return view_func(*args, **kwargs)
  51. return decorated_view
  52. if view is None:
  53. return decorator
  54. else:
  55. return decorator(view)