o
    þÞhQ  ã                   @   st   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
„ d
eƒZdS )é    N)ÚDecimal)ÚApps)ÚNotSupportedError)ÚBaseDatabaseSchemaEditor)Ú	Statement)Ústrip_quotes)ÚCompositePrimaryKeyÚUniqueConstraintc                       sÂ   e Zd ZdZdZdZeZdZdZdZ	dZ
dZ‡ fdd„Z‡ fd	d
„Zdd„ Zdd„ Z	d#dd„Zd$‡ fdd„	Z‡ fdd„Z‡ fdd„Z	d%dd„Zdd„ Z‡ fdd„Z‡ fdd „Zd!d"„ Z‡  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                    s   | j  ¡ s	tdƒ‚tƒ  ¡ S )NzüSQLite 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__© úa/var/www/html/premium_crap/venv/lib/python3.10/site-packages/django/db/backends/sqlite3/schema.pyr      s
   
ÿ
zDatabaseSchemaEditor.__enter__c                    s(   | j  ¡  tƒ  |||¡ | j  ¡  d S ©N)r   Úcheck_constraintsr   Ú__exit__Úenable_constraint_checking)r   Úexc_typeÚ	exc_valueÚ	tracebackr   r   r   r   &   s   
zDatabaseSchemaEditor.__exit__c                 C   sÀ   zdd l }| |¡}W n ty   Y n
 |jy   Y nw t|tƒr)tt|ƒƒS t|tt	tfƒr5t|ƒS t|tƒrBd| 
dd¡ S |d u rHdS t|tttfƒrVd| ¡  S td|t|ƒf ƒ‚)Nr   z'%s'ú'z''ÚNULLzX'%s'z*Cannot quote parameter value %r of type %s)Úsqlite3ÚadaptÚImportErrorÚProgrammingErrorÚ
isinstanceÚboolÚstrÚintr   ÚfloatÚreplaceÚbytesÚ	bytearrayÚ
memoryviewÚhexÚ
ValueErrorÚtype)r   Úvaluer   r   r   r   Úquote_value+   s*   ÿ

ÿz DatabaseSchemaEditor.quote_valuec                 C   s
   |   |¡S r   )r/   )r   r.   r   r   r   Úprepare_defaultJ   s   
z$DatabaseSchemaEditor.prepare_defaultc              	      sì  ‡fdd„‰‡fdd„ˆj jD ƒ}ˆj j}t|tƒr!| ¡ ||j< ‡fdd„ˆj jD ƒ}i ‰d}|p3g }t|ddƒsCtd	d
„ |D ƒƒrkt	| 
¡ ƒD ]!\‰}	|	jrjt‡fdd
„|D ƒƒsjd|	_|	}|	jrj|ˆ= ||	j= qI|rŠ|||j< | ¡ sŠ|jsŠ|jsŠ|jrŠˆ ˆ |¡¡||j< |D ]W}
|
\}}| |jd¡ | |jd¡ |||j< |jˆ|j< |jr¯qŒ|jrÚ|jsÚ| ¡ sÂˆ ˆ |¡¡}nˆ |¡\}}dˆ |j¡|dœ }|||j< qŒˆ |j¡||j< qŒˆ �r|ˆ j= | ˆ jd¡ ˆ j�rˆ jjj j�rˆ ˆ jj¡S tƒ }‡fdd„ˆj jD ƒ}ˆj j}ˆ �r"‡ fdd„|D ƒ}t	ˆj jƒ}t  |¡}ˆj j!ˆj j"||||dœ}t#dd|ƒ}||d< ˆj$|d< t#ˆj j%ˆj&|ƒ t  |¡}ˆj j!dt'ˆj j"ƒ ||||dœ}t#dd|ƒ}||d< ˆj$|d< t#dˆj j% ˆj&|ƒ}ˆ �r¢ˆ j(|j jj(k�r¢|j j}t)||j(ƒ |j j* +|¡ d|_ˆ ,|¡ ˆ -dˆ |j j"¡d .‡fdd
„|D ƒ¡d .| /¡ ¡ˆ ˆj j"¡f ¡ ˆjˆdd� ˆ 0||j j"ˆj j"¡ ˆj1D ]}ˆ -|¡ �qàg ˆ_1|�rôd|_dS dS )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                    s   | j o| jjˆ u S r   )Úis_relationÚremote_fieldÚmodel)Úf)r3   r   r   Úis_self_referentialc   s   z?DatabaseSchemaEditor._remake_table.<locals>.is_self_referentialc                    s$   i | ]}|j ˆ |ƒr| ¡ n|“qS r   )ÚnameÚclone©Ú.0r4   )r5   r   r   Ú
<dictcomp>g   s    ÿÿz6DatabaseSchemaEditor._remake_table.<locals>.<dictcomp>c                    s&   i | ]}|j d u r|jˆ  |j¡“qS ©F)Ú	generatedÚcolumnÚ
quote_namer8   r   r   r   r:   t   s
    
