
    hb                        d dl 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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      Z#y)    N)contextmanager)	AppConfig)Appsapps)settings)models)RECURSIVE_RELATIONSHIP_CONSTANT)DEFAULT_NAMESnormalize_together)make_model_tuple)cached_property)import_string)get_docs_version   )InvalidBasesErrorc                     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      ]/var/www/html/ranktracker/api/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_modelsr5      s     "#!1!1!3h- 	N   EWWTJ 3==Q__8AOO]`Aa!%%agg.!!!//23 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.
    )r5   r   r   r   )r   rel_mods     r   get_related_models_tuplesr8   -   sB     +5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'   r5   r   r   r   r+   extend)r   seenqueuer7   rel_app_labelrel_model_names         r   get_related_models_recursiver?   8   s     5D&E 3(/(?(?AYAY~>*d2-01(123 EKK))5;;+A+ABCCCr    c                       e Zd ZdZddZd Zd ZddZddZddZ	d	 Z
d
 Zd Ze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 | _         |xs g | _        d| _        y NF)r   	real_apps
is_delayed)selfr   rD   s      r   __init__zProjectState.__init__U   s    l"br    c                     |j                   |j                  }}|| j                  ||f<   d| j                  v r| j	                  ||       y y Nr   )r   
name_lowerr   __dict__reload_model)rF   model_stater   r   s       r   	add_modelzProjectState.add_model[   sK     + 5 5{7M7M:	/:Y
+,T]]"i4 #r    c                     | j                   ||f= d| j                  v r7| j                  j                  ||       | j                  j	                          y y rI   )r   rK   r   unregister_modelclear_cacherF   r   r   s      r   remove_modelzProjectState.remove_modela   sJ    KK	:-.T]]"II&&y*= II!!#	 #r    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)rE   r'   r   	get_modelr8   r?   LookupErrorr   fieldsvaluesr)   remote_fieldr   r	   r   r*   r+   lowerupdate)rF   r   r   delayr1   	old_modelrM   direct_related_modelsfieldr=   r>   	rel_models               r   _find_reload_modelzProjectState._find_reload_modeli   s   "DO
	I		++IzBI !:9!E!=i!H kk9j"9: !$ ''..0 	SE  %%++/NN0MeNaNacl0m-~%))=.:N:N:P*QR	S 	34-B 		S)M>S II//~N	 "))*CI*NO"))*Fy*QR		S 	Iz23M  		6  s#   E. E>.	E;:E;>	F
	F
c                 j    d| j                   v r%| j                  |||      }| j                  |       y y rI   )rK   ra   _reload)rF   r   r   r\   r1   s        r   rL   zProjectState.reload_model   s3    T]]"!44Y
ERNLL( #r    c                     d| j                   v rHt               }|D ]'  \  }}|j                  | j                  |||             ) | j	                  |       y y rI   )rK   r'   r[   ra   rc   )rF   r   r\   r1   r   r   s         r   reload_modelszProjectState.reload_models   sZ    T]]" UN)/ ]%	:%%d&=&=iUZ&[\]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N)
r   bulk_updaterP   real_modelsr   rJ   r,   r   KeyErrorrender_multiple)rF   r1   r=   r>   states_to_be_renderedrM   s         r   rc   zProjectState._reload   s   YY""$ 	J1? J-~		**=.IJ	J !#  9900 	:K%%{'='=>.P%,,[9	:
 .< 	:)M>:"kk-*GH &,,[9	: 			!!"78-	J 	J   s   'CC)C&)	C54C5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   rD   r   )rA   r   itemsclonerD   rK   r   rE   )rF   kv	new_states       r   ro   zProjectState.clone   st     -1[[->->-@ATQAqwwyLAnn
	 T]]"!YY__.IN#	 Bs   B
