
    gY                     f   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Z)d Z*d Z+d Z, G d d      Z- G d de      Z. G d de
      Z/ G d  d!      Z0y)#    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_relationc                     t        | t              r2| j                  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   s      r/var/www/python.vincentserveurtest.ovh/public_html/venv/lib/python3.12/site-packages/django/db/migrations/state.py_get_app_label_and_model_namer&      s]    %C#"5zQuU|IYa4II{{$$ekk&<&<<<    c                    | j                         D cg c]  }t        |t        j                        r|  }}t	               }| j
                  j                  dd      D ]m  }|j                  s|j                  t        |j                  t              r8|j                  |j                         |j                  |j                         o | j
                  }|j                  r| |v r|j                  |j                         |S c c}w )zEReturn all models that have a direct relationship to the given model.T)include_parentsinclude_hidden)__subclasses__
issubclassr   Modelsetr!   
get_fieldsis_relationrelated_modelr   r   addr$   appendproxyconcrete_model)msubclassrelated_modelsrelated_fields_modelsfoptss         r%   _get_related_modelsr<   !   s     ((**Hh- 	*  
  EWWTJMM+q4!%%agg.!!!//2 K 77Dzza00d112's   #Dc                     t        |       D ch c].  }|j                  j                  |j                  j                  f0 c}S c c}w )zq
    Return a list of typical (app_label, model_name) tuples for all related
    models for the given model.
    )r<   r!   r"   r#   )r$   rel_mods     r%   get_related_models_tuplesr?   9   sG     +511G 
	 	 '--":":;1  s   3Ac                 Z   t               }t        |       }|D ]b  }|j                  j                  |j                  j                  }}||f|v r6|j                  ||f       |j                  t        |             d || j                  j                  | j                  j                  fhz
  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.   r<   r!   r"   r#   r2   extend)r$   seenqueuer>   rel_app_labelrel_model_names         r%   get_related_models_recursiverF   D   s     5D&EMM##MM$$ & >*d2-01(12  EKK))5;;+A+ABCCCr'   c                      e Zd ZdZd&dZed        Zd Zd Zd Z	d'dZ
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd(dZd(dZd)dZd Zd Z	 d'dZd'dZd Zd Z d Z!d  Z"d! Z#d" Z$e%d#        Z&e'd$        Z(d% Z)y)*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                     |xs i | _         |t               }nt        |t              sJ || _        d| _        d | _        y NF)r   r.   r   	real_apps
is_delayed
_relations)selfr   rK   s      r%   __init__zProjectState.__init__d   s?    lIi---"r'   c                 R    | j                   | j                          | j                   S N)rM   resolve_fields_and_relationsrN   s    r%   	relationszProjectState.relationsp   s"    ??"--/r'   c                     |j                   |j                  f}|| j                  |<   | j                  | j	                  |       d| j
                  v r | j                  |  y y Nr   )r"   
