U
    8ÄT_»b  ã                   @   s  d dl Z d dlmZ d dlmZ d dlmZmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZmZ d d	lmZ d d
lmZ d dlmZ d dlmZ ddlmZ d dd„Zdd„ Zdd„ Zdd„ ZG dd„ dƒZ G dd„ deƒZ!G dd„ deƒZ"G dd„ dƒZ#dS )!é    N)Úcontextmanager)Ú	AppConfig)ÚAppsÚapps)Úsettings)Úmodels)ÚRECURSIVE_RELATIONSHIP_CONSTANT)ÚDEFAULT_NAMESÚnormalize_together)Úmake_model_tuple)Úcached_property)Úimport_string)Úget_docs_versioné   )ÚInvalidBasesErrorÚ c                 C   sJ   t | tƒr6|  dd¡}t|ƒdkr*t|ƒS ||d fS | jj| jjfS d S )NÚ.r   é   r   )Ú
isinstanceÚstrÚsplitÚlenÚtupleÚ_metaÚ	app_labelÚ
model_name)Úmodelr   r   © r   ú>/tmp/pip-unpacked-wheel-dv63caxw/django/db/migrations/state.pyÚ_get_app_label_and_model_name   s    
 r   c                 C   s†   dd„ |   ¡ D ƒ}tƒ }| jjddd�D ]8}|jr(|jdk	r(t|jtƒs(| |j	¡ | 
|j¡ q(| j}|jr‚| |kr‚| 
|j¡ |S )zEReturn all models that have a direct relationship to the given model.c                 S   s   g | ]}t |tjƒr|‘qS r   )Ú
issubclassr   ÚModel)Ú.0Úsubclassr   r   r   Ú
<listcomp>   s   ÿz'_get_related_models.<locals>.<listcomp>T)Zinclude_parentsZinclude_hiddenN)Ú__subclasses__Úsetr   Z
get_fieldsÚis_relationÚrelated_modelr   r   Úaddr   ÚappendÚproxyZconcrete_model)ÚmÚrelated_modelsZrelated_fields_modelsÚfÚoptsr   r   r   Ú_get_related_models   s    ÿr0   c                 C   s   dd„ t | ƒD ƒS )zq
    Return a list of typical (app_label, model_name) tuples for all related
    models for the given model.
    c                 S   s   h | ]}|j j|j jf’qS r   )r   r   r   )r"   Úrel_modr   r   r   Ú	<setcomp>2   s   ÿz,get_related_models_tuples.<locals>.<setcomp>)r0   ©r   r   r   r   Úget_related_models_tuples-   s    þr4   c                 C   sj   t ƒ }t| ƒ}|D ]@}|jj|jj }}||f|kr6q| ||f¡ | t|ƒ¡ q|| jj| jjfh S )aå  
    Return all models that have a direct or indirect relationship
    to the given model.

    Relationships are either defined by explicit relational fields, like
    ForeignKey, ManyToManyField or OneToOneField, or by inheriting from another
    model (a superclass is related to its subclasses, but not vice versa). Note,
    however, that a model inheriting from a concrete model is also related to
    its superclass through the implicit *_ptr OneToOneField on the subclass.
    )r&   r0   r   r   r   r)   Úextend)r   ÚseenÚqueuer1   Úrel_app_labelÚrel_model_namer   r   r   Úget_related_models_recursive8   s    r:   c                   @   sŒ   e Zd ZdZddd„Zdd„ Zdd„ Zd d
d„Zd!dd„Zd"dd„Z	dd„ Z
dd„ Zdd„ Zedd„ ƒZedd„ ƒZedd„ ƒZdd„ ZdS )#ÚProjectStatez½
    Represent the entire project's overall state. This is the item that is
    passed around - do it here rather than at the app level so that cross-app
    FKs/etc. resolve properly.
    Nc                 C   s   |pi | _ |pg | _d| _d S ©NF)r   Ú	real_appsÚ
is_delayed)Úselfr   r=   r   r   r   Ú__init__U   s    

zProjectState.__init__c                 C   s6   |j |j }}|| j||f< d| jkr2|  ||¡ d S ©Nr   )r   Ú
name_lowerr   Ú__dict__Úreload_model)r?   Úmodel_stater   r   r   r   r   Ú	add_model[   s    
zProjectState.add_modelc                 C   s2   | j ||f= d| jkr.| j ||¡ | j ¡  d S rA   )r   rC   r   Úunregister_modelÚclear_cache©r?   r   r   r   r   r   Úremove_modela   s    
zProjectState.remove_modelFc              	   C   s  |r
d| _ tƒ }z| j ||¡}W n tk
r6   Y nX |rFt|ƒ}nt|ƒ}| j||f }tƒ }|j 	¡ D ]:}|j
rl|jjtkr„qlt|j|ƒ\}	}
| |	|
 ¡ f¡ ql| |¡ |D ]R\}	}
