a
    ¥Q•hÎž  ã                   @   sV  d dl 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l	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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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&ƒZ0dS )(é    N)Údefaultdict)Úcontextmanager)Úpartial)Ú	AppConfig)ÚApps©Úapps)Úsettings)ÚFieldDoesNotExist)Úmodels)Úfield_is_referencedÚget_references)ÚNOT_PROVIDED)ÚRECURSIVE_RELATIONSHIP_CONSTANT)ÚDEFAULT_NAMESÚnormalize_together)Úmake_model_tuple)Úcached_property)Úimport_string)Úget_docs_versioné   )ÚInvalidBasesError)Úresolve_relationÚ 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%   úS/var/www/sistema_ama/venv/lib/python3.9/site-packages/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ur(t|jtƒs(| |j	¡ | 
|j¡ q(| j}|jr‚| |v 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)Úinclude_parentsÚinclude_hiddenN)Ú__subclasses__Úsetr!   Ú
get_fieldsÚis_relationÚrelated_modelr   r   Úaddr$   ÚappendÚproxyÚconcrete_model)ÚmÚrelated_modelsZrelated_fields_modelsÚfÚoptsr%   r%   r&   Ú_get_related_models!   s"    þÿþ
ýr<   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>>   s   ÿz,get_related_models_tuples.<locals>.<setcomp>)r<   ©r$   r%   r%   r&   Úget_related_models_tuples9   s    þr@   c                 C   sj   t ƒ }t| ƒ}|D ]@}|jj|jj }}||f|v 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.
    )r0   r<   r!   r"   r#   r4   Úextend)r$   ÚseenÚqueuer=   Úrel_app_labelÚrel_model_namer%   r%   r&   Úget_related_models_recursiveD   s    þrF   c                   @   sB  e Zd ZdZdKdd„Zedd„ ƒZdd„ Zd	d
„ Zdd„ Z	dLd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!d"„ Zd#d$„ Zd%d&„ Zd'd(„ ZdMd*d+„ZdNd,d-„ZdOd/d0„Zd1d2„ Zd3d4„ ZdPd5d6„ZdQd7d8„Zd9d:„ Zd;d<„ Z d=d>„ Z!d?d@„ Z"dAdB„ Z#dCdD„ Z$e%dEdF„ ƒZ&e'dGdH„ ƒZ(dIdJ„ Z)dS )RÚ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 | _ |d u rtƒ }nt|tƒs(J ‚|| _d| _d | _d S ©NF)r   r0   r   Ú	real_appsÚ
is_delayedÚ
_relations)Úselfr   rI   r%   r%   r&   Ú__init__d   s    
zProjectState.__init__c                 C   s   | j d u r|  ¡  | j S ©N)rK   Úresolve_fields_and_relations©rL   r%   r%   r&   Ú	relationsp   s    
zProjectState.relationsc                 C   sB   |j |jf}|| j|< | jd ur*|  |¡ d| jv r>| j|Ž  d S ©Nr   )r"   Ú
name_lowerr   rK   Úresolve_model_relationsÚ__dict__Úreload_model)rL   Úmodel_stateÚ	model_keyr%   r%   r&   Ú	add_modelv   s    



zProjectState.add_modelc                 C   s|   ||f}| j |= | jd urX| j |d ¡ t| j ¡ ƒD ] \}}| |d ¡ |s6| j|= q6d| jv rx| jj|Ž  | j ¡  d S rR   )	r   rK   ÚpopÚlistÚitemsrU   r   Úunregister_modelÚclear_cache)rL   r"   r#   rX   Zrelated_model_keyÚmodel_relationsr%   r%   r&   Úremove_model~   s    


