o
    Þhz]  ã                   @   sè  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Zd dlm	Z	 d dl
mZ d dlmZmZ d dlmZmZmZ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! zd dl"Z"W n e#y…   zd dl$m"Z" W n e#y‚   dZ"Y nw Y nw e %e&¡Z'G dd„ de(ƒZ)G dd„ de(ƒZ*dde*dddddddddddddfdd„Z+dd„ Z,dd„ Z-dd„ Z.dd„ Z/dd„ Z0d d!„ Z1d"d#„ Z2d$d%„ Z3d9d&d'„Z4d(d)„ Z5d*d+„ Z6d,d-„ Z7d.d/„ Z8d:d3d4„Z9d5d6„ Z:d7d8„ Z;dS );é    N)ÚOrderedDict)ÚDecimal)Úmodels)Ú	force_str)ÚserializersÚstatus)ÚDestroyModelMixinÚListModelMixinÚRetrieveModelMixinÚUpdateModelMixin)ÚFileUploadParser©Úis_form_media_type)Úapi_settings)ÚencodersÚjson)ÚAPIViewé   )Úswagger_settings)Úzoneinfoc                   @   ó   e Zd ZdZdS )Úno_bodyzcUsed as a sentinel value to forcibly remove the body of a request via :func:`.swagger_auto_schema`.N©Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r   r   úN/var/www/html/premium_crap/venv/lib/python3.10/site-packages/drf_yasg/utils.pyr       ó    r   c                   @   r   )ÚunsetzmUsed as a sentinel value for function parameters not set by the caller where ``None`` would be a valid value.Nr   r   r   r   r   r    %   r   r    c                    s0   ‡ ‡‡‡‡‡‡‡‡‡	‡
‡‡‡‡‡‡fdd„}|S )a¼  Decorate a view method to customize the :class:`.Operation` object generated from it.

    `method` and `methods` are mutually exclusive and must only be present when decorating a view method that accepts
    more than one HTTP request method.

    The `auto_schema` and `operation_description` arguments take precedence over view- or method-level values.

    :param str method: for multi-method views, the http method the options should apply to
    :param list[str] methods: for multi-method views, the http methods the options should apply to
    :param drf_yasg.inspectors.SwaggerAutoSchema auto_schema: custom class to use for generating the Operation object;
        this overrides both the class-level ``swagger_schema`` attribute and the ``DEFAULT_AUTO_SCHEMA_CLASS``
        setting, and can be set to ``None`` to prevent this operation from being generated
    :param request_body: custom request body which will be used as the ``schema`` property of a
        :class:`.Parameter` with ``in: 'body'``.

        A Schema or SchemaRef is not valid if this request consumes form-data, because ``form`` and ``body`` parameters
        are mutually exclusive in an :class:`.Operation`. If you need to set custom ``form`` parameters, you can use
        the `manual_parameters` argument.

        If a ``Serializer`` class or instance is given, it will be automatically converted into a :class:`.Schema`
        used as a ``body`` :class:`.Parameter`, or into a list of ``form`` :class:`.Parameter`\ s, as appropriate.
    :type request_body: drf_yasg.openapi.Schema or drf_yasg.openapi.SchemaRef  or rest_framework.serializers.Serializer
        or type[no_body]

    :param rest_framework.serializers.Serializer query_serializer: if you use a ``Serializer`` to parse query
        parameters, you can pass it here and have :class:`.Parameter` objects be generated automatically from it.

        If any ``Field`` on the serializer cannot be represented as a ``query`` :class:`.Parameter`
        (e.g. nested Serializers, file fields, ...), the schema generation will fail with an error.

        Schema generation will also fail if the name of any Field on the `query_serializer` conflicts with parameters
        generated by ``filter_backends`` or ``paginator``.

    :param list[drf_yasg.openapi.Parameter] manual_parameters: a list of manual parameters to override the
        automatically generated ones

        :class:`.Parameter`\ s are identified by their (``name``, ``in``) combination, and any parameters given
        here will fully override automatically generated parameters if they collide.

        It is an error to supply ``form`` parameters when the request does not consume form-data.

    :param str operation_id: operation ID override; the operation ID must be unique across the whole API
    :param str operation_description: operation description override
    :param str operation_summary: operation summary string
    :param list[dict] security: security requirements override; used to specify which authentication mechanism
        is required to call this API; an empty list marks the endpoint as unauthenticated (i.e. removes all accepted
        authentication schemes), and ``None`` will inherit the top-level security requirements
    :param bool deprecated: deprecation status for operation
    :param responses: a dict of documented manual responses
        keyed on response status code. If no success (``2xx``) response is given, one will automatically be
        generated from the request body and http method. If any ``2xx`` response is given the automatic response is
        suppressed.

        * if a plain string is given as value, a :class:`.Response` with no body and that string as its description
          will be generated
        * if ``None`` is given as a value, the response is ignored; this is mainly useful for disabling default
          2xx responses, i.e. ``responses={200: None, 302: 'something'}``
        * if a :class:`.Schema`, :class:`.SchemaRef` is given, a :class:`.Response` with the schema as its body and
          an empty description will be generated
        * a ``Serializer`` class or instance will be converted into a :class:`.Schema` and treated as above
        * a :class:`.Response` object will be used as-is; however if its ``schema`` attribute is a ``Serializer``,
          it will automatically be converted into a :class:`.Schema`
    :type responses: dict[int or str, (drf_yasg.openapi.Schema or drf_yasg.openapi.SchemaRef or
        drf_yasg.openapi.Response or str or rest_framework.serializers.Serializer)]

    :param list[type[drf_yasg.inspectors.FieldInspector]] field_inspectors: extra serializer and field inspectors; these
        will be tried before :attr:`.ViewInspector.field_inspectors` on the :class:`.inspectors.SwaggerAutoSchema`
    :param list[type[drf_yasg.inspectors.FilterInspector]] filter_inspectors: extra filter inspectors; these will be
        tried before :attr:`.ViewInspector.filter_inspectors` on the :class:`.inspectors.SwaggerAutoSchema`
    :param list[type[drf_yasg.inspectors.PaginatorInspector]] paginator_inspectors: extra paginator inspectors; these
        will be tried before :attr:`.ViewInspector.paginator_inspectors` on the :class:`.inspectors.SwaggerAutoSchema`
    :param list[str] tags: tags override
    :param extra_overrides: extra values that will be saved into the ``overrides`` dict; these values will be available
        in the handling :class:`.inspectors.SwaggerAutoSchema` instance via ``self.overrides``
    c                    sn  t ‡fdd„tjD ƒƒrJ dƒ‚ˆˆˆ
