a
    Lcòf¬W  ã                   @   sü   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
mZmZ d dlmZ d dlmZmZ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 dlmZm Z m!Z! d dl"m#Z# d dl$m%Z% d dl&m'Z' G dd„ de
ƒZ(dS )é    N)Ú	takewhile)Úapps)Úsettings)ÚBaseCommandÚCommandErrorÚno_translations)Úrun_formatters)ÚDEFAULT_DB_ALIASÚOperationalErrorÚconnectionsÚrouter©Ú	Migration)ÚMigrationAutodetector)ÚMigrationLoader)ÚSwappableTuple)ÚMigrationOptimizer)ÚInteractiveMigrationQuestionerÚMigrationQuestionerÚ!NonInteractiveMigrationQuestioner)ÚProjectState)Úget_migration_name_timestamp)ÚMigrationWriterc                   @   s^   e Zd ZdZdd„ Zedd„ ƒZdd„ Zedd	„ ƒZ	d
d„ Z
ddd„Zedd„ ƒZdd„ ZdS )ÚCommandz"Creates new migration(s) for apps.c                 C   s²   |j 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dd� |j dddd� |j ddddd� |j ddddd� |j dddd d� |j d!dd"d#d� d S )$NÚargsÚ	app_labelÚ*z2Specify the app label(s) to create migrations for.)ÚmetavarÚnargsÚhelpz	--dry-runÚ
store_truezCJust show what migrations would be made; don't actually write them.)Úactionr   z--mergez%Enable fixing of migration conflicts.z--emptyzCreate an empty migration.z	--noinputz
--no-inputÚstore_falseÚinteractivez:Tells Django to NOT prompt the user for input of any kind.)r!   Údestr   z-nz--namez$Use this name for migration file(s).)r   z--no-headerÚinclude_headerz4Do not add header comments to new migration file(s).z--checkÚcheck_changeszuExit with a non-zero status if model changes are missing migrations and don't actually write them. Implies --dry-run.z--scriptableÚ
scriptableziDivert log output and input prompts to stderr, writing only paths of generated migration files to stdout.z--updateÚupdatezTMerge model changes into the latest migration and optimize the resulting operations.)Úadd_argument)ÚselfÚparser© r,   úk/home/httpd/docs/test/DocsMgr/lib/python3.9/site-packages/django/core/management/commands/makemigrations.pyÚadd_arguments   sr    üýýýûýüû	û	ûzCommand.add_argumentsc                 C   s   | j r| jS | jS ©N)r'   ÚstderrÚstdout)r*   r,   r,   r-   Ú
log_outputa   s    zCommand.log_outputc                 C   s   | j  |¡ d S r/   )r2   Úwrite)r*   Úmsgr,   r,   r-   Úloge   s    zCommand.logc                    sŠ  g | _ |d | _|d | _|d | _|d | _|d | _|d | _| jrZ| j ¡ sZtdƒ‚|d | _	|d	 }|rvd
| _|d | _
|d | _| j
r˜d | j_tˆ ƒ‰ d}ˆ D ]L}zt |¡ W q¨ tyò } z | j t|ƒ¡ d
}W Y d }~q¨d }~0 0 q¨|�rt d¡ td d
d�}dd„ t ¡ D ƒ}tj�r0tntg}	t|	ƒD ]€}
t|
 ‰ˆjd dk�r>t‡fdd„|D ƒƒ�r>z| ˆ¡ W n: t �yº } z t! "d|
