
    6HhQ                     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)CompositePrimaryKey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    Z/var/www/html/planif/env/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                  }t        |t              r|j                         ||j                  <   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 |rp|||j                  <   |j!                         sQ|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,                  sw|j!                         s! j'                   j)                  |            }n j/                  |      \  }}d j                  |j                        |dz  }||	|j                  <    j                  |j                        |	|j                  <   / |r||j                  = |	j+                  |j                  d       |j"                  rO|j0                  j2                  j                   j                  r% j5                  |j0                  j2                        S t7               }j                   j8                  D cg c]"  }|D cg c]  }|
j;                  ||       c}$ }}}j                   j<                  }|r(|D cg c]  }|j                  |j>                  vs| }}t        j                   j@                        }tC        jD                  |      }j                   jF                  j                   jH                  ||||d	}tK        d
d|      }||d
<   jL                  |d<   tK        j                   jN                  jP                  |       tC        jD                  |      }j                   jF                  dtS        j                   jH                        z  ||||d	}tK        d
d|      }||d
<   jL                  |d<   tK        dj                   jN                  z  jP                  |      }|r|jT                  |j                   j                  jT                  k(  rX|j                   j                  }tW        ||jT                         |j                   jX                  j[                  |       d|_         j]                  |        j_                  d j                  |j                   jH                        ddja                   fd|	D              ddja                  |	jc                               d j                  j                   jH                                j5                  d        je                  ||j                   jH                  j                   jH                          jf                  D ]  } j_                  |        g  _3        |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>   s"      >
9E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 %9 INN*1s   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     >$//!,>s   	) SELECT  FROM )handle_autom2mT)4_metalocal_concrete_fieldsrD   clonepkr%   r	   	generatedcolumnrT   r>   anylistitemsr<   auto_createdhas_db_default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delattrlocal_fieldsremovecreate_modelexecutejoinvaluesalter_db_tabledeferred_sql)!r   r9   create_fielddelete_fieldalter_fieldsr;   r:   bodyr\   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   sb   ,	C [[66
 FF!4Q!7AGGIQ>
 
 [[^^b-.HHJDM [[66
{{e# HHdooahh//
 
   #)r<6# >
IU>
 ;
  $DJJL1 2e$$S 1 )5	1 . ).E%',$)) J#ELL12 &2D""# !//1%22l6L6L ))/3/C/C**<80++, ( 	NK#. IyHHY^^T*KK	(($/#,D -6^^N9>>*""~~inn //1"2243I3I)3TUG!%!4!4Y!?JGQ;??9+;+;<&?  -5	((),0OOI<L<L,M	(()'	N* \&&'KK++T2 )) --55;;HH(()B)B)J)JKKv  ++55
 066!^1%6
 

 ++%%#*l.?.?u||.SG  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	+/( _

V 7
s/   ,\4*;\9	]\>(]]	*]	>]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   rk   rw   sql_delete_tablerT   rY   rH   r`   r{   r%   r   references_tableru   )r   r9   rX   r   r   s       r   rk   z!DatabaseSchemaEditor.delete_model  s    G ' LL%%T__U[[-A-AB D--. 2c9-#2F2FKK((3 %%,,S1	2r   c                    ddl m} |j                  rP|j                  j                  j
                  j                  r&| j                  |j                  j                         yt        |t              ry|j                  sO|j                  sC|j                  r7| j                  |      &|j                         r*t        |j                  |      s| j!                  ||       yt"        | I  ||       y)zCreate a field on a model.r   )ValueN)r|   )django.db.models.expressionsr   rd   r8   rj   rY   rb   rv   r%   r	   r<   r   rh   rf   rc   
db_defaultr   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23
  ||:: %%e,8 $$&z%:J:JE/R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}   )rd   r8   rj   rY   rb   rk   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_fieldJ  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   rl   r   setr9   related_objectsrelated_modelrd   
field_namerD   addr<   rj   rb   )r   r9   r   rA   old_typenew_typeold_db_paramsnew_db_paramsstrictold_collationnew_collationrelated_modelsoptsr8   rd   r   s                   r   _alter_fieldz!DatabaseSchemaEditor._alter_fieldf  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 NL#11U: #0088>>KK&**<+D+D+L+LMN "0 2""=12) %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   rj   rY   rH   r   	get_fieldm2m_reverse_field_namem2m_field_namerv   rw   rT   rx   m2m_column_namem2m_reverse_namerk   )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   rk   r   r   r   r   r   r   r   __classcell__)r   s   @r   r   r      s    -MO  #7FQ-"##5
>' IMJ0X2$,>:J 82t>:@	&	&&r   r   )rn   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 Bk&3 k&r   