U
    ǽb                     @   sv   d dl mZ d dlZd dlmZmZmZ ddlmZ ddl	m
Z
 ddlmZmZ G d	d
 d
eeZG dd deZdS )    )OrderedDictN)CursorPaginationLimitOffsetPaginationPageNumberPagination   )openapi)force_real_str   )FilterInspectorPaginatorInspectorc                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	CoreAPICompatInspectorzConverts ``coreapi.Field``\ s to :class:`.openapi.Parameter`\ s for filters and paginators that implement a
    ``get_schema_fields`` method.
    c                    s,   g }t |dr| j} fdd|D S )Nget_schema_fieldsc                    s   g | ]}  |qS  coreapi_field_to_parameter.0fieldselfr   =/tmp/pip-unpacked-wheel-o6yr43pd/drf_yasg/inspectors/query.py
<listcomp>   s     zCCoreAPICompatInspector.get_paginator_parameters.<locals>.<listcomp>hasattrr   view)r   	paginatorfieldsr   r   r   get_paginator_parameters   s    
z/CoreAPICompatInspector.get_paginator_parametersc                    s,   g }t |dr| j} fdd|D S )Nr   c                    s   g | ]}  |qS r   r   r   r   r   r   r      s     z@CoreAPICompatInspector.get_filter_parameters.<locals>.<listcomp>r   )r   Zfilter_backendr   r   r   r   get_filter_parameters   s    
z,CoreAPICompatInspector.get_filter_parametersc              
      s   t jt jt jt jd}tjt jtjt jtj	t j
tjt ji}dddddg}|j t jf |j||j |j rrt jnd|t t j
dt fd	d
|D S )zConvert an instance of `coreapi.Field` to a swagger :class:`.Parameter` object.

        :param coreapi.Field field:
        :rtype: openapi.Parameter
        )querypathformbodyformatpatternenumZ
min_length
max_lengthN)nameZin_requireddescriptiontypec                 3   s   | ]}|t  |d fV  qd S )N)getattr)r   attrschemar   r   	<genexpr>8   s     zDCoreAPICompatInspector.coreapi_field_to_parameter.<locals>.<genexpr>)r   ZIN_QUERYZIN_PATHZIN_FORM
coreschemaZIntegerTYPE_INTEGERNumberZTYPE_NUMBERStringTYPE_STRINGBooleanZTYPE_BOOLEANr.   	Parameterr'   locationr(   r   r)   getr*   r   )r   r   Zlocation_to_inZcoreapi_typesZcoreschema_attrsr   r-   r   r      s2        z1CoreAPICompatInspector.coreapi_field_to_parameterN)__name__
__module____qualname____doc__r   r   r   r   r   r   r   r      s   r   c                   @   s   e Zd ZdZdd ZdS )DjangoRestResponsePaginationzProvides response schema pagination warpping for django-rest-framework's LimitOffsetPagination,
    PageNumberPagination and CursorPagination
    c                 C   s   |j tjkstdd }t|tttfrt|t }tjtj	t
d|rRtjtjdnd fdtjtjtjddfdtjtjtjddfd|ffdgd	}|r|jd
d |S )Nz(array return expected for paged responsecount)r*   nextT)r*   r#   Z
x_nullablepreviousresults)r*   Z
propertiesr(   r   )r*   r   
TYPE_ARRAYAssertionError
isinstancer   r   r   ZSchemaZTYPE_OBJECTr   r1   r4   Z
FORMAT_URIr(   insert)r   r   Zresponse_schemaZpaged_schemaZ	has_countr   r   r   get_paginated_responseA   s"    z3DjangoRestResponsePagination.get_paginated_responseN)r9   r:   r;   r<   rF   r   r   r   r   r=   <   s   r=   )collectionsr   r0   Zrest_framework.paginationr   r   r    r   utilsr   baser
   r   r   r=   r   r   r   r   <module>   s   1