zProjectState.remove_modelc                 C   sR  |  ¡ }|  ¡ }| j||f  ¡ }||_|| j||f< ||f}|› d|› �}tƒ }	t| |ƒD ]d\}
}}}d }|jr‚| ¡ }||j_|j	r |d u r˜| ¡ }||j_	|r\||
j
|< |	 |
j|
jf¡ q\| jd u�r$||f}||f}|| jv rú| j |¡| j|< | j ¡ D ]}||v �r| |¡||< �q| j|	dd� |  ||¡ | j||dd� d S )Nr   T©Údelay)Úlowerr   ÚcloneÚnamer0   r   ÚtoÚremote_fieldr$   ÚthroughÚfieldsr4   r"   rS   rK   rZ   ÚvaluesÚreload_modelsr`   rV   )rL   r"   Úold_nameÚnew_nameÚold_name_lowerÚnew_name_lowerZrenamed_modelZold_model_tupleZnew_remote_modelZ	to_reloadrW   re   ÚfieldÚ	referenceZchanged_fieldZold_name_keyZnew_name_keyr_   r%   r%   r&   Úrename_modelŽ   sB    ÿ


zProjectState.rename_modelc                 C   sV   | j ||f }i |j¥|¥|_|rB|D ]}||vr&|j |d¡ q&| j||dd� d S )NFTra   )r   ÚoptionsrZ   rV   )rL   r"   r#   rs   Zoption_keysrW   Úkeyr%   r%   r&   Úalter_model_optionsµ   s    z ProjectState.alter_model_optionsc                    sJ   | j ||f }|j |¡ }r6‡ fdd„|D ƒ|j|< | j||dd� d S )Nc                    s    g | ]}t |ƒt ˆ ƒkr|‘qS r%   )r    ©r*   Úobj©Úvalue_to_remover%   r&   r,   Á   s   z5ProjectState.remove_model_options.<locals>.<listcomp>Tra   )r   rs   ÚgetrV   )rL   r"   r#   Úoption_namery   rW   Úobjsr%   rx   r&   Úremove_model_options¾   s    
ÿz!ProjectState.remove_model_optionsc                 C   s,   | j ||f }t|ƒ|_| j||dd� d S ©NTra   )r   r[   ÚmanagersrV   )rL   r"   r#   r   rW   r%   r%   r&   Úalter_model_managersÆ   s    
z!ProjectState.alter_model_managersc                 C   s:   | j ||f }g |j| ¢|‘|j|< | j||dd� d S r~   ©r   rs   rV   )rL   r"   r#   r{   rw   rW   r%   r%   r&   Ú_append_optionË   s    zProjectState._append_optionc                    sD   | j ||f }|j| }‡ fdd„|D ƒ|j|< | j||dd� d S )Nc                    s   g | ]}|j ˆ kr|‘qS r%   ©re   rv   ©Úobj_namer%   r&   r,   Ó   ó    z/ProjectState._remove_option.<locals>.<listcomp>Tra   r�   )rL   r"   r#   r{   r…   rW   r|   r%   r„   r&   Ú_remove_optionÐ   s    
zProjectState._remove_optionc                 C   s   |   ||d|¡ d S ©NÚindexes©r‚   )rL   r"   r#   Úindexr%   r%   r&   Ú	add_indexÖ   s    zProjectState.add_indexc                 C   s   |   ||d|¡ d S rˆ   ©r‡   )rL   r"   r#   Ú
index_namer%   r%   r&   Úremove_indexÙ   s    zProjectState.remove_indexc           	      C   sf   | j ||f }|jd }g }|D ]&}|j|kr<| ¡ }||_| |¡ q ||jd< | j||dd� d S )Nr‰   Tra   )r   rs   re   rd   r5   rV   )	rL   r"   r#   Zold_index_nameZnew_index_namerW   r|   Znew_indexesrw   r%   r%   r&   Úrename_indexÜ   s    


zProjectState.rename_indexc                 C   s   |   ||d|¡ d S ©NÚconstraintsrŠ   )rL   r"   r#   Ú
constraintr%   r%   r&   Úadd_constraintê   s    zProjectState.add_constraintc                 C   s   |   ||d|¡ d S r‘   r�   )rL   r"   r#   Úconstraint_namer%   r%   r&   Úremove_constraintí   s    zProjectState.remove_constraintc                 C   sd   |s|  ¡ }t|_n|}||f}|| j| j|< | jd urH|  |||¡ |j }| j|d|iŽ d S ©Nrb   )	rd   r   Údefaultr   ri   rK   Úresolve_model_field_relationsr2   rV   )rL   r"   r#   re   rp   Úpreserve_defaultrX   rb   r%   r%   r&   Ú	add_fieldð   s    
zProjectState.add_fieldc                 C   sR   ||f}| j | }|j |¡}| jd ur6|  |||¡ |j }| j|d|iŽ d S r—   )r   ri   rZ   rK   r™   r2   rV   )rL   r"   r#   re   rX   rW   Ú	old_fieldrb   r%   r%   r&   Úremove_fieldÿ   s    

