o
    uvXj^$  ã                   @   s    d 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mZmZ dd	lmZ dd
lmZ G dd„ deƒZG dd„ de
ƒZdS )a  
SyncData
========

Django command similar to 'loaddata' but also deletes.
After 'syncdata' has run, the database will have the same data as the fixture - anything
missing will of been added, anything different will of been updated,
and anything extra will of been deleted.
é    N)Úapps)Úsettings)Úserializers)ÚBaseCommand)Úno_style)ÚDEFAULT_DB_ALIASÚconnectionsÚtransaction)Ú	pluralize)Úsignalcommandc                   @   s   e Zd ZdS )ÚSyncDataErrorN)Ú__name__Ú
__module__Ú__qualname__© r   r   úk/var/www/html/myproject/venv/lib/python3.10/site-packages/django_extensions/management/commands/syncdata.pyr      s    r   c                       sD   e Zd ZdZdZdZ‡ fdd„Zdd„ Zedd	„ ƒZ	d
d„ Z
‡  ZS )ÚCommandz syncdata command zRMakes the current database have the same data as the fixture(s), no more, no less.zfixture [fixture ...]c                    sJ   t t| ƒ |¡ |jdddddd� |jdtdd	� |jd
dtdd� d S )Nz--skip-removeÚstore_falseÚremoveTzAvoid remove any object from db)ÚactionÚdestÚdefaultÚhelpz
--databasezXNominates a specific database to load fixtures into. Defaults to the "default" database.)r   r   Úfixture_labelsú?z+Specify the fixture label (comma separated))ÚnargsÚtyper   )Úsuperr   Úadd_argumentsÚadd_argumentr   Ústr)ÚselfÚparser©Ú	__class__r   r   r   $   s   þþ
þzCommand.add_argumentsc                 C   sÖ   |  ¡ D ]d}|j ¡ }tdd„ |D ƒƒ}tdd„ || D ƒƒ}| |¡}|rA|D ]}|j|v r@| ¡  |dkr@tdt 	|¡ ƒ q(|dkrh|rht
|ƒ}	|	dkrWt 	|jj¡}
nt 	|jj¡}
tdt|	ƒ|
f ƒ qd	S )
zå
        Delete all the objects in the database that are not in objects_to_keep.
        - objects_to_keep: A map where the keys are classes, and the values are a
         set of the objects of that class we should keep.
        c                 S   ó   g | ]}|j ‘qS r   ©Úpk©Ú.0Úxr   r   r   Ú
<listcomp>;   ó    z1Command.remove_objects_not_in.<locals>.<listcomp>c                 S   r%   r   r&   r(   r   r   r   r+   <   r,   é   zDeleted object: %sr   é   zDeleted %s %sN)ÚkeysÚobjectsÚallÚsetÚ
differencer'   ÚdeleteÚprintÚsixÚuÚlenÚ_metaÚverbose_name_pluralÚverbose_namer    )r!   Úobjects_to_keepÚ	verbosityÚclass_ÚcurrentÚcurrent_idsÚkeep_idsÚremove_these_onesÚobjÚnum_deletedÚtype_deletedr   r   r   Úremove_objects_not_in3   s(   


€€ìzCommand.remove_objects_not_inc              
   O   s¼   t ƒ | _|d | _|d r|d  d¡nd}zt ¡ � |  ||¡ W d   ƒ n1 s,w   Y  W n tyL } zt| j 	|¡ƒ W Y d }~nd }~ww t 
| j¡r\t| j  ¡  d S d S )NÚdatabaser   ú,r   )r   ÚstyleÚusingÚsplitr	   ÚatomicÚsyncdatar   r5   ÚERRORÚget_autocommitr   Úclose)r!   ÚargsÚoptionsr   Úexcr   r   r   ÚhandleO   s   

