+
    5)i@,                         R t ^ RIHt ^ RIHtHtHtHtHt ^ RI	H
t
Ht ^ RIHtHt ^ RIHt ^ RIHt RR R lltRR	 R
 lltRR R lltRR R lltRR R lltR# )z
Flask route decorators for automatic request validation using Pydantic
Provides Laravel-style validation decorators for Flask routes
wraps)TypeOptionalCallableAnyDict)requestjsonify)	BaseModelValidationError)ValidationException)ApiResponsec                F    V ^8  d   QhR\         \        ,          R\        /#    schemamessager   r   str)formats   "FD:\Projects\python\client-ideal-oms_pyapi\app\decorators\validation.py__annotate__r      s     . .$y/ .C .    c                   a a R VV 3R llpV# )aY  
Decorator to validate JSON request body using Pydantic schema

Args:
    schema: Pydantic BaseModel class for validation
    message: Custom error message for validation failures

Usage:
    @validate_json(ActiveUsersRequest)
    def get_active_users(validated_data):
        # validated_data is now an ActiveUsersRequest instance
        pass
c                0    V ^8  d   QhR\         R\         /# r   freturnr   )r   s   "r   r   #validate_json.<locals>.__annotate__        " "X "( "r   c                 6   <a  \        S 4      V VV3R  l4       pV# )c                  .  <  \         P                  ! 4       pVf   \        P                  ! RR./R4      hS! R/ VB pS! V RV/VB #   \         dM   p\        P
                  ! TS4      p\        P                  ! TP                  TP                  4      u R p?# R p?i\         d6   p\        P                  ! TP                  TP                  4      u R p?# R p?i\         d/   p\        P                  ! R\        T4       2RR7      u R p?# R p?ii ; i)	Njsonz$Request must contain valid JSON datazInvalid JSON datavalidated_jsonzValidation failed:   status_code )r	   get_jsonr   from_custom_errorsr   from_pydantic_errorr   validation_errorerrorsr   	Exceptionerrorr   )	argskwargs	json_datavalidated_dataevalidation_exceptionr   r   r   s	   *,    r   decorated_function<validate_json.<locals>.decorator.<locals>.decorated_function   s    Z#,,.	$-@@"H!IJ+  "(!4)!4 $H~HHH" o':'N'NqRY'Z$"334H4O4OQeQmQmnn& I"33AHHaiiHH Z"((+>s1vh)GUXYYZsO   AA DABDD'D(*CDD%D&#D	DDr   r   r7   r   r   s   f r   	decorator validate_json.<locals>.decorator   s#    	q	Z 
	Z: "!r   r)   r   r   r:   s   ff r   validate_jsonr=          " "@ r   c                F    V ^8  d   QhR\         \        ,          R\        /# r   r   )r   s   "r   r   r   ?   s     . .4	? .S .r   c                   a a R VV 3R llpV# )aQ  
Decorator to validate query parameters using Pydantic schema

Args:
    schema: Pydantic BaseModel class for validation
    message: Custom error message for validation failures

Usage:
    @validate_query(PaginationRequest)
    def get_items(validated_query):
        # validated_query contains validated query parameters
        pass