zProjectState.remove_fieldc           
      C   s¨   |s|  ¡ }t|_n|}||f}| j| j}| jd urr| |¡}|jrT|  |||¡ |||< |jrz|  |||¡ n|||< |j o’t	| |||fƒ }	| j
|d|	iŽ d S r—   )rd   r   r˜   r   ri   rK   rZ   r2   r™   r   rV   )
rL   r"   r#   re   rp   rš   rX   ri   rœ   rb   r%   r%   r&   Úalter_field	  s$    



ÿzProjectState.alter_fieldc              
      s¨  ||f}| j | }|j}z| ˆ¡}W n, tyR   t|› d|› dˆ› d�ƒ‚Y n0 ||ˆ < | ¡ D ].}	t|	dd ƒ}
|
rdt‡ ‡fdd„|
D ƒƒ|	_qd|j	}dD ](}||v rž‡ ‡fdd„|| D ƒ||< qžd	}t
| |ˆ|fƒ}|D ]V�^ }}	}d
}|jrà|j\}}t|dd ƒˆk�rˆ |_|ràt‡ ‡fdd„|D ƒƒ|	_qà| jd u�r”ˆ ¡ }ˆ  ¡ }| j ¡ D ]4}||| v �r^||  |¡}	||	_|	|| |< �q^| j|d|iŽ d S )Nr   z has no field named 'ú'Úfrom_fieldsc                    s   g | ]}|ˆkrˆ n|‘qS r%   r%   )r*   Úfrom_field_name©rm   rl   r%   r&   r,   4  s   ÿz-ProjectState.rename_field.<locals>.<listcomp>)Úindex_togetherÚunique_togetherc                    s    g | ]}‡ ‡fd d„|D ƒ‘qS )c                    s   g | ]}|ˆkrˆ n|‘qS r%   r%   )r*   Únr¢   r%   r&   r,   >  r†   z8ProjectState.rename_field.<locals>.<listcomp>.<listcomp>r%   )r*   Ztogetherr¢   r%   r&   r,   =  s   ÿTFÚ
field_namec                    s   g | ]}|ˆkrˆ n|‘qS r%   r%   )r*   Úto_field_namer¢   r%   r&   r,   L  s   ÿrb   )r   ri   rZ   ÚKeyErrorr
   rj   Úgetattrr    r    rs   r   rf   r¦   Ú	to_fieldsrK   rc   re   rV   )rL   r"   r#   rl   rm   rX   rW   ri   Úfoundrp   r    rs   Úoptionrb   Ú
referencesÚ_rq   rg   rª   rn   ro   Úto_modelr%   r¢   r&   Úrename_field#  s^    
ÿ
þÿþ
þÿzProjectState.rename_fieldFc              	   C   s  |r
d| _ tƒ }z| j ||¡}W n ty4   Y n0 |rDt|ƒ}nt|ƒ}| j||f }tƒ }|j 	¡ D ]:}|j
rj|jjtkr‚qjt|j|ƒ\}	}
| |	|
 ¡ f¡ qj| |¡ |D ]P\}	}