c                 V    | j                   rd| j                  v r| j                  d= y y y rI   )rE   rK   rF   s    r   clear_delayed_apps_cachez%ProjectState.clear_delayed_apps_cache   s'    ??v6f%  7?r    c                 B    t        | j                  | j                        S rg   )	StateAppsrD   r   rt   s    r   r   zProjectState.apps   s    55r    c                 h    t        | j                  | j                  d      | _        | j                  S )NT)ignore_swappable)rw   rD   r   r   rt   s    r   concrete_appszProjectState.concrete_apps   s$    dnndkkDQ	yyr    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   rJ   )clsr   
app_modelsr   rM   s        r   	from_appszProjectState.from_apps   s\     
__T_: 	VE$//6KJUJ--{/E/EFG	V :r    c                     | j                   |j                   k(  xr+ t        | j                        t        |j                        k(  S rg   )r   r'   rD   rF   others     r   __eq__zProjectState.__eq__   s1    {{ell*Zs4>>/Bc%//FZ/ZZr    )NNF)T)__name__
__module____qualname____doc__rG   rN   rS   ra   rL   re   rc   ro   ru   r   r   propertyrz   classmethodr   r    r    r   rA   rA   N   sw     5$.`)
)94	& 6 6    [r    rA   c                   ,     e Zd ZdZdZ fdZd Z xZS )AppConfigStubzAStub of an AppConfig. Only provides a label and a dict of models. c                 4    || _         t        | 	  |d        y rg   )labelsuperrG   )rF   r   	__class__s     r   rG   zAppConfigStub.__init__   s    
 	%r    c                 T    | j                   j                  | j                     | _        y rg   )r   
all_modelsr   r   rt   s    r   import_modelszAppConfigStub.import_models   s    ii**4::6r    )r   r   r   r   pathrG   r   __classcell__r   s   @r   r   r      s    KD&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 )	rw   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rg   )msg).0errors     r   	<genexpr>z%StateApps.__init__.<locals>.<genexpr>  s     &EUuyy&Es   )ri   global_appsget_app_configr}   r,   r~   r   rX   r   sortedr   r   rG   _lockready_eventrk   django.core.checks.model_checksr   r   r   AUTH_USER_MODELr'   
ValueErrorjoin)rF   rD   r   ry   r   appr   rM   
app_labelsr   app_configsr   r   errorsr   s                 r   rG   zStateApps.__init__   sV    " 	YI,,Y7C) Y  ''
(=(=eRV(=(WXY	Y
 @Mv}}Ok++O
O9?@Y)@Yj@Y9Z[}U+[[%
 
B}v}}B1A1ABC 	KAQ"8#;#;<=WZW\'V<TYY&Ef&EEFF ! P[s   =E#E!c              #      K   | j                   }d| _         	 d  || _         | j                          y # || _         | j                          w xY wwrC   )readyrQ   )rF   r   s     r   rh   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)rh   renderr   r,   r   r   )rF   model_statesunrendered_modelsnew_unrendered_modelsr   s        r   rk   zStateApps.render_multiple$  s    
  	: ,#(*%. <E<T*<
 ,-5F1GG+ '<=M=OQ  %:! $	: 	: - <-44U;<	: 	:s-   BA37B3BBBBBc                    t        g i       }t        j                  | j                        |_        t        j                  | j                        |_        |j                  j                         D ]	  }||_         | j                  |_        |S )z Return a clone of this registry.)rw   copydeepcopyr   r   rX   r   ri   )rF   ro   
app_configs      r   ro   zStateApps.clone>  st    "b!==9 MM$*:*:;++224 	$J#JO	$ !,,r    c                    || j                   |   |j                  j                  <   || j                  vr@t	        |      | j                  |<   | | j                  |   _        i | j                  |   _        || j                  |   j                  |j                  j                  <   | j                  |       | j                          y rg   )	r   r   r   r   r   r   r   do_pending_operationsrQ   )rF   r   r   s      r   register_modelzStateApps.register_modelJ  s    =B	"5;;#9#9:D,,,*7	*BDY'/3DY',13DY'.EJ#**5;;+A+AB""5)r    c                 x    	 | j                   |   |= | j                  |   j                  |= y # t        $ r Y y w xY wrg   )r   r   r   rj   rR   s      r   rP   zStateApps.unregister_modelT  sC    		*:6  +22:> 		s   *- 	99r   )r   r   r   r   rG   r   rh   rk   ro   r   rP   r   r   s   @r   rw   rw      s6    G> 	 	:4
r    rw   c                   d    e Zd ZdZddZe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|z        |j                  s]t        |j                   j"                  d      s~t        d|z         | j                  d   D ]  }|j                  rt        d|z         y )	Nindexesconstraintsr   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   namedictrW   options
setdefaultr   r&   basesmanagersrn   hasattrr   r)   r*   many_to_manyrY   through)	rF   r   r   rW   r   r   r   r_   indexs	            r   rG   zModelState.__init__g  sT   "	6l}"	2.r2-v||o
 B;;,,. 	KD%ug& MPTT    WU-@-@'%J 68<=  !!ge.@.@.H.H'&R 68<= 	$ \\), 	E:: +-23 	r    c                 6    | j                   j                         S rg   )r   rZ   rt   s    r   rJ   zModelState.name_lower  s    yy  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 ]F  }|dv r	|j                   j                  v s"|dk(  r1j                   j                  d   }t        t!        |            ||<   X|d	k(  r1j                   j                  d	   }	t        t!        |	            ||<   |d
k(  r\j                   j"                  D 
cg c]  }
|
j                          }}
|D ]   }|j                  r|j%                         " ||d
<   |dk(  r7j                   j&                  D cg c]  }|j                          c}|d<   +j                   j                  |   ||<   I |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.rY   NzCouldn't reconstruct field z on z: zCouldn't reconstruct m2m field )r   r   unique_togetherindex_togetherr   r   )r   r   order_with_respect_tor   c                     g }| j                   D ]M  }t        |d      r.|j                  j                  r|j	                   |             =|j                  |       O |S )Nr   )	__bases__r   r   abstractr:   r,   )r   r   baseflatten_basess      r   r   z,ModelState.from_model.<locals>.flatten_bases  sU    E '4)djj.A.ALLt!45LL&	'
 Lr    c                 :    j                   j                  |       S rg   )__mro__r   )xr   s    r   <lambda>z'ModelState.from_model.<locals>.<lambda>  s    %--J]J]^_J` r    keyc              3   d   K   | ](  }t        |d       r|j                  j                  n| * yw)r   N)r   r   label_lowerr   r   s     r   r   z(ModelState.from_model.<locals>.<genexpr>  s8      
  4) 