name_lowerr   rM   resolve_model_relations__dict__reload_model)rN   model_state	model_keys      r%   	add_modelzProjectState.add_modelv   s_    ));+A+AA	!,I??&((3T]]"Dy) #r'   c                    ||f}| j                   |= | j                  i| j                  j                  |d        t        | j                  j	                               D ]'  \  }}|j                  |d        |r| j                  |= ) d| j
                  v r4 | j                  j                  |  | j                  j                          y y rV   )	r   rM   poplistitemsrY   r   unregister_modelclear_cache)rN   r"   r#   r\   related_model_keymodel_relationss         r%   remove_modelzProjectState.remove_model~   s    z)	KK	"??&OO	406:4??;P;P;R6S2!?##It4&(9: 7T T]]"&DII&&	2 II!!#	 #r'   c                    |j                         }|j                         }| j                  ||f   j                         }||_        || j                  ||f<   ||f}| d| }t	               }	t        | |      D ]  \  }
}}}d }|j                  r!|j                         }||j                  _        |j                  r#||j                         }||j                  _	        |si||
j                  |<   |	j                  |
j                  |
j                  f        | j                  v||f}||f}|| j                  v r(| j                  j                  |      | j                  |<   | j                  j!                         D ]  }||v s|j                  |      ||<    | j#                  |	d       | j%                  ||       | j'                  ||d       y )Nr   Tdelay)lowerr   clonenamer.   r   toremote_fieldr$   throughfieldsr2   r"   rW   rM   r_   valuesreload_modelsrf   rZ   )rN   r"   old_namenew_nameold_name_lowernew_name_lowerrenamed_modelold_model_tuplenew_remote_model	to_reloadr[   rl   field	referencechanged_fieldold_name_keynew_name_keyre   s                     r%   rename_modelzProjectState.rename_model   s   !)!)I~$=>DDF%1>I~-.$n5'[(4E	3A/4
/Kui !M|| %3C**0   ($)KKMM5E**2+8""4({44k6L6LMN4
 ??&$n4L$n4Lt.040C0CL0Q-#'??#9#9#;?24C4G4G4UOL1 $< 	9D1)^4)^4@r'   c                     | j                   ||f   }i |j                  ||_        |r(|D ]#  }||vs|j                  j                  |d       % | j                  ||d       y )NFTrh   )r   optionsr_   rZ   )rN   r"   r#   r   option_keysr[   keys          r%   alter_model_optionsz ProjectState.alter_model_options   so    kk)Z"78@!4!4@@"g%''++C7 # 	)Zt<r'   c                     | j                   ||f   }|j                  j                  |      x}r5|D cg c]  }t        |      t        |      k7  s| c}|j                  |<   | j	                  ||d       y c c}w NTrh   )r   r   getr    rZ   )rN   r"   r#   option_namevalue_to_remover[   objsobjs           r%   remove_model_optionsz!ProjectState.remove_model_options   s    kk)Z"78&&**;7747#0#uSzU?5K'Kt0K, 	)Zt<0s   A9A9c                 n    | j                   ||f   }t        |      |_        | j                  ||d       y r   )r   r`   managersrZ   )rN   r"   r#   r   r[   s        r%   alter_model_managersz!ProjectState.alter_model_managers   s6    kk)Z"78#H~)Zt<r'   c                     | j                   ||f   }g |j                  |   ||j                  |<   | j                  ||d       y r   )r   r   rZ   )rN   r"   r#   r   r   r[   s         r%   _append_optionzProjectState._append_option   sO    kk)Z"78+S[-@-@-M+Ss+SK()Zt<r'   c                     | j                   ||f   }|j                  |   }|D cg c]  }|j                  |k7  s| c}|j                  |<   | j                  ||d       y c c}w r   )r   r   rl   rZ   )rN   r"   r#   r   obj_namer[   r   r   s           r%   _remove_optionzProjectState._remove_option   sj    kk)Z"78"";/;?+X4C388xCWC4+XK()Zt< ,Ys
   A#A#c                 ,    | j                  ||d|       y Nindexesr   )rN   r"   r#   indexs       r%   	add_indexzProjectState.add_index   s    Iz9eDr'   c                 ,    | j                  ||d|       y r   r   )rN   r"   r#   
index_names       r%   remove_indexzProjectState.remove_index   s    Iz9jIr'   c                 
   | j                   ||f   }|j                  d   }g }|D ]9  }|j                  |k(  r|j                         }||_        |j	                  |       ; ||j                  d<   | j                  ||d       y )Nr   Trh   )r   r   rl   rk   r3   rZ   )	rN   r"   r#   old_index_namenew_index_namer[   r   new_indexesr   s	            r%   rename_indexzProjectState.rename_index   s    kk)Z"78""9-Cxx>)iik)s#	  *5I&)Zt<r'   c                 ,    | j                  ||d|       y Nconstraintsr   )rN   r"   r#   