|f t#¡ W Y d }~n
d }~0 0 �q>| $¡ }ˆ �rä‡ fdd„| %¡ D ƒ}|�r| j�sd &dd„ | %¡ D ƒ¡}td| ƒ‚| j�r2|�s2|  'd¡ d S | j�rL|�rL|  (||¡S | j�rht)ˆ | j| j*d�}nt+ˆ | j| j| j'd�}t,| -¡ t. /t¡|ƒ}| j�rÚˆ �sªtdƒ‚d d„ ˆ D ƒ}|j0||j1| jd!�}|  2|¡ d S |j3|j1ˆ �pêd ˆ �pòd | jd"�}|�sX| jd#k�r†ˆ �rLt4ˆ ƒd#k�r6|  'd$ˆ  5¡  ¡ n|  'd%d& &ˆ ¡ ¡ n
|  'd'¡ n.| j�rl|  6|¡ n
|  2|¡ |�r†t d#¡ d S )(NÚ	verbosityr#   Údry_runÚmergeÚemptyÚnamez5The migration name must be a valid Python identifier.r%   r&   Tr'   r(   Fé   )Zignore_no_migrationsc                 S   s   h | ]
}|j ’qS r,   )Úlabel)Ú.0Úconfigr,   r,   r-   Ú	<setcomp>Ž   ó    z!Command.handle.<locals>.<setcomp>ZENGINEzdjango.db.backends.dummyc                 3   s8   | ]0}t  |¡ ¡ D ]}tjˆ j||jjd �V  qqdS ))Z
model_nameN)r   Úget_app_configZ
get_modelsr   Zallow_migrateÚaliasÚ_metaZobject_name)r=   r   Úmodel)Ú
connectionr,   r-   Ú	<genexpr>•   s
   üÿz!Command.handle.<locals>.<genexpr>z_Got an error checking a consistent migration history performed for database connection '%s': %sc                    s   i | ]\}}|ˆ v r||“qS r,   r,   )r=   r   Úconflict)Ú
app_labelsr,   r-   Ú
<dictcomp>¬   s   þz"Command.handle.<locals>.<dictcomp>z; c                 s   s$   | ]\}}d d  |¡|f V  qdS )z%s in %sú, N)Újoin)r=   ÚappÚnamesr,   r,   r-   rF   ³   s   zŒConflicting migrations detected; multiple leaf nodes in the migration graph: (%s).
To fix them run 'python manage.py makemigrations --merge'zNo conflicts detected to merge.)Úspecified_appsr7   Úprompt_output)rN   r7   r6   r5   z:You must supply at least one app label when using --empty.c                 S   s   i | ]}|t d |ƒg“qS )Zcustomr   )r=   rL   r,   r,   r-   rI   á   r@   )ÚchangesÚgraphÚmigration_name)rQ   Ztrim_to_appsZconvert_appsrR   é   zNo changes detected in app '%s'z No changes detected in apps '%s'z', 'zNo changes detected)7Úwritten_filesr6   r#   r7   r8   r9   rR   Úisidentifierr   r%   r'   r(   r0   Z
style_funcÚsetr   rA   ÚLookupErrorr3   ÚstrÚsysÚexitr   Zget_app_configsr   ZDATABASE_ROUTERSr   r	   ÚsortedZsettings_dictÚanyZcheck_consistent_historyr
   ÚwarningsÚwarnÚRuntimeWarningZdetect_conflictsÚitemsrK   r5   Úhandle_merger   r2   r   r   Zproject_stater   Z	from_appsZarrange_for_graphrQ   Úwrite_migration_filesrP   ÚlenÚpopÚwrite_to_last_migration_files)r*   rH   Úoptionsr&   Zhas_bad_labelsr   ÚerrÚloaderZconsistency_check_labelsZaliases_to_checkrB   ÚerrorÚ	conflictsZname_strÚ
questionerZautodetectorrP   r,   )rH   rE   r-   Úhandleh   sè    









ÿû
ÿý
þ
ÿþÿ
ýüýÿý
üÿÿ
zCommand.handlec                    sÜ  t tt ƒ}i }i }| ¡ D �]¬\}}|jj|d�}t|ƒdkrPtd|› d�ƒ‚|d ‰ |jjˆ  }|j	rztd|› d�ƒ‚ˆ |j
v r”td|› d�ƒ‚‡ fdd	„|j ¡ D ƒ}	|	rÚd
 dd	„ |	D ƒ¡}
