
    E6i                      X   d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZ ddl	m
Z
 ddlmZ d dlmZ d d	lmZ dd
lmZ ddlmZ  ej*                  dej,                  ej.                  z        Zd Z G d de      Z G d de      Z G d deee      Z G d deee      Z G d de      Z y)    N)OrderedDict)MutableMapping)cached_property   )Mask)abort)Draft4Validator)ValidationError)not_none)
HTTPStatusz)u?\'(?P<name>.*)\' is a required propertyc                 4    t        | t              r |        S | S N)
isinstancetype)clss    T/home/azureuser/techstart-app/venv/lib/python3.12/site-packages/flask_restx/model.pyinstancer      s    #tuJ    c                   p     e Zd ZdZ fdZed        Zd Zed        Ze	d        Z
d
dZd Zd	 ZeZ xZS )	ModelBasez
    Handles validation and swagger style inheritance for both subclasses.
    Subclass must define `schema` attribute.

    :param str name: The model public name
    c                 t     t        t         
  |i | d|i _        | _        g  _         fd}| _        y )Nnamec                 @     j                   j                  | g| S r   )	__class__inheritr   parentsselfs     r   instance_inheritz,ModelBase.__init__.<locals>.instance_inherit+   s!    )4>>))$?w??r   )superr   __init__
__apidoc__r   __parents__r   )r   r   argskwargsr   r   s   `    r   r!   zModelBase.__init__%   s@    i'88!4.		@ (r   c                     | j                   D cg c]  }|j                   }}t        j                  t        | j                  g      g| S c c}w )z+
        Return the ancestors tree
        )r#   	ancestorssetunionr   )r   pr'   s      r   r'   zModelBase.ancestors0   sE    
 +/*:*:;QQ[[;	;yydii[)6I66 <s   Ac                     | j                   |k(  r| S | j                  D ]  }|j                  |      }|s|c S  t        d|z   dz         )NzParent z
 not found)r   r#   
get_parent
ValueError)r   r   parentfounds       r   r,   zModelBase.get_parent8   sW    99K** !))$/ L! T)L899r   c                     | j                   }| j                  r<| j                  D cg c]  }ddj                  |j                        i! }}d||gz   iS |S c c}w )Nz$refz#/definitions/{0}allOf)_schemar#   formatr   )r   schemar.   refss       r   
__schema__zModelBase.__schema__B   sk     #.. ,33FKK@AD 
 TVH_--Ms   $Ac                 2     | ||d         }|dd |_         |S )z
        Inherit this model (use the Swagger composition pattern aka. allOf)
        :param str name: The new model name
        :param dict fields: The new model extra fields
        N)r#   )r   r   r   models       r   r   zModelBase.inheritP   s'     D'"+&#CRLr   c                      t         j                  ||      }	 |j                  |       y # t        $ r@ t	        t
        j                  dt         fd|j                  |      D                     Y y w xY w)N)resolverformat_checkerzInput payload validation failedc              3   @   K   | ]  }j                  |        y wr   )format_error).0er   s     r   	<genexpr>z%ModelBase.validate.<locals>.<genexpr>e   s     VQD--a0Vs   )messageerrors)	r	   r6   validater
   r   r   BAD_REQUESTdictiter_errors)r   datar;   r<   	validators   `    r   rD   zModelBase.validate[   sh    #OOh~
		t$ 	&&9V):O:OPT:UVV	s   - AA65A6c                    t        |j                        }|j                  dk(  r?t        j	                  |j
                        j                  d      }|j                  |       dj                  d |D              }||j
                  fS )Nrequiredr   .c              3   2   K   | ]  }t        |        y wr   )str)r?   r*   s     r   rA   z)ModelBase.format_error.<locals>.<genexpr>m   s     ,!s1v,s   )	listpathrI   RE_REQUIREDmatchrB   groupappendjoin)r   errorrP   r   keys        r   r>   zModelBase.format_errorh   sj    EJJ??j($$U]]399&ADKKhh,t,,EMM!!r   c                 v    dj                  | j                  dj                  | j                                     S )NzModel({name},{{{fields}}}),)r   fields)r3   r   rU   keysr   s    r   __unicode__zModelBase.__unicode__p   s2    +22388DIIK#8 3 
 	
r   )NN)__name__
__module____qualname____doc__r!   propertyr'   r,   r6   classmethodr   rD   r>   r]   __str____classcell__r   s   @r   r   r      sd    	( 7 7:    "

 Gr   r   c                   b     e Zd ZdZeZ fdZed        Ze	d        Z
d Zed        Zd Z xZS )RawModela:  
    A thin wrapper on ordered fields dict to store API doc metadata.
    Can also be used for response marshalling.

    :param str name: The model public name
    :param str mask: an optional default model mask
    :param bool strict: validation should raise error when there is param not provided in schema
    c                 *    |j                  dd        _        |j                  dd       _         j                  r4t         j                  t              st	         j                         _        t        t           |g|i |  fd}| _        y )NmaskstrictFc                 @     j                   j                  | g| S r   )r   cloner   s     r   instance_clonez)RawModel.__init__.<locals>.instance_clone   s!    '4>>''d=W==r   )	pop__mask__
