o
    þÞ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   sF   t | tƒr|  dd¡}t|ƒdkrt|ƒS ||d fS | jj| jjfS )NÚ.r   é   r   )Ú
isinstanceÚstrÚsplitÚlenÚtupleÚ_metaÚ	app_labelÚ
model_name)Úmodelr"   r   © r%   úZ/var/www/html/premium_crap/venv/lib/python3.10/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 ]}|jr0|jdur0t|jtƒs0| |j	¡ | 
|j¡ q| j}|jrA| |v rA| 
|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_modelsÚ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>>   ó    ÿÿz,get_related_models_tuples.<locals>.<setcomp>)r=   ©r$   r%   r%   r&   Úget_related_models_tuples9   s   þrB   c                 C   sj   t ƒ }t| ƒ}|D ] }|jj|jj}}||f|v rq	| ||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   þrH   c                   @   sT  e Zd ZdZdOdd„Zedd„ ƒZdd„ Zd	d
„ Zdd„ Z	dPd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d)d*„ Zd+d,„ ZdQd.d/„ZdQd0d1„ZdRd3d4„Zd5d6„ Zd7d8„ Z	dPd9d:„ZdPd;d<„Z d=d>„ Z!d?d@„ Z"dAdB„ Z#dCdD„ Z$dEdF„ Z%dGdH„ Z&e'dIdJ„ ƒZ(e)dKdL„ ƒZ*dMdN„ Z+dS )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 | _ |d u rtƒ }nt|tƒsJ ‚|| _d| _d | _d S ©NF)r   r0   r   Ú	real_appsÚ
is_delayedÚ
_relations)Úselfr   rK   r%   r%   r&   Ú__init__d   s   

zProjectState.__init__c                 C   s   | j d u r	|  ¡  | j S ©N)rM   Úresolve_fields_and_relations©rN   r%   r%   r&   Ú	relationsp   s   
zProjectState.relationsc                 C   sF   |j |jf}|| j|< | jd ur|  |¡ d| jv r!| j|Ž  d S d S ©Nr   )r"   Ú
name_lowerr   rM   Úresolve_model_relationsÚ__dict__Úreload_model)rN   Úmodel_stateÚ	model_keyr%   r%   r&   Ú	add_modelv   s   



ÿzProjectState.add_modelc                 C   s€   ||f}| j |= | jd ur,| j |d ¡ t| j ¡ ƒD ]\}}| |d ¡ |s+| j|= qd| jv r>| jj|Ž  | j ¡  d S d S rT   )	r   rM   ÚpopÚlistÚitemsrW   r   Úunregister_modelÚclear_cache)rN   r"   r#   rZ   Úrelated_model_keyÚmodel_relationsr%   r%   r&   Úremove_model~   s   
€
üzProjectState.remove_modelc                 C   sL  |  ¡ }|  ¡ }| j||f  ¡ }||_|| j||f< ||f}|› d|› �}tƒ }	t| |ƒD ]2\}
}}}d }|jrA| ¡ }||j_|j	rP|d u rL| ¡ }||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"   rU   rM   r\   ÚvaluesÚreload_modelsrc   rX   )rN   r"   Úold_nameÚnew_nameÚold_name_lowerÚnew_name_lowerÚrenamed_modelÚold_model_tupleÚnew_remote_modelÚ	to_reloadrY   rh   ÚfieldÚ	referenceÚchanged_fieldÚold_name_keyÚnew_name_keyrb   r%   r%   r&   Úrename_modelŽ   sF   ÿ
€

