o
    /hS+                     @   s   d 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
 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 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CommandError)no_style)DEFAULT_DB_ALIASconnectionstransaction)	pluralize)signalcommandc                 C   s   | rd|  S dS )Nz'%s'zabsolute path )dirnamer   r   i/var/www/html/env_mimamsha/lib/python3.10/site-packages/django_extensions/management/commands/syncdata.pyhumanize   s   r   c                   @   s   e Zd ZdS )SyncDataErrorN)__name__
__module____qualname__r   r   r   r   r      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 commandzRMakes the current database have the same data as the fixture(s), no more, no less.zfixture [fixture ...]c                    sZ   t  | |jdddddd |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--remove-before
store_trueremove_beforeFz>Remove existing objects before inserting and updating new onesz
--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   )superadd_argumentsadd_argumentr   str)selfparser	__class__r   r   r#   '   s4   
zCommand.add_argumentsc                 C   s   |  D ]a}|j }tdd |D }tdd || D }||}|r@|D ]}|j|v r?|  |dkr?tdt|  q(|dkre|ret	|}	|	dkrUt|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       | ]}|j V  qd S Npk.0xr   r   r   	<genexpr>N       z0Command.remove_objects_not_in.<locals>.<genexpr>c                 s   r*   r+   r,   r.   r   r   r   r1   O   r2      zDeleted object: %sr      zDeleted %s %sN)keysobjectsallset
differencer-   deleteprintr%   len_metaverbose_name_pluralverbose_name)r&   objects_to_keep	verbosityclass_currentcurrent_idskeep_idsremove_these_onesobjnum_deletedtype_deletedr   r   r   remove_objects_not_inF   s(   


zCommand.remove_objects_not_inc              
   O   s   t  | _|d | _|d r|d dnd}z?zt  | || W d    n1 s-w   Y  W n tyC } zt|d }~ww W t	| jrTt
| j   d S d S t	| jrdt
| j   w w )Ndatabaser   ,r   )r   styleusingsplitr
   atomicsyncdatar   r   get_autocommitr	   close)r&   argsoptionsr   excr   r   r   handleb   s&   

zCommand.handlec                 C   s  |d }|d }d}d}g }t  }t| j  }	dd t D }
dd |
D }|D ]x}|d}t|dkr?|}t	 }nd
|d d	 |d	 }}|t	 v rW|g}ng }|rf|dkretd
|  ntd||f tj|rx|g}n
|ttj dg }|D ]}|dkrtdt|  d}|D ]	}|dkrtdt|||f  ztj
|d
||g}t|d}|r|  td|t|f |d7 }|d |dkrtd||t|f  zei }tt||}|D ]}|jj}||vrt  ||< || |j q|d r|d r| || |D ]}|d7 }|d	  d7  < ||jj |  q|d rE|d sE| || d}W n+ ttfyS     tys   dd l }|  |ri|!  td||" f w |  W q ty } z|d }~w ty   |dkrtd||t|f  Y qw qq*d|v rtd| |dkrt| j j#$| j%|}|r|dkrtd |D ]}|	&| q|dkr|dkrtd d S d S |dkrtd|t'||t'|f  d S d S )NrA   	tracebackr   c                 S   s   g | ]}|j qS r   )moduler/   appr   r   r   
<listcomp>   s    z$Command.syncdata.<locals>.<listcomp>c                 S   s$   g | ]}t jt j|jd qS )fixtures)ospathjoinr   __file__rZ   r   r   r   r\      s    .r4   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   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)(r8   r	   rN   cursorr   get_app_configsrO   r<   r   get_public_serializer_formatsr`   r;   r   r^   r_   isabslistr   FIXTURE_DIRSr   openrS   appenddeserializeobjectr)   addrJ   save
SystemExitKeyboardInterrupt	ExceptionrX   	print_exc
format_excopssequence_reset_sqlrM   executer   )r&   r   rU   rA   show_tracebackfixture_countobject_countobjects_per_fixturemodelsrf   app_modulesapp_fixturesfixture_labelpartsfixture_nameformatsformat_fixture_dirsfixture_dirlabel_found	full_pathfixturer@   r6   rG   rB   rX   esequence_sqlliner   r   r   rQ   v   s"  












S




zCommand.syncdata)r   r   r   __doc__r   rT   r#   rJ   r   rW   rQ   __classcell__r   r   r(   r   r   !   s    
r   )r   r^   django.appsr   django.confr   django.corer   django.core.management.baser   r   django.core.management.colorr   	django.dbr   r	   r
   django.template.defaultfiltersr   "django_extensions.management.utilsr   r   rt   r   r   r   r   r   r   <module>   s   