z| j |	|
¡}W n tk
rä   Y q¶X |rú| t|ƒ¡ q¶| t|ƒ¡ q¶| ||f¡ |S )NT)r>   r&   r   Ú	get_modelÚLookupErrorr4   r:   r   ÚfieldsÚvaluesr'   Úremote_fieldr   r   r   r(   r)   ÚlowerÚupdate)r?   r   r   Údelayr-   Z	old_modelrE   Zdirect_related_modelsÚfieldr8   r9   Z	rel_modelr   r   r   Ú_find_reload_modeli   s:    

zProjectState._find_reload_modelc                 C   s&   d| j kr"|  |||¡}|  |¡ d S rA   )rC   rT   Ú_reload)r?   r   r   rR   r-   r   r   r   rD   ™   s    
zProjectState.reload_modelTc                 C   s@   d| j kr<tƒ }|D ]\}}| |  |||¡¡ q|  |¡ d S rA   )rC   r&   rQ   rT   rU   )r?   r   rR   r-   r   r   r   r   r   Úreload_modelsž   s
    
zProjectState.reload_modelsc              	   C   s®   | j  ¡ �" |D ]\}}| j  ||¡ qW 5 Q R X g }| j jD ]}|j|jf|kr>| |¡ q>|D ]:\}}z| j||f }W n tk
r�   Y qbX | |¡ qb| j  	|¡ d S ©N)
r   Úbulk_updaterG   Úreal_modelsr   rB   r*   r   ÚKeyErrorÚrender_multiple)r?   r-   r8   r9   Zstates_to_be_renderedrE   r   r   r   rU   ¥   s    zProjectState._reloadc                 C   s@   t dd„ | j ¡ D ƒ| jd�}d| jkr4| j ¡ |_| j|_|S )z*Return an exact copy of this ProjectState.c                 S   s   i | ]\}}||  ¡ “qS r   ©Úclone)r"   ÚkÚvr   r   r   Ú
<dictcomp>Â   s      z&ProjectState.clone.<locals>.<dictcomp>)r   r=   r   )r;   r   Úitemsr=   rC   r   r]   r>   )r?   Z	new_stater   r   r   r]   ¿   s    þ
zProjectState.clonec                 C   s   | j rd| jkr| jd= d S rA   )r>   rC   ©r?   r   r   r   Úclear_delayed_apps_cacheÊ   s    z%ProjectState.clear_delayed_apps_cachec                 C   s   t | j| jƒS rW   )Ú	StateAppsr=   r   rb   r   r   r   r   Î   s    zProjectState.appsc                 C   s   t | j| jdd�| _| jS )NT)Úignore_swappable)rd   r=   r   r   rb   r   r   r   Úconcrete_appsÒ   s    zProjectState.concrete_appsc                 C   s8   i }|j dd�D ]}t |¡}|||j|jf< q| |ƒS )z3Take an Apps and return a ProjectState matching it.T)Zinclude_swapped)Ú
get_modelsÚ
ModelStateÚ
from_modelr   rB   )Úclsr   Z
app_modelsr   rE   r   r   r   Ú	from_apps×   s
    
zProjectState.from_appsc                 C   s    | j |j kot| jƒt|jƒkS rW   )r   r&   r=   ©r?   Úotherr   r   r   Ú__eq__à   s    zProjectState.__eq__)NN)F)F)T)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r@   rF   rJ   rT   rD   rV   rU   r]   rc   r   r   Úpropertyrf   Úclassmethodrk   rn   r   r   r   r   r;   N   s"   

0




r;   c                       s,   e Zd ZdZdZ‡ fdd„Zdd„ Z‡  ZS )ÚAppConfigStubzAStub of an AppConfig. Only provides a label and a dict of models.r   c                    s   || _ tƒ  |d ¡ d S rW   )ÚlabelÚsuperr@   )r?   rv   ©Ú	__class__r   r   r@   é   s    zAppConfigStub.__init__c                 C   s   | j j| j | _d S rW   )r   Ú
all_modelsrv   r   rb   r   r   r   Úimport_modelsð   s    zAppConfigStub.import_models)ro   rp   rq   rr   Úpathr@   r{   Ú__classcell__r   r   rx   r   ru   ä   s   ru   c                       sN   e Zd ZdZd‡ fdd„	Zedd„ ƒZdd„ Zd	d
„ Zdd„ Z	dd„ Z
‡  ZS )rd   zo
    Subclass of the global Apps registry class to better handle dynamic model
    additions and removals.
    Fc                    sà   g | _ |D ]2}t |¡}| ¡ D ]}| j  tj|dd�¡ q q
