
    gN                     z    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mZ  G d	 d
e      Zy)    N)Decimal)Apps)NotSupportedError)BaseDatabaseSchemaEditor)	Statement)strip_quotes)NOT_PROVIDEDUniqueConstraintc                        e Zd ZdZdZdZeZdZdZdZ	dZ
dZ fdZ fdZd	 Zd
 Z	 ddZd fd	Z fdZ fdZ	 ddZd Z fdZ fdZd Z xZS )DatabaseSchemaEditorz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                 j    | j                   j                         st        d      t        |          S )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    y/var/www/python.vincentserveurtest.ovh/public_html/venv/lib/python3.12/site-packages/django/db/backends/sqlite3/schema.pyr   zDatabaseSchemaEditor.__enter__   s7     ::<#1  w ""    c                     | j                   j                          t        |   |||       | j                   j	                          y N)r   check_constraintsr   __exit__enable_constraint_checking)r   exc_type	exc_value	tracebackr   s       r   r   zDatabaseSchemaEditor.__exit__&   s4    ))+9i8224r   c                    	 dd l }|j                  |      }t	        |t
              rt        t        |            S t	        |t        t        t        f      rt        |      S t	        |t              rd|j                  dd      z  S |yt	        |t        t        t        f      rd|j                         z  S t        d|dt!        |            # t        $ r Y j                  $ r Y w xY w)	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_valuez DatabaseSchemaEditor.quote_value+   s    	MM%(E eT"s5z?"45u:s#EMM#t444]y*=> UYY[((@EtE{S '  	'' 		s   C 	C-C-,C-c                 $    | j                  |      S r   )r2   )r   r1   s     r   prepare_defaultz$DatabaseSchemaEditor.prepare_defaultJ   s    &&r   c                     fd}j                   j                  D ci c]'  }|j                   ||      r|j                         n|) }}j                   j                  D ci c]6  }|j                  du r&|j
                   j                  |j
                        8 }}i }	d}
|xs g }t        |dd      st        d |D              rit        |j                               D ]M  \  }|j                  st        fd|D              r(d|_        |}
|j                  s>|= ||j
                  = O |rr|||j                  <   |j                  t        u rQ|j                  sE|j                  s9|j                   r- j#                   j%                  |            ||j
                  <   |D ].  }|\  }}|j'                  |j                  d       |j'                  |j
                  d       |||j                  <   |j                  |	|j                  <   |j                  rv|j(                  r|j(                  sy|j                  t        u r! j#                   j%                  |            }n j+                  |      \  }}d j                  |j
                        |dz  }|||j
                  <    j                  |j
                        ||j
                  <   1 |r||j                  = |j'                  |j
                  d       |j                  rO|j,                  j.                  j                   j                  r% j1                  |j,                  j.                        S t3               }j                   j4                  D cg c]"  }|D cg c]  }|	j7                  ||       c}$ }}}j                   j8                  }|r(|D cg c]  }|j                  |j:                  vs| }}t        j                   j<                        }t?        j@                  |      }j                   jB                  j                   jD                  ||||d	}tG        d