ˆˆˆˆˆˆˆ	rtˆ	ƒnd ˆr&tˆƒnd ˆr-tˆƒnd ˆr4tˆƒnd dœ‰tˆƒ‰ˆturDˆˆd< ˆ ˆ¡ ˆsMˆS tˆdg ƒ}tˆdi ƒ}‡fdd	„| ¡ D ƒ}|| }tˆd
d ƒ‰‡fdd	„tˆdg ƒD ƒ}|| ‰ tˆdi ƒ‰ˆ}ˆs‹ˆrÓˆ s‘J dƒ‚t	ˆƒt	ˆƒks�J dƒ‚t
ˆtƒr¦J dƒ‚ˆr®ˆ ¡ g}ndd	„ ˆD ƒ}t‡ fdd„|D ƒƒsÄJ dƒ‚t ‡fdd„|D ƒƒrÓJ dƒ‚ˆ �r$t	|ƒt	|ƒksâJ dƒ‚tˆ ƒdkrï|sîJ dƒ‚n|pòˆ }t ‡fdd„|D ƒƒ�rJ dƒ‚t ‡fdd„|D ƒƒ�rJ dƒ‚ˆ ‡fdd„|D ƒ¡ ˆˆ_ˆS |�r+J dƒ‚ˆ�r2J dƒ‚ˆˆ_ˆS )Nc                 3   ó   � | ]}|ˆ v V  qd S ©Nr   )Ú.0Úhm)Úextra_overridesr   r   Ú	<genexpr>{   ó   € z9swagger_auto_schema.<locals>.decorator.<locals>.<genexpr>z"HTTP method names not allowed here)Úrequest_bodyÚquery_serializerÚmanual_parametersÚoperation_idÚoperation_summaryÚ
deprecatedÚoperation_descriptionÚsecurityÚ	responsesÚfilter_inspectorsÚpaginator_inspectorsÚfield_inspectorsÚtagsÚauto_schemaÚbind_to_methodsÚmappingc                    s   g | ]\}}|ˆ j kr|‘qS r   )r   )r#   ÚmthÚname)Úview_methodr   r   Ú
<listcomp>–   s    z:swagger_auto_schema.<locals>.decorator.<locals>.<listcomp>Úclsc                    s   g | ]	}t ˆ |ƒr|‘qS r   )Úhasattr)r#   Úm©Úview_clsr   r   r;   ›   ó    Úhttp_method_namesÚ_swagger_auto_schemazI`method` or `methods` can only be specified on @action or @api_view viewsz specify either method or methodszR`methods` expects to receive a list of methods; use `method` for a single argumentc                 S   s   g | ]}|  ¡ ‘qS r   ©Úlower©r#   r8   r   r   r   r;   ©   s    c                 3   r!   r"   r   rF   )Úavailable_http_methodsr   r   r&   ª   r'   zhttp method not bound to viewc                 3   r!   r"   r   rF   ©Úexisting_datar   r   r&   «   r'   z"http method defined multiple timeszthis should never happenr   z�on multi-method api_view or action, you must specify swagger_auto_schema on a per-method basis using one of the `method` or `methods` argumentsc                 3   s"   � | ]}t tˆ |d ƒdƒV  qd S )NrC   )r=   ÚgetattrrF   r?   r   r   r&   ¹   s   €  z+swagger_auto_schema applied twice to methodc                 3   r!   r"   r   rF   rH   r   r   r&   »   r'   c                 3   s   � | ]	}|  ¡ ˆ fV  qd S r"   rD   rF   )Údatar   r   r&   ¼   ó   € z±the methods argument should only be specified when decorating an action; you should also ensure that you put the swagger_auto_schema decorator AFTER (above) the _route decorator)Úanyr   rB   ÚlistÚfilter_noner    ÚupdaterJ   ÚitemsÚboolÚ
isinstanceÚstrrE   ÚallÚlenrC   )r:   r6   r7   Úmapping_methodsÚaction_http_methodsÚapi_view_http_methodsÚ_methods©r5   r-   r%   r3   r1   r*   ÚmethodÚmethodsr.   r+   r,   r2   r)   r(   r0   r/   r4   )rG   rK   rI   r@   r:   r   Ú	decoratorz   sv    ó
ÿÿ 	ùÿz&swagger_auto_schema.<locals>.decoratorr   )r\   r]   r5   r(   r)   r*   r+   r.   r,   r/   r-   r0   r3   r1   r2   r4   r%   r^   r   r[   r   Úswagger_auto_schema*   s   ,PNr_   c                    s   ‡ fdd„}|S )zà
    Decorates the method of a serializers.SerializerMethodField
    to hint as to how Swagger should be generated for this field.

    :param serializer_or_field: ``Serializer``/``Field`` class or instance
    :return:
    c                    s
   ˆ | _ | S r"   )Ú_swagger_serializer)Úserializer_method©Úserializer_or_fieldr   r   r^   Ô   s   z,swagger_serializer_method.<locals>.decoratorr   )rc   r^   r   rb   r   Úswagger_serializer_methodË   s   	rd   c                 C   s¶   t |ddƒ}t ||dƒp|}t |ddƒ}t |ddƒ}|dv s&|du s&|dkr(d	S |d