dd„ | ¡ D ƒ}dd„ t||•ƒD ƒ}t	ƒ  
|¡ d | _d | _|  | ¡ | j •¡ ddlm}	 |r®ttjƒhntƒ }
|	| |
d	�}|rÜtd
 dd„ |D ƒ¡ƒ‚d S )NT)Úexclude_relsc                 S   s   h | ]
}|j ’qS r   )r   )r"   rE   r   r   r   r2     s     z%StateApps.__init__.<locals>.<setcomp>c                 S   s   g | ]}t |ƒ‘qS r   )ru   )r"   rv   r   r   r   r$     s     z&StateApps.__init__.<locals>.<listcomp>r   )Ú_check_lazy_references)ÚignoreÚ
c                 s   s   | ]}|j V  qd S rW   )Úmsg)r"   Úerrorr   r   r   Ú	<genexpr>  s     z%StateApps.__init__.<locals>.<genexpr>)rY   Úglobal_appsZget_app_configrg   r*   rh   ri   rN   Úsortedrw   r@   Ú_lockZready_eventr[   Zdjango.core.checks.model_checksr   r   r   ZAUTH_USER_MODELr&   Ú
ValueErrorÚjoin)r?   r=   r   re   r   Zappr   Z
app_labelsÚapp_configsr   r€   Úerrorsrx   r   r   r@   ù   s     
zStateApps.__init__c                 c   s,   | j }d| _ z
d V  W 5 || _ |  ¡  X d S r<   )ÚreadyrH   )r?   rŒ   r   r   r   rX     s    
zStateApps.bulk_updatec              
   C   sŒ   |sd S |   ¡ �r |}|r~g }|D ]2}z| | ¡ W q" tk
rR   | |¡ Y q"X q"t|ƒt|ƒkrxtd|tƒ f ƒ‚|}qW 5 Q R X d S )NzéCannot resolve bases for %r
This can happen if you are inheriting models from an app with migrations (e.g. contrib.auth)
 in an app with no migrations; see https://docs.djangoproject.com/en/%s/topics/migrations/#dependencies for more)rX   Úrenderr   r*   r   r   )r?   Zmodel_statesZunrendered_modelsZnew_unrendered_modelsr   r   r   r   r[   $  s$    
ýÿzStateApps.render_multiplec                 C   sH   t g i ƒ}t | j¡|_t | j¡|_|j ¡ D ]
}||_q0| j|_|S )z Return a clone of this registry.)rd   ÚcopyÚdeepcopyrz   rŠ   rN   r   rY   )r?   r]   Z
app_configr   r   r   r]   >  s    
zStateApps.clonec                 C   sl   || j | |jj< || jkrBt|ƒ| j|< | | j| _i | j| _|| j| j|jj< |  |¡ |  ¡  d S rW   )	rz   r   r   rŠ   ru   r   r   Zdo_pending_operationsrH   )r?   r   r   r   r   r   Úregister_modelJ  s    

zStateApps.register_modelc                 C   s8   z| j | |= | j| j|= W n tk
r2   Y nX d S rW   )rz   rŠ   r   rZ   rI   r   r   r   rG   T  s
    zStateApps.unregister_model)F)ro   rp   rq   rr   r@   r   rX   r[   r]   r�   rG   r}   r   r   rx   r   rd   ô   s   

rd   c                   @   sl   e Zd ZdZddd„Zedd„ ƒZed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 )rh   a�  
    Represent a Django Model. Don't use the actual Model class as it's not
    designed to have its options changed - instead, mutate this one and then
    render it into a Model as required.

    Note that while you are allowed to mutate .fields, you are not allowed
    to mutate the Field instances inside there themselves - you must instead
    assign new ones, as these are not detached during a clone.
    Nc           	      C   sâ   || _ || _t|ƒ| _|pi | _| j dg ¡ | j dg ¡ |pFtjf| _|pPg | _	| j 