d|      }||d
<   jH                  |d<   tG        j                   jJ                  jL                  |       t?        j@                  |      }j                   jB                  dtO        j                   jD                        z  ||||d	}tG        d
d|      }||d
<   jH                  |d<   tG        dj                   jJ                  z  jL                  |      }|r|jP                  |j                   jR                  jP                  k(  rX|j                   jR                  }tU        ||jP                         |j                   jV                  jY                  |       d|_)         j[                  |        j]                  d j                  |j                   jD                        ddj_                   fd|D              ddj_                  |ja                               d j                  j                   jD                                j1                  d        jc                  ||j                   jD                  j                   jD                          jd                  D ]  } j]                  |        g  _2        |
rd|
_        yyc c}w c c}w c c}w c c}}w c c}w )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                 P    | j                   xr | j                  j                  u S r   )is_relationremote_fieldmodel)fr9   s    r   is_self_referentialz?DatabaseSchemaEditor._remake_table.<locals>.is_self_referentialc   s!    ==BQ^^%9%9U%BBr   FNprimary_keyc              3   <   K   | ]  \  }}t        |d d        yw)r<   FN)getattr).0_	new_fields      r   	<genexpr>z5DatabaseSchemaEditor._remake_table.<locals>.<genexpr>x   s!      >
IUIGI}e4s   c              3   B   K   | ]  \  }}|j                   k(    y wr   )name)r?   r@   rA   rD   s      r   rB   z5DatabaseSchemaEditor._remake_table.<locals>.<genexpr>|   s(      1 )59 INN*(4s   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   @   K   | ]  }j                  |        y wr   )
quote_name)r?   xr   s     r   rB   z5DatabaseSchemaEditor._remake_table.<locals>.<genexpr>   s     >g$//!,gs   	) SELECT  FROM )handle_autom2mT)3_metalocal_concrete_fieldsrD   clone	generatedcolumnrT   r>   anylistitemsr<   auto_created
db_defaultr	   many_to_manyconcreter4   effective_defaultpopnulldb_default_sqlr8   throughdelete_modelr   rI   getrJ   fieldsrK   copydeepcopyrG   rH   r0   rO   object_name	__bases__r   attnamepkdelattrlocal_fieldsremovecreate_modelexecutejoinvaluesalter_db_tabledeferred_sql) r   r9   create_fielddelete_fieldalter_fieldsr;   r:   bodymappingrename_mappingrestore_pk_fieldfieldalter_field	old_fieldrA   rF   r@   case_sqlrL   uniquenrI   rJ   indexrK   	body_copymeta_contentsmeta	new_modelauto_pksqlrD   s    ``                             @r   _remake_tablez"DatabaseSchemaEditor._remake_tableM   s7   ,	C [[66
6 FF!4Q!7AGGIQ>6 	 
 [[66
6{{e# HHdooahh//6 	 
   #)r<6# >
IU>
 ;
  $DJJL1e$$S 1 )5	1 . ).E%',$)) J#ELL1  2 &2D""# ''<7%22l6L6L ))/3/C/C**<80++, (K#. IyHHY^^T*KK	(($/#,D -6^^N9>>*""~~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
s/   ,[5';[:	\[?)\\
+\
?\c                    |rt         |   |       y | j                  | j                  d| j	                  |j
                  j                        iz         t        | j                        D ]T  }t        |t              s|j                  |j
                  j                        s:| j                  j                  |       V y )Ntable)r   rj   rw   sql_delete_tablerT   rY   rH   r_   r{   r%   r   references_tableru   )r   r9   rX   r   r   s       r   rj   z!DatabaseSchemaEditor.delete_model  s    G ' LL%%T__U[[-A-AB D--.c9-#2F2FKK((3 %%,,S1	 /r   c                    ddl m} |j                  rP|j                  j                  j
                  j                  r&| j                  |j                  j                         y|j                  sQ|j                  sE|j                  r9| j                  |      (|j                  t        ur*t        |j                  |      s| j                  ||       yt         | E  ||       y)zCreate a field on a model.r   )ValueN)r|   )django.db.models.expressionsr   rc   r8   ri   rY   ra   rv   r<   r   rg   re   rb   r	   r%   r   r   	add_field)r   r9   r   r   r   s       r   r   zDatabaseSchemaEditor.add_field$  s    6 %"4"4"<"<"B"B"O"Oe00889 ||:: %%e,8   4"5#3#3U; u59GeU+r   c                     |j                   rQ|j                  j                  j                  j                  r&| j                  |j                  j                         yy| j                  j                  j                  rM|j                  sA|j                  s5|j                  s)|j                  r|j                  st        | 9  ||       y|j                  | j                        d   y| j!                  ||       y)z
        Remove a field from a model. Usually involves deleting a column,
        but for M2Ms may involve deleting a table.
        )r   r0   N)r}   )rc   r8   ri   rY   ra   rj   r   featurescan_alter_table_drop_columnr<   r   db_indexdb_constraintr   remove_fielddb_parametersr   )r   r9   r   r   s      r   r   z!DatabaseSchemaEditor.remove_field@  s     !!))//<<!!%"4"4"<"<= = OO$$@@ %%LLNN''E,?,?G . ""doo">vFNu59r   c	                    |j                   |j                   k7  r| j                  ||      | j                  ||      k(  rg|j                  r|j                  sO|j                  r|j                  s7| j	                  | j                  |j                  j                  |||            S | j                  |||fg       |j                  d      }	|j                  d      }