€zProjectState.rename_modelc                 C   sV   | j ||f }i |j¥|¥|_|r!|D ]}||vr |j |d¡ q| j||dd� d S )NFTrd   )r   Úoptionsr\   rX   )rN   r"   r#   r}   Úoption_keysrY   Úkeyr%   r%   r&   Úalter_model_optionsµ   s   €z ProjectState.alter_model_optionsc                    sJ   | j ||f }|j |¡ }r‡ 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>Trd   )r   r}   ÚgetrX   )rN   r"   r#   Úoption_namer„   rY   Úobjsr%   rƒ   r&   Úremove_model_options¾   s   
ÿz!ProjectState.remove_model_optionsc                 C   s,   | j ||f }t|ƒ|_| j||dd� d S ©NTrd   )r   r]   ÚmanagersrX   )rN   r"   r#   rŠ   rY   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   r}   rX   )rN   r"   r#   r†   r‚   rY   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%   ©rh   r�   ©Úobj_namer%   r&   r,   Ó   ó    z/ProjectState._remove_option.<locals>.<listcomp>Trd   rŒ   )rN   r"   r#   r†   r�   rY   r‡   r%   r�   r&   Ú_remove_optionÐ   s   
zProjectState._remove_optionc                    sF   | j ||f }|j| }‡ ‡fdd„|D ƒ|j|< | j||dd� d S )Nc                    s   g | ]}|j ˆkr|nˆ ‘qS r%   rŽ   r�   ©Úalt_objr�   r%   r&   r,   Ù   s    ÿz.ProjectState._alter_option.<locals>.<listcomp>Trd   rŒ   )rN   r"   r#   r†   r�   r”   rY   r‡   r%   r“   r&   Ú_alter_optionÖ   s   
ÿzProjectState._alter_optionc                 C   ó   |   ||d|¡ d S ©NÚindexes©r�   )rN   r"   r#   Úindexr%   r%   r&   Ú	add_indexÞ   ó   zProjectState.add_indexc                 C   r–   r—   ©r’   )rN   r"   r#   Ú
index_namer%   r%   r&   Úremove_indexá   rœ   zProjectState.remove_indexc           	      C   sf   | j ||f }|jd }g }|D ]}|j|kr| ¡ }||_| |¡ q||jd< | j||dd� d S )Nr˜   Trd   )r   r}   rh   rg   r5   rX   )	rN   r"   r#   Úold_index_nameÚnew_index_namerY   r‡   Únew_indexesr‚   r%   r%   r&   Úrename_indexä   s   


zProjectState.rename_indexc                 C   r–   ©NÚconstraintsr™   )rN   r"   r#   Ú
constraintr%   r%   r&   Úadd_constraintò   rœ   zProjectState.add_constraintc                 C   r–   r¤   r�   )rN   r"   r#   Úconstraint_namer%   r%   r&   Úremove_constraintõ   rœ   zProjectState.remove_constraintc                 C   s   |   ||d||¡ d S r¤   )r•   )rN   r"   r#   r¨   r¦   r%   r%   r&   Úalter_constraintø   s   
ÿzProjectState.alter_constraintc                 C   sd   |s
|  ¡ }t|_n|}||f}|| j| j|< | jd ur$|  |||¡ |j }| j|d|iŽ d S ©Nre   )	rg   r   Údefaultr   rl   rM   Úresolve_model_field_relationsr2   rX   )rN   r"   r#   rh   rw   Úpreserve_defaultrZ   re   r%   r%   r&   Ú	add_fieldý   s   
zProjectState.add_fieldc                 C   sR   ||f}| j | }|j |¡}| jd ur|  |||¡ |j }| j|d|iŽ d S r«   )r   rl   r\   rM   r­   r2   rX   )rN   r"   r#   rh   rZ   rY   Ú	old_fieldre   r%   r%   r&   Úremove_field  s   

zProjectState.remove_fieldc           
      C   s¨   |s
|  ¡ }t|_n|}||f}| j| j}| jd ur9| |¡}|jr*|  |||¡ |||< |jr8|  |||¡ n|||< |j oIt	| |||fƒ }	| j
|d|	iŽ d S r«   )rg   r   r¬   r   rl   rM   r\   r2   r­   r   rX   )
rN   r"   r#   rh   rw   r®   rZ   rl   r°   re   r%   r%   r&   Úalter_field  s&   

€

ÿzProjectState.alter_fieldc              
      sÐ  ||f}| j | }|j}z| ˆ¡}W n ty'   t|› d|› dˆ› d�ƒ‚w ||ˆ < | ¡ D ]1}	t|	dd ƒ}