z| j |	|
¡}W n tyà   Y q´0 |rö| t|ƒ¡ q´| t|ƒ¡ q´| ||f¡ |S )NT)rJ   r0   r   Ú	get_modelÚLookupErrorr@   rF   r   ri   rj   r2   rg   r$   r   r'   r3   r4   rc   Úupdate)rL   r"   r#   rb   r9   Ú	old_modelrW   Zdirect_related_modelsrp   rD   rE   Ú	rel_modelr%   r%   r&   Ú_find_reload_model[  s>    
ÿ
zProjectState._find_reload_modelc                 C   s&   d| j v r"|  |||¡}|  |¡ d S rR   )rU   r¶   Ú_reload)rL   r"   r#   rb   r9   r%   r%   r&   rV   �  s    
zProjectState.reload_modelTc                 C   s@   d| j v r<tƒ }|D ]\}}| |  |||¡¡ q|  |¡ d S rR   )rU   r0   r³   r¶   r·   )rL   r   rb   r9   r"   r#   r%   r%   r&   rk   ’  s    
ÿzProjectState.reload_modelsc              	   C   sÀ   | j  ¡ �, |D ]\}}| j  ||¡ qW d   ƒ n1 s<0    Y  g }| j jD ]}|j|jf|v rR| |¡ qR|D ]8\}}z| j||f }W n ty¢   Y qv0 | |¡ qv| j  	|¡ d S rN   )
r   Úbulk_updater]   Úreal_modelsr"   rS   r5   r   r¨   Úrender_multiple)rL   r9   rD   rE   Zstates_to_be_renderedrW   r%   r%   r&   r·   ›  s    .zProjectState._reloadc                 C   s‚   t |g|¢R Ž }|d | jvr.||v r.|| }| j| }|| j| jv rf||| vsXJ ‚||| |< n|| |= || s~||= d S )Nr   )r   rI   rK   r   ri   )rL   r$   rX   r¦   rp   Ú	concretesZremote_model_keyZrelations_to_remote_modelr%   r%   r&   Úupdate_model_field_relationµ  s    

z(ProjectState.update_model_field_relationc                 C   s`   |j }|sd S |d u r"|  ¡ \}}|  |j||||¡ t|dd ƒ}|sJd S |  |||||¡ d S )Nrh   )rg   Ú-_get_concrete_models_mapping_and_proxy_modelsr¼   r$   r©   )rL   rX   r¦   rp   r»   rg   r®   rh   r%   r%   r&   r™   Ì  s$    û
ÿz*ProjectState.resolve_model_field_relationsc                 C   sF   |d u r|   ¡ \}}| j| }|j ¡ D ]\}}|  ||||¡ q(d S rN   )r½   r   ri   r\   r™   )rL   rX   r»   r®   rW   r¦   rp   r%   r%   r&   rT   è  s
    
z$ProjectState.resolve_model_relationsc                 C   s~   | j  ¡ D ]}|j ¡ D ]\}}||_qq
ttttƒƒ| _|  	¡ \}}|D ]}|  
||¡ qJ|D ]}| j||  | j|< q`d S rN   )r   rj   ri   r\   re   r   r   ÚdictrK   r½   rT   )rL   rW   r¦   rp   r»   ZproxiesrX   r%   r%   r&   rO   ð  s    
z)ProjectState.resolve_fields_and_relationsc                 C   s   |   ¡ \}}t|ƒ}|| S rN   )r½   r   )rL   r$   Úconcrete_models_mappingr®   rX   r%   r%   r&   Úget_concrete_model_key   s    ýz#ProjectState.get_concrete_model_keyc                 C   sR   i }i }| j  ¡ D ]6\}}|j d¡r@|||< |  ||¡||< q|||< q||fS )Nr6   )r   r\   rs   rz   Ú_find_concrete_model_from_proxy)rL   r¿   Úproxy_modelsrX   rW   r%   r%   r&   r½     s    þþÿ
z:ProjectState._get_concrete_models_mapping_and_proxy_modelsc                 C   sT   |j D ]H}t|tƒs"t|tjƒs"qt|ƒ}| |¡}|s@|  S |  ||¡  S d S rN   )	Úbasesr   r   r(   r   r)   r   rz   rÁ   )rL   rÂ   rW   ÚbaseÚbase_keyZ
base_stater%   r%   r&   rÁ     s    

z,ProjectState._find_concrete_model_from_proxyc                 C   s@   t dd„ | j ¡ D ƒ| jd�}d| jv r4| j ¡ |_| j|_|S )z*Return an exact copy of this ProjectState.c                 S   s   i | ]\}}||  ¡ “qS r%   ©rd   )r*   ÚkÚvr%   r%   r&   Ú
<dictcomp>(  r†   z&ProjectState.clone.<locals>.<dictcomp>©r   rI   r   )rG   r   r\   rI   rU   r   rd   rJ   )rL   Ú	new_stater%   r%   r&   rd   %  s    þ
zProjectState.clonec                 C   s   | j rd| jv r| jd= d S rR   )rJ   rU   rP   r%   r%   r&   Úclear_delayed_apps_cache0  s    z%ProjectState.clear_delayed_apps_cachec                 C   s   t | j| jƒS rN   )Ú	StateAppsrI   r   rP   r%   r%   r&   r   4  s    zProjectState.appsc                 C   s8   i }|j dd�D ]}t |¡}|||j|jf< q| |ƒS )z3Take an Apps and return a ProjectState matching it.T)Úinclude_swapped)Ú
get_modelsÚ
ModelStateÚ
from_modelr"   rS   )Úclsr   Ú
app_modelsr$   rW   r%   r%   r&   Ú	from_apps8  s
    
