§
    ¤”jç=  ã                   óˆ   — 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	Z G d
„ d¦  «        ZdS )é    N)ÚStringIO)Úapps)Úsettings)Úserializers)Úrouter)Úatomic)Úimport_stringÚtest_c                   óš   — e 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dS )ÚBaseDatabaseCreationzs
    Encapsulate backend-specific differences pertaining to creation and
    destruction of the test database.
    c                 ó   — || _         d S ©N)Ú
connection)Úselfr   s     úo/var/www/finuniver-perm.ru/html/portfolio/venv/lib/python3.11/site-packages/django/db/backends/base/creation.pyÚ__init__zBaseDatabaseCreation.__init__   s   € Ø$ˆŒˆˆó    c                 ó4   — | j                              ¦   «         S r   )r   Ú_nodb_cursor©r   s    r   r   z!BaseDatabaseCreation._nodb_cursor   s   € ØŒ×+Ò+Ñ-Ô-Ð-r   c                 ó^   — t           j                             |t          j        z   ¦  «         d S r   )ÚsysÚstderrÚwriteÚosÚlinesep)r   Úmsgs     r   ÚlogzBaseDatabaseCreation.log   s%   € ÝŒ
×Ò˜�rœzÑ)Ñ*Ô*Ð*Ð*Ð*r   é   FTc                 ó  — ddl m} |                      ¦   «         }|dk    r5d}|rd}|                      |›d|                      ||¦  «        ›d�¦  «         |                      |||¦  «         | j                             ¦   «          |t          j	        | j        j
                 d<   || j        j        d<   	 | j        j        d	         d
         du r3t          j        }d„ t          j        ¦   «         D ¦   «         t          _         |dt          |dz
  d¦  «        d| j        j
        d¬¦  «         | j        j        d	         d
         du r|t          _        n+# | j        j        d	         d
         du r|t          _        w xY w|r|                      ¦   «         | j        _         |d| j        j
        ¬¦  «         | j                             ¦   «          t&          j                             d¦  «        dk    r|                      ¦   «          |S )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_commandr   ÚCreatingzUsing existingú test database for alias ú...ÚNAMEÚTESTÚMIGRATEFc                 ó   — i | ]
}|j         d “ŒS r   )Úlabel)Ú.0Úapps     r   ú
<dictcomp>z7BaseDatabaseCreation.create_test_db.<locals>.<dictcomp>H   s)   € ð .ð .ð .Ø(+�C”I˜tð.ð .ð .r   ÚmigrateT)Ú	verbosityÚinteractiveÚdatabaseÚ
run_syncdbÚcreatecachetable)r0   Ú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ÚmaxÚ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_moduless	            r   Úcreate_test_dbz#BaseDatabaseCreation.create_test_db    s?  € ð 	8Ð7Ð7Ð7Ð7Ð7à!×3Ò3Ñ5Ô5Ðà˜Š>ˆ>ØˆFØð *Ø)�à�HŠHð �F�FØ×2Ò2°9Ð>PÑQÔQÐQÐQðñô ð ð 	×Ò˜Y¨°VÑ<Ô<Ð<àŒ×ÒÑÔÐØ<N�Ô˜4œ?Ô0Ô1°&Ñ9Ø0BˆŒÔ% fÑ-ð	CØŒÔ,¨VÔ4°YÔ?À5ÐHÐHå(0Ô(BÐ%ð.ð .Ý/3Ô/CÑ/EÔ/Eð.ñ .ô .•Ô*ð ˆLØÝ˜i¨!™m¨QÑ/Ô/Ø!ØœÔ.Øðñ ô ð ð ŒÔ,¨VÔ4°YÔ?À5ÐHÐHØ-B•Ô*øøð ŒÔ,¨VÔ4°YÔ?À5ÐHÐHØ-B•Ô*ÐBÐBÐBÐBð ð 	VØ8<×8SÒ8SÑ8UÔ8UˆDŒOÔ5àˆÐ'°$´/Ô2GÐHÑHÔHÐHð 	Œ×)Ò)Ñ+Ô+Ð+åŒ:�>Š>Ð6Ñ7Ô7¸6ÒAÐAØ×1Ò1Ñ3Ô3Ð3à!Ð!s   Â5A8E Å(E<c                 ó0   — |d         | j         j        d<   dS )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_mirrorj   s   € ð
 1FÀfÔ0MˆŒÔ% fÑ-Ð-Ð-r   c                 ó’   ‡ — ˆ fd„}t          ¦   «         }t          j        d |¦   «         d|¬¦  «         |                     ¦   «         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   ó8  •K  — ddl m}   | ‰j        ¦  «        }t          j        ¦   «         D ]ì}|j        �ã|j        |j        v rÕ|j        t          j
        vrÂ|                     ¦   «         D ]­}|j                             ‰j        ¦  «        rŒt          j        ‰j        j        |¦  «        rm|j                             ‰j        j        ¦  «                             |j        j        j        ¦  «        }|j        rdnd }|                     |¬¦  «        E d {V —† Œ®Œíd S )Nr   )ÚMigrationLoaderiÐ  )Ú