v s4|d	u s4|dkr6dS t|tƒr=d	S t|tttfƒrGdS |  d¡ d¡}|rYd|d v rYdS d	S )zåCheck if the given path/method appears to represent a list view (as opposed to a detail/instance view).

    :param str path: view path
    :param str method: http method
    :param APIView view: target view
    :rtype: bool
    ÚactionÚ NÚdetailÚsuffix)rN   ÚcreateFÚListT)ÚretrieverP   Úpartial_updateÚdestroyÚInstanceú/Ú{éÿÿÿÿ)rJ   rS   r	   r
   r   r   ÚstripÚsplit)Úpathr\   Úviewre   rg   rh   Úpath_componentsr   r   r   Úis_list_viewÜ   s    	
rw   c                 C   s"   | dkrt jS | dkrt jS t jS )NÚpostÚdelete)r   ÚHTTP_201_CREATEDÚHTTP_204_NO_CONTENTÚHTTP_200_OK)r\   r   r   r   Úguess_response_status   s
   r}   c                 C   s.   t dd„ | D ƒƒ}t|ƒt| ƒksJ dƒ‚|S )a²  Transform a list of :class:`.Parameter` objects into an ``OrderedDict`` keyed on the ``(name, in_)`` tuple of
    each parameter.

    Raises an ``AssertionError`` if `parameters` contains duplicate parameters (by their name + in combination).

    :param list[drf_yasg.openapi.Parameter] parameters: the list of parameters
    :return: `parameters` keyed by ``(name, in_)``
    :rtype: dict[(str,str),drf_yasg.openapi.Parameter]
    c                 s   s    � | ]}|j |jf|fV  qd S r"   )r9   Úin_)r#   Úparamr   r   r   r&     s   € z&param_list_to_odict.<locals>.<genexpr>zduplicate Parameters found)r   rV   )Ú