¡ D ]\\}}t|dƒr|td| ƒ‚|jršt|jdƒrštd| ƒ‚|jr^t|jjdƒr^td| ƒ‚q^| jd D ]}|jsÆtd| ƒ‚qÆd S )	NÚindexesÚconstraintsr   z7ModelState.fields cannot be bound to a model - "%s" is.r   z_ModelState.fields cannot refer to a model class - "%s.to" does. Use a string reference instead.zdModelState.fields cannot refer to a model class - "%s.through" does. Use a string reference instead.zKIndexes passed to ModelState require a name attribute. %r doesn't have one.)r   ÚnameÚdictrM   ÚoptionsÚ
setdefaultr   r!   ÚbasesÚmanagersra   Úhasattrrˆ   r'   r(   Zmany_to_manyrO   Zthrough)	r?   r   r“   rM   r•   r—   r˜   rS   Úindexr   r   r   r@   g  s@    



ÿÿÿÿÿÿÿzModelState.__init__c                 C   s
   | j  ¡ S rW   )r“   rP   rb   r   r   r   rB   ‰  s    zModelState.name_lowerFc                    sX  g }ˆj jD ]z}t|ddƒr"|r"qt|tjƒr0q|j}z| || ¡ f¡ W q t	k
r„ } zt	d|ˆj j
|f ƒ‚W 5 d}~X Y qX q|sðˆj jD ]Z}|j}z| || ¡ f¡ W q” t	k
rì } zt	d|ˆj j|f ƒ‚W 5 d}~X Y q”X q”i }tD ]ä}|dk�r
qøqø|ˆj jkrø|dk�r>ˆj jd }tt|ƒƒ||< qø|dk�rfˆj jd }	tt|	ƒƒ||< qø|dk�rªd	d
„ ˆj jD ƒ}
|
D ]}|j�s†| ˆ¡ �q†|
|d< qø|dk�rÌdd
„ ˆj jD ƒ|d< qøˆj j| ||< qø|�rdD ]}||k�rè||= �qèn$| d¡dd„ ˆj jD ƒk�r&|d= ‡ fdd„‰ ttˆ ˆƒƒ‡fdd„d�}tdd„ |D ƒƒ}tdd„ |D ƒƒ�s|tjf}g }tƒ }d}ˆj jD ]–}|j|k�r¨�q’nb|j�rÄt |¡}| ¡  nF|ˆjk�sÜ|ˆjk�r’t  ¡ }|j!|_!|j|_|ˆjk�r
|}n�q’| "|j¡ | |j|f¡ �q’|d|fgk�r>g }| ˆj j#ˆj j||||ƒS )z3Given a model, return a ModelState representing it.rO   Nz'Couldn't reconstruct field %s on %s: %sz+Couldn't reconstruct m2m field %s on %s: %s)r   r   Úunique_togetherÚindex_togetherr‘   c                 S   s   g | ]}|  ¡ ‘qS r   r\   )r"   Úidxr   r   r   r$   ¹  s     z)ModelState.from_model.<locals>.<listcomp>r’   c                 S   s   g | ]}|  ¡ ‘qS r   r\   )r"   Úconr   r   r   r$   ¿  s     )r›   rœ   Úorder_with_respect_torŸ   c                 S   s   h | ]
}|j ’qS r   )r“   )r"   rS   r   r   r   r2   É  s     z(ModelState.from_model.<locals>.<setcomp>c                    s@   g }| j D ]0}t|dƒr0|jjr0| ˆ |ƒ¡ q
| |¡ q
|S )Nr   )Ú	__bases__r™   r   Zabstractr5   r*   )r   r—   Úbase)Úflatten_basesr   r   r¢   Ì  s    
z,ModelState.from_model.<locals>.flatten_basesc                    s   ˆ j  | ¡S rW   )Ú__mro__rš   )Úxr3   r   r   Ú<lambda>Ú  ó    z'ModelState.from_model.<locals>.<lambda>©Úkeyc                 s   s$   | ]}t |d ƒr|jjn|V  qdS )r   N)r™   r   Zlabel_lower©r"   r¡   r   r   r   r„   Ý  s   ýÿ
z(ModelState.from_model.<locals>.<genexpr>c                 s   s$   | ]}t |tƒpt|tjƒV  qd S rW   )r   r   r    r   r!   r©   r   r   r   r„   æ  s     Zobjects)$r   Zlocal_fieldsÚgetattrr   r   ZOrderWrtr“   r*   r]   Ú	TypeErrorrv   Zlocal_many_to_manyZobject_namer	   Zoriginal_attrsr&   r
   r‘   Zset_name_with_modelr’   ÚgetZprivate_fieldsr†   r   Úanyr!   r˜   Zuse_in_migrationsrŽ   Z_set_creation_counterZ_base_managerZ_default_managerÚManagerr   r)   r   )rj   r   r~   rM   rS   r“   Úer•   ÚutÚitr‘   rš   r¨   Zflattened_basesr—   r˜   Zmanager_namesZdefault_manager_shimÚmanagerZnew_managerr   )r¢   r   r   ri   �  s®    ýý