|
rGt‡ ‡fdd„|
D ƒƒ|	_t|	dd ƒ }raˆ|v rat‡ ‡fdd„|	j	D ƒƒ|	_	q0|j
}d	D ]}||v r{‡ ‡fd
d„|| D ƒ||< qgd}t| |ˆ|fƒ}|D ]*�^ }}	}d}|jr²|j\}}t|dd ƒˆkr£ˆ |_|r²t‡ ‡fdd„|D ƒƒ|	_qˆ| jd urÞˆ ¡ }ˆ  ¡ }| j ¡ D ]}||| v rÝ||  |¡}	||	_|	|| |< qÅ| j|d|iŽ d S )Nr   z has no field named 'ú'Úfrom_fieldsc                    ó   g | ]
}|ˆkr
ˆ n|‘qS r%   r%   )r*   Úfrom_field_name©rp   ro   r%   r&   r,   A  r@   z-ProjectState.rename_field.<locals>.<listcomp>Úfield_namesc                    rµ   r%   r%   )r*   Ú
field_namer·   r%   r&   r,   K  r@   )Úindex_togetherÚunique_togetherc                    s    g | ]}‡ ‡fd d„|D ƒ‘qS )c                    rµ   r%   r%   )r*   Únr·   r%   r&   r,   U  s    z8ProjectState.rename_field.<locals>.<listcomp>.<listcomp>r%   )r*   Útogetherr·   r%   r&   r,   T  s    ÿÿTFr¹   c                    rµ   r%   r%   )r*   Úto_field_namer·   r%   r&   r,   c  r@   re   )r   rl   r\   ÚKeyErrorr
   rm   Úgetattrr    r´   r¸   r}   r   ri   r¹   Ú	to_fieldsrM   rf   rh   rX   )rN   r"   r#   ro   rp   rZ   rY   rl   Úfoundrw   r´   r¸   r}   Úoptionre   Ú
referencesÚ_rx   rj   rÁ   rq   rr   Úto_modelr%   r·   r&   Úrename_field0  sv   
ÿÿþÿþÿ€
þ€
þÿ€
€zProjectState.rename_fieldFc              	   C   s  |rd| _ tƒ }z	| j ||¡}W n	 ty   Y nw |r"t|ƒ}nt|ƒ}| j||f }tƒ }|j 	¡ D ]}|j
rR|jjtkrAq5t|j|ƒ\}	}
| |	|
 ¡ f¡ q5| |¡ |D ](\}	}
