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%   /home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/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)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>>       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 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.
    )r.   r8   r!   r"   r#   r1   extend)r$   seenqueuer9   rel_app_labelrel_model_namer%   r%   r&   get_related_models_recursiveD   s   rC   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   r.   r   	real_apps
is_delayed
_relations)selfr   rF   r%   r%   r&   __init__d   s   

zProjectState.__init__c                 C   s   | j d u r	|   | j S N)rH   resolve_fields_and_relationsrI   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   rH   resolve_model_relations__dict__reload_model)rI   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 rO   )	r   rH   poplistitemsrR   r   unregister_modelclear_cache)rI   r"   r#   rU   Z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namer.   r   toremote_fieldr$   throughfieldsr1   r"   rP   rH   rW   valuesreload_modelsr]   rS   )rI   r"   old_namenew_nameold_name_lowernew_name_lowerZrenamed_modelZold_model_tupleZnew_remote_modelZ	to_reloadrT   rb   field	referenceZchanged_fieldZold_name_keyZnew_name_keyr\   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 )NFTr^   )r   optionsrW   rS   )rI   r"   r#   rp   Zoption_keysrT   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>Tr^   )r   rp   getrS   )rI   r"   r#   option_namerv   rT   objsr%   ru   r&   remove_model_options   s   
z!ProjectState.remove_model_optionsc                 C   s,   | j ||f }t||_| j||dd d S NTr^   )r   rX   managersrS   )rI   r"   r#   r|   rT   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   rp   rS   )rI   r"   r#   rx   rt   rT   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%   rb   rs   obj_namer%   r&   r,          z/ProjectState._remove_option.<locals>.<listcomp>Tr^   r~   )rI   r"   r#   rx   r   rT   ry   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   rs   alt_objr   r%   r&   r,      s    z.ProjectState._alter_option.<locals>.<listcomp>Tr^   r~   )rI   r"   r#   rx   r   r   rT   ry   r%   r   r&   _alter_option   s   
zProjectState._alter_optionc                 C      |  ||d| d S Nindexesr   )rI   r"   r#   indexr%   r%   r&   	add_index      zProjectState.add_indexc                 C   r   r   r   )rI   r"   r#   Z
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   Tr^   )r   rp   rb   ra   r2   rS   )	rI   r"   r#   Zold_index_nameZnew_index_namerT   ry   Znew_indexesrt   r%   r%   r&   rename_index   s   


zProjectState.rename_indexc                 C   r   Nconstraintsr   )rI   r"   r#   
constraintr%   r%   r&   add_constraint   r   zProjectState.add_constraintc                 C   r   r   r   )rI   r"   r#   constraint_namer%   r%   r&   remove_constraint   r   zProjectState.remove_constraintc                 C   s   |  ||d|| d S r   )r   )rI   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 Nr_   )	ra   r   defaultr   rf   rH   resolve_model_field_relationsr/   rS   )rI   r"   r#   rb   rm   preserve_defaultrU   r_   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   rf   rW   rH   r   r/   rS   )rI   r"   r#   rb   rU   rT   	old_fieldr_   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   )ra   r   r   r   rf   rH   rW   r/   r   r   rS   )
rI   r"   r#   rb   rm   r   rU   rf   r   r_   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 |_|rt 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*   Zfrom_field_namerj   ri   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*   Ztogetherr   r%   r&   r,   T  s    TFr   c                    r   r%   r%   )r*   Zto_field_namer   r%   r&   r,   c  r;   r_   )r   rf   rW   KeyErrorr
   rg   getattrr    r   r   rp   r   rc   r   	to_fieldsrH   r`   rb   rS   )rI   r"   r#   ri   rj   rU   rT   rf   foundrm   r   r   rp   optionr_   Z
references_rn   rd   r   rk   rl   Z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)rG   r.   r   	get_modelLookupErrorr=   rC   r   rf   rg   r/   rd   r$   r   r'   r0   r1   r`   update)rI   r"   r#   r_   r5   Z	old_modelrT   Zdirect_related_modelsrm   rA   rB   Z	rel_modelr%   r%   r&   _find_reload_modelr  sD   

