a
    5XhΞ                     @   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%   _/var/www/viveiro_mudafortebrasil/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)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"    
r8   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>)r8   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.
    )r.   r8   r!   r"   r#   r1   extend)r$   seenqueuer9   rel_app_labelrel_model_namer%   r%   r&   get_related_models_recursiveD   s    rB   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   r.   r   	real_apps
is_delayed
_relations)selfr   rE   r%   r%   r&   __init__d   s    
zProjectState.__init__c                 C   s   | j d u r|   | j S N)rG   resolve_fields_and_relationsrH   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   rG   resolve_model_relations__dict__reload_model)rH   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 rN   )	r   rG   poplistitemsrQ   r   unregister_modelclear_cache)rH   r"   r#   rT   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namer.   r   toremote_fieldr$   throughfieldsr1   r"   rO   rG   rV   valuesreload_modelsr\   rR   )rH   r"   old_namenew_nameold_name_lowernew_name_lowerZrenamed_modelZold_model_tupleZnew_remote_modelZ	to_reloadrS   ra   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 )NFTr]   )r   optionsrV   rR   )rH   r"   r#   ro   Zoption_keysrS   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>Tr]   )r   ro   getrR   )rH   r"   r#   option_nameru   rS   objsr%   rt   r&   remove_model_options   s    
z!ProjectState.remove_model_optionsc                 C   s,   | j ||f }t||_| j||dd d S NTr]   )r   rW   managersrR   )rH   r"   r#   r{   rS   r%   r%   r&   alter_model_managers   s    
z!ProjectState.alter_model_managersc                 C   s:   | j ||f }g |j| ||j|< | j||dd d S rz   r   ro   rR   )rH   r"   r#   rw   rs   rS   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%   ra   rr   obj_namer%   r&   r,          z/ProjectState._remove_option.<locals>.<listcomp>Tr]   r}   )rH   r"   r#   rw   r   rS   rx   r%   r   r&   _remove_option   s    
zProjectState._remove_optionc                 C   s   |  ||d| d S Nindexesr~   )rH   r"   r#   indexr%   r%   r&   	add_index   s    zProjectState.add_indexc                 C   s   |  ||d| d S r   r   )rH   r"   r#   Z
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   Tr]   )r   ro   ra   r`   r2   rR   )	rH   r"   r#   Zold_index_nameZnew_index_namerS   rx   Znew_indexesrs   r%   r%   r&   rename_index   s    


zProjectState.rename_indexc                 C   s   |  ||d| d S Nconstraintsr   )rH   r"   r#   
constraintr%   r%   r&   add_constraint   s    zProjectState.add_constraintc                 C   s   |  ||d| d S r   r   )rH   r"   r#   Z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 Nr^   )	r`   r   defaultr   re   rG   resolve_model_field_relationsr/   rR   )rH   r"   r#   ra   rl   preserve_defaultrT   r^   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   re   rV   rG   r   r/   rR   )rH   r"   r#   ra   rT   rS   	old_fieldr^   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 ot	| |||f }	| j
|d|	i d S r   )r`   r   r   r   re   rG   rV   r/   r   r   rR   )
rH   r"   r#   ra   rl   r   rT   re   r   r^   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 ||< qd	}t
| ||f}|D ]V^ }}	}d
}|jr|j\}}t|dd kr |_|rt 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*   Zfrom_field_nameri   rh   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*   Zto_field_namer   r%   r&   r,   L  s   r^   )r   re   rV   KeyErrorr
   rf   getattrr    r   ro   r   rb   r   	to_fieldsrG   r_   ra   rR   )rH   r"   r#   rh   ri   rT   rS   re   foundrl   r   ro   optionr^   Z
references_rm   rc   r   rj   rk   Z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rqjt|j|\}	}
||	|
 f qj|| |D ]P\}	}
z| j|	|
}W n ty   Y q0 |r|t| q|t| q|||f |S )NT)rF   r.   r   	get_modelLookupErrorr<   rB   r   re   rf   r/   rc   r$   r   r'   r0   r1   r_   update)rH   r"   r#   r^   r5   Z	old_modelrS   Zdirect_related_modelsrl   r@   rA   Z	rel_modelr%   r%   r&   _find_reload_model[  s>    

zProjectState._find_reload_modelc                 C   s&   d| j v r"| |||}| | d S rN   )rQ   r   _reload)rH   r"   r#   r^   r5   r%   r%   r&   rR     s    
zProjectState.reload_modelTc                 C   s@   d| j v r<t }|D ]\}}|| ||| q| | d S rN   )rQ   r.   r   r   r   )rH   r   r^   r5   r"   r#   r%   r%   r&   rg     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 rJ   )
r   bulk_updaterY   real_modelsr"   rO   r2   r   r   render_multiple)rH   r5   r@   rA   Zstates_to_be_renderedrS   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   rE   rG   r   re   )rH   r$   rT   r   rl   	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 )Nrd   )rc   -_get_concrete_models_mapping_and_proxy_modelsr   r$   r   )rH   rT   r   rl   r   rc   r   rd   r%   r%   r&   r     s$    
z*ProjectState.resolve_model_field_relationsc                 C   sF   |d u r|   \}}| j| }|j D ]\}}| |||| q(d S rJ   )r   r   re   rX   r   )rH   rT   r   r   rS   r   rl   r%   r%   r&   rP     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 rJ   )r   rf   re   rX   ra   r   r   dictrG   r   rP   )rH   rS   r   rl   r   proxiesrT   r%   r%   r&   rK     s    
z)ProjectState.resolve_fields_and_relationsc                 C   s   |   \}}t|}|| S rJ   )r   r   )rH   r$   concrete_models_mappingr   rT   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 )Nr3   )r   rX   ro   rv   _find_concrete_model_from_proxy)rH   r   proxy_modelsrT   rS   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 rJ   )	basesr   r   r(   r   r)   r   rv   r   )rH   r   rS   baseZ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%   r`   )r*   kvr%   r%   r&   
<dictcomp>(  r   z&ProjectState.clone.<locals>.<dictcomp>r   rE   r   )rC   r   rX   rE   rQ   r   r`   rF   )rH   Z	new_stater%   r%   r&   r`   %  s    
zProjectState.clonec                 C   s   | j rd| jv r| jd= d S rN   )rF   rQ   rL   r%   r%   r&   clear_delayed_apps_cache0  s    z%ProjectState.clear_delayed_apps_cachec                 C   s   t | j| jS rJ   )	StateAppsrE   r   rL   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)Zinclude_swapped)
get_models
ModelState
from_modelr"   rO   )clsr   Z
app_modelsr$   rS   r%   r%   r&   	from_apps8  s
    