zProjectState.from_appsc                 C   s   | j |j ko| j|jkS rN   rÊ   ©rL   Úotherr%   r%   r&   Ú__eq__A  s    zProjectState.__eq__)NN)N)F)F)T)N)N)*Ú__name__Ú
__module__Ú__qualname__Ú__doc__rM   ÚpropertyrQ   rY   r`   rr   ru   r}   r€   r‚   r‡   rŒ   r�   r�   r”   r–   r›   r�   rž   r°   r¶   rV   rk   r·   r¼   r™   rT   rO   rÀ   r½   rÁ   rd   rÌ   r   r   ÚclassmethodrÔ   r×   r%   r%   r%   r&   rG   ]   sP   

'
	
8
2

	 û



rG   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚAppConfigStubzAStub of an AppConfig. Only provides a label and a dict of models.c                 C   s   d | _ i | _|| _|| _d S rN   )r   r   Úlabelre   )rL   rß   r%   r%   r&   rM   H  s    zAppConfigStub.__init__c                 C   s   | j j| j | _d S rN   )r   Ú
all_modelsrß   r   rP   r%   r%   r&   Úimport_modelsQ  s    zAppConfigStub.import_modelsN)rØ   rÙ   rÚ   rÛ   rM   rá   r%   r%   r%   r&   rÞ   E  s   	rÞ   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 )rÍ   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g |¢|¢ƒD ƒ}t	ƒ  
|¡ d | _d | _|  g | ¡ ¢| 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*   rW   r%   r%   r&   r>   g  r†   z%StateApps.__init__.<locals>.<setcomp>c                 S   s   g | ]}t |ƒ‘qS r%   )rÞ   )r*   rß   r%   r%   r&   r,   h  s   z&StateApps.__init__.<locals>.<listcomp>r   )Ú_check_lazy_references)ÚignoreÚ
c                 s   s   | ]}|j V  qd S rN   )Úmsg)r*   Úerrorr%   r%   r&   Ú	<genexpr>}  r†   z%StateApps.__init__.<locals>.<genexpr>)r¹   Úglobal_appsÚget_app_configrÏ   r5   rÐ   rÑ   rj   ÚsortedÚsuperrM   Ú_lockÚready_eventrº   Údjango.core.checks.model_checksrã   r   r	   ÚAUTH_USER_MODELr0   Ú
ValueErrorÚjoin)rL   rI   r   Zignore_swappabler"   Úappr$   Ú
app_labelsÚapp_configsrã   rä   Úerrors©Ú	__class__r%   r&   rM   [  s&    
ÿÿzStateApps.__init__c                 c   s:   | j }d| _ zd V  W || _ |  ¡  n|| _ |  ¡  0 d S rH   )Úreadyr^   )rL   rù   r%   r%   r&   r¸     s    
ÿzStateApps.bulk_updatec              
   C   sž   |sd S |   ¡ �z |}|r|g }|D ]0}z| | ¡ W q" tyP   | |¡ Y q"0 q"t|ƒt|ƒkrvtd|tƒ f ƒ‚|}qW d   ƒ n1 s�0    Y  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)r¸   Úrenderr   r5   r   r   )rL   Zmodel_statesZunrendered_modelsZnew_unrendered_modelsr$   r%   r%   r&   rº   ‹  s$    
ûÿzStateApps.render_multiplec                 C   sP   t g i ƒ}t | j¡|_| jD ]$}t|ƒ}||_| ¡  ||j|< q| j|_|S )z Return a clone of this registry.)	rÍ   ÚcopyÚdeepcopyrà   rõ   rÞ   r   rá   r¹   )rL   rd   r"   Ú
app_configr%   r%   r&   rd   §  s    

zStateApps.clonec                 C   s`   || j | |jj< || jvr6t|ƒ| j|< | | j| _|| j| j|jj< |  |¡ |  ¡  d S rN   )	rà   r!   r#   rõ   rÞ   r   r   Údo_pending_operationsr^   )rL   r"   r$   r%   r%   r&   Úregister_model¶  s    