zProjectState._find_reload_modelc                 C   s*   d| j v r| |||}| | d S d S rO   )rR   r   _reload)rI   r"   r#   r_   r5   r%   r%   r&   rS     s   
zProjectState.reload_modelTc                 C   sD   d| j v r t }|D ]\}}|| ||| q
| | d S d S rO   )rR   r.   r   r   r   )rI   r   r_   r5   r"   r#   r%   r%   r&   rh     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 rK   )
r   bulk_updaterZ   real_modelsr"   rP   r2   r   r   render_multiple)rI   r5   rA   rB   Zstates_to_be_renderedrT   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   rF   rH   r   rf   )rI   r$   rU   r   rm   	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 }|s%d S | ||||| d S )Nre   )rd   -_get_concrete_models_mapping_and_proxy_modelsr   r$   r   )rI   rU   r   rm   r   rd   r   re   r%   r%   r&   r     s$   
z*ProjectState.resolve_model_field_relationsc                 C   sF   |d u r
|   \}}| j| }|j D ]\}}| |||| qd S rK   )r   r   rf   rY   r   )rI   rU   r   r   rT   r   rm   r%   r%   r&   rQ     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 rK   )r   rg   rf   rY   rb   r   r   dictrH   r   rQ   )rI   rT   r   rm   r   proxiesrU   r%   r%   r&   rL     s   z)ProjectState.resolve_fields_and_relationsc                 C   s   |   \}}t|}|| S rK   )r   r   )rI   r$   concrete_models_mappingr   rU   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 )Nr3   )r   rY   rp   rw   _find_concrete_model_from_proxy)rI   r   proxy_modelsrU   rT   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 rK   )	basesr   r   r(   r   r)   r   rw   r   )rI   r   rT   baseZbase_keyZ
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%   ra   )r*   kvr%   r%   r&   
<dictcomp>?  r   z&ProjectState.clone.<locals>.<dictcomp>r   rF   r   )rD   r   rY   rF   rR   r   ra   rG   )rI   	new_stater%   r%   r&   ra   <  s   
zProjectState.clonec                 C   s$   | j rd| jv r| jd= d S d S d S rO   )rG   rR   rM   r%   r%   r&   clear_delayed_apps_cacheG  s   z%ProjectState.clear_delayed_apps_cachec                 C   s   t | j| jS rK   )	StateAppsrF   r   rM   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)Zinclude_swapped)
get_models
ModelState
from_modelr"   rP   )clsr   Z
app_modelsr$   rT   r%   r%   r&   	from_appsO  s
   
zProjectState.from_appsc                 C   s   | j |j ko| j|jkS rK   r   rI   otherr%   r%   r&   __eq__X  s   zProjectState.__eq__)NNrK   F)T),__name__
__module____qualname____doc__rJ   propertyrN   rV   r]   ro   rr   rz   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rS   rh   r   r   r   rQ   rL   r   r   r   ra   r   r   r   classmethodr   r   r%   r%   r%   r&   rD   ]   sV    


'	

B
2
	



rD   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 rK   )r   r   labelrb   )rI   r   r%   r%   r&   rJ   _  s   
zAppConfigStub.__init__c                 C   s   | j j| j | _d S rK   )r   
all_modelsr   r   rM   r%   r%   r&   import_modelsh  r   zAppConfigStub.import_modelsN)r   r   r   r   rJ   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*   rT   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 rK   )msg)r*   errorr%   r%   r&   	<genexpr>  s    z%StateApps.__init__.<locals>.<genexpr>)r   global_appsZget_app_configr   r2   r   r   rg   sortedsuperrJ   _lockZready_eventr   Zdjango.core.checks.model_checksr   r   r	   ZAUTH_USER_MODELr.   
ValueErrorjoin)rI   rF   r   Zignore_swappabler"   Zappr$   Z
app_labelsapp_configsr   r   errors	__class__r%   r&   rJ   r  s*   
zStateApps.__init__c                 c   s:    | j }d| _ zd V  W || _ |   d S || _ |   w rE   )readyr[   )rI   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 )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   )rI   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   )rI   ra   r"   Z
app_configr%   r%   r&   ra     s   