parametersÚresultr   r   r   Úparam_list_to_odict	  s   
r‚   c                 C   s"   t | ƒ} |  t |ƒ¡ t|  ¡ ƒS )a  Merge `overrides` into `parameters`. This is the same as appending `overrides` to `parameters`, but any element
    of `parameters` whose ``(name, in_)`` tuple collides with an element in `overrides` is replaced by it.

    Raises an ``AssertionError`` if either list contains duplicate parameters.

    :param list[drf_yasg.openapi.Parameter] parameters: initial parameters
    :param list[drf_yasg.openapi.Parameter] overrides: overriding parameters
    :return: merged list
    :rtype: list[drf_yasg.openapi.Parameter]
    )r‚   rP   rN   Úvalues)r€   Ú	overridesr   r   r   Úmerge_params  s   r…   c                 C   sx   | du rdS d}t | tƒrt| ƒdd„ |  ¡ D ƒƒ}t | ttfƒr,t| ƒdd„ | D ƒƒ}|dur:t|ƒt| ƒkr:|S | S )z¬Remove ``None`` values from tuples, lists or dictionaries. Return other objects as-is.

    :param obj: the object
    :return: collection with ``None`` values removed
    Nc                 s   s,   � | ]\}}|d ur|d ur||fV  qd S r"   r   )r#   ÚkÚvr   r   r   r&   2  s   €* zfilter_none.<locals>.<genexpr>c                 s   s   � | ]	}|d ur|V  qd S r"   r   )r#   r‡   r   r   r   r&   4  rL   )rS   ÚdictÚtyperQ   rN   ÚtuplerV   )ÚobjÚnew_objr   r   r   rO   (  s   
rO   c                 C   sL   t  | ¡rt| tjƒsJ d| j ƒ‚| ƒ S t| tjƒs$J dt| ƒj ƒ‚| S )aY  Force `serializer` into a ``Serializer`` instance. If it is not a ``Serializer`` class or instance, raises
    an assertion error.

    :param serializer: serializer class or instance
    :type serializer: serializers.BaseSerializer or type[serializers.BaseSerializer]
    :return: serializer instance
    :rtype: serializers.BaseSerializer
    úSerializer required, not %sú-Serializer class or instance required, not %s©ÚinspectÚisclassÚ