z	| j |	|
¡}W n	 typ   Y qZw |r{| t|ƒ¡ qZ| t|ƒ¡ qZ| ||f¡ |S )NT)rL   r0   r   Ú	get_modelÚLookupErrorrB   rH   r   rl   rm   r2   rj   r$   r   r'   r3   r4   rf   Úupdate)rN   r"   r#   re   r9   Ú	old_modelrY   Údirect_related_modelsrw   rF   rG   Ú	rel_modelr%   r%   r&   Ú_find_reload_modelr  sD   ÿ
ÿ€
ÿzProjectState._find_reload_modelc                 C   s*   d| j v r|  |||¡}|  |¡ d S d S rT   )rW   rÎ   Ú_reload)rN   r"   r#   re   r9   r%   r%   r&   rX   ¤  s   
þzProjectState.reload_modelTc                 C   sD   d| j v r tƒ }|D ]\}}| |  |||¡¡ q
|  |¡ d S d S rT   )rW   r0   rÊ   rÎ   rÏ   )rN   r   re   r9   r"   r#   r%   r%   r&   rn   ©  s   
ÿúzProjectState.reload_modelsc              	   C   sÀ   | j  ¡ � |D ]\}}| j  ||¡ qW d   ƒ n1 sw   Y  g }| j jD ]}|j|jf|v r8| |¡ q)|D ]\}}z	| j||f }W n	 tyQ   Y q;w | |¡ q;| j  	|¡ d S rP   )
r   Úbulk_updater_   Úreal_modelsr"   rU   r5   r   r¿   Úrender_multiple)rN   r9   rF   rG   Ústates_to_be_renderedrY   r%   r%   r&   rÏ   ²  s$   ÿÿ
€ÿzProjectState._reloadc                 C   sˆ   t |g|¢R Ž }|d | jvr||v r|| }| j| }|| j| jv r4||| vs,J ‚||| |< d S || |= || sB||= d S d S )Nr   )r   rK   rM   r   rl   )rN   r$   rZ   r¹   rw   Ú	concretesÚremote_model_keyÚ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 ƒ}|s%d S |  |||||¡ d S )Nrk   )rj   Ú-_get_concrete_models_mapping_and_proxy_modelsr×   r$   rÀ   )rN   rZ   r¹   rw   rÔ   rj   rÅ   rk   r%   r%   r&   r­   ã  s$   û
ÿz*ProjectState.resolve_model_field_relationsc                 C   sF   |d u r
|   ¡ \}}| j| }|j ¡ D ]\}}|  ||||¡ qd S rP   )rØ   r   rl   r^   r­   )rN   rZ   rÔ   rÅ   rY   r¹   rw   r%   r%   r&   rV   ÿ  s   
ÿz$ProjectState.resolve_model_relationsc                 C   s~   | j  ¡ D ]}|j ¡ D ]\}}||_qqttttƒƒ| _|  	¡ \}}|D ]}|  
||¡ q%|D ]}| j||  | j|< q0d S rP   )r   rm   rl   r^   rh   r   r   ÚdictrM   rØ   rV   )rN   rY   r¹   rw   rÔ   ÚproxiesrZ   r%   r%   r&   rQ     s   ÿÿz)ProjectState.resolve_fields_and_relationsc                 C   s   |   ¡ \}}t|ƒ}|| S rP   )rØ   r   )rN   r$   Úconcrete_models_mappingrÅ   rZ   r%   r%   r&   Úget_concrete_model_key  s   ýz#ProjectState.get_concrete_model_keyc                 C   sR   i }i }| j  ¡ D ]\}}|j d¡r |||< |  ||¡||< q	|||< q	||fS )Nr6   )r   r^   r}   r…   Ú_find_concrete_model_from_proxy)rN   rÛ   Úproxy_modelsrZ   rY   r%   r%   r&   rØ     s   þÿ
z:ProjectState._get_concrete_models_mapping_and_proxy_modelsc                 C   sT   |j D ]$}t|tƒst|tjƒsqt|ƒ}| |¡}|s |  S |  ||¡  S d S rP   )	Úbasesr   r   r(   r   r)   r   r…   rÝ   )rN   rÞ   rY   ÚbaseÚbase_keyÚ
base_stater%   r%   r&   rÝ   1  s   

øz,ProjectState._find_concrete_model_from_proxyc                 C   s@   t dd„ | j ¡ D ƒ| jd�}d| jv r| j ¡ |_| j|_|S )z*Return an exact copy of this ProjectState.c                 S   ó   i | ]	\}}||  ¡ “qS r%   ©rg   )r*   ÚkÚvr%   r%   r&   Ú
<dictcomp>?  r‘   z&ProjectState.clone.<locals>.<dictcomp>©r   rK   r   )rI   r   r^   rK   rW   r   rg   rL   )rN   Ú	new_stater%   r%   r&   rg   <  s   þ
zProjectState.clonec                 C   s$   | j rd| jv r| jd= d S d S d S rT   )rL   rW   rR   r%   r%   r&   Úclear_delayed_apps_cacheG  s   ÿz%ProjectState.clear_delayed_apps_cachec                 C   s   t | j| jƒS rP   )Ú	StateAppsrK   r   rR   r%   r%   r&   r   K  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"   rU   )Úclsr   Ú
app_modelsr$   rY   r%   r%   r&   Ú	from_appsO  s
   
