o
    ×ŸŽi1  ã                   @   s„   d dl Z d dlZd dlmZ d dlmZ eddƒZee d¡ƒZ	G dd„ dƒZ
d	d
„ Zddd„Z		ddd„Zddd„Zdd„ ZdS )é    N)Ú
namedtuple)ÚRECURSIVE_RELATIONSHIP_CONSTANTÚFieldReferencez
to throughÚ c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚRegexObjectc                 C   s   |j | _ |j| _d S ©N)ÚpatternÚflags)ÚselfÚobj© r   údC:\Users\psant\Downloads\Anu Raj Backend\school\venv\Lib\site-packages\django/db/migrations/utils.pyÚ__init__   s   zRegexObject.__init__c                 C   s&   t |tƒstS | j|jko| j|jkS r   )Ú
isinstancer   ÚNotImplementedr   r	   )r
   Úotherr   r   r   Ú__eq__   s   
zRegexObject.__eq__N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r      s    r   c                   C   s   t j  ¡  d¡S )Nz%Y%m%d_%H%M)ÚdatetimeÚnowÚstrftimer   r   r   r   Úget_migration_name_timestamp   s   r   c                 C   s‚   t | tƒr9| tkr|du s|du rtdƒ‚||fS d| v r+|  dd¡\}}|| ¡ fS |du r3tdƒ‚||  ¡ fS | jj| jjfS )z¾
    Turn a model class or model reference string and return a model tuple.

    app_label and model_name are used to resolve the scope of recursive and
    unscoped model relationship.
    NzMapp_label and model_name must be provided to resolve recursive relationships.Ú.é   zCapp_label must be provided to resolve unscoped model relationships.)	r   Ústrr   Ú	TypeErrorÚsplitÚlowerZ_metaÚ	app_labelÚ
model_name)Úmodelr    r!   r   r   r   Úresolve_relation   s    
ÿÿr#   c                 C   sÎ   |j }|sdS d}d}t|jg| ¢R Ž |kr7t|ddƒ}|du s3|du s3d|v r/|du s3|js3||v r7||f}t|ddƒ}	|	r\t|	g| ¢R Ž |kr\|j}
|du sX|
du sX||
v r\||
f}|sb|sbdS t||ƒS )at  
    Return either False or a FieldReference if `field` references provided
    context.

    False positives can be returned if `reference_field_name` is provided
    without `reference_field` because of the introspection limitation it
    incurs. This should not be an issue when this function is used to determine
    whether or not an optimization can take place.
    FNÚ	to_fieldsÚthrough)Úremote_fieldr#   r"   ÚgetattrZprimary_keyÚthrough_fieldsr   )Úmodel_tupleÚfieldZreference_model_tupleZreference_field_nameZreference_fieldr&   Zreferences_toZreferences_throughr$   r%   r(   r   r   r   Úfield_references5   sB   ÿüø	÷	÷óÿüù	
r+   r   c                 c   sT   � | j  ¡ D ]!\}}|j ¡ D ]\}}t|||g|¢R Ž }|r&||||fV  qqdS )zÍ
    Generator of (model_state, name, field, reference) referencing
    provided context.

    If field_tuple is provided only references to this particular field of
    model_tuple will be generated.
    N)ÚmodelsÚitemsÚfieldsr+   )Ústater)   Úfield_tupleZstate_model_tupleZmodel_stateÚnamer*   Ú	referencer   r   r   Úget_referencesn   s   €ÿÿ€ûÿr3   c                 C   s   t t| ||ƒdƒduS )z?Return whether `field_tuple` is referenced by any state models.N)Únextr3   )r/   r)   r0   r   r   r   Úfield_is_referenced   s   r5   )NN)r   )r   ÚreÚcollectionsr   Zdjango.db.models.fields.relatedr   r   ÚtypeÚcompileZCOMPILED_REGEX_TYPEr   r   r#   r+   r3   r5   r   r   r   r   Ú<module>   s    


û
9