
    hN                     z    S SK r S SKJr  S SKJr  S SKJr  S SKJr  S SK	J
r
  S SKJr  S SKJrJr   " S	 S
\5      rg)    N)Decimal)Apps)NotSupportedError)BaseDatabaseSchemaEditor)	Statement)strip_quotes)NOT_PROVIDEDUniqueConstraintc                      ^  \ rS rSrSrSrSr\rSrSr	Sr
SrSrU 4S jrU 4S	 jrS
 rS r SS jrSU 4S jjrU 4S jrU 4S jr SS jrS rU 4S jrU 4S jrS rSrU =r$ )DatabaseSchemaEditor   zDROP TABLE %(table)sNzEREFERENCES %(to_table)s (%(to_column)s) DEFERRABLE INITIALLY DEFERREDz,ALTER TABLE %(table)s DROP COLUMN %(column)sz7CREATE UNIQUE INDEX %(name)s ON %(table)s (%(columns)s)zDROP INDEX %(name)sc                 t   > U R                   R                  5       (       d  [        S5      e[        TU ]  5       $ )NzSQLite schema editor cannot be used while foreign key constraint checks are enabled. Make sure to disable them before entering a transaction.atomic() context because SQLite does not support disabling them in the middle of a multi-statement transaction.)
connectiondisable_constraint_checkingr   super	__enter__)self	__class__s    S/var/www/html/env/lib/python3.13/site-packages/django/db/backends/sqlite3/schema.pyr   DatabaseSchemaEditor.__enter__   s:     ::<<#1  w ""    c                    > U R                   R                  5         [        TU ]  XU5        U R                   R	                  5         g N)r   check_constraintsr   __exit__enable_constraint_checking)r   exc_type	exc_value	tracebackr   s       r   r   DatabaseSchemaEditor.__exit__&   s2    ))+i8224r   c                     SS K nUR                  U5      n[	        U[
        5      (       a  [        [        U5      5      $ [	        U[        [        [        45      (       a  [        U5      $ [	        U[        5      (       a  SUR                  SS5      -  $ Uc  g[	        U[        [        [        45      (       a  SUR                  5       -  $ [        SU< S[!        U5      < 35      e! [         a     NWR                   a     Nf = f)	Nr   z'%s''z''NULLzX'%s'zCannot quote parameter value z	 of type )sqlite3adaptImportErrorProgrammingError
isinstanceboolstrintr   floatreplacebytes	bytearray
memoryviewhex
ValueErrortype)r   valuer$   s      r   quote_value DatabaseSchemaEditor.quote_value+   s    	MM%(E eT""s5z?"455u:s##EMM#t444]y*=>> UYY[((@EtE{S '  	'' 		s   C( (
D4DDc                 $    U R                  U5      $ r   )r5   )r   r4   s     r   prepare_default$DatabaseSchemaEditor.prepare_defaultJ   s    &&r   c                 &  ^ ^^ U4S jnTR                   R                   Vs0 s H-  nUR                  U" U5      (       a  UR                  5       OU_M/     nnTR                   R                   Vs0 s H:  nUR                  SL d  M  UR
                  T R                  UR
                  5      _M<     nn0 n	Sn
U=(       d    / n[        USS5      (       d  [        S U 5       5      (       a}  [        UR                  5       5       H`  u  mnUR                  (       d  M  [        U4S jU 5       5      (       a  M5  SUl        Un
UR                  (       d  MQ  UT	 XR
                  	 Mb     U(       a  X'UR                  '   UR                  [        L a_  UR                  (       dN  UR                  (       d=  UR                   (       a,  T R#                  T R%                  U5      5      XR
                  '   U GH<  nUu  pUR'                  UR                  S5        UR'                  UR
                  S5        XUR                  '   UR                  XR                  '   UR                  (       a  My  UR(                  (       a  UR(                  (       dz  UR                  [        L a!  T R#                  T R%                  U5      5      nOT R+                  U5      u  nnST R                  UR
                  5      US.-  nUXR
                  '   GM  T R                  UR
                  5      XR
                  '   GM?     U(       a  XsR                  	 UR'                  UR
                  S5        UR                  (       aT  UR,                  R.                  R                   R                  (       a%  T R1                  UR,                  R.                  5      $ [3        5       nTR                   R4                   VVs/ s H&  nU Vs/ s H  nU	R7                  UU5      PM     snPM(     nnnTR                   R8                  nU(       a.  U Vs/ s H!  nUR                  UR:                  ;  d  M  UPM#     nn[        TR                   R<                  5      n[>        R@                  " U5      nTR                   RB                  TR                   RD                  UUUUS	.n[G        S
SU5      nUUS
'   TRH                  US'   [G        TR                   RJ                  TRL                  U5        [>        R@                  " U5      nTR                   RB                  S[O        TR                   RD                  5      -  UUUUS	.n[G        S
SU5      nUUS
'   TRH                  US'   [G        STR                   RJ                  -  TRL                  U5      nU(       a  URP                  UR                   RR                  RP                  :X  aX  UR                   RR                  n[U        UURP                  5        UR                   RV                  RY                  U5        SUl)        T R[                  U5        T R]                  ST R                  UR                   RD                  5      < SSR_                  U 4S jU 5       5      < SSR_                  URa                  5       5      < ST R                  TR                   RD                  5      < 35        T R1                  TSS9  T Rc                  UUR                   RD                  TR                   RD                  5        T Rd                   H  nT R]                  U5        M     / T l2        U
(       a  SU
l        ggs  snf s  snf s  snf s  snnf s  snf )a$  
Shortcut to transform a model from old_model into new_model

This follows the correct procedure to perform non-rename or column
addition operations based on SQLite's documentation

https://www.sqlite.org/lang_altertable.html#caution

The essential steps are:
  1. Create a table with the updated definition called "new__app_model"
  2. Copy the data from the existing "app_model" table to the new table
  3. Drop the "app_model" table
  4. Rename the "new__app_model" table to "app_model"
  5. Restore any index of the previous "app_model" table.
c                 Z   > U R                   =(       a    U R                  R                  TL $ r   )is_relationremote_fieldmodel)fr>   s    r   is_self_referential?DatabaseSchemaEditor._remake_table.<locals>.is_self_referentialc   s!    ==BQ^^%9%9U%BBr   FNprimary_keyc              3   @   #    U  H  u  p[        US S5      v   M     g7f)rB   FN)getattr).0_	new_fields      r   	<genexpr>5DatabaseSchemaEditor._remake_table.<locals>.<genexpr>x   s!      >
IUGI}e44s   c              3   F   >#    U  H  u  pTUR                   :H  v   M     g 7fr   )name)rE   rF   rG   rK   s      r   rH   rI   |   s%      1 )5 INN*(4   !zcoalesce(%(col)s, %(default)s))coldefault)	app_labeldb_tableunique_togetherindexesconstraintsappsMeta 
__module__znew__%szNew%sINSERT INTO  (, c              3   F   >#    U  H  nTR                  U5      v   M     g 7fr   )
quote_name)rE   xr   s     r   rH   rI      s     >g$//!,,grL   	) SELECT  FROM )handle_autom2mT)3_metalocal_concrete_fieldsrK   clone	generatedcolumnr\   rD   anylistitemsrB   auto_created
db_defaultr	   many_to_manyconcreter8   effective_defaultpopnulldb_default_sqlr=   throughdelete_modelr   rQ   getrR   fieldsrS   copydeepcopyrO   rP   r3   rW   object_name	__bases__r   attnamepkdelattrlocal_fieldsremovecreate_modelexecutejoinvaluesalter_db_tabledeferred_sql) r   r>   create_fielddelete_fieldalter_fieldsr@   r?   bodymappingrename_mappingrestore_pk_fieldfieldalter_field	old_fieldrG   rN   rF   case_sqlrT   uniquenrQ   rR   indexrS   	body_copymeta_contentsmeta	new_modelauto_pksqlrK   s    ``                             @r   _remake_table"DatabaseSchemaEditor._remake_tableM   s=   ,	C [[66
6 FF!4Q!7!7AGGIQ>6 	 
 [[66
6{{e# 0AHHdooahh//6 	 
   #)r<66# >
IU>
 ;
 ;
  $DJJL1e$$$S 1 )5	1 . . ).E%',$))) J#LL1  2 &2""# ''<7%22l6L6L ))/3/C/C**<80++, (K#. IHHY^^T*KK	(($/#, -6^^N>>*""~~inn''<7"2243I3I)3TUG!%!4!4Y!?JGQ;??9+;+;<&?  -5((),0OOI<L<L,M(()' (* &&'KK++T2 )) --55;;HH(()B)B)J)JKKv  ++55
5 066v!^1%v65 	 

 ++%%#*#*%l.?.?u||.S7   5;;223
 MM$'	 ..,,.&
 FB. 	&"'"2"2	,U[[$$eooyA MM$'	..!L1E1E$FF.&
 FB. 	&"'"2"2	,5;;#:#::EOOYW	 L00IOO4F4F4N4NNoo((GIw/OO((//8IL 	)$ 	 	 8 89		>g>>		'..*+ 4 45	
 	%6 	OO$$KK  	
 $$CLL %+/( Q

V 7
s5   4]90]>*]>)
^3^^:^^^c                   > U(       a  [         TU ]  U5        g U R                  U R                  SU R	                  UR
                  R                  5      0-  5        [        U R                  5       Ha  n[        U[        5      (       d  M  UR                  UR
                  R                  5      (       d  MF  U R                  R                  U5        Mc     g )Ntable)r   rr   r   sql_delete_tabler\   ra   rP   rg   r   r(   r   references_tabler}   )r   r>   r`   r   r   s       r   rr   !DatabaseSchemaEditor.delete_model  s    G ' LL%%T__U[[-A-AB D--.c9--#2F2FKK((3 3 %%,,S1	 /r   c                   > SSK Jn  UR                  (       aU  UR                  R                  R
                  R                  (       a&  U R                  UR                  R                  5        gUR                  (       db  UR                  (       dQ  UR                  (       a@  U R                  U5      c.  UR                  [        La+  [        UR                  U5      (       d  U R                  XS9  g[         TU ]E  X5        g)zCreate a field on a model.r   )ValueN)r   )django.db.models.expressionsr   rk   r=   rq   ra   ri   r~   rB   r   ro   rm   rj   r	   r(   r   r   	add_field)r   r>   r   r   r   s       r   r   DatabaseSchemaEditor.add_field$  s    6 %"4"4"<"<"B"B"O"Oe00889 ||:: %%e,8   4"5#3#3U;; u9Ge+r   c                 B  > UR                   (       aV  UR                  R                  R                  R                  (       a&  U R                  UR                  R                  5        ggU R                  R                  R                  (       ae  UR                  (       dT  UR                  (       dC  UR                  (       d2  UR                  (       a  UR                  (       d  [        TU ]9  X5        gUR                  U R                  S9S   c  gU R!                  XS9  g)zm
Remove a field from a model. Usually involves deleting a column,
but for M2Ms may involve deleting a table.
)r   r3   N)r   )rk   r=   rq   ra   ri   rr   r   featurescan_alter_table_drop_columnrB   r   db_indexdb_constraintr   remove_fielddb_parametersr   )r   r>   r   r   s      r   r   !DatabaseSchemaEditor.remove_field@  s     !!))//<<!!%"4"4"<"<= = OO$$@@ %%LLNN''E,?,?G . ""doo">vFNu9r   c	                 .   UR                   UR                   :w  a  U R                  X5      U R                  X5      :X  az  UR                  (       a  UR                  (       dX  UR                  (       a  UR                  (       d6  U R	                  U R                  UR                  R                  X#U5      5      $ U R                  XU4/S9  UR                  S5      n	UR                  S5      n
UR                  (       Ga  XE:w  d  X:w  Ga  [        5       nUR                  R                  nUR                   H  nUR                  U:X  a  M  UR                  (       d9  UR                   UR"                  :X  a  UR%                  UR                  5        M]  M_  UR&                  (       d  Mr  UR(                  R                  R*                  (       d  M  UR%                  UR(                  5        M     UR&                  (       a{  UR                   Hk  nUR                  U:X  a  M  UR                  R(                  R                  R*                  (       d  MF  UR%                  UR                  R(                  5        Mm     U H  nU R                  U5        M     ggg)z3Perform a "physical" (non-ManyToMany) field update.r   	collationN)re   
column_sqlr=   r   r   _rename_field_sqlra   rP   r   rs   r   setr>   related_objectsrelated_modelrk   
field_namerK   addrB   rq   ri   )r   r>   r   rG   old_typenew_typeold_db_paramsnew_db_paramsstrictold_collationnew_collationrelated_modelsoptsr=   rk   r   s                   r   _alter_field!DatabaseSchemaEditor._alter_field\  s    	 0 001T__U5VV&&++))++ <<&&KK(()  	5I0F/GH%))+6%))+6 M$B UN??((D $ 4 4--6#00#..)..@&**<+E+EF A***|/C/C/I/I/V/V/V"&&|';';< !5 $$$($5$5L#11U: #0088>>KKK&**<+D+D+L+LM %6 "0""=1 "0) %C r   c                 J   UR                   R                  R                  R                  UR                   R                  R                  R                  :X  Ga  U R	                  UR                   R                  UR                   R                  R                  R                  UR                  5       5      UR                   R                  R                  R                  UR                  5       5      4UR                   R                  R                  R                  UR                  5       5      UR                   R                  R                  R                  UR                  5       5      4/S9  gU R                  UR                   R                  5        U R                  SU R                  UR                   R                  R                  R                  5      < SSR                  SUR                  5       UR                  5       /5      < SSR                  SUR                  5       UR                  5       /5      < SU R                  UR                   R                  R                  R                  5      < 35        U R                  UR                   R                  5        g)	z*Alter M2Ms to repoint their to= endpoints.r   NrX   rY   rZ   idr^   r_   )r=   rq   ra   rP   r   	get_fieldm2m_reverse_field_namem2m_field_namer~   r   r\   r   m2m_column_namem2m_reverse_namerr   )r   r>   r   rG   r   s        r   _alter_many_to_many(DatabaseSchemaEditor._alter_many_to_many  s    ""**0099%%--33<<=
 &&.. "..66<<FF%<<> "..66<<FF%<<>
 "..66<<FF%446 "..66<<FF%446
  6  	)00889 	 6 6 > > D D M MN		!113!224 		!113!224 	 6 6 > > D D M MN#	
, 	)00889r   c                    > [        U[        5      (       aT  UR                  (       d3  UR                  (       d"  UR                  (       d  UR
                  (       a  [        TU ]  X5        g U R                  U5        g r   )	r(   r
   	conditioncontains_expressionsinclude
deferrabler   add_constraintr   r   r>   
constraintr   s      r   r   #DatabaseSchemaEditor.add_constraint  sP    j"233  ..!!$$G"55u%r   c                    > [        U[        5      (       aT  UR                  (       d3  UR                  (       d"  UR                  (       d  UR
                  (       a  [        TU ]  X5        g U R                  U5        g r   )	r(   r
   r   r   r   r   r   remove_constraintr   r   s      r   r   &DatabaseSchemaEditor.remove_constraint  sP    j"233  ..!!$$G%e8u%r   c                     SU-   $ )NzCOLLATE rV   )r   r   s     r   _collate_sql!DatabaseSchemaEditor._collate_sql  s    I%%r   )r   )NNN)T)F)__name__rW   __qualname____firstlineno__r   sql_create_fksql_create_inline_fksql_create_column_inline_fksql_delete_columnsql_create_uniquesql_delete_uniquesql_alter_table_commentsql_alter_column_commentr   r   r5   r8   r   rr   r   r   r   r   r   r   r   __static_attributes____classcell__)r   s   @r   r   r      s    -MO  #7FQ-"##5
>' IMC0J2$,8:J 82t>:@	&	&& &r   r   )ru   decimalr   django.apps.registryr   	django.dbr   django.db.backends.base.schemar   !django.db.backends.ddl_referencesr   django.db.backends.utilsr   django.db.modelsr	   r
   r   rV   r   r   <module>r      s,      % ' C 7 1 ;a&3 a&r   