zProjectState.from_appsc                 C   s   | j |j ko| j|jkS rJ   r   rH   otherr%   r%   r&   __eq__A  s    zProjectState.__eq__)NN)N)F)F)T)N)N)*__name__
__module____qualname____doc__rI   propertyrM   rU   r\   rn   rq   ry   r|   r~   r   r   r   r   r   r   r   r   r   r   r   rR   rg   r   r   r   rP   rK   r   r   r   r`   r   r   r   classmethodr   r   r%   r%   r%   r&   rC   ]   sP   

'
	
8
2

	 



rC   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 rJ   )r   r   labelra   )rH   r   r%   r%   r&   rI   H  s    zAppConfigStub.__init__c                 C   s   | j j| j | _d S rJ   )r   
all_modelsr   r   rL   r%   r%   r&   import_modelsQ  s    zAppConfigStub.import_modelsN)r   r   r   r   rI   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}	 |rttjhnt }
|	| |
d	}|rtd
dd |D d S )NT)exclude_relsc                 S   s   h | ]
}|j qS r%   )r"   )r*   rS   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 rJ   )msg)r*   errorr%   r%   r&   	<genexpr>}  r   z%StateApps.__init__.<locals>.<genexpr>)r   global_appsZget_app_configr   r2   r   r   rf   sortedsuperrI   _lockZready_eventr   Zdjango.core.checks.model_checksr   r   r	   ZAUTH_USER_MODELr.   
ValueErrorjoin)rH   rE   r   Zignore_swappabler"   Zappr$   Z
app_labelsapp_configsr   r   errors	__class__r%   r&   rI   [  s&    
zStateApps.__init__c                 c   s:   | j }d| _ zd V  W || _ |   n|| _ |   0 d S rD   )readyrZ   )rH   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 s0    Y  d S )NzCannot 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   r2   r   r   )rH   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   )rH   r`   r"   Z
app_configr%   r%   r&   r`     s    

zStateApps.clonec                 C   s`   || j | |jj< || jvr6t|| j|< | | j| _|| j| j|jj< | | |   d S rJ   )	r   r!   r#   r   r   r   r   Zdo_pending_operationsrZ   )rH   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 rJ   )r   r   r   r   )rH   r"   r#   r%   r%   r&   rY     s
    zStateApps.unregister_model)F)r   r   r   r   rI   r   r   r   r`   r   rY   __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rt|jdrtd| |jr^t|jjdr^td| q^| jd D ]}|jstd| qd 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"   ra   r   re   ro   
setdefaultr   r)   r   r{   rX   hasattrr   r/   r0   Zmany_to_manyrc   rd   )	rH   r"   ra   re   ro   r   r{   rl   r   r%   r%   r&   rI     s@    



zModelState.__init__c                 C   s
   | j  S rJ   )ra   r_   rL   r%   r%   r&   rO     s    zModelState.name_lowerc                 C   s    |dkr| j d|}| j| S )N_orderorder_with_respect_to)ro   rv   re   )rH   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}~qd}~0 0 qi }tD ]}|dv rqq|j jv r|dkrBj jd }tt|||< q|dkrjj jd }	tt|	||< q|dkrd	d
 j jD }
|
D ]}|js| q|
|d< q|dkrdd
 j jD |d< qj j| ||< q|rdD ]}||v r||= qn$|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 stjf}g }t }d}j jD ]}|j|v rqnb|jrt|}|  nF|ju s|ju rt  }|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.rc   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*   conr%   r%   r&   r,   7  s   )r   r   r   r   c                 S   s   h | ]
}|j qS r%   r   )r*   rl   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!   Zabstractr=   r2   )r$   r   r   )flatten_basesr%   r&   r   H  s    
z,ModelState.from_model.<locals>.flatten_basesc                    s    j | S rJ   )__mro__r   )xr;   r%   r&   <lambda>W  r   z'ModelState.from_model.<locals>.<lambda>rp   c                 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 rJ   )r   r   r(   r   r)   r   r%   r%   r&   r   `  s   Zobjects)$r!   Zlocal_fieldsr   r   r   ZOrderWrtra   r2   r`   	TypeErrorr   Zlocal_many_to_manyZobject_namer   Zoriginal_attrsr.   r   r   Zset_name_with_modelr   rv   Zprivate_fieldsr   r    anyr)   r{   Zuse_in_migrationsr   Z_set_creation_counterZ_base_managerZ_default_managerManagerr$   r1   r"   )r   r$   r   re   rl   ra   ero   utitr   r   rp   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   )Zcreation_counter)r   r%   r%   r&   r     r   z/ModelState.construct_managers.<locals>.<lambda>r   N)r   r{   deconstructr   
as_manager)rH   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"   ra   re   ro   r   r{   )	r   r"   ra   r   re   ro   r   rW   r{   rL   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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   ZMetar%   c                 3   s&   | ]}t |tr |n|V  qd S rJ   )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*   ra   rl   r%   r%   r&   r     r   z%ModelState.render.<locals>.<dictcomp>Z__fake__r   )r"   ro   typer    r   r   r   re   rX   r   r  ra   )rH   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ro   ra   r   )rH   ra   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  )rH   ra   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"   ra   rL   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*   Zk1f1Zk2f2r%   r%   r&   r     s   z$ModelState.__eq__.<locals>.<genexpr>)r"   ra   r   re   allzipr   rX   ro   r   r{   r   r%   r%   r&   r     s$    




zModelState.__eq__)NNN)F)r   r   r   r   rI   r   rO   r   r   r   r  r`   r   r  r	  r
  r   r%   r%   r%   r&   r     s     
$
 r   )r   )1r   collectionsr   
contextlibr   	functoolsr   Zdjango.appsr   Zdjango.apps.registryr   r   r   Zdjango.confr	   Zdjango.core.exceptionsr
   Z	django.dbr   Zdjango.db.migrations.utilsr   r   Zdjango.db.modelsr   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   utilsr   r'   r8   r<   rB   rC   r   r   r   r%   r%   r%   r&   <module>   s<   
   kr