o
    "ih                     @   sD   d dl mZmZ d dlmZ d dlmZmZmZ G dd deZ	dS )    )errorwarn)OpenApiSerializerExtension)force_instanceis_list_serializeris_serializerc                   @   sL   e Zd ZdZdZdd Zdd Zdd Zd	d
 Zdd Z	dd Z
dd ZdS )#PolymorphicProxySerializerExtensionz0drf_spectacular.utils.PolymorphicProxySerializerc                 C   s   | j jS N)targetcomponent_nameself r   `/var/www/html/crm_dreinet/venv_linux/lib/python3.10/site-packages/drf_spectacular/serializers.pyget_name
   s   z,PolymorphicProxySerializerExtension.get_namec                 C   s   t | jjtr| ||}n| ||}|  s!ddd |D iS g }|D ]\}}||vr2|| q%|| jjdd |D ddS )zN custom handling for @extend_schema's injection of PolymorphicProxySerializer oneOfc                 S   s   g | ]\}}|qS r   r   ).0_schemar   r   r   
<listcomp>   s    zFPolymorphicProxySerializerExtension.map_serializer.<locals>.<listcomp>c                 S   s   i | ]	\}}||d  qS )z$refr   )r   resource_typer   r   r   r   
<dictcomp>   s    zFPolymorphicProxySerializerExtension.map_serializer.<locals>.<dictcomp>)propertyNamemapping)r   discriminator)	
isinstancer   serializersdict_get_explicit_sub_components_get_implicit_sub_components_has_discriminatorappendresource_type_field_name)r   auto_schema	directionsub_componentsone_of_listr   r   r   r   r   map_serializer   s   
z2PolymorphicProxySerializerExtension.map_serializerc           	      C   s   g }| j jD ]M}| |}| |||\}}|sq|  s%|d |f qz|j| j j }|d }W n   t	d| d| j j
 d| j j d |}Y |||f q|S )Nzsub-serializer z of z' must contain the discriminator field "zO". defaulting to sub-serializer name, but schema will likely not match the API.)r   r   _prep_serializer_process_serializerr!   r"   fieldsr#   to_representationr   r   )	r   r$   r%   r&   sub_serializerresolved_nameresolved_schemadiscriminator_fieldr   r   r   r   r    #   s(   
z@PolymorphicProxySerializerExtension._get_implicit_sub_componentsc                 C   sL   g }| j j D ]\}}| |}| |||\}}|r#|||f q|S r
   )r   r   itemsr)   r*   r"   )r   r$   r%   r&   r   r-   r   r/   r   r   r   r   <   s   
z@PolymorphicProxySerializerExtension._get_explicit_sub_componentsc                 C   s   | j jd uS r
   )r   r#   r   r   r   r   r!   F   s   z6PolymorphicProxySerializerExtension._has_discriminatorc                 C   s   t |}| jj|_|S r
   )r   r   partial)r   
serializerr   r   r   r)   I   s   
z4PolymorphicProxySerializerExtension._prep_serializerc                 C   sp   t |r|  s| jjdurtd dS |||}d |fS t|r2|||}|r0|j|j	fS dS t
d dS )NFzTo control sub-serializer's "many" attribute, following usage pattern is necessary: PolymorphicProxySerializer(serializers=[...], resource_type_field_name=None, many=False). Ignoring serializer as it is not processable in this configuration.)NNzKPolymorphicProxySerializer's serializer argument contained unknown objects.)r   r!   r   _manyr   _unwrap_list_serializerr   resolve_serializernamerefr   )r   r$   r3   r%   r   resolvedr   r   r   r*   N   s   z7PolymorphicProxySerializerExtension._process_serializerN)__name__
__module____qualname__target_classpriorityr   r(   r    r   r!   r)   r*   r   r   r   r   r      s    
r   N)
drf_spectacular.drainager   r   drf_spectacular.extensionsr   drf_spectacular.plumbingr   r   r   r   r   r   r   r   <module>   s    