constraints       r%   add_constraintzProjectState.add_constraint   s    Iz=*Mr'   c                 ,    | j                  ||d|       y r   r   )rN   r"   r#   constraint_names       r%   remove_constraintzProjectState.remove_constraint   s    Iz=/Rr'   c                     |s|j                         }t        |_        n|}||f}|| j                  |   j                  |<   | j
                  | j                  |||       |j                   } | j                  |d|i y Nri   )	rk   r   defaultr   rp   rM   resolve_model_field_relationsr0   rZ   )rN   r"   r#   rl   r{   preserve_defaultr\   ri   s           r%   	add_fieldzProjectState.add_field   s~    KKME(EMEz)	.3I%%d+??&..y$F%%%92E2r'   c                     ||f}| j                   |   }|j                  j                  |      }| j                  | j	                  |||       |j
                   } | j                  |d|i y r   )r   rp   r_   rM   r   r0   rZ   )rN   r"   r#   rl   r\   r[   	old_fieldri   s           r%   remove_fieldzProjectState.remove_field   so    z)	kk),&&**40	??&..y$	J)))92E2r'   c                    |s|j                         }t        |_        n|}||f}| j                  |   j                  }| j
                  U|j                  |      }|j                  r| j                  |||       |||<   |j                  r| j                  |||       n|||<   |j                   xr t        | |||f       }	 | j                  |d|	i y r   )rk   r   r   r   rp   rM   r_   r0   r   r   rZ   )
rN   r"   r#   rl   r{   r   r\   rp   r   ri   s
             r%   alter_fieldzProjectState.alter_field	  s    KKME(EMEz)	Y'..??&

4(I$$229dIN F4L  229dEJ F4L
 %%% 
.A)dE]/
 +
 	92E2r'   c           
         ||f}| j                   |   }|j                  }	 |j                  |      }|||<   |j                         D ]7  }	t        |	dd       }
|
st        |
D cg c]  }||k(  r|n| c}      |	_        9 |j                  }dD ]4  }||v s||   D cg c]  }|D cg c]  }||k(  r|n| c} c}}||<   6 d}t        | |||f      }|D ]c  ^ }}	}d}|j                  s|j                  \  }}t        |dd       |k(  r||_        |s?t        |D cg c]  }||k(  r|n| c}      |	_        e | j                  j|j                         }|j                         }| j                  j                         D ]-  }|||   v s||   j                  |      }	||	_        |	||   |<   /  | j"                  |d	|i y # t        $ r t	        | d| d| d      w xY wc c}w c c}w c c}}w c c}w )
Nr   z has no field named ''from_fields)index_togetherunique_togetherTF
field_nameri   )r   rp   r_   KeyErrorr
   rq   getattrr    r   r   r   rm   r   	to_fieldsrM   rj   rl   rZ   )rN   r"   r#   rs   rt   r\   r[   rp   foundr{   r   from_field_namer   optiontogethernri   
references_r|   rn   r   to_field_nameru   rv   to_models                             r%   rename_fieldzProjectState.rename_field#  sg   z)	kk),##	JJx(E
 !x]]_E!%=K$) 0;/:O %4x$?_T/:%!	 % %%;F  %,FO#$3 @HHx!hXA5xH$3# < #D)h5FG
$. QyE||*3,,'i<t<H.6L+&+ 2;1: )6(AH}T1:'EO %/ ??&%^^-N%^^-N OO224!Xi%88$Y/33NCE!/EJ:?HY'7	 5
 	92E2_  	#+Qzl*?zK 	 I#s/   G #G)
	G3(G.8G3!G9
G&.G3c                    |rd| _         t               }	 | j                  j                  ||      }|rt	        |      }nt        |      }	 | j                  ||f   }t               }|j                  j                         D ]g  }|j                  s|j                  j                  t        k(  r.t        |j                  |      \  }	}
|j!                  |	|
j#                         f       i |j%                  |       |D ]Y  \  }	}
	 | j                  j                  |	|
      }|r|j%                  t	        |             @|j%                  t        |             [ |j!                  ||f       |S # t        $ r Y /w xY w# t        $ r Y w xY w)NT)rL   r.   r   	get_modelr?   rF   LookupErrorr   rp   rq   r0   rn   r$   r   r&   r1   r2   rj   update)rN   r"   r#   ri   r8   	old_modelr[   direct_related_modelsr{   rD   rE   	rel_models               r%   _find_reload_modelzProjectState._find_reload_model[  s   "DO
	I		++IzBI !:9!E!=i!H kk9j"9: !$ ''..0E  %%++/NN0M''1-~ &))=.:N:N:P*QR 1 	34-B)M>S II//~N	 "))*CI*NO"))*Fy*QR .C 	Iz23Q  		:  s#   E. E>.	E;:E;>	F
	F