ÿ€€ÿÿzCommand.handlec                 C   sÐ  |d }|d }d}d}g }t ƒ }dd„ }	t| j  ¡ }
dd„ t ¡ D ƒ}dd„ |D ƒ}|D �]]}| d	¡}t|ƒd
krC|}t 	¡ }nd	 
|d d… ¡|d }}|t 	¡ v r[|g}ng }|rj|d
kritd| ƒ ntd||f ƒ‚tj |¡r||g}n
|ttjƒ dg }|D �]}|d
kr—td|	|ƒ ƒ d}|D ]ï}|d
kr¬td|	|ƒ||f ƒ z¶tj 
|d	 
||g¡¡}t|dƒ}|rÎ| ¡  td||	|ƒf ƒ‚|d
7 }| d¡ |dkrætd|||	|ƒf ƒ zGi }t ||¡}|D ]-}|d
7 }|d  d
7  < |jj}||v�rt ƒ ||< ||  |j¡ | |¡ | ¡  qñ|d �r*|  ||¡ d}W n/ ttf�y8   ‚  t�y\   dd l}| ¡  t  !¡  |�rR| "¡  td|| #¡ f ƒ‚w | ¡  W q› t�yq } z|‚d }~w t�yŠ   |d
k�rˆtd|||	|ƒf ƒ Y q›w qˆq.d|v �r˜td| ƒ‚|dk�r¿t| j j$ %| j&|¡}|�r¿|d
k�r´tdƒ |D ]}|
 '|¡ �q¶|dk�rÑ|d
k�rÏtdƒ d S d S |dk�rætd|t(|ƒ|t(|ƒf ƒ d S d S )Nr=   Ú	tracebackr   c                 S   s   | rd|  pdS )Nz'%s'zabsolute pathr   )Údirnamer   r   r   Ú<lambda>k   s    z"Command.syncdata.<locals>.<lambda>c                 S   r%   r   )Úmodule©r)   Úappr   r   r   r+   r   r,   z$Command.syncdata.<locals>.<listcomp>c                 S   s$   g | ]}t j t j |j¡d ¡‘qS )Úfixtures)ÚosÚpathÚjoinrV   Ú__file__rY   r   r   r   r+   s   s   $ Ú.r.   éÿÿÿÿzLoading '%s' fixtures...zHProblem installing fixture '%s': %s is not a known serialization format.Ú zChecking %s for fixtures...Fz Trying %s for %s fixture '%s'...Úrz-Multiple fixtures named '%s' in %s. Aborting.z#Installing %s fixture '%s' from %s.r   Tz$Problem installing fixture '%s': %s
zNo %s fixture '%s' in %s.z=No fixture data found for '%s'. (File format may be invalid.)zResetting sequenceszNo fixtures found.z'Installed %d object%s from %d fixture%s))r2   r   rJ   Úcursorr   Úget_app_configsrK   r8   r   Úget_public_serializer_formatsr^   r5   r   r\   r]   ÚisabsÚlistr   ÚFIXTURE_DIRSÚopenrP   ÚappendÚdeserializeÚobjectr$   ÚaddÚsaverF   Ú
SystemExitÚKeyboardInterruptÚ	ExceptionrU   r	   ÚrollbackÚ	print_excÚ
format_excÚopsÚsequence_reset_sqlrI   Úexecuter
   )r!   r   rR   r=   Úshow_tracebackÚfixture_countÚobject_countÚobjects_per_fixtureÚmodelsÚhumanizerd   Úapp_modulesÚapp_fixturesÚfixture_labelÚpartsÚfixture_nameÚformatsÚformatÚfixture_dirsÚfixture_dirÚlabel_foundÚ	full_pathÚfixturer<   r0   rC   r>   rU   ÚeÚsequence_sqlÚliner   r   r   rM   a   sÆ   


€







ú€
€þÒû
9



ÿ
þÿzCommand.syncdata)r   r   r   Ú__doc__r   rQ   r   rF   r   rT   rM   Ú__classcell__r   r   r#   r   r      s    
r   )rŽ   r\   r6   Údjango.appsr   Údjango.confr   Údjango.corer   Údjango.core.management.baser   Údjango.core.management.colorr   Ú	django.dbr   r   r	   Údjango.template.defaultfiltersr
   Ú"django_extensions.management.utilsr   rr   r   r   r   r   r   r   Ú<module>   s   
