Ë
    ¦#ijê@  ã                   ó”   — d dl Z d dl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 d d	lmZ d
Z G d„ d«      Zy)é    N)ÚStringIO)Úapps)Úsettings)Úserializers)Úrouter)Úatomic)ÚRemovedInDjango70Warning)Úimport_stringÚtest_c                   óž   — e Zd ZdZd„ Zd„ Zd„ Zd„ Z	 dd„Zd„ Z	d	„ Z
d
„ Zd„ Zd„ Zdd„Zdd„Zdd„Zd„ Zdd„Z	 dd„Zd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚBaseDatabaseCreationzs
    Encapsulate backend-specific differences pertaining to creation and
    destruction of the test database.
    c                 ó   — || _         y ©N©Ú
connection)Úselfr   s     úZ/var/www/html/office/venv/lib/python3.12/site-packages/django/db/backends/base/creation.pyÚ__init__zBaseDatabaseCreation.__init__   s	   € Ø$ˆ�ó    c                 ó   — | ` y r   r   ©r   s    r   Ú__del__zBaseDatabaseCreation.__del__   s   € Ø‰Or   c                 ó6   — | j                   j                  «       S r   )r   Ú_nodb_cursorr   s    r   r   z!BaseDatabaseCreation._nodb_cursor   s   € Ø�‰×+Ñ+Ó-Ð-r   c                 ód   — t         j                  j                  |t        j                  z   «       y r   )ÚsysÚstderrÚwriteÚosÚlinesep)r   Úmsgs     r   ÚlogzBaseDatabaseCreation.log"   s   € Ü�
‰
×Ñ˜œrŸz™zÑ)Õ*r   Nc                 óª  — ddl m} | j                  «       }|dk\  r-d}|rd}| j                  |›d| j	                  ||«      ›d�«       | j                  |||«       | j                  j                  «        |t        j                  | j                  j                     d<   || j                  j                  d<   	 | j                  j                  d	   d
   du rFt        j                  }t        j                  «       D �	ci c]  }	|	j                  d“Œ c}	t        _         |dt!        |dz
  d«      d| j                  j                  d¬«       | j                  j                  d	   d
   du rt        _        	 |�=t#        j$                  ddt&        ¬«       |r| j)                  «       | j                  _         |d| j                  j                  ¬«       | j                  j-                  «        t.        j0                  j3                  d«      dk(  r| j5                  «        |S c c}	w # | j                  j                  d	   d
   du rt        _        w w xY w)z£
        Create a test database, prompting the user for confirmation if the
        database already exists. Return the name of the test database created.
        r   )Úcall_commandé   ÚCreatingzUsing existingú test database for alias ú...ÚNAMEÚTESTÚMIGRATEFNÚmigrateT)Ú	verbosityÚinteractiveÚdatabaseÚ
run_syncdbz¾DatabaseCreation.create_test_db(serialize) is deprecated. Call DatabaseCreation.serialize_test_db() once all test databases are set up instead if you need fixtures persistence between tests.é   )Ú
stacklevelÚcategoryÚcreatecachetable)r/   ÚRUNNING_DJANGOS_TEST_SUITEÚtrue)Údjango.core.managementr$   Ú_get_test_db_namer"   Ú_get_database_display_strÚ_create_test_dbr   Úcloser   Ú	DATABASESÚaliasÚsettings_dictÚMIGRATION_MODULESr   Úget_app_configsÚlabelÚmaxÚwarningsÚwarnr	   Úserialize_db_to_stringÚ_test_serialized_contentsÚensure_connectionr   ÚenvironÚgetÚ mark_expected_failures_and_skips)
r   r-   ÚautoclobberÚ	serializeÚkeepdbr$   Útest_database_nameÚactionÚold_migration_modulesÚapps
             r   Úcreate_test_dbz#BaseDatabaseCreation.create_test_db'   s  € õ 	8à!×3Ñ3Ó5Ðà˜Š>ØˆFÙØ)�à�H‰Hò Ø×2Ñ2°9Ð>PÕQðôð 	×Ñ˜Y¨°VÔ<à�‰×ÑÔØ<NŒ×Ñ˜4Ÿ?™?×0Ñ0Ñ1°&Ñ9Ø0Bˆ�‰×%Ñ% fÑ-ð	CØ�‰×,Ñ,¨VÑ4°YÑ?À5ÑHä(0×(BÑ(BÐ%ä/3×/CÑ/CÓ/Eö.Ø(+�C—I‘I˜t‘Oò.”Ô*ñ ØÜ˜i¨!™m¨QÓ/Ø!ØŸ™×.Ñ.Øõð �‰×,Ñ,¨VÑ4°YÑ?À5ÑHØ-B”Õ*ð Ð Ü�M‰MðMð Ü1õñ à×/Ñ/Ó1ð —‘Ô9ñ 	Ð'°$·/±/×2GÑ2GÕHð 	�‰×)Ñ)Ô+ä�:‰:�>‰>Ð6Ó7¸6ÒAØ×1Ñ1Ô3à!Ð!ùòY.øð �‰×,Ñ,¨VÑ4°YÑ?À5ÑHØ-B”Õ*ð Iús   Â:AH& Ã>H!Ä:H& È!H& È&,Ic                 ó<   — |d   | j                   j                  d<   y)z€
        Set this database up to be used in testing as a mirror of a primary
        database whose settings are given.
        r)   N)r   r>   )r   Úprimary_settings_dicts     r   Úset_as_test_mirrorz'BaseDatabaseCreation.set_as_test_mirror}   s   € ð
 1FÀfÑ0Mˆ�‰×%Ñ% fÒ-r   c                 ó~   ‡ — ˆ fd„}t        «       }t        j                  d |«       d|¬«       |j                  «       S )z¤
        Serialize all data in the database into a JSON string.
        Designed only for test runner usage; will not handle large
        amounts of data.
        c               3   óÖ  •K  — ddl m}   | ‰j                  «      }t        j                  «       D �]2  }|j
                  €Œ|j                  |j                  v sŒ*|j                  t        j                  vsŒG|j                  «       D ]Ù  }|j                  j                  ‰j                  «      sŒ)t        j                  ‰j                  j                   |«      sŒT|j"                  j%                  ‰j                  j                   «      j'                  |j                  j(                  j                  «      }|j*                  rdnd }|j-                  |¬«      E d {  –—†  ŒÛ �Œ5 y 7 Œ
­w)Nr   )ÚMigrationLoaderiÐ  )Ú
chunk_size)Údjango.db.migrations.loaderrX   r   r   r@   Úmodels_modulerA   Úmigrated_appsÚnamer   ÚTEST_NON_SERIALIZED_APPSÚ
get_modelsÚ_metaÚcan_migrater   Úallow_migrate_modelr=   Ú_base_managerÚusingÚorder_byÚpkÚ_prefetch_related_lookupsÚiterator)rX   ÚloaderÚ
app_configÚmodelÚquerysetrY   r   s         €r   Úget_objectsz@BaseDatabaseCreation.serialize_db_to_string.<locals>.get_objectsŒ   s$  øè ø€ ÝCá$ T§_¡_Ó5ˆFÜ"×2Ñ2Ó4ó P�
à×,Ñ,Ñ8Ø"×(Ñ(¨F×,@Ñ,@Ò@Ø"Ÿ™¬x×/PÑ/PÒPà!+×!6Ñ!6Ó!8ò 
P˜Ø Ÿ;™;×2Ñ2Ø ŸO™Oõä$×8Ñ8¸¿¹×9NÑ9NÐPUÕVØ',×':Ñ':×'@Ñ'@Ø $§¡× 5Ñ 5ó(ç&™h u§{¡{§~¡~×':Ñ':Ó;ð %ð )1×(JÒ(J¡ÐPTð 'ð (0×'8Ñ'8ÀJÐ'8Ó'O×OÑOò
PñPð  Pús0   ƒ=E)ÁE)ÁE)Á78E)Â0*E)ÃBE)ÅE'ÅE)ÚjsonN)ÚindentÚstream)r   r   rL   Úgetvalue)r   rm   Úouts   `  r   rE   z+BaseDatabaseCreation.serialize_db_to_string„   s4   ø€ ô	Pô. ‹jˆÜ×Ñ˜f¡k£m¸DÈÕMØ�|‰|‹~Ðr   c                 ó$  — t        |«      }t        «       }t        | j                  j                  ¬«      5  | j                  j                  «       5  t        j                  d|| j                  j                  ¬«      D ]K  }|j                  «        |j                  |j                  j                  j                  j                  «       ŒM 	 ddd«       | j                  j                  |¬«       ddd«       y# 1 sw Y   Œ.xY w# 1 sw Y   yxY w)zw
        Reload the database with data from a string generated by
        the serialize_db_to_string() method.
        )rd   rn   N)Útable_names)r   Úsetr   r   r=   Úconstraint_checks_disabledr   ÚdeserializeÚsaveÚaddÚobjectÚ	__class__r`   Údb_tableÚcheck_constraints)r   Údatart   Úobjs       r   Údeserialize_db_from_stringz/BaseDatabaseCreation.deserialize_db_from_string§   sá   € ô
 ˜‹~ˆÜ“eˆä˜$Ÿ/™/×/Ñ/Ô0ñ 	Gð —‘×;Ñ;Ó=ñ IÜ&×2Ñ2Ø˜D¨¯©×(=Ñ(=ôò I�Cð —H‘H”JØ—O‘O C§J¡J×$8Ñ$8×$>Ñ$>×$GÑ$GÕHñ	I÷Ið �O‰O×-Ñ-¸+Ð-ÔF÷	Gð 	G÷Ið Iú÷	Gð 	Gús$   ¶DÁA;C:Ã$DÃ:D	Ã?DÄDc                 óR   — d| j                   j                  ›d|dk\  rd|z  ›�S d›�S )zR
        Return display string for a database for use in various actions.
        ú'r1   z ('%s')Ú )r   r=   )r   r-   Údatabase_names      r   r9   z.BaseDatabaseCreation._get_database_display_str¼   s<   � ð
 �O‰O×!Ó!Ø+4¸ª>ˆY˜Ñ&ÐAð
ð 	
à?AÐAð
ð 	
r   c                 ó²   — | j                   j                  d   d   r| j                   j                  d   d   S t        | j                   j                  d   z   S )zû
        Internal implementation - return the name of the test DB that will be
        created. Only useful when called from create_test_db() and
        _create_test_db() and when no external munging is done with the 'NAME'
        settings.
        r*   r)   )r   r>   ÚTEST_DATABASE_PREFIXr   s    r   r8   z&BaseDatabaseCreation._get_test_db_nameÅ   sO   € ð �?‰?×(Ñ(¨Ñ0°Ò8Ø—?‘?×0Ñ0°Ñ8¸Ñ@Ð@Ü# d§o¡o×&CÑ&CÀFÑ&KÑKÐKr   c                 ó,   — |j                  d|z  «       y )Nz%CREATE DATABASE %(dbname)s %(suffix)s)Úexecute)r   ÚcursorÚ
parametersrM   s       r   Ú_execute_create_test_dbz,BaseDatabaseCreation._execute_create_test_dbÐ   s   € Ø�‰Ð>ÀÑKÕLr   c           	      ó   — | j                  «       }| j                  j                  j                  |«      | j	                  «       dœ}| j                  «       5 }	 | j                  |||«       ddd«       |S # t        $ �r }|r|cY d}~cddd«       S | j                  d|z  «       |st        d|z  «      }|sdk(  r’	 |dk\  r%| j                  d| j                  ||«      ›d�«       |j                  d	|z  «       | j                  |||«       ne# t        $ r3}| j                  d
|z  «       t        j                  d«       Y d}~n.d}~ww xY w| j                  d«       t        j                  d«       Y d}~�Œd}~ww xY w# 1 sw Y   |S xY w)zF
        Internal implementation - create the test db tables.
        )ÚdbnameÚsuffixNz+Got an error creating the test database: %szXType 'yes' if you would like to try deleting the test database '%s', or 'no' to cancel: Úyesr%   z'Destroying old test database for alias r(   zDROP DATABASE %(dbname)sz-Got an error recreating the test database: %sr1   zTests cancelled.)r8   r   ÚopsÚ
quote_nameÚsql_table_creation_suffixr   r‹   Ú	Exceptionr"   Úinputr9   rˆ   r   Úexit)	r   r-   rK   rM   rN   Útest_db_paramsr‰   ÚeÚconfirms	            r   r:   z$BaseDatabaseCreation._create_test_dbÓ   s�  € ð "×3Ñ3Ó5Ðà—o‘o×)Ñ)×4Ñ4Ð5GÓHØ×4Ñ4Ó6ñ
ˆð
 ×ÑÓ ð !	  Fð  Ø×,Ñ,¨V°^ÀVÔL÷!	 ðF "Ð!øôA ó  ñ Ø-Ô-÷!	 ñ !	 ð —‘ÐFÈÑJÔKÙ"Ü#ð=Ø?QñRó�Gñ  '¨UÒ"2ð$Ø$¨š>Ø ŸHšHð %)×$BÑ$BØ(1Ð3Eõ%&ð!"ôð Ÿ™Ð'AÀNÑ'RÔSØ×4Ñ4°V¸^ÈVÕTøÜ$ò $ØŸ™Ð!PÐSTÑ!TÔUÜŸ™ Ÿ™ûð$úð —H‘HÐ/Ô0Ü—H‘H˜Q”Kÿùð= ú÷!	 ðF "Ð!úsm   ÁFÁA6Á6
F Â E;ÂF ÂFÂ+E;Â>ADÄE;Ä	EÄ)EÅE;ÅEÅ)E;Å5FÅ;F Æ FÆFc                 óÀ   — | j                   j                  d   }|dk\  r-d}|rd}| j                  |›d| j                  ||«      ›d�«       | j	                  |||«       y)z(
        Clone a test database.
        r)   r%   zCloning test databasezUsing existing clonez for alias r(   N)r   r>   r"   r9   Ú_clone_test_db)r   rŽ   r-   rK   rM   Úsource_database_namerO   s          r   Úclone_test_dbz"BaseDatabaseCreation.clone_test_db  sh   € ð  $Ÿ™×<Ñ<¸VÑDÐà˜Š>Ø,ˆFÙØ/�Ø�H‰Hò Ø×2Ñ2°9Ð>RÕSðôð 	×Ñ˜F I¨vÕ6r   c                 ód   — | j                   j                  }i |¥ddj                  |d   |«      i¥S )zX
        Return a modified connection settings dict for the n-th clone of a DB.
        r)   z{}_{})r   r>   Úformat)r   rŽ   Úorig_settings_dicts      r   Úget_test_db_clone_settingsz/BaseDatabaseCreation.get_test_db_clone_settings  sA   € ð "Ÿ_™_×:Ñ:Ðð
Ø ð
à�G—N‘NÐ#5°fÑ#=¸vÓFñ
ð 	
r   c                 ó   — t        d«      ‚)zI
        Internal implementation - duplicate the test db tables.
        znThe database backend doesn't support cloning databases. Disable the option to run tests in parallel processes.)ÚNotImplementedError)r   rŽ   r-   rM   s       r   rš   z#BaseDatabaseCreation._clone_test_db%  s   € ô "ðEó
ð 	
r   c                 ó°  — | j                   j                  «        |€| j                   j                  d   }n| j                  |«      d   }|dk\  r-d}|rd}| j	                  |›d| j                  ||«      ›d�«       |s| j                  ||«       |�D|t        j                  | j                   j                     d<   || j                   j                  d<   yy)zv
        Destroy a test database, prompting the user for confirmation if the
        database already exists.
        Nr)   r%   Ú
DestroyingÚ
Preservingr'   r(   )
r   r;   r>   r    r"   r9   Ú_destroy_test_dbr   r<   r=   )r   Úold_database_namer-   rM   rŽ   rN   rO   s          r   Údestroy_test_dbz$BaseDatabaseCreation.destroy_test_db.  sÕ   € ð 	�‰×ÑÔØˆ>Ø!%§¡×!>Ñ!>¸vÑ!FÑà!%×!@Ñ!@ÀÓ!HÈÑ!PÐà˜Š>Ø!ˆFÙØ%�Ø�H‰Hò Ø×2Ñ2°9Ð>PÕQðôñ Ø×!Ñ!Ð"4°iÔ@ð Ð(Ø@QŒH×Ñ˜tŸ™×4Ñ4Ñ5°fÑ=Ø4EˆD�O‰O×)Ñ)¨&Ò1ð )r   c                 ó¼   — | j                  «       5 }|j                  d| j                  j                  j	                  |«      z  «       ddd«       y# 1 sw Y   yxY w)zF
        Internal implementation - remove the test db tables.
        zDROP DATABASE %sN)r   rˆ   r   r�   r‘   )r   rN   r-   r‰   s       r   r¦   z%BaseDatabaseCreation._destroy_test_dbQ  sQ   € ð ×ÑÓ ð 	 FØ�N‰NØ" T§_¡_×%8Ñ%8×%CÑ%CÐDVÓ%WÑWô÷	÷ 	ñ 	ús   ‘8AÁAc           
      ó|  — ddl m}m} | j                  j                  j
                  D ]h  }|j                  d«      \  }}}|j                  d«      d   }|t        j                  v sŒ?t        |«      }t        ||«      }	t        || ||	«      «       Œj | j                  j                  j                  j                  «       D ]x  \  }
}|D ]n  }|j                  d«      \  }}}|j                  d«      d   }|t        j                  v sŒ?t        |«      }t        ||«      }	t        ||  ||
«      |	«      «       Œp Œz y)z›
        Mark tests in Django's test suite which are expected failures on this
        database and test which should be skipped on this database.
        r   )ÚexpectedFailureÚskipú.N)Úunittestr«   r¬   r   ÚfeaturesÚdjango_test_expected_failuresÚ
rpartitionÚsplitr   ÚINSTALLED_APPSr
   ÚgetattrÚsetattrÚdjango_test_skipsÚitems)r   r«   r¬   Ú	test_nameÚtest_case_nameÚ_Útest_method_nameÚtest_appÚ	test_caseÚtest_methodÚreasonÚtestss               r   rJ   z5BaseDatabaseCreation.mark_expected_failures_and_skips^  s5  € ÷ 	3àŸ™×1Ñ1×OÑOò 	SˆIØ2;×2FÑ2FÀsÓ2KÑ/ˆN˜AÐ/Ø —‘ sÓ+¨AÑ.ˆHàœ8×2Ñ2Ò2Ü)¨.Ó9�	Ü% iÐ1AÓB�Ü˜	Ð#3±_À[Ó5QÕRð	Sð "Ÿ_™_×5Ñ5×GÑG×MÑMÓOò 		T‰MˆF�EØ"ò T�	Ø6?×6JÑ6JÈ3Ó6OÑ3� Ð#3Ø$Ÿ?™?¨3Ó/°Ñ2�ð œx×6Ñ6Ò6Ü -¨nÓ =�IÜ")¨)Ð5EÓ"F�KÜ˜IÐ'7¸¹¸f»ÀkÓ9RÕSñTñ		Tr   c                  ó   — y)zQ
        SQL to append to the end of the test table creation statements.
        rƒ   © r   s    r   r’   z.BaseDatabaseCreation.sql_table_creation_suffixy  s   € ð r   c                 óh   — | j                   j                  }|d   |d   |d   | j                  «       fS )zÇ
        Return a tuple with elements of self.connection.settings_dict (a
        DATABASES setting value) that uniquely identify a database
        accordingly to the RDBMS particularities.
        ÚHOSTÚPORTÚENGINE)r   r>   r8   )r   r>   s     r   Útest_db_signaturez&BaseDatabaseCreation.test_db_signature  sA   € ð Ÿ™×5Ñ5ˆà˜&Ñ!Ø˜&Ñ!Ø˜(Ñ#Ø×"Ñ"Ó$ð	
ð 	
r   c                 ó¶   — | j                  t        |«      «      }| j                  j                  j	                  |«       | j                  j                  «        y r   )r    Ústrr   r>   Úupdater;   )r   Ú
_worker_idr>   s      r   Úsetup_worker_connectionz,BaseDatabaseCreation.setup_worker_connection�  s@   € Ø×7Ñ7¼¸J»ÓHˆð
 	�‰×%Ñ%×,Ñ,¨]Ô;Ø�‰×ÑÕr   )r%   FNF)F)r%   FF)Nr%   FN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r"   rR   rU   rE   r€   r9   r8   r‹   r:   rœ   r    rš   r¨   r¦   rJ   r’   rÇ   rÌ   rÂ   r   r   r   r      s‰   „ ñò
%òò.ò+ð FKóT"òlNò!òFGò*
ò	LóMó-"ó^7ò,
ó
ð IMó!FòFòTò6ò
ó r   r   )r   r   rC   Úior   Údjango.appsr   Údjango.confr   Údjango.corer   Ú	django.dbr   Údjango.db.transactionr   Údjango.utils.deprecationr	   Údjango.utils.module_loadingr
   r†   r   rÂ   r   r   ú<module>rÙ      s:   ðÛ 	Û 
Û Ý å Ý  Ý #Ý Ý (Ý =Ý 5ð Ð ÷A ò A r   