3
g+&                 @   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   l/var/www/tester-filtro-web/env/lib/python3.6/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 command zRMakes the current database have the same data as the fixture(s), no more, no less.zfixture [fixture ...]c                sZ   t  j| |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#   '   s    zCommand.add_argumentsc             C   s   x|j  D ]}|jj }tdd |D }tdd || D }|j|}|rx6|D ].}|j|krT|j  |dkrTtdt|  qTW |dkr
|r
t	|}	|	dkrt|j
j}
nt|j
j}
tdt|	|
f  q
W 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   s   | ]}|j V  qd S )N)pk).0xr   r   r   	<genexpr>B   s    z0Command.remove_objects_not_in.<locals>.<genexpr>c             s   s   | ]}|j V  qd S )N)r)   )r*   r+   r   r   r   r,   C   s       zDeleted object: %sr      zDeleted %s %sN)keysobjectsallset
differencer)   deleteprintr%   lenZ_metaZverbose_name_pluralZverbose_name)r&   objects_to_keep	verbosityclass_currentZcurrent_idsZkeep_idsZremove_these_onesobjZnum_deletedZtype_deletedr   r   r   remove_objects_not_in:   s"    



zCommand.remove_objects_not_inc             O   s   t  | _|d | _|d r(|d jdnf }zTy$tj  | j|| W d Q R X W n* tk
r| } zt|W Y d d }~X nX W d tj	| jrt
| j j  X d S )NZdatabaser   ,)r   styleusingsplitr
   Zatomicsyncdatar   r   Zget_autocommitr	   close)r&   argsoptionsr   excr   r   r   handleV   s    

zCommand.handlec             C   sD  |d }|d }d}d}g }t  }t| j j }	dd tj D }
dd |
D }x@|D ]6}|jd}t|dkr|}tj	 }n4dj
|d d |d  }}|tj	 kr|g}ng }|r|dkrtd	|  ntd
||f tjj|r|g}n|ttj dg }x|D ]z}|dkr0tdt|  d}xR|D ]H}|dkrbtdt|||f  ytjj
|dj
||g}t|d}|r|j  td|t|f nv|d7 }|jd |dkrtd||t|f  yi }ttj||}x:|D ]2}|jj}||krt  ||< || j|j qW |d rR|d rR| j|| x<|D ]4}|d7 }|d  d7  < |j|jj |j  qXW |d r|d  r| j|| d}W nb ttfk
r    Y nH tk
r   dd l }|j  |r|j!  td||j" f Y nX |j  W n\ tk
rN } z
|W Y d d }~X n6 tk
r   |dkr~td||t|f  Y nX q<W qW qXW d|krtd| |dkrt| j j#j$| j%|}|r|dkrtd x|D ]}|	j&| qW |dkr|dkr@td n&|dkr@td|t'||t'|f  d S )Nr8   	tracebackr   c             S   s   g | ]
}|j qS r   )module)r*   appr   r   r   
<listcomp>w   s    z$Command.syncdata.<locals>.<listcomp>c             S   s$   g | ]}t jjt jj|jd qS )Zfixtures)ospathjoinr   __file__)r*   rI   r   r   r   rJ   x   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   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%srR   rR   )(r2   r	   r?   cursorr   Zget_app_configsr@   r6   r   Zget_public_serializer_formatsrM   r5   r   rK   rL   isabslistr   ZFIXTURE_DIRSr   openrB   appendZdeserializeobjectr(   addr<   save
SystemExitKeyboardInterrupt	ExceptionrG   	print_exc
format_excopsZsequence_reset_sqlr>   executer   )r&   r   rD   r8   show_tracebackZfixture_countZobject_countZobjects_per_fixturemodelsrS   Zapp_modulesZapp_fixturesZfixture_labelpartsZfixture_nameformatsZformat_Zfixture_dirsZfixture_dirZlabel_found	full_pathZfixturer7   r0   r;   r9   rG   eZsequence_sqlliner   r   r   rA   h   s    











,







zCommand.syncdata)r   r   r   __doc__r   rC   r#   r<   r   rF   rA   __classcell__r   r   )r(   r   r   !   s   r   )ri   rK   Zdjango.appsr   Zdjango.confr   Zdjango.corer   Zdjango.core.management.baser   r   Zdjango.core.management.colorr   Z	django.dbr   r	   r
   Zdjango.template.defaultfiltersr   Z"django_extensions.management.utilsr   r   r]   r   r   r   r   r   r   <module>
   s   