U
    ÄWjÌ  ã                   @   sˆ   d Z ddlmZ eddddddd	gƒZed
ddddddgƒ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Úmodel_fieldÚrelated_modelÚto_manyÚto_fieldÚ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   újc:\users\psant\downloads\hotstarbackend\school\venv38\Lib\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>>   s       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   s       z._get_forward_relationships.<locals>.<listcomp>F©r
   r   r   r   r   r   c                 S   s   g | ]}|j r|‘qS r   )r    r!   r   r   r   r$   X   s      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k	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   s      z._get_reverse_relationships.<locals>.<listcomp>NFTr*   c                 S   s   g | ]}|j jr|‘qS r   r.   r/   r   r   r   r$   z   s      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   | |–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   r3   )r   r   r   r   Úis_abstract_model˜   s    r5   N)Ú__doc__Úcollectionsr   r   r	   r   r   r   r(   r   r   r   r   r5   r   r   r   r   Ú<module>   s4   ú	ú
 %