þNÚprimary_keyFc                 s   s    � | ]\}}t |d dƒV  qdS )r?   FN)Úgetattr©r9   Ú_Ú	new_fieldr   r   r   Ú	<genexpr>   s   € 
ÿz5DatabaseSchemaEditor._remake_table.<locals>.<genexpr>c                 3   s   � | ]
\}}ˆ |j kV  qd S r   ©r6   rA   rE   r   r   rD   ƒ   s
   € ÿ
ýzcoalesce(%(col)s, %(default)s))ÚcolÚdefaultc                    s   g | ]}‡ fd d„|D ƒ‘qS )c                    s   g | ]}ˆ   ||¡‘qS r   )Úget)r9   Ún©Úrename_mappingr   r   Ú
<listcomp>¿   s    zADatabaseSchemaEditor._remake_table.<locals>.<listcomp>.<listcomp>r   )r9   ÚuniquerJ   r   r   rL   ¾   s    ÿÿz6DatabaseSchemaEditor._remake_table.<locals>.<listcomp>c                    s   g | ]
}ˆ j |jvr|‘qS r   )r6   Úfields)r9   Úindex©Údelete_fieldr   r   rL   Å   s    )Ú	app_labelÚdb_tableÚunique_togetherÚindexesÚconstraintsÚappsÚMetar   Ú
__module__znew__%szNew%sú%INSERT INTO %s (%s) SELECT %s FROM %sú, c                 3   s   � | ]}ˆ   |¡V  qd S r   )r>   )r9   Úxr   r   r   rD     s   € )Úhandle_autom2mT)2Ú_metaÚlocal_concrete_fieldsÚpkr"   r   r7   r6   r@   ÚanyÚlistÚitemsr?   Úauto_createdr=   Úhas_db_defaultÚmany_to_manyr<   Úconcreter0   Úeffective_defaultÚpopÚnullÚdb_default_sqlr>   r2   ÚthroughÚdelete_modelr   rT   rU   rV   ÚcopyÚdeepcopyrR   rS   r-   rY   Úobject_nameÚ	__bases__r   ÚattnameÚdelattrÚlocal_fieldsÚremoveÚcreate_modelÚexecuteÚjoinÚvaluesÚalter_db_tableÚdeferred_sql)r   r3   Úcreate_fieldrQ   Úalter_fieldsÚbodyr`   ÚmappingÚrestore_pk_fieldÚfieldÚalter_fieldÚ	old_fieldrC   rG   rB   Úcase_sqlrW   rT   rU   rV   Ú	body_copyÚmeta_contentsÚmetaÚ	new_modelÚauto_pkÚsqlr   )rQ   r5   r3   r6   rK   r   r   Ú_remake_tableM   sü   
þ

þÿü€
ÿþþý
ÿ

þÿ
þ
þ
ÿ
ú

ú

üÿÿý