td|› d|
› d�ƒ‚|D ]n}|j |j¡ |jD ]T}t|tƒ�r0tj|jk�r"|j d¡ n|j |¡ qö|d |jkrö|j |¡ qöqÞtƒ }| |j|¡|_t|ƒj}| j�p|| ¡ }|jd d… d|› � }|j|k�r®|jd }n|}||_|g||< |||< q|  ||¡ d S )N)rL   r   zApp z0 has no migration, cannot update last migration.z Cannot update squash migration 'z'.z!Cannot update applied migration 'c                    s   g | ]}ˆ |j v r|‘qS r,   )Údependencies©r=   Ú	migration©Zleaf_migration_noder,   r-   Ú
<listcomp>  s   
þz9Command.write_to_last_migration_files.<locals>.<listcomp>rJ   c                 S   s   g | ]}d |› d �‘qS )ú'r,   rn   r,   r,   r-   rq   &  r@   zCannot update migration 'z' that migrations z depend on.)Z__setting__ÚAUTH_USER_MODELé   Ú_Z_updated) r   r   r	   r`   rQ   Z
leaf_nodesrc   r   ÚnodesZreplacesZapplied_migrationsZdisk_migrationsÚvaluesrK   Ú
operationsÚextendrm   Ú
isinstancer   r   rs   ZsettingÚappendr   r   Úoptimizer   ÚpathrR   Zsuggest_namer:   rb   )r*   rP   rh   Znew_changesÚupdate_previous_migration_pathsr   Úapp_migrationsZleaf_migration_nodesZleaf_migrationZdepending_migrationsZformatted_migrationsro   Ú
dependencyZ	optimizerZprevious_migration_pathZname_fragmentZsuggested_nameÚnew_namer,   rp   r-   re     sp    
ÿ
ÿ

ÿ
þÿÿÿ
ÿÿ


z%Command.write_to_last_migration_filesNc                 C   s  i }|  ¡ D �]ê\}}| jdkr6|  | j d| ¡¡ |D �]º}t|| jƒ}| jdkr¨|  |j¡}|  d| j 	|¡ ¡ |j
D ]}	|  d|	 ¡  ¡ q~| jr¨| j |¡ | j�sÆtj |j¡}
| |¡�s
tj|
dd� tj |
d¡}tj |¡�st|dƒ ¡  d||< | ¡ }t|jdd	d
��(}| |¡ | j |j¡ W d  ƒ n1 �sR0    Y  |�rö|| }|  |¡}|j�rª|  |j¡}|  | j d|› d|› d�¡¡ nt |¡ |  d|› �¡ q:| jdkr:|  | j d|j ¡¡ |  | ¡ ¡ q:qt| jƒ dS )zL
        Take a changes dict and write them out as migration files.
        rS   zMigrations for '%s':z  %s
