
    >Tf	                     R    d dl mZ d dlmZ  G d d          Z G d d          ZdS )    )DeferredAttribute)registryc                   0    e Zd ZdZd Zd Zd Zd Zd ZdS )Trackerzj
    An ephemeral instance employed to record which tracked fields on an instance have been modified.
    c                     i | _         d S N_changed_fieldsselfs    7/var/www/html/netbox-4.1.3/netbox/utilities/tracking.py__init__zTracker.__init__
   s    !    c                     || j         v S r   r	   )r   items     r   __contains__zTracker.__contains__   s    t+++r   c                     || j         |<   dS )zY
        Mark an attribute as having been changed and record its original value.
        Nr	   )r   namevalues      r   setzTracker.set   s     &+T"""r   c                     | j         |         S )ze
        Return the original value of a changed field. Raises KeyError if name is not found.
        r	   )r   r   s     r   getzTracker.get   s     #D))r   c                 T    |D ]}| j                             |d           i | _         dS )zM
        Clear any fields that were recorded as having been changed.
        N)r
   pop)r   namesr   s      r   clearzTracker.clear   s=      	& 	&D $$T40000#%D   r   N)	__name__
__module____qualname____doc__r   r   r   r   r    r   r   r   r      si         " " ", , ,+ + +* * *& & & & &r   r   c                   H     e Zd Z fdZed             Z fdZ fdZ xZS )TrackingModelMixinc                 H     t                      j        |i | d| _        d S )NT)superr   _initialized)r   argskwargs	__class__s      r   r   zTrackingModelMixin.__init__(   s/    $)&))) !r   c                 t    t          | j        d          st                      | j        _        | j        j        S )z`
        Return the Tracker instance for this instance, first creating it if necessary.
        _tracker)hasattr_stater   r+   r   s    r   trackerzTrackingModelMixin.tracker.   s1    
 t{J// 	-#*99DK {##r   c                      t                      j        |i | |                    dg           } | j        j        |  d S )Nupdate_fields)r%   saver   r.   r   )r   r'   r(   r0   r)   s       r   r1   zTrackingModelMixin.save7   sK    d%f%%% 

?B77M****r   c                    t          | d          r|t          d         | j                 v r|| j        vr\|| j        v r2t          | |          }||k    r| j                            ||           nY| j                            |t                     n8|| j                            |          k    r| j        	                    |           t                                          ||           d S )Nr&   counter_fields)r,   r   r)   r.   __dict__getattrr   r   r   r   r%   __setattr__)r   r   r   	old_valuer)   s       r   r6   zTrackingModelMixin.__setattr__>   s    4(( 	-x 01$.AAAt|++t},,$+D$$7$7	 I-- L,,T9===((/@AAAAdl..t4444L&&t,,,D%(((((r   )	r   r   r   r   propertyr.   r1   r6   __classcell__)r)   s   @r   r#   r#   &   s        ! ! ! ! ! $ $ X$+ + + + +) ) ) ) ) ) ) ) )r   r#   N)django.db.models.query_utilsr   netbox.registryr   r   r#   r!   r   r   <module>r<      s    : : : : : : $ $ $ $ $ $& & & & & & & &@() () () () () () () () () ()r   