zStateApps.register_modelc                 C   s6   z| j | |= | j| j|= W n ty0   Y n0 d S rN   )rà   rõ   r   r¨   )rL   r"   r#   r%   r%   r&   r]   ¿  s
    zStateApps.unregister_model)F)rØ   rÙ   rÚ   rÛ   rM   r   r¸   rº   rd   rÿ   r]   Ú__classcell__r%   r%   r÷   r&   rÍ   U  s   $
	rÍ   c                   @   st   e Zd ZdZddd„Zedd„ ƒZ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 )rÐ   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 )	Nr‰   r’   r$   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"   re   r¾   ri   rs   Ú
setdefaultr   r)   rÃ   r   r\   Úhasattrrñ   r2   r3   Úmany_to_manyrg   rh   )	rL   r"   re   ri   rs   rÃ   r   rp   r‹   r%   r%   r&   rM   Ò  s@    



ÿÿÿÿÿÿÿzModelState.__init__c                 C   s
   | j  ¡ S rN   )re   rc   rP   r%   r%   r&   rS   ö  s    zModelState.name_lowerc                 C   s    |dkr| j  d|¡}| j| S )NÚ_orderÚorder_with_respect_to)rs   rz   ri   )rL   r¦   r%   r%   r&   Ú	get_fieldú  s    zModelState.get_fieldFc                    s\  g }ˆj jD ]|}t|ddƒr"|r"qt|tjƒr0q|j}z| || ¡ f¡ W q t	y† } z"t	d|ˆj j
|f ƒ‚W Y d}~qd}~0 0 q|sôˆj jD ]\}|j}z| || ¡ f¡ W q– t	yð } z"t	d|ˆj j|f ƒ‚W Y d}~q–d}~0 0 q–i }tD ]ä}|dv �rqüqü|ˆj jv rü|dk�rBˆj jd }tt|ƒƒ||< qü|dk�rjˆ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 ]}||v �rì||= �qìn$| d¡dd„ ˆj jD ƒv �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|v �r¬�q–nb|j�rÈt |¡}| ¡  nF|ˆju �sà|ˆju �r–t  ¡ }|j!|_!|j|_|ˆju �r|}n�q–| "|j¡ | |j|f¡ �q–|d|fgk�rBg }| ˆj j#ˆj j||||ƒS )z3Given a model, return a ModelState representing it.rg   Nz'Couldn't reconstruct field %s on %s: %sz+Couldn't reconstruct m2m field %s on %s: %s)r   r"   r¤   r£   r‰   c                 S   s   g | ]}|  ¡ ‘qS r%   rÆ   )r*   Úidxr%   r%   r&   r,   1  r†   z)ModelState.from_model.<locals>.<listcomp>r’   c                 S   s   g | ]}|  ¡ ‘qS r%   rÆ   )r*   Zconr%   r%   r&   r,   7  s   )r¤   r£   r  r  c                 S   s   h | ]
}|j ’qS r%   rƒ   )r*   rp   r%   r%   r&   r>   C  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!   ÚabstractrA   r5   )r$   rÃ   rÄ   )Úflatten_basesr%   r&   r
  H  s    
z,ModelState.from_model.<locals>.flatten_basesc                    s   ˆ j  | ¡S rN   )Ú__mro__r‹   )Úxr?   r%   r&   Ú<lambda>W  r†   z'ModelState.from_model.<locals>.<lambda>©rt   c                 s   s$   | ]}t |d ƒr|jjn|V  qdS )r!   N)r  r!   Ú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 rN   )r   r   r(   r   r)   r  r%   r%   r&   rè   `  s   Úobjects)$r!   Úlocal_fieldsr©   r   r   ÚOrderWrtre   r5   rd   Ú	TypeErrorrß   Úlocal_many_to_manyÚobject_namer   Úoriginal_attrsr0   r   r‰   Úset_name_with_modelr’   rz   Úprivate_fieldsrë   r    Úanyr)   r   Úuse_in_migrationsrû   Ú_set_creation_counterÚ_base_managerÚ_default_managerÚManagerr$   r4   r"   )rÒ   r$   râ   ri   rp   re   Úers   ÚutÚitr‰   r‹   rt   Zflattened_basesrÃ   r   Zmanager_namesZdefault_manager_shimÚmanagerZnew_managerr%   )r
  r$   r&   rÑ   ÿ  sÊ    ýÿÿýÿÿ	





