o
    ¤ó·iÌ  ã                   @   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.
    N)	Ú_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   úeC:\Users\psant\Downloads\PAF backend\school\venv\Lib\site-packages\rest_framework/utils/model_meta.pyÚget_field_info   s   



ÿr   c                 C   s6   | j }|j}|r|jr|jjjj }|j}|r|js|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< q&|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   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 ]}| ¡ }td|j|jjjt|jƒddd�||< qdd„ | j D ƒ}|D ]#}| ¡ }td|jddt|jjddƒduoM|jjj	j
j dd�||< q0|S )	r'   c                 S   s   g | ]}|j js|‘qS r   ©r    r(   ©r   Úrr   r   r   r!   m   ó    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   ÚabstractN)Úhasattrr   r1   )r   r   r   r   Úis_abstract_model˜   s   r3   N)Ú__doc__Úcollectionsr   r   r	   r   r   r   r&   r   r   r   r   r3   r   r   r   r   Ú<module>   s    	
 %