
    >Tf                         d dl mZ d dlmZmZmZmZ d dlmZm	Z	m
Z
 d dlmZ ddlmZ d Zd Zd	 Zd
 Zd Zd Zd ZdS )    )apps)FCountOuterRefSubquery)post_delete	post_save
pre_delete)registry   )CounterCacheFieldc                 L    t           d         |                                          S )zO
    Return field mappings for all counters registered to the given model.
    counter_fields)r   items)models    7/var/www/html/netbox-4.1.3/netbox/utilities/counters.pyget_counters_for_modelr   	   s!     $%e,22444    c                 v     | j                             |          j        di |t          |          |z   i dS )z
    Increment or decrement a counter field on an object identified by its model and primary key (PK). Positive values
    will increment; negative values will decrement.
    pkN )objectsfilterupdater   )r   r   counter_namevalues       r   update_counterr      sU    
 'EMB&  <50
1    r   c                     t          | j                            t          d                                        t          |                                        d                    } | j        j        di ||iS )z
    Perform a bulk update for the given model and counter field. For example,

        update_counts(Device, '_interface_count', 'interfaces')

    will effectively set

        Device.objects.update(_interface_count=Count('interfaces'))
    r   r   )_countr    r   )r   r   r   r   annotater   valuesr   )r   
field_namerelated_querysubquerys       r   update_countsr&      s     //88m@T@T8UU\\]eff H  5=  H#   r   c                 6   t          |           D ]\  }}| j                            |          j        }t	          ||d          }||j        v }|r|j                            |          nd}	|	t          ||	|d           ||s|rt          |||d           dS )zm
    Update counter fields on related objects when a TrackingModelMixin subclass is created or modified.
    Nr   )r   _meta	get_fieldrelated_modelgetattrtrackergetr   )
senderinstancecreatedkwargsr#   r   parent_modelnew_pkhas_old_fieldold_pks
             r   post_save_receiverr7   0   s     %;6$B$B 
B 
B 
L|--j99G:t44"h&665BL!%%j111 <rBBB=G<qAAA
B 
Br   c                     |j         j        }|j                            |j                                                  s	d|_        d S d S )Nr   T)r)   r   r   r   r   exists_previously_removed)r/   r0   originr2   r   s        r   pre_delete_receiverr<   A   sM    N E=8;//6688 ,'+$$$, ,r   c                     t          |           D ]Y\  }}| j                            |          j        }t	          ||d          }|"t          |d          st          |||d           ZdS )za
    Update counter fields on related objects when a TrackingModelMixin subclass is deleted.
    Nr:   r(   )r   r)   r*   r+   r,   hasattrr   )r/   r0   r;   r2   r#   r   r3   	parent_pks           r   post_delete_receiverr@   G   s     %;6$B$B F F 
L|--j99GHj$77	  ;P)Q)Q <L"EEEF Fr   c            
         | D ]}d |j                                         D             }|D ]}t          j        |j                  }t
          d         |         }|j        ||j         d<   t          j	        t          |d|j         j         d|j                    t          j	        t          |d|j         j         d|j                    t          j	        t          |d|j         j         d|j                    ԌdS )zn
    Register counter fields and connect post_save & post_delete signal handlers for the affected models.
    c                 >    g | ]}t          |          t          u |S r   )typer   ).0fields     r   
<listcomp>z$connect_counters.<locals>.<listcomp>_   s0     
 
 
4;;J[;[;[E;[;[;[r   r   _idF.)r/   weakdispatch_uidN)r)   
get_fieldsr   	get_modelto_model_namer   nameto_field_namer	   connectr7   labelr
   r<   r   r@   )modelsr   r   rE   to_modelchange_tracking_fieldss         r   connect_countersrU   X   sY        
 
${5577
 
 
 $ 	 	E~e&9::H &..>%?%I"BG*"e&9#>#>#>? " % 1@@EJ@@	    # % 1@@EJ@@	    $ % 1@@EJ@@	    )	   r   N)django.appsr   django.db.modelsr   r   r   r   django.db.models.signalsr   r	   r
   netbox.registryr   fieldsr   r   r   r&   r7   r<   r@   rU   r   r   r   <module>r[      s          9 9 9 9 9 9 9 9 9 9 9 9 G G G G G G G G G G $ $ $ $ $ $ % % % % % %5 5 5    ,B B B", , ,
F 
F 
F"$ $ $ $ $r   