&&
s   .0c              3   t   K   | ]0  }t        |t              xs t        |t        j                         2 y wrg   )r   r   r%   r   r&   r   s     r   r   z(ModelState.from_model.<locals>.<genexpr>  s+     _QUJtS)KZfll-KK_s   68objects)$r   local_fieldsgetattrr   r   OrderWrtr   r,   ro   	TypeErrorr   local_many_to_manyobject_namer
   original_attrsr'   r   r   set_name_with_modelr   getprivate_fieldsr   r   anyr&   r   use_in_migrationsr   _set_creation_counter_base_manager_default_managerManagerr   r+   r   )r   r   r   rW   r_   r   er   utitidxr   r   conr   flattened_basesr   r   manager_namesdefault_manager_shimmanagernew_managerr   s    `                    @r   r   zModelState.from_model  s:    [[-- 	Eund3%1::DtU[[]34	 77 	zzMM4"78	 ! 	ED,,333,,334EFB$'(:2(>$?GDM--334DEB$'(:2(>$?GDMY&6;kk6I6IJssyy{JGJ!( =$zz!55e<= *1GI&]*EJ[[E\E\-]cciik-]GM*$)KK$>$>t$DGDM)	E. U %'>% [[01ekkNhNh5iUejj5ii/0	 !]5%9!:@`a  
 (
 
 _Y^__\\OE#{{++ 	9G||},**"ii0113E///7e>T>T3T$nn.$+MM!#*<< e444+6(gll+OOW\\;78%	9* $89::H KK!!KK##
 	
W  KK%%!   ! #//%  ( K .^ 6jsB   !P!!Q7Q:Q?R	P>(P99P>	Q7
(Q22Q7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)rq   s    r   r   z/ModelState.construct_managers.<locals>.<lambda>  s    ad>S>S r    r   N)r   r   deconstructr   
as_manager)rF   sorted_managersmgr_namer   r  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 >>>	?s   A3A5c           
          | j                  | j                  | j                  t        | j                        t        | j
                        | j                  t        | j                              S )z(Return an exact copy of this ModelState.)r   r   rW   r   r   r   )	r   r   r   r   rW   r   r   listr   rt   s    r   ro   zModelState.clone  sS    ~~nn$ &**$--(  

 
	
r    c                    | j                   d| j                  }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   r   Metar   c              3   d   K   | ]'  }t        |t              rj                  |      n| ) y wrg   )r   r   rU   )r   r   r   s     r   r   z$ModelState.render.<locals>.<genexpr>0  s0       *4D#)>%DHs   -0z&Cannot resolve one or more bases from __fake__r   )r   r   typer   r   rV   r   rW   rn   ro   r[   r  r   )rF   r   meta_contentsmetar   r   r_   bodys    `      r   r   zModelState.render)  s     '+nndSdllSFB.	`  JJ E 8<{{7H7H7JKeekkm#KKV'\ 	D++-.DIIud++  	`#RVR\R\$^__	` 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   r   r   )rF   r   r   s      r   get_index_by_namezModelState.get_index_by_name@  sA    \\), 	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  )rF   r   
constraints      r   get_constraint_by_namez!ModelState.get_constraint_by_nameF  sB    ,,}5 	"J$&!!	" tyyQRRr    c                 j    d| j                   j                  d| j                  d| j                  dS )N<z: 'r   z'>)r   r   r   r   rt   s    r   __repr__zModelState.__repr__L  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)r  )r   k1f1k2f2s        r   r   z$ModelState.__eq__.<locals>.<genexpr>T  sQ      &HRhr2 bIR^^-ab1R^^5Eab5IIIs   AA)r   r   r   rW   allzipr   rn   r   r   r   r   s     r   r   zModelState.__eq__O  s    ^^u. .YY%**$.U\\!22.  *-4;;,,./5<<--/0+ . \\U]]*. ZZ5;;&. ]]enn,	
r    )NNNr   )r   r   r   r   rG   r   rJ   r   r   r  ro   r   r  r  r!  r   r   r    r   r~   r~   \  s^     D ! ! ~
 ~
@?
,.NSV
r    r~   )r   )$r   
contextlibr   django.appsr   django.apps.registryr   r   r   django.confr   	django.dbr   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   r   r5   r8   r?   rA   r   rw   r~   r   r    r   <module>r6     sw     % ! :    K F 3 3 5 1 )=&D,S[ S[l7I 7 e ePB
 B
r    