c                 j    d| j                   v r%| j                  |||      }| j                  |       y y rV   )rY   r   _reload)rN   r"   r#   ri   r8   s        r%   rZ   zProjectState.reload_model  s3    T]]"!44Y
ERNLL( #r'   c                     d| j                   v rHt               }|D ]'  \  }}|j                  | j                  |||             ) | j	                  |       y y rV   )rY   r.   r   r   r   )rN   r   ri   r8   r"   r#   s         r%   rr   zProjectState.reload_models  sW    T]]" UN)/%	:%%++Iz5I *0 LL( #r'   c                    | j                   j                         5  |D ]!  \  }}| j                   j                  ||       # 	 d d d        g }| j                   j                  D ].  }|j                  |j
                  f|v s|j                  |       0 |D ](  \  }}	 | j                  ||f   }|j                  |       * | j                   j                  |       y # 1 sw Y   xY w# t        $ r Y ^w xY wrQ   )
r   bulk_updaterb   real_modelsr"   rW   r3   r   r   render_multiple)rN   r8   rD   rE   states_to_be_renderedr[   s         r%   r   zProjectState._reload  s    YY""$1?-~		**=.I 2@ % !#  9900K%%{'='=>.P%,,[9 1
 .<)M>:"kk-*GH &,,[9 .< 			!!"78- %$   s   'CC)C&)	C54C5c                     t        |g| }|d   | j                  vr	||v r||   }| j                  |   }|| j                  |   j                  v r|||   vsJ |||   |<   y ||   |= ||   s||= y y )Nr   )r   rK   rM   r   rp   )rN   r$   r\   r   r{   	concretesremote_model_keyrelations_to_remote_models           r%   update_model_field_relationz(ProjectState.update_model_field_relation  s     ,E>I>Adnn49IY9V()9:$(OO4D$E!Y/666 %>y%IIII?D%i0<))4Z@,Y7-i8 8r'   c                     |j                   }|sy || j                         \  }}| j                  |j                  ||||       t	        |dd       }|sy | j                  |||||       y )Nro   )rn   -_get_concrete_models_mapping_and_proxy_modelsr   r$   r   )rN   r\   r   r{   r   rn   r   ro   s           r%   r   z*ProjectState.resolve_model_field_relations  s     ))MMOLIq((	
 ,	48((Y
E9	
r'   c                     || j                         \  }}| j                  |   }|j                  j                         D ]  \  }}| j	                  ||||        y rQ   )r   r   rp   ra   r   )rN   r\   r   r   r[   r   r{   s          r%   rX   z$ProjectState.resolve_model_relations  sZ    MMOLIqkk),!,!3!3!9!9!;J..y*eYW "<r'   c                 |   | j                   j                         D ]+  }|j                  j                         D ]  \  }}||_         - t        t        t
        t                    | _        | j                         \  }}|D ]  }| j                  ||        |D ]!  }| j                  ||      | j                  |<   # y rQ   )r   rq   rp   ra   rl   r   r   dictrM   r   rX   )rN   r[   r   r{   r   proxiesr\   s          r%   rR   z)ProjectState.resolve_fields_and_relations  s    ;;--/K%0%7%7%=%=%?!
E'
 &@ 0
 &gk4&@A!OOQ	7"I((I> # !I)-99M)NDOOI& !r'   c                 H    | j                         \  }}t        |      }||   S rQ   )r   r   )rN   r$   concrete_models_mappingr   r\   s        r%   get_concrete_model_keyz#ProjectState.get_concrete_model_key   s0     >>@	