issubclassr   ÚBaseSerializerr   rS   r‰   ©Ú
serializerr   r   r   Úforce_serializer_instance:  s   
	ÿr–   c                 C   sZ   | du rdS t  | ¡rt| tjƒsJ d| j ƒ‚| S t| tjƒs)J dt| ƒj ƒ‚t| ƒS )a6  Given a ``Serializer`` class or instance, return the ``Serializer`` class.
    If `serializer` is not a ``Serializer`` class or instance, raises an assertion error.

    :param serializer: serializer class or instance, or ``None``
    :return: serializer class
    :rtype: type[serializers.BaseSerializer]
    Nr�   rŽ   r�   r”   r   r   r   Úget_serializer_classL  s   
ÿr—   c                 C   sZ   | pg } g }| D ]"}t  |¡r|rt||ƒr| |¡ q|r#t||ƒr*| t|ƒ¡ q|S )at  Given a list of instances or class objects, return the list of their classes.

    :param classes_or_instances: mixed list to parse
    :type classes_or_instances: list[type or object]
    :param expected_base_class: if given, only subclasses or instances of this type will be returned
    :type expected_base_class: type
    :return: list of classes
    :rtype: list
    )r�   r‘   r’   ÚappendrS   r‰   )Úclasses_or_instancesÚexpected_base_classr�   r‹   r   r   r   Úget_object_classes`  s   


€€r›   c                 C   sJ   t | ƒ} dd„ | D ƒ} dd„ | pg D ƒ}dd„ |D ƒ}t|ƒdkr#|S |S )a  Extract ``consumes`` MIME types from a list of parser classes.

    :param list parser_classes: parser classes
    :type parser_classes: list[rest_framework.parsers.BaseParser or type[rest_framework.parsers.BaseParser]]
    :return: MIME types for ``consumes``
    :rtype: list[str]
    c                 S   s   g | ]	}t |tƒs|‘qS r   )r’   r   )r#   Úpcr   r   r   r;   €  rA   z get_consumes.<locals>.<listcomp>c                 S   ó   g | ]}|j ‘qS r   ©Ú
media_type)r#   Úparserr   r   r   r;   �  ó    c                 S   s   g | ]}t |ƒs|‘qS r   r   )r#   Úencodingr   r   r   r;   ‚  s    r   )r›   rV   )Úparser_classesÚmedia_typesÚnon_form_media_typesr   r   r   Úget_consumesw  s   r¦   c                 C   s,   t | ƒ} dd„ | p
g D ƒ}dd„ |D ƒ}|S )a/  Extract ``produces`` MIME types from a list of renderer classes.

    :param list renderer_classes: renderer classes
    :type renderer_classes: list[rest_framework.renderers.BaseRenderer or type[rest_framework.renderers.BaseRenderer]]
    :return: MIME types for ``produces``
    :rtype: list[str]
    c                 S   r�   r   rž   )r#   Úrendererr   r   r   r;   ˜  r¡   z get_produces.<locals>.<listcomp>c                    s(   g | ]‰ t ‡ fd d„tjD ƒƒsˆ ‘qS )c                 3   r!   r"   r   )r#   Úexcluded©r¢   r   r   r&   š  r'   z*get_produces.<locals>.<listcomp>.<genexpr>)rM   r   ÚEXCLUDED_MEDIA_TYPES)r#   r   r©   r   r;   ™  s    
ÿ)r›   )Úrenderer_classesr¤   r   r   r   Úget_produces�  s   r¬   c                 C   s,   t | tjƒst | tjƒrt| dtjƒ S dS )zÄReturns true if ``field`` is a django-rest-framework DecimalField and its ``coerce_to_string`` attribute or the
    ``COERCE_DECIMAL_TO_STRING`` setting is set to ``False``.

    :rtype: bool
    Úcoerce_to_stringF)rS   r   ÚDecimalFieldr   rJ   Úrest_framework_settingsÚCOERCE_DECIMAL_TO_STRING)Úfieldr   r   r   Údecimal_as_floatž  s   r²   c                 C   s|   t | ddƒ}t| ƒj}t|dƒr|j}|S |dkr,t| tjƒr,t 	dt
| ƒ ¡ d}|S |}| d¡r<|dtdƒ … }|S )zëGet serializer's ref_name (or None for ModelSerializer if it is named 'NestedSerializer')

    :param serializer: Serializer instance
    :return: Serializer's ``ref_name`` or ``None`` for inline serializer
    :rtype: str or None
    ÚMetaNÚref_nameÚNestedSerializerzDForcing inline output for ModelSerializer named 'NestedSerializer':
Ú
Serializer)rJ   r‰   r   r=   r´   rS   r   ÚModelSerializerÚloggerÚdebugrT   ÚendswithrV   )r•   Úserializer_metaÚserializer_namer´   r   r   r   Úget_serializer_ref_name©  s   

ùý
r½   úutf-8FÚstrictc                 C   s8   | durt | |||ƒ} t| ƒturd|  } t | ¡} | S )zi
    Force `s` into a ``str`` instance.

    Fix for https://github.com/axnsan12/drf-yasg/issues/159
    Nrf   )r   r‰   rT   ÚtextwrapÚdedent)Úsr¢   Ústrings_onlyÚerrorsr   r   r   Úforce_real_str¾  s   
rÅ   c                 C   sx   |   |¡}t|tƒrt| ƒrt|ƒ}nt|ƒ}nt|tjƒr#t|ƒ}ntdur1t|tj	ƒr1t|ƒ}t
 t
j|tjd�¡S )zøConvert a python value related to a field (default, choices, etc.) into its OpenAPI-compatible representation.

    :param serializers.Field field: field associated with the value
    :param object value: value
    :return: the converted value
    N)r<   )Úto_representationrS   r   r²   ÚfloatrT   ÚpytzÚ
BaseTzInfor   ÚZoneInfor   ÚloadsÚdumpsr   ÚJSONEncoder)r±   Úvaluer   r   r   Úfield_value_to_representationÏ  s   




rÏ   c                 C   sÐ   t | dtjƒ}|tjurft|ƒr?zt|dƒr| | ¡ t |ddƒr&|| ƒ}n|ƒ }W n ty>   tjd| dd� tj}Y nw |tjurf|durfzt	| |ƒ}W |S  tye   tjd	| dd� tj}Y |S w |S )
z±
    Get the default value for a field, converted to a JSON-compatible value while properly handling callables.

    :param field: field instance
    :return: default value
    ÚdefaultÚset_contextÚrequires_contextFzfdefault for %s is callable but it raised an exception when called; 'default' will not be set on schemaT)Úexc_infoNzX'default' on schema for %s will not be set because to_representation raised an exception)
rJ   r   ÚemptyÚcallabler=   rÑ   Ú	Exceptionr¸   ÚwarningrÏ   )r±   rÐ   r   r   r   Úget_field_defaultè  s8   



€ÿ
ýûÿûrØ   r"   )r¾   Fr¿   )<r�   ÚloggingrÀ   Úcollectionsr   Údecimalr   rÈ   Ú	django.dbr   Údjango.utils.encodingr   Úrest_frameworkr   r   Úrest_framework.mixinsr   r	   r
   r   Úrest_framework.parsersr   Úrest_framework.requestr   Úrest_framework.settingsr   r¯   Úrest_framework.utilsr   r   Úrest_framework.viewsr   Úapp_settingsr   r   ÚImportErrorÚ	backportsÚ	getLoggerr   r¸   Úobjectr   r    r_   rd   rw   r}   r‚   r…   rO   r–   r—   r›   r¦   r¬   r²   r½   rÅ   rÏ   rØ   r   r   r   r   Ú<module>   sf    ÿ€ý



ý "$	