c                0    V ^8  d   QhR\         R\         /# r   r   )r   s   "r   r   $validate_query.<locals>.__annotate__M   r!   r   c                 6   <a  \        S 4      V VV3R  l4       pV# )c                    <  \         P                  P                  4       pVP                  4        FV  w  r4VP	                  4       '       d   \        V4      W#&   K*  VP                  4       R9   g   KA  VP                  4       R 8H  W#&   KX  	  S
! R/ VB pS! V.V O5/ VB #   \         dM   p\        P                  ! TS	4      p\        P                  ! TP                  TP                  4      u Rp?# Rp?i\         d6   p\        P                  ! TP                  TP                  4      u Rp?# Rp?i\         d/   p\        P                  ! R\!        T4       2RR7      u Rp?# Rp?ii ; i)trueNzQuery validation failed: r&   r'   rE   falser)   )r	   r1   to_dictitemsisdigitintlowerr   r   r,   r   r-   r.   r   r/   r0   r   )r1   r2   
query_datakeyvaluer4   r5   r6   r   r   r   s   *,      r   r7   =validate_query.<locals>.decorator.<locals>.decorated_functionN   s%   `$\\113
 #-"2"2"4JC}}*-e*
*;;*/++-6*A
 #5 "(!5*!5 9$9&99" o':'N'NqRY'Z$"334H4O4OQeQmQmnn& I"33AHHaiiHH `"((+DSVH)M[^__`sU   A*B 2,B E+*AC1+E+1E+>E+?*D/)E+/E+<E+=#E& E+&E+r   r9   s   f r   r:   !validate_query.<locals>.decoratorM   s#    	q	` 
	`: "!r   r)   r<   s   ff r   validate_queryrR   ?   r>   r   c                F    V ^8  d   QhR\         \        ,          R\        /# r   r   )r   s   "r   r   r   p   s     + +$y/ +C +r   c                   a a R VV 3R llpV# )aJ  
Decorator to validate form data using Pydantic schema

Args:
    schema: Pydantic BaseModel class for validation
    message: Custom error message for validation failures

Usage:
    @validate_form(UserRegistrationRequest)
    def register_user(validated_form):
        # validated_form contains validated form data
        pass
c                0    V ^8  d   QhR\         R\         /# r   r   )r   s   "r   r   #validate_form.<locals>.__annotate__~   s     " "X "( "r   c                 6   <a  \        S 4      V VV3R  l4       pV# )c                    <  \         P                  P                  4       p\         P                  '       d,   \         P                  P	                  4        F	  w  r4WBV&   K  	  S
! R/ VB pS! V.V O5/ VB #   \
         dM   p\        P                  ! TS	4      p\        P                  ! TP                  TP                  4      u R p?# R p?i\         d6   p\        P                  ! TP                  TP                  4      u R p?# R p?i\         d/   p\        P                  ! R\        T4       2RR7      u R p?# R p?ii ; i)NzForm validation failed: r&   r'   r)   )r	   formrH   filesrI   r   r   r,   r   r-   r.   r   r/   r0   r   )r1   r2   	form_datarN   filer4   r5   r6   r   r   r   s   *,      r   r7   <validate_form.<locals>.decorator.<locals>.decorated_function   s   _#LL002	 ===%,]]%8%8%:	)-# &; "(!4)!4 9$9&99" o':'N'NqRY'Z$"334H4O4OQeQmQmnn& I"33AHHaiiHH _"((+CCF8)LZ]^^_sS   3A6 >A6 6EACEEE*D EEE#D=7E=Er   r9   s   f r   r:    validate_form.<locals>.decorator~   s#    	q	_ 
	_4 "!r   r)   r<   s   ff r   validate_formr_   p   s    " ": r   Nc                    V ^8  d   QhR\         \        \        ,          ,          R\         \        \        ,          ,          R\         \        \        ,          ,          R\        /# )r   json_schemaquery_schemaform_schemar   )r   r   r   r   )r   s   "r   r   r      sQ     Q Q$y/*Q4	?+Q $y/*Q 	Qr   c                &   a aaa R VV VV3R llpV# )ax  
Decorator to validate multiple data sources (JSON, query, form) using different schemas

Args:
    json_schema: Pydantic schema for JSON body validation
    query_schema: Pydantic schema for query parameters validation
    form_schema: Pydantic schema for form data validation
    message: Custom error message for validation failures

Usage:
    @validate_multiple(
        json_schema=ContentStatsRequest,
        query_schema=PaginationRequest
    )
    def get_content_stats(validated_json=None, validated_query=None, validated_form=None):
        # Each validated parameter contains the respective validated data
        pass
c                0    V ^8  d   QhR\         R\         /# r   r   )r   s   "r   r   'validate_multiple.<locals>.__annotate__   s     8" 8"X 8"( 8"r   c                 :   <a  \        S 4      V VVVV3R  l4       pV# )c            	      L  <  R pR pR pS'       d"   \         P                  ! 4       pVe	   S! R/ VB pS'       d   \         P                  P                  4       pVP	                  4        FV  w  rxVP                  4       '       d   \        V4      Wg&   K*  VP                  4       R	9   g   KA  VP                  4       R8H  Wg&   KX  	  V'       d	   S! R/ VB pS'       dp   \         P                  P                  4       p	\         P                  '       d,   \         P                  P	                  4        F	  w  rzWV&   K  	  V	'       d	   S! R/ V	B pS! V RVRVRV/VB #   \         dM   p\        P                  ! TS4      p\        P                  ! TP                  TP                   4      u R p?# R p?i\         d6   p\        P                  ! TP                  TP                   4      u R p?# R p?i\"         d/   p\        P$                  ! R\'        T4       2RR7      u R p?# R p?ii ; i)
NrE   r%   validated_queryvalidated_formz Multi-source validation failed: r&   r'   r)   rF   )r	   r*   r1   rH   rI   rJ   rK   rL   rY   rZ   r   r   r,   r   r-   r.   r   r/   r0   r   )r1   r2   r%   ri   rj   r3   rM   rN   rO   r[   r\   r5   r6   r   rc   ra   r   rb   s   *,           r   r7   @validate_multiple.<locals>.decorator.<locals>.decorated_function   s   3g!%"&!%  ' 0 0 2I ,)4)Ay)A  !(!5!5!7J&0&6&6&8
 ==??.1%jJO"[[].??.3kkmv.EJO	 '9 "*6*D*D  ' 4 4 6I}}})0)<)<)>IC-1cN *? !)4)Ay)A  	#1$3 $2
   # o':'N'NqRY'Z$"334H4O4OQeQmQmnn& I"33AHHaiiHH g"((+KCPQF8)Tbeffgsw   E (E A*E ) E 
E 3E 2E E H#"AF)#H#)H#6H#7*G'!H#'H#4H#5#HH#H#r   )r   r7   rc   ra   r   rb   s   f r   r:   $validate_multiple.<locals>.decorator   s*    	q4	g 4	g 
4	gl "!r   r)   )ra   rb   rc   r   r:   s   ffff r   validate_multiplerm      s    08" 8"r r   c                0    V ^8  d   QhR\         R\        /# )r   validator_funcr   )r   r   )r   s   "r   r   r      s     / /H /s /r   c                   a  R V 3R llpV# )a  
Decorator for custom business logic validation

Args:
    validator_func: Function that takes request data and returns True if valid,
                   raises ValidationException if invalid
    message: Custom error message for validation failures

Usage:
    def validate_user_permissions(data):
        if not user_has_permission(data.user_id, 'read_reports'):
            raise ValidationException.from_custom_errors(
                {"user_id": ["User does not have permission to access reports"]},
                "Permission denied"
            )
        return True

    @validate_business_rules(validate_user_permissions)
    def get_reports(validated_data):
        pass
c                0    V ^8  d   QhR\         R\         /# r   r   )r   s   "r   r   -validate_business_rules.<locals>.__annotate__  s     " "X "( "r   c                 4   <a  \        S 4      V V3R  l4       pV# )c                  6  <  R pV '       d$   \        V ^ ,          R4      '       d   V ^ ,          pMa\        P                  ! 4       ;'       gE    \        P                  P	                  4       ;'       g    \        P
                  P	                  4       pS! V4       S! V / VB #   \         d6   p\        P                  ! TP                  TP                  4      u R p?# R p?i\         d/   p\        P                  ! R\        T4       2RR7      u R p?# R p?ii ; i)N__dict__z!Business rule validation failed: r&   r'   )hasattrr	   r*   rY   rH   r1   r   r   r-   r.   r   r/   r0   r   )r1   r2   r4   r5   r   ro   s   *,  r   r7   Fvalidate_business_rules.<locals>.decorator.<locals>.decorated_function	  s    h!%GDGZ88%)!WN &-%5%5%7%k%k7<<;O;O;Q%k%kU\UaUaUiUiUkN ~. $)&))& I"33AHHaiiHH h"((+LSQRVH)UcfgghsF   	B! >B! %B! 2.B! !D,*CDD)D*#DDDr   )r   r7   ro   s   f r   r:   *validate_business_rules.<locals>.decorator  s#    	q	h 
	h, "!r   r)   )ro   r   r:   s   f& r   validate_business_rulesry      s    ," "2 r   )zThe given data was invalid.)zInvalid query parameters.)zInvalid form data.)NNNzValidation failed.)z Business rule validation failed.)__doc__	functoolsr   typingr   r   r   r   r   flaskr	   r
   pydanticr   r   #app.exceptions.validation_exceptionr   app.utils.response_helperr   r=   rR   r_   rm   ry   r)   r   r   <module>r      sD   
  6 6 " / C 1.b.b+\Qh/ /r   