o
    /h                     @   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 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)BaseDatabaseWrapper)MigrationLoader)MigrationRecorder)timezone)signalcommandzmanagestate.jsondefaultc                   @   s   e Zd ZU dZdZeed< eed< 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	verbositydatabaseconnc                 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/env_mimamsha/lib/python3.10/site-packages/django_extensions/management/commands/managestate.pyadd_arguments   sx   
	
zCommand.add_argumentsc                 O   s>   || _ || _|d | _t| | _|| _|| _t| || d S )Nr   )r   r   r   r   r   r   r   getattr)r'   r   r   r   r   argsoptionsr)   r)   r*   handleg   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   q   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_appliedr5   r4   r6   WARNINGr   r   r7   )r'   r   
migrationskwargsapp	migrationr-   r)   r)   r*   r   }   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.zeror9   zApps having migrations: z, )
r
   r   r8   dictfromkeysr   r5   r4   joinsorted)r'   appsr8   r)   r)   r*   r1      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.r9   )key)_applied_migrationsr   r   applied_migrationsrJ   keysr   rG   )r'   rA   last_appliedr)   r)   r*   r3      s   
zCommand.get_applied_migrationsrC   rD   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.r9   r;   z" are already applied.TF)r3   r=   r   r5   r4   r6   r@   )r'   rC   rD   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   r2   strr   nowrT   r   rU   r   )r'   rX   savedrW   r)   r)   r*   r4      s   "zCommand.write)__name__
__module____qualname__r   rM   rG   __annotations__r^   intr	   r+   r   r/   r   r   r1   r3   boolr?   r<   r4   r)   r)   r)   r*   r      s&   
 I
	
	r   )rU   operatorr   pathlibr   django.core.managementr   django.core.management.baser   r   	django.dbr   r   django.db.backends.base.baser	   django.db.migrations.loaderr
   django.db.migrations.recorderr   django.utilsr   "django_extensions.management.utilsr   r&   r%   r   r)   r)   r)   r*   <module>   s   