a
    Sic                     @   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dS )zx
        Return a dictionary of metadata about the view.
        Used to return responses for OPTIONS requests.
        z).determine_metadata() must be overridden.N)NotImplementedError)selfrequestview r   S/var/www/html/django/DPS/env/lib/python3.9/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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rh| ||}|rh||d	< |S )
Nnamedescriptionc                 S   s   g | ]
}|j qS r   
media_type).0rendererr   r   r   
<listcomp>@       z5SimpleMetadata.determine_metadata.<locals>.<listcomp>Zrendersc                 S   s   g | ]
}|j qS r   r(   )r*   parserr   r   r   r,   A   r-   Zparsesget_serializeractions)r   get_view_nameget_view_descriptionrenderer_classesparser_classeshasattrdetermine_actions)r   r   r   metadatar0   r   r   r   r   <   s    
z!SimpleMetadata.determine_metadatac                 C   s   i }ddht |j@ D ]}t|||_zpz4t|dr@||j |dkrZt|drZ|  W n tjt	t
fyv   Y n0 | }| |||< W ||_q||_0 q|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   r5   r:   r;   r   APIExceptionr   r   r/   get_serializer_info)r   r   r   r0   method
serializerr   r   r   r6   H   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,   l   s   z6SimpleMetadata.get_serializer_info.<locals>.<listcomp>)r5   rB   r   fieldsitems)r   rA   r   rG   r   r?   c   s
    
z"SimpleMetadata.get_serializer_infoc                 C   s   t  }| j| |d< t|dd|d< g d}|D ]0}t||d}|dur0|dkr0t|dd||< q0t|d	dr| |j|d	< nt|d
dr| ||d< |dst|t	j
t	jfst|drd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_onlyrB   rH   childrenrL   choicesc                 S   s"   g | ]\}}|t |d ddqS )TrT   )valuedisplay_namer   )r*   Zchoice_valueZchoice_namer   r   r   r,      s   
z1SimpleMetadata.get_field_info.<locals>.<listcomp>)r   label_lookupgetattrr   rE   rB   r?   getrC   r   RelatedFieldManyRelatedFieldr5   rW   rI   )r   r   
field_infoattrsattrrX   r   r   r   rE   r   s*    

zSimpleMetadata.get_field_infoN) r   r   r   __doc__r
   r   FieldBooleanField	CharField	UUIDFieldURLField
EmailField
RegexField	SlugFieldIntegerField
FloatFieldDecimalField	DateFieldDateTimeField	TimeFieldChoiceFieldMultipleChoiceField	FileField
ImageField	ListField	DictField
SerializerrZ   r   r6   r?   rE   r   r   r   r   r      s8   r   N)rb   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   	