zStateApps.clonec                 C   s`   || j | |jj< || jvrt|| j|< | | j| _|| j| j|jj< | | |   d S rK   )	r   r!   r#   r   r   r   r   Zdo_pending_operationsr[   )rI   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 rK   )r   r   r   r   )rI   r"   r#   r%   r%   r&   rZ     s   zStateApps.unregister_modelr   )r   r   r   r   rJ   r   r   r   ra   r   rZ   __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st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"   rb   r   rf   rp   
setdefaultr   r)   r   r|   rY   hasattrr   r/   r0   Zmany_to_manyrd   re   )	rI   r"   rb   rf   rp   r   r|   rm   r   r%   r%   r&   rJ     sV   



zModelState.__init__c                 C   s
   | j  S rK   )rb   r`   rM   r%   r%   r&   rP     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)rp   rw   rf   )rI   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rdd	 j jD }	|	D ]
}
|
js|
 q|	|d< qp|d
krdd	 j jD |d
< qpj j| ||< qp|rd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 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.rd   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*   rm   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!   abstractr>   r2   )r$   r   r   )flatten_basesr%   r&   r  a  s   
z,ModelState.from_model.<locals>.flatten_basesc                    s    j | S rK   )__mro__r   )xr<   r%   r&   <lambda>p  s    z'ModelState.from_model.<locals>.<lambda>rq   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   t  s
    
z(ModelState.from_model.<locals>.<genexpr>c                 s   s&    | ]}t |tpt|tjV  qd S rK   )r   r   r(   r   r)   r  r%   r%   r&   r   y  s    
objects)$r!   Zlocal_fieldsr   r   r   ZOrderWrtrb   r2   ra   	TypeErrorr   Zlocal_many_to_manyZobject_namer   Zoriginal_attrsr.   r   r   Zset_name_with_modelr   rw   Zprivate_fieldsr   r    anyr)   r|   Zuse_in_migrationsr   Z_set_creation_counterZ_base_managerZ_default_managerManagerr$   r1   r"   )r   r$   r   rf   rm   rb   erp   utr   r   rq   Zflattened_basesr   r|   Zmanager_namesZdefault_manager_shimmanagerZnew_managerr%   )r  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   )Zcreation_counter)r   r%   r%   r&   r    s   
 z/ModelState.construct_managers.<locals>.<lambda>r  N)r   r|   deconstructr   
as_manager)rI   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"   rb   rf   rp   r   r|   )	r   r"   rb   r   rf   rp   r   rX   r|   rM   r%   r%   r&   ra     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   ZMetar%   c                 3   s(    | ]}t |tr |n|V  qd S rK   )r   r   r   r  r   r%   r&   r     s
    
z$ModelState.render.<locals>.<genexpr>z(Cannot resolve one or more bases from %rc                 S   r   r%   r   )r*   rb   rm   r%   r%   r&   r     r   z%ModelState.render.<locals>.<dictcomp>Z__fake__r   )rp   rW   r"   typer    r   r   r   rf   rY   r   r  rb   )rI   r   Zmeta_optionsZ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rp   rb   r   )rI   rb   r   r%   r%   r&   get_index_by_name  
   
zModelState.get_index_by_namec                 C   r  )Nr   z"No constraint named %s on model %sr  )rI   rb   r   r%   r%   r&   get_constraint_by_name  r  z!ModelState.get_constraint_by_namec                 C   s   d| j j| j| jf S )Nz<%s: '%s.%s'>)r   r   r"   rb   rM   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)r  )r*   Zk1f1Zk2f2r%   r%   r&   r     s
    &
z$ModelState.__eq__.<locals>.<genexpr>)r"   rb   r   rf   allzipr   rY   rp   r   r|   r   r%   r%   r&   r     s$   




zModelState.__eq__)NNNr   )r   r   r   r   rJ   r   rP   r   r   r   r  ra   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=   rC   rD   r   r   r   r%   r%   r%   r&   <module>   s@    
    r