|j                  rn||k7  s|	|
k7  rbt               }|j                  j                  }|j                  D ]  }|j                  |k(  r|j                  s6|j                   |j"                  k(  s9|j%                  |j                         U|j&                  sb|j(                  j                  j*                  s|j%                  |j(                          |j&                  rq|j                  D ]b  }|j                  |k(  r|j                  j(                  j                  j*                  s>|j%                  |j                  j(                         d |D ]  }| j                  |        yyy)z3Perform a "physical" (non-ManyToMany) field update.r~   	collationN)r]   
column_sqlr8   r   rw   _rename_field_sqlrY   rH   r   rk   r   setr9   related_objectsrelated_modelrc   
field_namerD   addr<   ri   ra   )r   r9   r   rA   old_typenew_typeold_db_paramsnew_db_paramsstrictold_collationnew_collationrelated_modelsoptsr8   rc   r   s                   r   _alter_fieldz!DatabaseSchemaEditor._alter_field\  s     	 0 00y1T__UI5VV&&++))++ <<&&KK(()Y  	5I0F/GH%))+6%))+6 M]$B UN??((D $ 4 4--6#00#..)..@&**<+E+EF**|/C/C/I/I/V/V"&&|';';< !5 $$$($5$5L#11U: #0088>>KK&**<+D+D+L+LM %6 "0""=1 "0) %C r   c                 F   |j                   j                  j                  j                  |j                   j                  j                  j                  k(  r| j	                  |j                   j                  |j                   j                  j                  j                  |j                               |j                   j                  j                  j                  |j                               f|j                   j                  j                  j                  |j                               |j                   j                  j                  j                  |j                               fg       y| j                  |j                   j                         | j                  d| j                  |j                   j                  j                  j                        ddj                  d|j                         |j                         g      ddj                  d|j                         |j                         g      d| j                  |j                   j                  j                  j                               | j                  |j                   j                         y)	z*Alter M2Ms to repoint their to= endpoints.r   NrP   rQ   rR   idrV   rW   )r8   ri   rY   rH   r   	get_fieldm2m_reverse_field_namem2m_field_namerv   rw   rT   rx   m2m_column_namem2m_reverse_namerj   )r   r9   r   rA   r   s        r   _alter_many_to_manyz(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                     t        |t              rA|j                  s$|j                  s|j                  s|j
                  rt        |   ||       y | j                  |       y r   )	r%   r
   	conditioncontains_expressionsinclude
deferrabler   add_constraintr   r   r9   
constraintr   s      r   r   z#DatabaseSchemaEditor.add_constraint  sO    j"23  ..!!$$G"5*5u%r   c                     t        |t              rA|j                  s$|j                  s|j                  s|j
                  rt        |   ||       y | j                  |       y r   )	r%   r
   r   r   r   r   r   remove_constraintr   r   s      r   r   z&DatabaseSchemaEditor.remove_constraint  sO    j"23  ..!!$$G%eZ8u%r   c                     d|z   S )NzCOLLATE rN   )r   r   s     r   _collate_sqlz!DatabaseSchemaEditor._collate_sql  s    I%%r   )NNN)T)F)__name__rO   __qualname__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   r2   r4   r   rj   r   r   r   r   r   r   r   __classcell__)r   s   @r   r   r      s    -MO  #7FQ-"##5
>' IMC0J2$,8:J 82t>:@	&	&&r   r   )rm   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   rN   r   r   <module>r      s,      % ' C 7 1 ;a&3 a&r   