ÿ
ÿ
ÿþÿ


úzModelState.from_modelc                 c   sn   t | jdd„ d�}|D ]R\}}| ¡ \}}}}}|rLt|ƒ}	||	 ¡ fV  qt|ƒ}
||
|i |¤ŽfV  qdS )z-Deep-clone the managers using deconstruction.c                 S   s
   | d j S )Nr   )Úcreation_counter)rÈ   r%   r%   r&   r  �  r†   z/ModelState.construct_managers.<locals>.<lambda>r  N)rë   r   Údeconstructr   Ú
as_manager)rL   Zsorted_managersZmgr_namer#  r&  Zmanager_pathZqs_pathÚargsÚkwargsÚqs_classÚ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"   re   ri   rs   rÃ   r   )	rø   r"   re   r¾   ri   rs   rÃ   r[   r   rP   r%   r%   r&   rd   —  s    ÷zModelState.clonec                    sž   | j ˆ dœ| j¥}tdd|ƒ}zt‡ fdd„| jD ƒƒ}W n" ty\   td| jf ƒ‚Y n0 dd„ | j ¡ D ƒ}||d< d	|d
< | 	|  
¡ ¡ t| j||ƒS )zACreate a Model object from our current state into the given apps.)r"   r   ÚMetar%   c                 3   s&   | ]}t |tƒrˆ  |¡n|V  qd S rN   )r   r   r±   r  r   r%   r&   rè   ¬  s   ÿz$ModelState.render.<locals>.<genexpr>z(Cannot resolve one or more bases from %rc                 S   s   i | ]\}}||  ¡ “qS r%   rÆ   )r*   re   rp   r%   r%   r&   rÉ   µ  r†   z%ModelState.render.<locals>.<dictcomp>Z__fake__rÙ   )r"   rs   Útyper    rÃ   r²   r   ri   r\   r³   r+  re   )rL   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©rs   re   rñ   )rL   re   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 %sr0  )rL   re   r“   r%   r%   r&   Úget_constraint_by_nameÄ  s    

z!ModelState.get_constraint_by_namec                 C   s   d| j j| j| jf S )Nz<%s: '%s.%s'>)rø   rØ   r"   re   rP   r%   r%   r&   Ú__repr__Ê  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*   Úk1Úf1Úk2Úf2r%   r%   r&   rè   Ò  s   ÿz$ModelState.__eq__.<locals>.<genexpr>)r"   re   r   ri   ÚallÚziprë   r\   rs   rÃ   r   rÕ   r%   r%   r&   r×   Í  s$    
ÿþþþý

ö
õ
ózModelState.__eq__)NNN)F)rØ   rÙ   rÚ   rÛ   rM   r   rS   r  rÝ   rÑ   r+  rd   rú   r1  r2  r3  r×   r%   r%   r%   r&   rÐ   Ç  s     ÿ
$
 rÐ   )r   )1rû   Úcollectionsr   Ú
contextlibr   Ú	functoolsr   Údjango.appsr   Zdjango.apps.registryr   r   ré   Údjango.confr	   Údjango.core.exceptionsr
   Ú	django.dbr   Údjango.db.migrations.utilsr   r   Údjango.db.modelsr   Údjango.db.models.fields.relatedr   Údjango.db.models.optionsr   r   Údjango.db.models.utilsr   Údjango.utils.functionalr   Údjango.utils.module_loadingr   Údjango.utils.versionr   Ú
exceptionsr   Úutilsr   r'   r<   r@   rF   rG   rÞ   rÍ   rÐ   r%   r%   r%   r&   Ú<module>   s<   
   kr