ú	

úzModelState.from_modelc                 c   sj   t | jdd„ d�}|D ]N\}}| ¡ \}}}}}|rLt|ƒ}	||	 ¡ fV  qt|ƒ}
||
||ŽfV  qdS )z-Deep-clone the managers using deconstruction.c                 S   s
   | d j S )Nr   )Zcreation_counter)r_   r   r   r   r¥     r¦   z/ModelState.construct_managers.<locals>.<lambda>r§   N)r†   r˜   Údeconstructr   Ú
as_manager)r?   Zsorted_managersZmgr_namer²   r´   Zmanager_pathZqs_pathÚargsÚkwargsZqs_classZmanager_classr   r   r   Úconstruct_managers  s    zModelState.construct_managersc                 C   s.   | j | j| jt| jƒt| jƒ| jt| jƒd�S )z(Return an exact copy of this ModelState.)r   r“   rM   r•   r—   r˜   )	ry   r   r“   r”   rM   r•   r—   Úlistr˜   rb   r   r   r   r]     s    ÷zModelState.clonec                    s    | j ˆ dœ| j–}tdd|ƒ}zt‡ fdd„| jD ƒƒ}W n$ tk
r^   td| jf ƒ‚Y nX dd„ | j ¡ D ƒ}||d< d	|d
< | 	|  
¡ ¡ t| j||ƒS )zACreate a Model object from our current state into the given apps.)r   r   ZMetar   c                 3   s&   | ]}t |tƒrˆ  |¡n|V  qd S rW   )r   r   rK   r©   ©r   r   r   r„   0  s   ÿz$ModelState.render.<locals>.<genexpr>z(Cannot resolve one or more bases from %rc                 S   s   i | ]\}}||  ¡ “qS r   r\   )r"   r“   rS   r   r   r   r`   7  s      z%ModelState.render.<locals>.<dictcomp>Z__fake__rp   )r   r•   Útyper   r—   rL   r   rM   ra   rQ   r·   r“   )r?   r   Zmeta_contentsÚmetar—   Úbodyr   r¹   r   r�   )  s    þzModelState.renderc                 C   s8   | j d D ]}|j|kr
|  S q
td|| jf ƒ‚d S )Nr‘   zNo index named %s on model %s©r•   r“   rˆ   )r?   r“   rš   r   r   r   Úget_index_by_name@  s    

zModelState.get_index_by_namec                 C   s8   | j d D ]}|j|kr
|  S q
td|| jf ƒ‚d S )Nr’   z"No constraint named %s on model %sr½   )r?   r“   Ú
constraintr   r   r   Úget_constraint_by_nameF  s    

z!ModelState.get_constraint_by_namec                 C   s   d| j j| j| jf S )Nz<%s: '%s.%s'>)ry   ro   r   r“   rb   r   r   r   Ú__repr__L  s    zModelState.__repr__c                 C   s|   | j |j koz| j|jkozt| jƒt|jƒkoztdd„ tt| j ¡ ƒt|j ¡ ƒƒD ƒƒoz| j|jkoz| j	|j	koz| j
|j
kS )Nc                 s   sB   | ]:\\}}\}}||ko8|  ¡ d d… |  ¡ d d… kV  qdS )r   N)r³   )r"   Zk1Úf1Zk2Úf2r   r   r   r„   T  s   ÿz$ModelState.__eq__.<locals>.<genexpr>)r   r“   r   rM   ÚallÚzipr†   ra   r•   r—   r˜   rl   r   r   r   rn   O  s$    
ÿþþþý

ö
õ
ózModelState.__eq__)NNN)F)ro   rp   rq   rr   r@   r   rB   rt   ri   r·   r]   r�   r¾   rÀ   rÁ   rn   r   r   r   r   rh   \  s   

"
 rh   )r   )$rŽ   Ú
contextlibr   Zdjango.appsr   Zdjango.apps.registryr   r   r…   Zdjango.confr   Z	django.dbr   Zdjango.db.models.fields.relatedr   Zdjango.db.models.optionsr	   r
   Zdjango.db.models.utilsr   Zdjango.utils.functionalr   Zdjango.utils.module_loadingr   Zdjango.utils.versionr   Ú
exceptionsr   r   r0   r4   r:   r;   ru   rd   rh   r   r   r   r   Ú<module>   s*   
 h