zProjectState.from_appsc                 C   s   | j |j ko| j|jkS rP   rè   ©rN   Úotherr%   r%   r&   Ú__eq__X  s   zProjectState.__eq__)NNrP   ©F)T),Ú__name__Ú
__module__Ú__qualname__Ú__doc__rO   ÚpropertyrS   r[   rc   r|   r€   rˆ   r‹   r�   r’   r•   r›   rŸ   r£   r§   r©   rª   r¯   r±   r²   rÇ   rÎ   rX   rn   rÏ   r×   r­   rV   rQ   rÜ   rØ   rÝ   rg   rê   r   r   Úclassmethodrò   rõ   r%   r%   r%   r&   rI   ]   sV    


'	

B
2
	
û


rI   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 rP   )r   r   Úlabelrh   )rN   rþ   r%   r%   r&   rO   _  s   
zAppConfigStub.__init__c                 C   s   | j j| j | _d S rP   )r   Ú
all_modelsrþ   r   rR   r%   r%   r&   Úimport_modelsh  rœ   zAppConfigStub.import_modelsN)r÷   rø   rù   rú   rO   r   r%   r%   r%   r&   rý   \  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 ]}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	�}|rrtd
 dd„ |D ƒ¡ƒ‚d S )NT)Úexclude_relsc                 S   ó   h | ]}|j ’qS r%   )r"   )r*   rY   r%   r%   r&   r?   ~  s    z%StateApps.__init__.<locals>.<setcomp>c                 S   s   g | ]}t |ƒ‘qS r%   )rý   )r*   rþ   r%   r%   r&   r,     ó    ÿz&StateApps.__init__.<locals>.<listcomp>r   )Ú_check_lazy_references)ÚignoreÚ
c                 s   s   � | ]}|j V  qd S rP   )Úmsg)r*   Úerrorr%   r%   r&   Ú	<genexpr>”  s   € z%StateApps.__init__.<locals>.<genexpr>)rÑ   Úglobal_appsÚget_app_configrí   r5   rî   rï   rm   ÚsortedÚsuperrO   Ú_lockÚready_eventrÒ   Údjango.core.checks.model_checksr  r   r	   ÚAUTH_USER_MODELr0   Ú
ValueErrorÚjoin)rN   rK   r   Úignore_swappabler"   Úappr$   Ú
app_labelsÚapp_configsr  r  Úerrors©Ú	__class__r%   r&   rO   r  s*   
ÿÿÿÿzStateApps.__init__c                 c   s:   � | j }d| _ zd V  W || _ |  ¡  d S || _ |  ¡  w rJ   )Úreadyr`   )rN   r  r%   r%   r&   rÐ   –  s   €ÿ
zStateApps.bulk_updatec              
   C   s°   |sd S |   ¡ �F |}|rFg }|D ]}z| | ¡ W q ty(   | |¡ Y qw t|ƒt|ƒkr:td|tƒ f ƒ‚|}|sW d   ƒ d S W d   ƒ d S 1 sQw   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   )rN   Úmodel_statesÚunrendered_modelsÚ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Ñ   )rN   rg   r"   Ú
app_configr%   r%   r&   rg   ¾  s   

zStateApps.clonec                 C   s`   || j | |jj< || jvrt|ƒ| j|< | | j| _|| j| j|jj< |  |¡ |  ¡  d S rP   )	rÿ   r!   r#   r  rý   r   r   Údo_pending_operationsr`   )rN   r"   r$   r%   r%   r&   Úregister_modelÍ  s   

zStateApps.register_modelc                 C   s6   z| j | |= | j| j|= W d S  ty   Y d S w rP   )rÿ   r  r   r¿   )rN   r"   r#   r%   r%   r&   r_   Ö  s   ÿzStateApps.unregister_modelrö   )r÷   rø   rù   rú   rO   r   rÐ   rÒ   rg   r$  r_   Ú__classcell__r%   r%   r  r&   rë   l  s    $
	rë   c                   @   sv   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 ¡ |p#tjf| _|p(g | _	| j 