#$U+	&y11r'   c                     i }i }| j                   j                         D ]@  \  }}|j                  j                  d      r|||<   | j	                  ||      ||<   <|||<   B ||fS )Nr4   )r   ra   r   r   _find_concrete_model_from_proxy)rN   r   proxy_modelsr\   r[   s        r%   r   z:ProjectState._get_concrete_models_mapping_and_proxy_models  s    "$&*kk&7&7&9"I{""&&w/*5Y' 88$# (	2 6?'	2 ': '44r'   c                     |j                   D ]b  }t        |t              st        |t        j
                        s.t        |      }|j                  |      }|s|c S | j                  ||      c S  y rQ   )	basesr   r   r,   r   r-   r   r   r   )rN   r   r[   basebase_key
base_states         r%   r   z,ProjectState._find_concrete_model_from_proxy  sa    %%DtS)Zfll-K'-H%))(3J77jQQ &r'   c           	      0   t        | j                  j                         D ci c]  \  }}||j                          c}}| j                        }d| j
                  v r| j                  j                         |_        | j                  |_        |S c c}}w )z*Return an exact copy of this ProjectState.r   rK   r   )rH   r   ra   rk   rK   rY   r   rL   )rN   kv	new_states       r%   rk   zProjectState.clone%  sz     -1[[->->-@A-@TQAqwwyL-@Ann
	 T]]"!YY__.IN#	 Bs   B
c                 V    | j                   rd| j                  v r| j                  d= y y y rV   )rL   rY   rS   s    r%   clear_delayed_apps_cachez%ProjectState.clear_delayed_apps_cache0  s'    ??v6f%  7?r'   c                 B    t        | j                  | j                        S rQ   )	StateAppsrK   r   rS   s    r%   r   zProjectState.apps4  s    55r'   c                     i }|j                  d      D ]2  }t        j                  |      }|||j                  |j                  f<   4  | |      S )z3Take an Apps and return a ProjectState matching it.T)include_swapped)
get_models
ModelState
from_modelr"   rW   )clsr   
app_modelsr$   r[   s        r%   	from_appszProjectState.from_apps8  sU     
__T_:E$//6KJUJ--{/E/EFG ; :r'   c                 j    | j                   |j                   k(  xr | j                  |j                  k(  S rQ   r   rN   others     r%   __eq__zProjectState.__eq__A  s'    {{ell*Pt~~/PPr'   )NNrQ   F)T)*__name__
__module____qualname____doc__rO   propertyrT   r]   rf   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rZ   rr   r   r   r   rX   rR   r   r   r   rk   r   r   r   classmethodr  r   r'   r%   rH   rH   ]   s    
  
*$ %AN===
=
=EJ=NS333463p0d)
)9498 
8XO 25$	R	& 6 6  Qr'   rH   c                       e Zd ZdZd Zd Zy)AppConfigStubzAStub of an AppConfig. Only provides a label and a dict of models.c                 <    d | _         i | _        || _        || _        y rQ   )r   r   labelrl   )rN   r  s     r%   rO   zAppConfigStub.__init__H  s     	 
	r'   c                 T    | j                   j                  | j                     | _        y rQ   )r   
all_modelsr  r   rS   s    r%   import_modelszAppConfigStub.import_modelsQ  s    ii**4::6r'   N)r  r  r	  r
  rO   r  r  r'   r%   r  r  E  s    K7r'   r  c                   L     e Zd ZdZd fd	Zed        Zd Zd Zd Z	d Z
 xZS )	r   zo
    Subclass of the global Apps registry class to better handle dynamic model
    additions and removals.
    c                    g | _         |D ]\  }t        j                  |      }|j                         D ]2  }| j                   j	                  t
        j                  |d             4 ^  |j                         D ch c]  }|j                   }}t        g ||      D 	cg c]  }	t        |	       }
}	t        | 1  |
       d | _        d | _        | j                  g  |j                         | j                          ddlm} |rt%        t&        j(                        hn	t+               } || |      }|r!t-        dj/                  d |D                    y c c}w c c}	w )NT)exclude_relsr   )_check_lazy_references)ignore
