a
    còfÌ  ã                   @   sx   d Z ddlmZ edg d¢ƒZedg d¢ƒZdd„ Zd	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 )zý
Helper function for returning the field information that is associated
with a model class. This includes returning all the forward and reverse
relationships and their associated metadata.

Usage: `get_field_info(model)` returns a `FieldInfo` instance.
é    )Ú
namedtupleÚ	FieldInfo)ÚpkÚfieldsÚforward_relationsÚreverse_relationsÚfields_and_pkZ	relationsÚRelationInfo©Zmodel_fieldÚrelated_modelZto_manyZto_fieldZhas_through_modelÚreversec                 C   sP   | j jj }t|ƒ}t|ƒ}t|ƒ}t|ƒ}t||ƒ}t||ƒ}t||||||ƒS )zÏ
    Given a model class, returns a `FieldInfo` instance, which is a
    `namedtuple`, containing metadata about the various field types on the model
    including information about their relationships.
    )	Ú_metaZconcrete_modelÚ_get_pkÚ_get_fieldsÚ_get_forward_relationshipsÚ_get_reverse_relationshipsÚ_merge_fields_and_pkÚ_merge_relationshipsr   )ÚmodelÚoptsr   r   r   r   r   Zrelationships© r   ú\/home/httpd/docs/test/DocsMgr/lib/python3.9/site-packages/rest_framework/utils/model_meta.pyÚget_field_info   s    



ÿr   c                 C   s.   | j }|j}|r*|jr*|jjjj }|j}q|S ©N)r   Úremote_fieldZparent_linkr   r   )r   r   Úrelr   r   r   r   0   s    
r   c                 C   s(   i }dd„ | j D ƒD ]}|||j< q|S )Nc                 S   s   g | ]}|j r|js|‘qS r   ©Ú	serializer   ©Ú.0Úfieldr   r   r   Ú
<listcomp>>   ó    z_get_fields.<locals>.<listcomp>)r   Úname)r   r   r    r   r   r   r   <   s    r   c                 C   s   t | dd ƒo| jd S )NÚ	to_fieldsr   )Úgetattrr$   )r    r   r   r   Ú_get_to_fieldD   s    r&   c              	   C   s~   i }dd„ | j D ƒD ]&}t||jjdt|ƒddd�||j< qdd„ | jD ƒD ],}t||jjdd|jjjj	 dd�||j< qL|S )ú:
    Returns a dict of field names to `RelationInfo`.
    c                 S   s   g | ]}|j r|jr|‘qS r   r   r   r   r   r   r!   M   r"   z._get_forward_relationships.<locals>.<listcomp>Fr
   c                 S   s   g | ]}|j r|‘qS r   )r   r   r   r   r   r!   X   r"   TN)
r   r	   r   r   r&   r#   Úmany_to_manyÚthroughr   Úauto_created)r   r   r    r   r   r   r   H   s(    ú
÷r   c              
   C   s¬   i }dd„ | j D ƒ}|D ]2}| ¡ }td|j|jjjt|jƒddd�||< qdd„ | j D ƒ}|D ]F}| ¡ }td|jddt|jjddƒduoš|jjj	j
j dd�||< q`|S )	r'   c                 S   s   g | ]}|j js|‘qS r   ©r    r(   ©r   Úrr   r   r   r!   m   r"   z._get_reverse_relationships.<locals>.<listcomp>NFTr
   c                 S   s   g | ]}|j jr|‘qS r   r+   r,   r   r   r   r!   z   r"   r)   )Zrelated_objectsZget_accessor_namer	   r   r    r   Úmultipler&   r%   r)   r   r*   )r   r   Zall_related_objectsZrelationZaccessor_nameZ all_related_many_to_many_objectsr   r   r   r   h   s2    ú
ör   c                 C   s   d| | j | i}| |¡ |S )Nr   )r#   Úupdate)r   r   r   r   r   r   r   �   s    
r   c                 C   s   i | ¥|¥S r   r   )r   r   r   r   r   r   ”   s    r   c                 C   s   t | dƒot | jdƒo| jjS )z_
    Given a model class, returns a boolean True if it is abstract and False if it is not.
    r   Úabstract)Úhasattrr   r0   )r   r   r   r   Úis_abstract_model˜   s    r2   N)Ú__doc__Úcollectionsr   r   r	   r   r   r   r&   r   r   r   r   r2   r   r   r   r   Ú<module>   s   	
 %