¡ D ]B\}}t|dƒr>td| ƒ‚|jrWt|jdƒrWtd| j › d| j› d|› d�ƒ‚|jrqt|jjdƒrqtd| j › d| j› d|› d	�ƒ‚q/| jd D ]}|js‚td
| ƒ‚qwd S )Nr˜   r¥   r$   z7ModelState.fields cannot be bound to a model - "%s" is.r!   zEModel fields in "ModelState.fields" cannot refer to a model class - "r   z*.to" does. Use a string reference instead.z/.through" does. Use a string reference instead.zKIndexes passed to ModelState require a name attribute. %r doesn't have one.)r"   rh   rÙ   rl   r}   Ú
setdefaultr   r)   rß   rŠ   r^   Úhasattrr  r2   r3   Úmany_to_manyrj   rk   )	rN   r"   rh   rl   r}   rß   rŠ   rw   rš   r%   r%   r&   rO   é  sV   



ÿÿÿÿÿÿÿÿÿ€ÿÿÿÿzModelState.__init__c                 C   s
   | j  ¡ S rP   )rh   rf   rR   r%   r%   r&   rU     s   
zModelState.name_lowerc                 C   s,   |dkr| j  d¡d ur| j d }| j| S )NÚ_orderÚorder_with_respect_to)r}   r…   rl   )rN   r¹   r%   r%   r&   Ú	get_field  s   

zModelState.get_fieldFc                    s   g }ˆj jD ]7}t|ddƒr|rqt|tjƒrq|j}z| || ¡ f¡ W q t	y= } zt	d|ˆj j
|f ƒ‚d}~ww |slˆj jD ]'}|j}z| || ¡ f¡ W qD t	yk } zt	d|ˆj j|f ƒ‚d}~ww i }tD ]W}|dv rwqp|ˆj jv rÇ|dkr�ˆj jd }tt|ƒƒ||< qp|dkr¯dd	„ ˆj jD ƒ}	|	D ]
}
|
js©|
 ˆ¡ qŸ|	|d< qp|d
kr¿dd	„ ˆj jD ƒ|d
< qpˆj j| ||< qp|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}|j|v �r(�q|j�r6t |¡}| ¡  n#|ˆju �sB|ˆju �rWt  ¡ }|j!|_!|j|_|ˆju �rV|}n�q| "|j¡ | |j|f¡ �q|d|fgk�rsg }| ˆj j#ˆj j||||ƒS )z3Given a model, return a ModelState representing it.rj   Nz'Couldn't reconstruct field %s on %s: %sz+Couldn't reconstruct m2m field %s on %s: %s)r   r"   r»   r˜   c                 S   ó   g | ]}|  ¡ ‘qS r%   rä   )r*   Úidxr%   r%   r&   r,   J  s    z)ModelState.from_model.<locals>.<listcomp>r¥   c                 S   r,  r%   rä   )r*   Úconr%   r%   r&   r,   P  r  )r»   r*  r*  c                 S   r  r%   rŽ   )r*   rw   r%   r%   r&   r?   \  s    ÿz(ModelState.from_model.<locals>.<setcomp>c                    s@   g }| j D ]}t|dƒr|jjr| ˆ |ƒ¡ q| |¡ q|S )Nr!   )Ú	__bases__r'  r!   ÚabstractrC   r5   )r$   rß   rà   )Úflatten_basesr%   r&   r1  a  s   
z,ModelState.from_model.<locals>.flatten_basesc                    s   ˆ j  | ¡S rP   )Ú__mro__rš   )ÚxrA   r%   r&   Ú<lambda>p  s    z'ModelState.from_model.<locals>.<lambda>©r   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	  t  s
   € ÿ
ÿz(ModelState.from_model.<locals>.<genexpr>c                 s   s&   � | ]}t |tƒpt|tjƒV  qd S rP   )r   r   r(   r   r)   r7  r%   r%   r&   r	  y  s   € 
ÿÚobjects)$r!   Úlocal_fieldsrÀ   r   r   ÚOrderWrtrh   r5   rg   Ú	TypeErrorrþ   Úlocal_many_to_manyÚobject_namer   Úoriginal_attrsr0   r   r˜   Úset_name_with_modelr¥   r…   Úprivate_fieldsr  r    Úanyr)   rŠ   Úuse_in_migrationsr   Ú_set_creation_counterÚ_base_managerÚ_default_managerÚManagerr$   r4   r"   )rð   r$   r  rl   rw   rh   Úer}   Úutr˜   rš   r   Úflattened_basesrß   rŠ   Úmanager_namesÚdefault_manager_shimÚmanagerÚnew_managerr%   )r1  r$   r&   rï     sÖ   ýÿÿ€ÿ	ýÿÿ€ÿ