__strict__r   r   r    rh   r!   rm   )r   r   r$   r%   rn   r   s   `    r   r!   zRawModel.__init__   sr    

640 **Xu5==DMM4!@ /DMh&t=d=f=	> $
r   c                    | j                         }t               }d }| j                         D ]L  \  }}t        |      }|j                  ||<   |j
                  r|j                  |       t        |dd      sK|}N t        t        |            xs d ||| j                  rt        | j                        nd dd}| j                  rd|d<   t        |      S )NdiscriminatorFobject)rK   
propertiesrs   zx-maskr   additionalProperties)wrapperr(   itemsr   r6   rK   addgetattrsortedrO   rp   rN   rq   r   )r   ru   rK   rs   r   field
definitions          r   r2   zRawModel._schema   s    \\^
5::< 	%KD%UOE$//Jt~~T"uou5 $	% tH~.6$$*,0MMc$--(t

 ??16J-.
##r   c                 ^   t        j                  |       }| j                  D ]  }|j                  |j                          |j                         D cg c]  }t        |dd      s| }}t        |      dkD  rt        d      t        |      dk(  r| j                  |d   _
        |S c c}w )zG
        Resolve real fields before submitting them to marshal
        rs   Nr   z-There can only be one discriminator by schemar   )copydeepcopyr#   updateresolvedvaluesrz   lenr-   r   default)r   r   r.   f
candidatess        r   r   zRawModel.resolved   s     ==& && 	-FOOFOO,	- "*!2XAgaRV6WaX
Xz?QLMM_!$(IIJqM! Ys   B*'B*c                     t        j                  dt        d       t        |t        t
        f      r | j                  |g| S | j                  ||      S )z
        Extend this model (Duplicate all fields)

        :param str name: The new model name
        :param dict fields: The new model extra fields

        :deprecated: since 0.9. Use :meth:`clone` instead.
        z*extend is is deprecated, use clone instead   )
stacklevel)warningswarnDeprecationWarningr   rO   tuplerm   )r   r   rZ   s      r   extendzRawModel.extend   sP     	8	

 ftUm,4::d,V,,::dF++r   c                     | j                         }|D ]&  }|j                  t        j                  |             (  | ||      S )a\  
        Clone these models (Duplicate all fields)

        It can be used from the class

        >>> model = Model.clone(fields_1, fields_2)

        or from an Instanciated model

        >>> new_model = model.clone(fields_1, fields_2)

        :param str name: The new model name
        :param dict parents: The new model extra fields
        )rw   r   r   r   )r   r   r   rZ   r.   s        r   rm   zRawModel.clone   s@       	1FMM$--/0	14  r   c                    | j                  | j                  | j                         D cg c]  \  }}|t        j                  ||      f c}}| j
                  | j                        }| j                  |_        |S c c}}w )N)rj   rk   )r   r   rx   r   r   rp   rq   r#   )r   memorW   valueobjs        r   __deepcopy__zRawModel.__deepcopy__   sl    nnIIAEN:3c4==-.N??	  
 **
 Os   "A>)r^   r_   r`   ra   rF   rw   r!   rb   r2   r   r   r   rc   rm   r   re   rf   s   @r   rh   rh   x   sZ     G
$ $ $2  ,,& ! !(r   rh   c                       e Zd ZdZy)Modelz
    A thin wrapper on fields dict to store API doc metadata.
    Can also be used for response marshalling.

    :param str name: The model public name
    :param str mask: an optional default model mask
    N)r^   r_   r`   ra    r   r   r   r      s     	r   r   c                       e Zd ZdZeZy)OrderedModelz
    A thin wrapper on ordered fields dict to store API doc metadata.
    Can also be used for response marshalling.

    :param str name: The model public name
    :param str mask: an optional default model mask
    N)r^   r_   r`   ra   r   rw   r   r   r   r   r      s     Gr   r   c                   .     e Zd ZdZd fd	Zd ZeZ xZS )SchemaModelz
    Stores API doc metadata based on a json schema.

    :param str name: The model public name
    :param dict schema: The json schema we are documenting
    c                 B    t         t        |   |       |xs i | _        y r   )r    r   r!   r2   )r   r   r4   r   s      r   r!   zSchemaModel.__init__  s    k4)$/|r   c                 P    dj                  | j                  | j                        S )NzSchemaModel({name},{schema}))r   r4   )r3   r   r2   r\   s    r   r]   zSchemaModel.__unicode__  s'    -444<< 5 
 	
r   r   )r^   r_   r`   ra   r!   r]   rd   re   rf   s   @r   r   r     s    $

 Gr   r   )!r   rer   collectionsr   collections.abcr   werkzeug.utilsr   rj   r   rC   r   
jsonschemar	   jsonschema.exceptionsr
   utilsr   _httpr   compileIUrQ   r   rt   r   rh   rF   r   r   r   r   r   r   <module>r      s     	  # * *   & 1   bjjErttbdd{SX Xvyy yx		HdN 			8[. 	) r   