ú    - %sT)Úexist_okz__init__.pyÚwúutf-8©ÚencodingNzUpdated migration z- requires manual porting.
Previous migration z? was kept and must be deleted after porting functions manually.zDeleted é   zFull migrations file '%s':) r`   r6   r5   ÚstyleÚMIGRATE_HEADINGr   r%   Úget_relative_pathr}   ÚMIGRATE_LABELrx   Údescriber'   r1   r3   r7   ÚosÚdirnameÚgetÚmakedirsrK   ÚisfileÚopenÚcloseÚ	as_stringrT   r{   Zneeds_manual_portingÚWARNINGÚremoveÚfilenamer   )r*   rP   r~   Zdirectory_createdr   r   ro   ÚwriterÚmigration_stringÚ	operationZmigrations_directoryZ	init_pathÚfhZ	prev_pathZrel_prev_pathZmigration_pathr,   r,   r-   rb   N  s^    




.
þÿÿ	

ÿÿzCommand.write_migration_filesc                 C   s:   zt j | ¡}W n ty&   | }Y n0 | d¡r6| }|S )Nz..)rŽ   r}   ÚrelpathÚ
ValueErrorÚ
startswith)r}   rš   r,   r,   r-   r‹   Œ  s    

zCommand.get_relative_pathc              	      s  | j rt| jd�}ntddid�}| ¡ D �]Ú\‰ }g }|D ]:}ˆ ˆ |¡‰‡fdd„ˆj ˆ |f¡D ƒˆ_| 	ˆ¡ q<dd„ }t
d	d
„ |D ƒŽ }tdd
„ t||ƒD ƒƒ}	|	sºtd| ƒ‚|D ]4‰ˆj|	d… ˆ_‡fdd
„ˆjD ƒ}
t|
g ƒˆ_q¾| jdk�rZ|  | j dˆ  ¡¡ |D ]>‰|  | j dˆj ¡¡ ˆjD ]}|  d| ¡  ¡ �q<�q| ˆ ¡r*dd„ |D ƒ}ztdd
„ |D ƒƒ}W n t�y    d}Y n0 tdtfd‡ fdd„|D ƒiƒ}d|d  g}| j�ræ| 	| j¡ nH| 	d¡ d tdd
„ |D ƒƒ¡}t|ƒdk�r$| 	tƒ ¡ n
| 	|¡ d |¡}||ˆ ƒ}t || j!ƒ}| j"�sÖt#|j$ddd ��}| %| &¡ ¡ W d  ƒ n1 �sŒ0    Y  t'|j$gƒ | jdk�r|  d!|j$ ¡ | j(�r| j) %|j$¡ q*| jd"kr*|  | j d#|j* ¡¡ |  | &¡ ¡ q*dS )$zŠ
        Handles merging together conflicted migrations interactively,
        if it's safe; otherwise, advises on how to fix it.
        )rO   Ú	ask_mergeT)Údefaultsc                    s   g | ]}|d  ˆ j kr|‘qS )r   ©r   )r=   Zmig)ro   r,   r-   rq   ¦  s   þz(Command.handle_merge.<locals>.<listcomp>c                    s   t ‡ fdd„ˆ dd … D ƒƒS )Nc                 3   s   | ]}|ˆ d  kV  qdS )r   Nr,   )r=   Úitem©Úseqr,   r-   rF   ®  r@   z@Command.handle_merge.<locals>.all_items_equal.<locals>.<genexpr>rS   )Úallr¤   r,   r¤   r-   Úall_items_equal­  s    z-Command.handle_merge.<locals>.all_items_equalc                 s   s   | ]}|j V  qd S r/   )Úancestry)r=   Úmr,   r,   r-   rF   °  r@   z'Command.handle_merge.<locals>.<genexpr>c                 s   s   | ]
}d V  qdS )rS   Nr,   )r=   Zcommon_ancestor_generationr,   r,   r-   rF   ±  s   ÿz$Could not find common ancestor of %sNc                 3   s    | ]\}}ˆ   ||¡jV  qd S r/   )Úget_migrationrx   )r=   Znode_appZ	node_name)rh   r,   r-   rF   ¾  s   ÿr   z
Merging %sz  Branch %sr‚   c                 S   s   g | ]}t  |j¡‘qS r,   )r   Zparse_numberr:   rn   r,   r,   r-   rq   Ï  s   ÿc                 s   s   | ]}|d ur|V  qd S r/   r,   )r=   Úxr,   r,   r-   rF   Ô  r@   rS   r   rm   c                    s   g | ]}ˆ |j f‘qS r,   ©r:   rn   r¢   r,   r-   rq   Û  s   ÿz%04ir8   ru   c                 s   s   | ]}|j V  qd S r/   r¬   rn   r,   r,   r-   rF   ç  r@   é/   r„   r…   r†   z
Created new merge migration %srˆ   z Full merge migrations file '%s':)+r#   r   r2   r   r`   rª   rQ   Zforwards_planr¨   r{   ÚzipÚsumr   rž   ÚbranchZmerged_operationsr6   r5   r‰   rŠ   rŒ   r:   r�   r    ÚmaxÚtyper   rR   rK   r[   rc   r   r   r%   r7   r“   r}   r3   r•   r   r'   r1   r˜   )r*   rh   rj   rk   Zmigration_namesZmerge_migrationsrR   r§   Zmerge_migrations_generationsZcommon_ancestor_countZmigrations_opsr›   ÚnumbersZbiggest_numberÚsubclassÚpartsZ
leaf_namesZnew_migrationr™   rœ   r,   )r   rh   ro   r-   ra   –  sœ    
þÿþÿ
þ

þ
þÿý

ÿ


.
ÿÿzCommand.handle_merge)N)Ú__name__Ú
__module__Ú__qualname__r   r.   Úpropertyr2   r5   r   rl   re   rb   Ústaticmethodr‹   ra   r,   r,   r,   r-   r      s   D

 G
>
	r   ))rŽ   rY   r]   Ú	itertoolsr   Zdjango.appsr   Zdjango.confr   Zdjango.core.management.baser   r   r   Zdjango.core.management.utilsr   Z	django.dbr	   r
   r   r   Zdjango.db.migrationsr   Z!django.db.migrations.autodetectorr   Zdjango.db.migrations.loaderr   Zdjango.db.migrations.migrationr   Zdjango.db.migrations.optimizerr   Zdjango.db.migrations.questionerr   r   r   Zdjango.db.migrations.stater   Zdjango.db.migrations.utilsr   Zdjango.db.migrations.writerr   r   r,   r,   r,   r-   Ú<module>   s$   