€
ÿ€€þÿÿþ
ÿ

€úzModelState.from_modelc                 c   sp   � t | jdd„ d�}|D ])\}}| ¡ \}}}}}|r't|ƒ}	||	 ¡ 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&   r4  ¦  s   
 z/ModelState.construct_managers.<locals>.<lambda>r5  N)r  rŠ   Údeconstructr   Ú
as_manager)rN   Úsorted_managersÚmgr_namerL  rP  Úmanager_pathÚ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"   rh   rl   r}   rß   rŠ   )	r  r"   rh   rÙ   rl   r}   rß   r]   rŠ   rR   r%   r%   r&   rg   °  s   ÷zModelState.clonec                    s®   i | j ¥}| dd¡ | jˆ dœ|¥}tdd|ƒ}zt‡ fdd„| jD ƒƒ}W n ty6   td| jf ƒ‚w d	d
„ | j 	¡ D ƒ}||d< d|d< | 
|  ¡ ¡ t| j||ƒS )zACreate a Model object from our current state into the given apps.rº   N)r"   r   ÚMetar%   c                 3   s(   � | ]}t |tƒrˆ  |¡n|V  qd S rP   )r   r   rÈ   r7  r   r%   r&   r	  É  s
   € ÿ
ÿz$ModelState.render.<locals>.<genexpr>z(Cannot resolve one or more bases from %rc                 S   rã   r%   rä   )r*   rh   rw   r%   r%   r&   rç   Ò  r‘   z%ModelState.render.<locals>.<dictcomp>Ú__fake__rø   )r}   r\   r"   Útyper    rß   rÉ   r   rl   r^   rÊ   rY  rh   )rN   r   Úmeta_optionsÚmeta_contentsÚmetarß   Úbodyr%   r   r&   r  ¾  s$   
þ
ÿÿzModelState.renderc                 C   ó4   | j d D ]}|j|kr|  S qtd|| jf ƒ‚)Nr˜   zNo index named %s on model %s©r}   rh   r  )rN   rh   rš   r%   r%   r&   Úget_index_by_nameÛ  ó
   
ÿzModelState.get_index_by_namec                 C   ra  )Nr¥   z"No constraint named %s on model %srb  )rN   rh   r¦   r%   r%   r&   Úget_constraint_by_nameá  rd  z!ModelState.get_constraint_by_namec                 C   s   d| j j| j| jf S )Nz<%s: '%s.%s'>)r  r÷   r"   rh   rR   r%   r%   r&   Ú__repr__ç  s   zModelState.__repr__c                 C   s|   | j |j ko=| j|jko=t| jƒt|jƒko=tdd„ tt| j ¡ ƒt|j ¡ ƒƒD ƒƒo=| j|jko=| j	|j	ko=| j
|j
kS )Nc                 s   sD   � | ]\\}}\}}||ko|  ¡ d d… |  ¡ d d… kV  qdS )r   N)rO  )r*   Úk1Úf1Úk2Úf2r%   r%   r&   r	  ï  s
   € &ÿ
ÿz$ModelState.__eq__.<locals>.<genexpr>)r"   rh   r   rl   ÚallÚzipr  r^   r}   rß   rŠ   ró   r%   r%   r&   rõ   ê  s$   
ÿþþþý

ö
õ
ózModelState.__eq__)NNNrö   )r÷   rø   rù   rú   rO   r   rU   r+  rü   rï   rY  rg   r  rc  re  rf  rõ   r%   r%   r%   r&   rî   Þ  s"    
ÿ&
 rî   )r   )1r   Úcollectionsr   Ú
contextlibr   Ú	functoolsr   Údjango.appsr   Ú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=   rB   rH   rI   rý   rë   rî   r%   r%   r%   r&   Ú<module>   s@    
    r