o
    wvXj  ã                   @   s~   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
„ d
ƒZG dd„ deƒZdS )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                   @   s   e Zd Zdd„ ZdS )ÚBaseMetadatac                 C   s   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Úview© r   úT/var/www/html/myproject/venv/lib/python3.10/site-packages/rest_framework/metadata.pyÚdetermine_metadata   s   zBaseMetadata.determine_metadataN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r      s    r   c                   @   sâ   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jdejdejdejdi¥ƒZdd„ Zdd„ Zdd„ Zdd„ Z dS )Ú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                 C   sl   t ƒ }| ¡ |d< | ¡ |d< dd„ |jD ƒ|d< dd„ |jD ƒ|d< t|dƒr4|  ||¡}|r4||d	< |S )
NÚnameÚdescriptionc                 S   ó   g | ]}|j ‘qS r   ©Ú
media_type)Ú.0Úrendererr   r   r   Ú
<listcomp>A   ó    z5SimpleMetadata.determine_metadata.<locals>.<listcomp>Úrendersc                 S   r(   r   r)   )r+   Úparserr   r   r   r-   B   r.   ÚparsesÚget_serializerÚactions)r   Úget_view_nameÚget_view_descriptionÚrenderer_classesÚparser_classesÚhasattrÚdetermine_actions)r   r   r   Úmetadatar3   r   r   r   r   =   s   
z!SimpleMetadata.determine_metadatac                 C   s¤   i }ddht |jƒ@ D ]D}t||ƒ|_z8zt|dƒr | |j¡ |dkr-t|dƒr-| ¡  W n tjt	t
fy;   Y nw | ¡ }|  |¡||< W ||_q||_w |S )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   r8   r=   r>   r   ÚAPIExceptionr   r   r2   Úget_serializer_info)r   r   r   r3   ÚmethodÚ
serializerr   r   r   r9   I   s"   
€ÿ€z SimpleMetadata.determine_actionsc                    s,   t |dƒr|j}t‡ fdd„|j ¡ D ƒƒS )zn
        Given an instance of a serializer, return a dictionary of metadata
        about its fields.
        Úchildc                    s*   g | ]\}}t |tjƒs|ˆ  |¡f‘qS r   )Ú
isinstancer   ÚHiddenFieldÚget_field_info)r+   Ú
field_namer   ©r   r   r   r-   m   s    
ýÿz6SimpleMetadata.get_serializer_info.<locals>.<listcomp>)r8   rE   r   ÚfieldsÚitems)r   rD   r   rJ   r   rB   d   s
   
þz"SimpleMetadata.get_serializer_infoc                 C   sÜ   t ƒ }| j| |d< t|ddƒ|d< g d¢}|D ]}t||dƒ}|dur0|dkr0t|dd�||< qt|d	dƒr@|  |j¡|d	< nt|d
dƒrM|  |¡|d< | d¡slt|t	j
t	jfƒslt|dƒrldd„ |j ¡ D ƒ|d< |S )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_onlyrE   rK   ÚchildrenrO   Úchoicesc                 S   s"   g | ]\}}|t |d d�dœ‘qS )TrW   )ÚvalueÚdisplay_namer   )r+   Úchoice_valueÚchoice_namer   r   r   r-   �   s    ý
þÿz1SimpleMetadata.get_field_info.<locals>.<listcomp>)r   Úlabel_lookupÚgetattrr   rH   rE   rB   ÚgetrF   r   ÚRelatedFieldÚManyRelatedFieldr8   rZ   rL   )r   r   Ú
field_infoÚattrsÚattrr[   r   r   r   rH   s   s,   €
ÿþ
ûzSimpleMetadata.get_field_infoN)!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   r9   rB   rH   r   r   r   r   r      s^    ÿþýüûúùø	÷
öõôóòñðïêr   N)rg   Ú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   r   Ú<module>   s    	