
    >Tf                         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 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 ddlmZ dZ G d de	j                  ZdS )    )cached_property)settings)GenericForeignKey)ValidationError)models)reverse)gettext_lazy)	MPTTModel)ObjectChangeActionChoices)ObjectChangeQuerySet)ChangeLoggingMixin)shallow_compare_dict   )
ObjectType)ObjectChangec                   l    e Zd ZdZ ej         ed          ddd          Z ej        e	j
        ej        ddd          Z ej         ed          d	d
          Z ej         ed          dd          Z ej         ed          de          Z ej        dej        d          Z ej                    Z edd          Z ej        dej        ddd          Z ej        dd          Z edd          Z ej        dd          Z ej         ed          ddd          Z ej         ed          ddd          Z e j!                    Z" G d d          Z#d  Z$ fd!Z% fd"Z&d# Z'd$ Z(e)d%             Z*e)d&             Z+d' Z,e)d(             Z-e)d)             Z.d* Z/ xZ0S )+r   aY  
    Record a change to an object and the user account associated with that change. A change record may optionally
    indicate an object related to the one being changed. For example, a change to an interface may also indicate the
    parent device. This will ensure changes made to component models appear in the parent model's changelog.
    timeTF)verbose_nameauto_now_addeditabledb_indexchanges)to	on_deleterelated_nameblanknullz	user name   )r   
max_lengthr   z
request ID)r   r   r   action2   )r   r   choiceszcontenttypes.ContentType+)r   r   r   changed_object_typechanged_object_id)ct_fieldfk_field)r   r   related_object_typerelated_object_id   )r   r   zpre-change data)r   r   r   r   zpost-change datac                       e Zd ZdgZ ej        d           ej        d          fZ ed          Z ed          Z	dS )ObjectChange.Metaz-time)r$   r%   )fields)r(   r)   zobject changezobject changesN)
__name__
__module____qualname__orderingr   Indexindexes_r   verbose_name_plural     ?/var/www/html/netbox-4.1.3/netbox/core/models/change_logging.pyMetar,   d   sf        9FL LMMMFL LMMM
 q))a 011r7   r9   c                     d                     | j        | j        |                                                                 | j                  S )Nz{} {} {} by {})formatr$   object_reprget_action_displaylower	user_nameselfs    r8   __str__zObjectChange.__str__m   sF    &&$##%%++--N	
 
 	
r7   c                     t                                                       | j        t          j                            d          vr5t          t          d                              | j                            d S )Nchange_loggingz>Change logging is not supported for this object type ({type}).)type)	supercleanr$   r   objectswith_featurer   r4   r;   )rA   	__class__s    r8   rG   zObjectChange.cleanu   sy     #:+=+J+JK[+\+\\\!RSSZZ1 [     ]\r7   c                     | j         s| j        j        | _         | j        st	          | j                  | _         t                      j        |i |S N)r?   userusernamer<   strchanged_objectrF   save)rA   argskwargsrJ   s      r8   rQ   zObjectChange.save   sT     ~ 	0!Y/DN 	8"4#677Duww|T,V,,,r7   c                 0    t          d| j        g          S )Nzcore:objectchange)rR   )r   pkr@   s    r8   get_absolute_urlzObjectChange.get_absolute_url   s    *$';;;;r7   c                 J    t           j                            | j                  S rL   )r   colorsgetr    r@   s    r8   get_action_colorzObjectChange.get_action_color   s    (/33DK@@@r7   c                 "    | j         | j        k    S rL   )prechange_datapostchange_datar@   s    r8   has_changeszObjectChange.has_changes   s    "d&:::r7   c                    | j                                         }t                      }t          |t                    r|                    ddh           t          |t                    r|                    h d           |S )a   
        Return a set of attributes which should be ignored when calculating a diff
        between the pre- and post-change data. (For instance, it would not make
        sense to compare the "last updated" times as these are expected to differ.)
        createdlast_updated>   lftrghtleveltree_id)r$   model_classset
issubclassr   updater
   )rA   modelattrss      r8   diff_exclude_fieldsz ObjectChange.diff_exclude_fields   s     (4466 e/00 	6LL)^4555 eY'' 	>LL<<<===r7   c                     i }t          | | d          pi }|                                D ](\  }}|| j        vr|                    d          s|||<   )|S )zh
        Return only the pre-/post-change attributes which are relevant for calculating a diff.
        _datar4   )getattritemsrl   
startswith)rA   prefixretchange_datakvs         r8   get_clean_datazObjectChange.get_clean_data   ss     dv$4$4$455;%%'' 	 	DAq000c9J9J0A
r7   c                 ,    |                      d          S )N	prechangerw   r@   s    r8   prechange_data_cleanz!ObjectChange.prechange_data_clean   s    "";///r7   c                 ,    |                      d          S )N
postchangerz   r@   s    r8   postchange_data_cleanz"ObjectChange.postchange_data_clean   s    ""<000r7   c                    | j         | j        | j        t          j        k    r"t                                                    }nh| j        t          j        k    r"t                                                    }n1t                    }t          |                                          }fd|D             fd|D             dS )zg
        Return a dictionary of pre- and post-change values for attributes which have changed.
        c                 <    i | ]}|                     |          S r6   rY   ).0ru   r\   s     r8   
<dictcomp>z%ObjectChange.diff.<locals>.<dictcomp>   s6       -.>%%a((  r7   c                 <    i | ]}|                     |          S r6   r   )r   ru   r]   s     r8   r   z%ObjectChange.diff.<locals>.<dictcomp>   s6       ./?&&q))  r7   )prepost)	r{   r~   r    r   ACTION_CREATEsortedkeysACTION_DELETEr   )rA   changed_attrschanged_datar]   r\   s      @@r8   diffzObjectChange.diff   s     24 ;3AAA"?#7#7#9#9::MM[5CCC">#6#6#8#899MM 0PPL"<#4#4#6#677M   2?     3@  	
 
 	
r7   )1r.   r/   r0   __doc__r   DateTimeFieldr4   r   
ForeignKeyr   AUTH_USER_MODELSET_NULLrM   	CharFieldr?   	UUIDField
request_idr   r    PROTECTr$   PositiveBigIntegerFieldr%   r   rP   r(   r)   related_objectr<   	JSONFieldr\   r]   r   
as_managerrH   r9   rB   rG   rQ   rV   rZ   r   r^   rl   rw   r{   r~   r   __classcell__)rJ   s   @r8   r   r      s|        
  6QvYY	  D 6#/  D ! Q{^^  I
 "!Q|__  J
 VQx[[)  F
 ,&+%.  
 7688&&&$  N ,&+%.   76   '&&$  N #&"  K &V%Q())	  N 'f&Q)**	  O ."-//G2 2 2 2 2 2 2 2
 
 
	 	 	 	 	- - - - -< < <A A A ; ; _;   _&	 	 	 0 0 _0 1 1 _1
 
 
 
 
 
 
r7   r   N)	functoolsr   django.confr   "django.contrib.contenttypes.fieldsr   django.core.exceptionsr   	django.dbr   django.urlsr   django.utils.translationr	   r4   mptt.modelsr
   core.choicesr   core.querysetsr   netbox.models.featuresr   utilities.datar   contenttypesr   __all__Modelr   r6   r7   r8   <module>r      s6   % % % % % %             @ @ @ @ @ @ 2 2 2 2 2 2             6 6 6 6 6 6 ! ! ! ! ! ! 2 2 2 2 2 2 / / / / / / 5 5 5 5 5 5 / / / / / / $ $ $ $ $ $
}
 }
 }
 }
 }
6< }
 }
 }
 }
 }
r7   