ÿz"DatabaseSchemaEditor._remake_tableTc                    sj   |r
t ƒ  |¡ d S |  | jd|  |jj¡i ¡ t| jƒD ]}t	|t
ƒr2| |jj¡r2| j |¡ qd S )NÚtable)r   rm   rw   Úsql_delete_tabler>   r^   rS   rb   r{   r"   r   Úreferences_tableru   )r   r3   r]   rŠ   r   r   r   rm     s   ÿÿÿÿ€üz!DatabaseSchemaEditor.delete_modelc                    s–   ddl m} |jr|jjjjr|  |jj¡ dS t|t	ƒrdS |j
s9|js9|jr9|  |¡dus9| ¡ rBt|j|ƒsB| j||d� dS tƒ  ||¡ dS )zCreate a field on a model.r   )ÚValueN)r|   )Údjango.db.models.expressionsr�   rf   r2   rl   r^   rd   rv   r"   r   r?   rM   rj   rh   re   Ú
db_defaultr‹   r   Ú	add_field)r   r3   r�   r�   r   r   r   r’   +  s$   
ýüû	ý
ýzDatabaseSchemaEditor.add_fieldc                    sŽ   |j r|jjjjr|  |jj¡ dS dS | jjjr1|j	s1|j
s1|js1|jr(|js1tƒ  ||¡ dS |j| jd�d du r>dS | j||d� dS )z…
        Remove a field from a model. Usually involves deleting a column,
        but for M2Ms may involve deleting a table.
        )r   r-   NrP   )rf   r2   rl   r^   rd   rm   r   ÚfeaturesÚcan_alter_table_drop_columnr?   rM   Údb_indexÚdb_constraintr   Úremove_fieldÚdb_parametersr‹   )r   r3   r�   r   r   r   r—   J  s(   ÿÿüûúùù	z!DatabaseSchemaEditor.remove_fieldFc	                 C   sN  |j |j kr+|  ||¡|  ||¡kr+|jr|js+|jr|js+|  |  |jj|||¡¡S | j|||fgd� | 	d¡}	| 	d¡}
|j
r¡||ksJ|	|
kr£tƒ }|jj}|jD ]&}|j|kr\qT|jsl|j|jkrk| |j¡ qT|jrz|jjjrz| |j¡ qT|jr—|jD ]}|j|kr‰q�|jjjjr–| |jj¡ q�|D ]}|  |¡ q™dS dS dS )z3Perform a "physical" (non-ManyToMany) field update.©r}   Ú	collationN)r=   Ú
column_sqlr2   r–   rw   Ú_rename_field_sqlr^   rS   r‹   rH   rM   Úsetr3   Úrelated_objectsÚrelated_modelrf   Ú
field_namer6   Úaddr?   rl   rd   )r   r3   rƒ   rC   Úold_typeÚnew_typeÚold_db_paramsÚnew_db_paramsÚstrictÚold_collationÚnew_collationÚrelated_modelsÚoptsr2   rf   rŸ   r   r   r   Ú_alter_fieldf  sX   þýüûÿÿ



€€

€êz!DatabaseSchemaEditor._alter_fieldc                 C   sô   |j jjj|j jjjkr=| j|j j|j jj | ¡ ¡|j jj | ¡ ¡f|j jj | ¡ ¡|j jj | ¡ ¡fgd� dS |  |j j¡ |  	d|  
|j jjj¡d d| ¡ | ¡ g¡d d| ¡ | ¡ g¡|  
|j jjj¡f ¡ |  |j j¡ dS )z*Alter M2Ms to repoint their to= endpoints.r™   NrZ   r[   Úid)r2   rl   r^   rS   r‹   Ú	get_fieldÚm2m_reverse_field_nameÚm2m_field_namerv   rw   r>   rx   Úm2m_column_nameÚm2m_reverse_namerm   )r   r3   rƒ   rC   r¦   r   r   r   Ú_alter_many_to_many   sV   

ÿ
ÿ
ÿù
ÿ
ÿùôþýÿýÿðÿÿz(DatabaseSchemaEditor._alter_many_to_manyc                    óB   t |tƒr|js|js|js|jrtƒ  ||¡ d S |  |¡ d S r   )	r"   r	   Ú	conditionÚcontains_expressionsÚincludeÚ
deferrabler   Úadd_constraintr‹   ©r   r3   Ú
constraintr   r   r   r¸   à  ó   
ÿþýüz#DatabaseSchemaEditor.add_constraintc                    r³   r   )	r"   r	   r´   rµ   r¶   r·   r   Úremove_constraintr‹   r¹   r   r   r   r¼   ë  r»   z&DatabaseSchemaEditor.remove_constraintc                 C   s   d| S )NzCOLLATE r   )r   rš   r   r   r   Ú_collate_sqlö  s   z!DatabaseSchemaEditor._collate_sql)NNN)Tr;   )Ú__name__rY   Ú__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   r/   r0   r‹   rm   r’   r—   r«   r²   r¸   r¼   r½   Ú__classcell__r   r   r   r   r
      s6    ÿ
ÿ M%
÷:@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
   r   r   r   r   Ú<module>   s    