
    h                         d 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
mZ ddlmZ ddlmZ  G d	 d
      Z G d de      Zy)aL  
The metadata API is used to allow customization of how `OPTIONS` requests
are handled. We currently provide a single default implementation that returns
some fairly ad-hoc information about the view.

Future implementations might use JSON schema or other definitions in order
to return this information in a more standardized way.
    )OrderedDict)PermissionDenied)Http404)	force_str)
exceptionsserializers)clone_request)ClassLookupDictc                       e Zd Zd Zy)BaseMetadatac                     t        d      )zx
        Return a dictionary of metadata about the view.
        Used to return responses for OPTIONS requests.
        z).determine_metadata() must be overridden.)NotImplementedError)selfrequestviews      Z/var/www/html/ranktracker/api/venv/lib/python3.12/site-packages/rest_framework/metadata.pydetermine_metadatazBaseMetadata.determine_metadata   s    
 ""MNN    N)__name__
__module____qualname__r    r   r   r   r      s    Or   r   c                   n   e Zd ZdZ ei ej                  dej                  dej                  dej                  dej                  dej                  dej                  dej                  dej                  dej                  d	ej                   d
ej"                  dej$                  dej&                  dej(                  dej*                  dej,                  dej.                  dej0                  dej2                  dej4                  dej6                  di      Zd Zd Zd Zd Z y)SimpleMetadataz
    This is the default metadata implementation.
    It returns an ad-hoc set of information about the view.
    There are not any formalized standards for `OPTIONS` responses
    for us to base this on.
    fieldbooleanstringurlemailregexslugintegerfloatdecimaldatedatetimetimechoicezmultiple choicezfile uploadzimage uploadlistznested objectc                 `   t               }|j                         |d<   |j                         |d<   |j                  D cg c]  }|j                   c}|d<   |j
                  D cg c]  }|j                   c}|d<   t        |d      r| j                  ||      }|r||d<   |S c c}w c c}w )Nnamedescriptionrendersparsesget_serializeractions)r   get_view_nameget_view_descriptionrenderer_classes
media_typeparser_classeshasattrdetermine_actions)r   r   r   metadatarendererparserr0   s          r   r   z!SimpleMetadata.determine_metadata=   s    =--/"&";";"=CGCXCXYxx22Y>B>Q>QRFf//R4)*,,Wd;G&-# ZRs   B&&B+c                    i }ddht        |j                        z  D ]  }t        ||      |_        	 t	        |d      r|j                  |j                         |dk(  rt	        |d      r|j                          |j                         }| j                  |      ||<   ||_         |S # t        j                  t        t        f$ r Y +w xY w# ||_        w xY w)z
        For generic class based views we return information about
        the fields that are accepted for 'PUT' and 'POST' methods.
        PUTPOSTcheck_permissions
get_object)setallowed_methodsr	   r   r6   r>   r?   r/   get_serializer_infor   APIExceptionr   r   )r   r   r   r0   method
serializers         r   r7   z SimpleMetadata.determine_actionsI   s    
 foD,@,@(AA 	'F(&9DL'4!45**4<<8U?wt\'BOO% "002
"&":"::"F&#	'&  ++-=wG   's*   AB):$C)C
C	C

C	Cc           
          t        |d      r|j                  }t        |j                  j	                         D cg c]2  \  }}t        |t        j                        s|| j                  |      f4 c}}      S c c}}w )zn
        Given an instance of a serializer, return a dictionary of metadata
        about its fields.
        child)	r6   rG   r   fieldsitems
isinstancer   HiddenFieldget_field_info)r   rE   
field_namer   s       r   rB   z"SimpleMetadata.get_serializer_infod   sv    
 :w' $))J%/%6%6%<%<%>
!
Ee[%<%<= ,,U34
  	 
s   7A:
c           	      p   t               }| j                  |   |d<   t        |dd      |d<   g d}|D ](  }t        ||d      }||dk7  st        |d      ||<   * t        |d	d      r| j	                  |j
                        |d	<   n!t        |d
d      r| j                  |      |d<   |j                  d      stt        |t        j                  t        j                  f      sJt        |d      r>|j                  j                         D cg c]  \  }}|t        |d      d c}}|d<   |S c c}}w )zl
        Given an instance of a serializer field, return a dictionary
        of metadata about it.
        typerequiredF)	read_onlylabel	help_text
min_length
max_length	min_value	max_valueN T)strings_onlyrG   rH   childrenrQ   choices)valuedisplay_name)r   label_lookupgetattrr   rL   rG   rB   getrJ   r   RelatedFieldManyRelatedFieldr6   r[   rI   )r   r   
field_infoattrsattrr\   choice_valuechoice_names           r   rL   zSimpleMetadata.get_field_infos   s?   
 !]
!..u5
6!(
E!B
:
  	GDE4.E Ub[#,U#F
4 	G
 5'4("&"5"5ekk"BJwUHd+%)%=%=e%DJz"{+5;#;#;[=Y=Y"Z[y) 271D1D1F%
 .L+ *$-k$M%Jy! %s   D2N)!r   r   r   __doc__r
   r   FieldBooleanFieldNullBooleanField	CharField	UUIDFieldURLField
EmailField
RegexField	SlugFieldIntegerField
FloatFieldDecimalField	DateFieldDateTimeField	TimeFieldChoiceFieldMultipleChoiceField	FileField
ImageField	ListField	DictField
Serializerr^   r   r7   rB   rL   r   r   r   r   r      s    # $7$  )$ 	$$i$ 	x	$
 	x$ 	e$ 	$ 	$ 	v$ 	  )$ 	$ 	  )$ 	v$ 	!!:$ 	v$  	!$" 	''):#$$ 	}v-$ L2
6$r   r   N)rh   collectionsr   django.core.exceptionsr   django.httpr   django.utils.encodingr   rest_frameworkr   r   rest_framework.requestr	   "rest_framework.utils.field_mappingr
   r   r   r   r   r   <module>r      s;    $ 3  + 2 0 >O Oz\ zr   