c              3   4   K   | ]  }|j                     y wrQ   )msg).0errors     r%   	<genexpr>z%StateApps.__init__.<locals>.<genexpr>}  s     &EfUuyyfs   )r   global_appsget_app_configr   r3   r   r   rq   r"   sortedr  superrO   _lockready_eventr   django.core.checks.model_checksr  r   r	   AUTH_USER_MODELr.   
ValueErrorjoin)rN   rK   r   ignore_swappabler"   appr$   r[   
app_labelsr  app_configsr  r  errors	__class__s                 r%   rO   zStateApps.__init__[  s_    "I,,Y7C)  ''
(=(=eRV(=(WX * #
 @Mv}}Ok++
O.45Ny5N:5N.O
.OUM% .O 	 
 	%
 
B}v}}B1A1ABC 	K =Mh6678RURW 	 (V<TYY&Ef&EEFF + P
s   =E#E!c              #      K   | j                   }d| _         	 d  || _         | j                          y # || _         | j                          w xY wwrJ   )readyrc   )rN   r1  s     r%   r   zStateApps.bulk_update  sI      


	DJ DJs   A3 AAAc                 >   |sy | j                         5  |}|rQg }|D ]  }	 |j                  |         t	        |      t	        |      k(  rt        d|dt               d      |}|rQd d d        y # t        $ r |j                  |       Y rw xY w# 1 sw Y   y xY w)NzCannot resolve bases for z
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/z)/topics/migrations/#dependencies for more)r   renderr   r3   r   r   )rN   model_statesunrendered_modelsnew_unrendered_modelsr$   s        r%   r   zStateApps.render_multiple  s    
  ,#(*%.E<T* /
 ,-5F1GG+ 12B2DF  %:!! $   - <-44U;<  s-   BA37B3BBBBBc                    t        g i       }t        j                  | j                        |_        | j                  D ]3  }t        |      }||_        |j                          ||j                  |<   5 | j                  |_        |S )z Return a clone of this registry.)	r   copydeepcopyr  r-  r  r   r  r   )rN   rk   r"   
app_configs       r%   rk   zStateApps.clone  su    "b!==9))I&y1J#JO$$&+5Ei(	 * !,,r'   c                 f   || j                   |   |j                  j                  <   || j                  vr,t	        |      | j                  |<   | | j                  |   _        || j                  |   j                  |j                  j                  <   | j                  |       | j                          y rQ   )	r  r!   r#   r-  r  r   r   do_pending_operationsrc   )rN   r"   r$   s      r%   register_modelzStateApps.register_model  s    =B	"5;;#9#9:D,,,*7	*BDY'/3DY',EJ#**5;;+A+AB""5)r'   c                 x    	 | j                   |   |= | j                  |   j                  |= y # t        $ r Y y w xY wrQ   )r  r-  r   r   )rN   r"   r#   s      r%   rb   zStateApps.unregister_model  sC    		*:6  +22:> 		s   *- 	99r  )r  r  r	  r
  rO   r   r   r   rk   r=  rb   __classcell__)r/  s   @r%   r   r   U  s7    
"GH 	 	:8r'   r   c                   l    e Zd ZdZ	 ddZed        Zd Zedd       Z	d Z
d Zd	 Zd
 Zd Zd Zd Zy)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           
      &   || _         || _        t        |      | _        |xs i | _        | j                  j                  dg        | j                  j                  dg        |xs t        j                  f| _        |xs g | _	        | j                  j                         D ]  \  }}t        |d      rt        d|z        |j                  r?t        |j                  d      r)t        d| j                    d| j                   d| d      |j                  sxt        |j                   j"                  d      st        d| j                    d| j                   d| d	       | j                  d   D ]  }|j                  rt        d
