o
    .i[                     @   s   d dl Z d dlmZ d dlmZ d dlmZ d dlmZm	Z	 d dl
mZmZ d dlmZ d dlmZ d d	lmZ d d
lmZ dZdZG dd deZdS )    N)
itemgetter)Path)call_command)BaseCommandCommandError)DEFAULT_DB_ALIASconnections)MigrationLoader)MigrationRecorder)timezone)signalcommandzmanagestate.jsondefaultc                   @   s   e Zd ZU dZd ZZdZeed< eed< e	ed< e
ed< dd Zed	d
 Zde	fddZde	fddZdefddZdefddZde	de	defddZdefddZdefddZdS )Commandz,Manage database state in the convenient way.Nmigrate_argsmigrate_optionsfilename	verbosityc                 C   s   |j dddd |j ddtdt dd	 |j d
dtdt dd |j ddtdt dd |j dddddd |j dddd |j dddd |j dddd |j d dd!d |j d"dd#d$d d S )%Naction)dumploadztAn action to do. Dump action saves applied migrations to a file. Load action applies migrations specified in a file.)choiceshelpstate?z@A name of a state. Usually a name of a git branch. Defaults to "")nargsr   r   z-dz
--databasez6Nominates a database to synchronize. Defaults to the "z" database.)r   r   z-fz
--filenamez!A file to write to. Defaults to "z	--noinputz
--no-inputstore_falseinteractivez^The argument for "migrate" command. Tells Django to NOT prompt the user for input of any kind.)r   destr   z--fake
store_truezYThe argument for "migrate" command. Mark migrations as run without actually running them.)r   r   z--fake-initiala   The argument for "migrate" command. Detect if tables already exist and fake-apply initial migrations if so. Make sure that the current database schema matches your initial migration before using this flag. Django will only check for an existing table name.z--planzaThe argument for "migrate" command. Shows a list of the migration actions that will be performed.z--run-syncdbzOThe argument for "migrate" command. Creates tables for apps without migrations.z--checkcheck_unappliedz_The argument for "migrate" command. Exits with a non-zero status if unapplied migrations exist.)add_argumentDEFAULT_STATEr   DEFAULT_FILENAME)selfparser r&   l/var/www/html/philips/venv/lib/python3.10/site-packages/django_extensions/management/commands/managestate.pyadd_arguments   sP   



zCommand.add_argumentsc                 O   s>   || _ || _|d | _t| | _|| _|| _t| || d S )Nr   )r   r   r   r   conndatabaser   getattr)r$   r   r*   r   r   argsoptionsr&   r&   r'   handleR   s   

zCommand.handler   c              	   C   sL   |   }||   | ||i | j| jd| d| j d dS )z"Save applied migrations to a file.zMigrations for state "z"" have been successfully saved to .N)get_migrated_appsupdateget_applied_migrationswritestdoutstyleSUCCESSr   )r$   r   migrated_appsr&   r&   r'   r   \   s   
zCommand.dumpc                 C   s   |   |}|du rtd| i | j| j| jdkr"| jd ndd}| D ]1\}}| ||r6q+| jdkrI| j	| j
d| d ||g| jR }tdg|R i | q+| j	| j
d	| d
 dS )zApply migrations from a file.NzNo such state saved:    r   )r*   r   zApplying migrations for "r   migrateMigrations for "z!" have been successfully applied.)readgetr   r   r*   r   items
is_appliedr4   r3   r5   WARNINGr   r   r6   )r$   r   
migrationskwargsapp	migrationr,   r&   r&   r'   r   e   s&   


zCommand.loadreturnc                 C   s@   t | jj}t|d}| jdkr| jddt	|  |S )z!Installed apps having migrations.zeror8   zApps having migrations: z, )
r	   r)   r7   dictfromkeysr   r4   r3   joinsorted)r$   appsr7   r&   r&   r'   r0   ~   s
   
zCommand.get_migrated_appsc                 C   s>   | j r| j S t| j }t| tdd}t|| _ | j S )z,Installed apps with last applied migrations.r8   )key)_applied_migrationsr
   r)   applied_migrationsrI   keysr   rF   )r$   r@   last_appliedr&   r&   r'   r2      s   
zCommand.get_applied_migrationsrB   rC   c                 C   sD   |   |}||kr | jdkr| j| jd| d dS dS )z7Check whether a migration for an app is applied or not.r8   r:   z" are already applied.TF)r2   r<   r   r4   r3   r5   r?   )r$   rB   rC   appliedr&   r&   r'   r>      s   

zCommand.is_appliedc                 C   sb   t | j}| r| std| j t| j}t|W  d   S 1 s*w   Y  dS )zGet saved state from the file.zNo such file: N)r   r   existsis_filer   openjsonr   )r$   pathfiler&   r&   r'   r;      s   
$zCommand.readdatac                 C   s~   z|   }W n ty   i }Y nw |j|tt d t| jd}tj	||ddd W d   dS 1 s8w   Y  dS )z.Write new data to the file using existent one.)
updated_atw   T)indent	sort_keysN)
r;   r   r1   strr   nowrS   r   rT   r   )r$   rW   savedrV   r&   r&   r'   r3      s   "zCommand.write)__name__
__module____qualname__r   r)   r*   rL   rF   __annotations__r]   intr(   r   r.   r   r   r0   r2   boolr>   r;   r3   r&   r&   r&   r'   r      s$   
 6
			r   )rT   operatorr   pathlibr   django.core.managementr   django.core.management.baser   r   	django.dbr   r   django.db.migrations.loaderr	   django.db.migrations.recorderr
   django.utilsr   "django_extensions.management.utilsr   r#   r"   r   r&   r&   r&   r'   <module>   s   