chunk_size)Údjango.db.migrations.loaderrR   r   r   r>   Úmodels_moduler)   Ú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)rR   ÚloaderÚ
app_configÚmodelÚquerysetrS   r   s         €r   Úget_objectsz@BaseDatabaseCreation.serialize_db_to_string.<locals>.get_objectsy   sP  øè è € ØCÐCÐCÐCÐCÐCà$�_ T¤_Ñ5Ô5ˆFÝ"Ô2Ñ4Ô4ð Pð P�
àÔ,Ð8Ø"Ô(¨FÔ,@Ð@Ð@Ø"œ­xÔ/PÐPÐPà!+×!6Ò!6Ñ!8Ô!8ð 
Pð 
P˜Ø œ;×2Ò2Ø œOñô ð 	På$Ô8¸¼Ô9NÐPUÑVÔVð	Pð (-Ô':×'@Ò'@Ø $¤Ô 5ñ(ô (ç&šh u¤{¤~Ô':Ñ;Ô;ð %ð )1Ô(JÐ T  ÐPTð 'ð (0×'8Ò'8ÀJÐ'8Ñ'OÔ'OÐOÐOÐOÐOÐOÐOÐOøøð!Pð Pr   ÚjsonN)ÚindentÚstream)r   r   rG   Úgetvalue)r   rg   Úouts   `  r   r@   z+BaseDatabaseCreation.serialize_db_to_stringq   sZ   ø€ ð	Pð 	Pð 	Pð 	Pð 	Põ. ‰jŒjˆÝÔ˜f k k¡m¤m¸DÈÐMÑMÔMÐMØ�|Š|‰~Œ~Ðr   c                 ó  — t          |¦  «        }t          ¦   «         }t          | j        j        ¬¦  «        5  | j                             ¦   «         5  t          j        d|| j        j        ¬¦  «        D ]?}|                     ¦   «          | 	                    |j
        j        j        j        ¦  «         Œ@	 ddd¦  «         n# 1 swxY w Y   | j                             |¬¦  «         ddd¦  «         dS # 1 swxY w Y   dS )zw
        Reload the database with data from a string generated by
        the serialize_db_to_string() method.
        )r^   rh   N)Útable_names)r   Úsetr   r   r;   Úconstraint_checks_disabledr   ÚdeserializeÚsaveÚaddÚobjectÚ	__class__rZ   Údb_tableÚcheck_constraints)r   Údatarn   Úobjs       r   Údeserialize_db_from_stringz/BaseDatabaseCreation.deserialize_db_from_string”   s¡  € õ
 ˜‰~Œ~ˆÝ‘e”eˆå˜$œ/Ô/Ð0Ñ0Ô0ð 	Gð 	Gð ”×;Ò;Ñ=Ô=ð Ið IÝ&Ô2Ø˜D¨¬Ô(=ðñ ô ð Ið I�Cð —H’H‘J”J�JØ—O’O C¤JÔ$8Ô$>Ô$GÑHÔHÐHÐHð	IðIð Ið Iñ Iô Ið Ið Ið Ið Ið Ið Iøøøð Ið Ið Ið Ið ŒO×-Ò-¸+Ð-ÑFÔFÐFð	Gð 	Gð 	Gñ 	Gô 	Gð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gøøøð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gs6   ¸C4ÁA"CÂ5C4ÃC	ÃC4ÃC	Ã	C4Ã4C8Ã;C8c                 ó<   — d| j         j        ›d|dk    rd|z  nd›�S )zR
        Return display string for a database for use in various actions.
        ú'é   z ('%s')Ú )r   r;   )r   r.   Údatabase_names      r   r7   z.BaseDatabaseCreation._get_database_display_str©   s6   € € ð
 ŒOÔ!Ð!Ð!Ø+4¸ª>¨>ˆY˜Ñ&Ð&¸rÐ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   r6   z&BaseDatabaseCreation._get_test_db_name²   sF   € ð Œ?Ô(¨Ô0°Ô8ð 	AØ”?Ô0°Ô8¸Ô@Ð@Ý# d¤oÔ&CÀFÔ&KÑKÐKr   c                 ó6   — |                      d|z  ¦  «         d S )Nz%CREATE DATABASE %(dbname)s %(suffix)s)Úexecute)r   ÚcursorÚ
parametersrH   s       r   Ú_execute_create_test_dbz,BaseDatabaseCreation._execute_create_test_db½   s    € Ø�ŠÐ>ÀÑKÑLÔLÐLÐLÐLr   c           	      ó„  — |                       ¦   «         }| j        j                             |¦  «        |                      ¦   «         dœ}|                      ¦   «         5 }	 |                      |||¦  «         �n1# t          $ �r#}|r|cY d}~cddd¦  «         S |                      d|z  ¦  «         |st          d|z  ¦  «        }|s|dk    r§	 |dk    r-|                      d|  
                    ||¦  «        ›d�¦  «         |                     d	|z  ¦  «         |                      |||¦  «         nl# t          $ r6}|                      d
|z  ¦  «         t          j        d¦  «         Y d}~n1d}~ww xY w|                      d¦  «         t          j        d¦  «         Y d}~nd}~ww xY wddd¦  «         n# 1 swxY w Y   |S )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: %sr}   zTests cancelled.)r6   r   ÚopsÚ
quote_nameÚsql_table_creation_suffixr   r†   Ú	Exceptionr   Úinputr7   rƒ   r   Úexit)	r   r.   rF   rH   rI   Útest_db_paramsr„   ÚeÚconfirms	            r   r8   z$BaseDatabaseCreation._create_test_dbÀ   sˆ  € ð "×3Ò3Ñ5Ô5Ðà”oÔ)×4Ò4Ð5GÑHÔHØ×4Ò4Ñ6Ô6ð
ð 
ˆð
 ×ÒÑ Ô ð !	  Fð  Ø×,Ò,¨V°^ÀVÑLÔLÐLÑLøÝð  ñ  ð  ð ð .Ø-Ð-Ð-Ð-Ð-Ð-ð!	 ð !	 ð !	 ð !	 ñ !	 ô !	 ð !	 ð !	 ð —’ÐFÈÑJÑKÔKÐKØ"ð Ý#ð=Ø?QñRñô �Gð ð   '¨UÒ"2Ð"2ð$Ø$¨š>˜>Ø ŸHšH˜Hð %)×$BÒ$BØ(1Ð3Eñ%&ô %&ð %&ð %&ð!"ñô ð ð ŸšÐ'AÀNÑ'RÑSÔSÐSØ×4Ò4°V¸^ÈVÑTÔTÐTÐTøÝ$ð $ð $ð $ØŸšÐ!PÐSTÑ!TÑUÔUÐUÝœ ™œ˜˜˜˜˜˜øøøøð$øøøð —H’HÐ/Ñ0Ô0Ð0Ý”H˜Q‘K”K�Køøøøøøøøøð= øøøð!	 ð !	 ð !	 ñ !	 ô !	 ð !	 ð !	 ð !	 ð !	 ð !	 ð !	 øøøð !	 ð !	 ð !	 ð !	 ðF "Ð!sy   ÁF5ÁA8Á6F5Á8F&ÂF!ÂF&ÂF5Â4F!ÃA"D0Ä/F!Ä0
E0Ä:,E+Å&F!Å+E0Å0,F!ÆF5Æ!F&Æ&F5Æ5F9Æ<F9c                 óÎ   — | j         j        d         }|dk    r5d}|rd}|                      |›d|                      ||¦  «        ›d�¦  «         |                      |||¦  «         dS )z(
        Clone a test database.
        r%   r   zCloning test databasezUsing existing clonez for alias r$   N)r   r<   r   r7   Ú_clone_test_db)r   r‰   r.   rF   rH   Úsource_database_namerJ   s          r   Úclone_test_dbz"BaseDatabaseCreation.clone_test_dbï   s�   € ð  $œÔ<¸VÔDÐà˜Š>ˆ>Ø,ˆFØð 0Ø/�Ø�HŠHð �F�FØ×2Ò2°9Ð>RÑSÔSÐSÐSðñô ð ð 	×Ò˜F I¨vÑ6Ô6Ð6Ð6Ð6r   c                 ó^   — | j         j        }i |¥dd                     |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  sD   € ð "œ_Ô:Ðð
Ø ð
à�G—N’NÐ#5°fÔ#=¸vÑFÔ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.   rH   s       r   r•   z#BaseDatabaseCreation._clone_test_db  s   € õ "ðEñ
ô 
ð 	
r   Nc                 ó¢  — | j                              ¦   «          |€| j         j        d         }n|                      |¦  «        d         }|dk    r5d}|rd}|                      |›d|                      ||¦  «        ›d�¦  «         |s|                      ||¦  «         |�0|t          j        | j         j	                 d<   || j         j        d<   dS dS )zv
        Destroy a test database, prompting the user for confirmation if the
        database already exists.
        Nr%   r   Ú
DestroyingÚ
Preservingr#   r$   )
r   r9   r<   r›   r   r7   Ú_destroy_test_dbr   r:   r;   )r   Úold_database_namer.   rH   r‰   rI   rJ   s          r   Údestroy_test_dbz$BaseDatabaseCreation.destroy_test_db  s   € ð 	Œ×ÒÑÔÐØˆ>Ø!%¤Ô!>¸vÔ!FÐÐà!%×!@Ò!@ÀÑ!HÔ!HÈÔ!PÐà˜Š>ˆ>Ø!ˆFØð &Ø%�Ø�HŠHð �F�FØ×2Ò2°9Ð>PÑQÔQÐQÐQðñô ð ð ð 	AØ×!Ò!Ð"4°iÑ@Ô@Ð@ð Ð(Ø@Q�HÔ˜tœÔ4Ô5°fÑ=Ø4EˆDŒOÔ)¨&Ñ1Ð1Ð1ð )Ð(r   c                 óÊ   — |                       ¦   «         5 }|                     d| j        j                             |¦  «        z  ¦  «         ddd¦  «         dS # 1 swxY w Y   dS )zF
        Internal implementation - remove the test db tables.
        zDROP DATABASE %sN)r   rƒ   r   r‹   rŒ   )r   rI   r.   r„   s       r   r¡   z%BaseDatabaseCreation._destroy_test_db>  s©   € ð ×ÒÑ Ô ð 	 FØ�NŠNØ" T¤_Ô%8×%CÒ%CÐDVÑ%WÔ%WÑWñô ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   •6AÁAÁAc           
      ó˜  — ddl m}m} | j        j        j        D ]}}|                     d¦  «        \  }}}|                     d¦  «        d         }|t          j	        v r9t          |¦  «        }t          ||¦  «        }	t          || ||	¦  «        ¦  «         Œ~| j        j        j                             ¦   «         D ]Ž\  }
}|D ]†}|                     d¦  «        \  }}}|                     d¦  «        d         }|t          j	        v rBt          |¦  «        }t          ||¦  «        }	t          ||  ||
¦  «        |	¦  «        ¦  «         Œ‡Œ�dS )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   rE   z5BaseDatabaseCreation.mark_expected_failures_and_skipsK  s}  € ð 	3Ð2Ð2Ð2Ð2Ð2Ð2Ð2àœÔ1ÔOð 	Sð 	SˆIØ2;×2FÒ2FÀsÑ2KÔ2KÑ/ˆN˜AÐ/Ø —’ sÑ+Ô+¨AÔ.ˆHà�8Ô2Ð2Ð2Ý)¨.Ñ9Ô9�	Ý% iÐ1AÑBÔB�Ý˜	Ð#3°_°_À[Ñ5QÔ5QÑRÔRÐRøØ!œ_Ô5ÔG×MÒMÑOÔOð 	Tð 	T‰MˆF�EØ"ð Tð T�	Ø6?×6JÒ6JÈ3Ñ6OÔ6OÑ3� Ð#3Ø$Ÿ?š?¨3Ñ/Ô/°Ô2�à�xÔ6Ð6Ð6Ý -¨nÑ =Ô =�IÝ")¨)Ð5EÑ"FÔ"F�KÝ˜IÐ'7¸¸¸¸f¹¼ÀkÑ9RÔ9RÑSÔSÐSøðTð	Tð 	Tr   c                 ó   — dS )zQ
        SQL to append to the end of the test table creation statements.
        r~   © r   s    r   r�   z.BaseDatabaseCreation.sql_table_creation_suffixe  s	   € ð ˆrr   c                 ón   — | j         j        }|d         |d         |d         |                      ¦   «         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<   r6   )r   r<   s     r   Útest_db_signaturez&BaseDatabaseCreation.test_db_signaturek  s?   € ð œÔ5ˆà˜&Ô!Ø˜&Ô!Ø˜(Ô#Ø×"Ò"Ñ$Ô$ð	
ð 	
r   c                 óº   — |                       t          |¦  «        ¦  «        }| j        j                             |¦  «         | j                             ¦   «          d S r   )r›   Ústrr   r<   Úupdater9   )r   Ú
_worker_idr<   s      r   Úsetup_worker_connectionz,BaseDatabaseCreation.setup_worker_connectiony  sP   € Ø×7Ò7½¸J¹¼ÑHÔHˆð
 	ŒÔ%×,Ò,¨]Ñ;Ô;Ð;ØŒ×ÒÑÔÐÐÐr   )r   FTF)F)r   FF)Nr   FN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   rL   rO   r@   rz   r7   r6   r†   r8   r—   r›   r•   r£   r¡   rE   r�   rÂ   rÇ   r½   r   r   r   r      s’  € € € € € ðð ð
%ð %ð %ð.ð .ð .ð+ð +ð +ð FKðH"ð H"ð H"ð H"ðTNð Nð Nð!ð !ð !ðFGð Gð Gð*
ð 
ð 
ð	Lð 	Lð 	LðMð Mð Mð Mð-"ð -"ð -"ð -"ð^7ð 7ð 7ð 7ð,
ð 
ð 
ð
ð 
ð 
ð 
ð IMð!Fð !Fð !Fð !FðFð ð ðTð Tð Tð4ð ð ð
ð 
ð 
ð ð  ð  ð  ð  r   r   )r   r   Úior   Údjango.appsr   Údjango.confr   Údjango.corer   Ú	django.dbr   Údjango.db.transactionr   Údjango.utils.module_loadingr	   r�   r   r½   r   r   ú<module>rÓ      sÙ   ðØ 	€	€	€	Ø 
€
€
€
Ø Ð Ð Ð Ð Ð à Ð Ð Ð Ð Ð Ø  Ð  Ð  Ð  Ð  Ð  Ø #Ð #Ð #Ð #Ð #Ð #Ø Ð Ð Ð Ð Ð Ø (Ð (Ð (Ð (Ð (Ð (Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5ð Ð ðo ð o ð o ð o ð o ñ o ô o ð o ð o ð o r   