|z         y )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"   rl   r   rp   r   
setdefaultr   r-   r   r   ra   hasattrr(  r0   r1   many_to_manyrn   ro   )	rN   r"   rl   rp   r   r   r   r{   r   s	            r%   rO   zModelState.__init__  s    #	6l}"	2.r2-v||o
 B;;,,.KD%ug& MPTT    WU-@-@'%J ..)499+Qtf =)) 
 !!ge.@.@.H.H'&R ..)499+Qtf =00  /( \\),E:: +-23  -r'   c                 6    | j                   j                         S rQ   )rl   rj   rS   s    r%   rW   zModelState.name_lower  s    yy  r'   c                 b    |dk(  r| j                   j                  d|      }| j                  |   S )N_orderorder_with_respect_to)r   r   rp   )rN   r   s     r%   	get_fieldzModelState.get_field  s0    !))*A:NJ{{:&&r'   c           
         g }j                   j                  D ][  }t        |dd      r|rt        |t        j
                        r.|j                  }	 |j                  ||j                         f       ] |sIj                   j                  D ]0  }|j                  }	 |j                  ||j                         f       2 i }t        D ]  }|dv r	|j                   j                  v s"|dk(  r1j                   j                  d   }t        t!        |            ||<   X|d	k(  r\j                   j"                  D 	cg c]  }	|	j                          }
}	|
D ]   }|j                  r|j%                         " |
|d	<   |d
k(  r6j                   j&                  D cg c]  }|j                          c}|d
<   j                   j                  |   ||<    |rdD ]
  }||v s||=  nB|j)                  d      j                   j*                  D ch c]  }|j                   c}v r|d= fdt-        t                     fd      }t/        d |D              }t1        d |D              st        j2                  f}g }t               }d}j                   j4                  D ]  }|j                  |v r|j6                  r&t9        j8                  |      }|j;                          nd|j<                  u s|j>                  u rGt	        j@                         }|jB                  |_!        |j                  |_        |j>                  u r|}n|jE                  |j                         |j                  |j                  |f        |d|fgk(  rg } | j                   jF                  j                   j                  ||||      S # t        $ r-}t        d|dj                   j                  d|      d}~ww xY w# t        $ r-}t        d|dj                   j                  d|      d}~ww xY wc c}	w c c}w c c}w )z3Given a model, return a ModelState representing it.rn   NzCouldn't reconstruct field z on z: zCouldn't reconstruct m2m field )r   r"   r   r   r   )r   rH  rH  c                     g }| j                   D ]M  }t        |d      r.|j                  j                  r|j	                   |             =|j                  |       O |S )Nr!   )	__bases__rC  r!   abstractrA   r3   )r$   r   r   flatten_basess      r%   rN  z,ModelState.from_model.<locals>.flatten_basesG  sP    E4)djj.A.ALLt!45LL&	 (
 Lr'   c                 :    j                   j                  |       S rQ   )__mro__r   )xr$   s    r%   <lambda>z'ModelState.from_model.<locals>.<lambda>V  s    U]]5H5H5Kr'   r   c              3   d   K   | ](  }t        |d       r|j                  j                  n| * yw)r!   N)rC  r!   label_lowerr  r   s     r%   r  z(ModelState.from_model.<locals>.<genexpr>Z  s0      
' (/tW'=TZZ##4G's   .0c              3   t   K   | ]0  }t        |t              xs t        |t        j                         2 y wrQ   )r   r   r,   r   r-   rV  s     r%   r  z(ModelState.from_model.<locals>.<genexpr>_  s/      
RW$Zc"Djv||&DDRWs   68objects)$r!   local_fieldsr   r   r   OrderWrtrl   r3   rk   	TypeErrorr  local_many_to_manyobject_namer   original_attrsr.   r   r   set_name_with_modelr   r   private_fieldsr"  r    anyr-   r   use_in_migrationsr8  _set_creation_counter_base_manager_default_managerManagerr$   r2   r"   )r   r$   r  rp   r{   rl   er   utidxr   r   conr   flattened_basesr   r   manager_namesdefault_manager_shimmanagernew_managerrN  s    `                   @r%   r   zModelState.from_model  s    [[--Eund3%1::D
tU[[]34 ." 77zz
MM4"78 8 !MD,,333,,334EFB$'(:2(>$?GDMY&6;kk6I6IJ6Issyy{6IGJ!($zz!55e< ") *1GI&]*/4{{/F/F./F		/F.GM* %*KK$>$>t$DGDM' ", C'> D [[01$)KK$>$>6
$>5EJJ$>6
 
 /0	 !e$%+K

  
'
 

  
RW
 
 \\OE#{{++G||},**"ii0113E///7e>T>T3T$nn.$+MM!#*<< e444+6(gll+OOW\\;78% ,* $89::H KK!!KK##
 	
e   ))	  ! # !!KK33	 ( K.6
sB   !O!!P
Q"QQ	P(PP
	Q (P;;Q c              #      K   t        | j                  d       }|D ]T  \  }}|j                         \  }}}}}|r t        |      }	||	j	                         f >t        |      }
| |
|i |f V yw)z-Deep-clone the managers using deconstruction.c                      | d   j                   S )Nr   )creation_counter)r   s    r%   rR  z/ModelState.construct_managers.<locals>.<lambda>  s    ad>S>Sr'   rS  N)r"  r   deconstructr   
as_manager)rN   sorted_managersmgr_namern  rt  manager_pathqs_pathargskwargsqs_classmanager_classs              r%   construct_managerszModelState.construct_managers  s      !4ST!0Hg>E>Q>Q>S;JgtV(1 3 3 555 -l ;t >v >>> "1s   A3A5c           
          | j                  | j                  | j                  t        | j                        t        | j
                        | j                  t        | j                              S )z(Return an exact copy of this ModelState.)r"   rl   rp   r   r   r   )	r/  r"   rl   r   rp   r   r   r`   r   rS   s    r%   rk   zModelState.clone  sS    ~~nn$ &**$--(  

 
	
r'   c                 
   i | j                   }|j                  dd       | j                  d|}t        dd|      }	 t	        fd| j
                  D              }| j                  j                         D ci c]  \  }}||j                          }}}||d<   d|d	<   |j                  | j                                t        | j                  ||      S # t        $ r t        d| j
                        w xY wc c}}w )
zACreate a Model object from our current state into the given apps.r   N)r"   r   Metar  c              3   d   K   | ]'  }t        |t              rj                  |      n| ) y wrQ   )r   r   r   )r  r   r   s     r%   r  z$ModelState.render.<locals>.<genexpr>  s0      &D *4D#)>%DH&s   -0z&Cannot resolve one or more bases from __fake__r  )r   r_   r"   typer    r   r   r   rp   ra   rk   r   r}  rl   )	rN   r   meta_optionsmeta_contentsmetar   rl   r{   bodys	    `       r%   r3  zModelState.render  s    ($,,' 	)40&*nndSlSFB.	  JJ E 8<{{7H7H7JK7Jeekkm#7JKV'\ 	D++-.DIIud++  	#>BjjJ 	
 Ls   C <C?"C<c                     | j                   d   D ]  }|j                  |k(  s|c S  t        d|d| j                        )Nr   zNo index named 
 on model r   rl   r(  )rN   rl   r   s      r%   get_index_by_namezModelState.get_index_by_name  s<    \\),EzzT! - D$))LMMr'   c                     | j                   d   D ]  }|j                  |k(  s|c S  t        d|d| j                        )Nr   zNo constraint named r  r  )rN   rl   r   s      r%   get_constraint_by_namez!ModelState.get_constraint_by_name  s=    ,,}5J$&!! 6 tyyQRRr'   c                 j    d| j                   j                  d| j                  d| j                  dS )N<z: 'r   z'>)r/  r  r"   rl   rS   s    r%   __repr__zModelState.__repr__  s!    "&.."9"94>>499UUr'   c           
      &   | j                   |j                   k(  xr | j                  |j                  k(  xr t        | j                        t        |j                        k(  xr t	        d t        t        | j                  j                               t        |j                  j                                     D              xrO | j                  |j                  k(  xr4 | j                  |j                  k(  xr | j                  |j                  k(  S )Nc              3      K   | ];  \  \  }}\  }}||k(  xr' |j                         d d |j                         d d k(   = yw)r   N)rs  )r  k1f1k2f2s        r%   r  z$ModelState.__eq__.<locals>.<genexpr>  sV      +&HRhr2 bIR^^-ab1R^^5Eab5III+s   AA)r"   rl   r   rp   allzipr"  ra   r   r   r   r  s     r%   r  zModelState.__eq__  s    ^^u. 2ejj(2T[[!S%662  *-4;;,,./5<<--/0+ 2 .2 u{{*2 %..0	
r'   )NNNr  )r  r  r	  r
  rO   r   rW   rI  r  r   r}  rk   r3  r  r  r  r  r  r'   r%   r   r     sj     KO$L ! !'
 E
 E
N?
,:NSV
r'   r   ) )1r8  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<   r?   rF   rH   r  r   r   r  r'   r%   <module>r     s     # %  ! % 4   4  J ) K F 3 3 5 1 ) #=0D2eQ eQP7I 7 o odX
 X
r'   