
    Bsi8                         d dl Z d dlmZ d dlmZmZ d dlmZmZm	Z	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mZmZ d d	lmZ d d
lmZ eeeef   Z G d de      Z  G d d      Z! e!       Z"y)    N)defaultdict)
CollectionIterable)AnyCallableOptionalUnion)apps)ManyToManyFieldModel)	ModelBase)ModelSignalm2m_changedpost_delete	post_savepre_save)settings)accessedc                       e Zd Zy)AuditLogRegistrationErrorN)__name__
__module____qualname__     ]/var/www/python-projects/worksol/worksolenv/lib/python3.12/site-packages/auditlog/registry.pyr   r      s    r   r   c                      e Zd ZdZdZ	 	 	 	 	 	 d'dededededed	eeee	f      fd
Z
	 	 	 	 	 	 	 	 	 	 d(dedeee      deee      deeeef      deee      dee   deee      dedeeeef      defdZdedefdZdeddfdZdee   fdZdefdZdefdZd Zd ZdefdZdefdZd edee   fd!Zd"ee   dee   fd#Zd$eeeeeef   f      ddfd%Zd& Z y))AuditlogModelRegistryzW
    A registry that keeps track of the models that use Auditlog to track changes.
    )zauditlog.LogEntryzadmin.LogEntryNcreateupdatedeleteaccessm2mcustomc                 R   ddl m}m}m}	m}
 i | _        i | _        t        t              | _	        |r|| j                  t        <   |r|
| j                  t        <   |r|	| j                  t        <   |r|| j                  t        <   || _        || j                  j                  |       y y )Nr   )
log_access
log_create
log_delete
log_update)auditlog.receiversr&   r'   r(   r)   	_registry_signalsr   dict_m2m_signalsr   r   r   r   _m2mr    )selfr   r    r!   r"   r#   r$   r&   r'   r(   r)   s              r   __init__zAuditlogModelRegistry.__init__"   s     	VU'-'1DMM)$&0DMM(#)3DMM+&&0DMM(#	MM  ( r   modelinclude_fieldsexclude_fieldsmapping_fieldsmask_fieldsmask_callable
m2m_fieldsserialize_dataserialize_kwargsserialize_auditlog_fields_onlyc           
      N   	
 g g i g 
t               	i 		s
rst        d      t        j                  D ]  }j	                  |        t        j
                  D ]  }j	                  |         
	f
d|fdS  |       y)a  
        Register a model with auditlog. Auditlog will then track mutations on this model's instances.

        :param model: The model to register.
        :param include_fields: The fields to include. Implicitly excludes all other fields.
        :param exclude_fields: The fields to exclude. Overrides the fields to include.
        :param mapping_fields: Mapping from field names to strings in diff.
        :param mask_fields: The fields to mask for sensitive info.
        :param mask_callable: The dotted path to a callable that will be used for masking. If not provided,
                              the default mask_callable will be used.
        :param m2m_fields: The fields to handle as many to many.
        :param serialize_data: Option to include a dictionary of the objects state in the auditlog.
        :param serialize_kwargs: Optional kwargs to pass to Django serializer
        :param serialize_auditlog_fields_only: Only fields being considered in changes will be serialized.
        NzxSerializer options were given but the 'serialize_data' option is not set. Did you forget to set serialized_data to True?c           
         
 t        | t              st        d      	
d	j                  | <   j	                  |        | S )z"Register models for a given class.z$Supplied model is not a valid model.)	r3   r4   r5   r6   r7   r8   r9   r:   r;   )
issubclassr   	TypeErrorr+   _connect_signals)clsr4   r3   r8   r5   r7   r6   r0   r;   r9   r:   s    r   	registrarz1AuditlogModelRegistry.register.<locals>.registrart   s]    c5) FGG #1"0"0*!.("0$42P
#DNN3 !!#&
 Jr   c                      |       S Nr   )rA   rB   s    r   <lambda>z0AuditlogModelRegistry.register.<locals>.<lambda>   s    y~ r   )setr   r    AUDITLOG_EXCLUDE_TRACKING_FIELDSappendAUDITLOG_MASK_TRACKING_FIELDS)r0   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   fldrB   s   ` ````````` @r   registerzAuditlogModelRegistry.register>   s    : !N!N!NKJ#! >+F 
 << 	'C!!#&	' 99 	$Cs#	$	 	. = .- er   returnc                     || j                   v S )z
        Check if a model is registered with auditlog.

        :param model: The model to check.
        :return: Whether the model has been registered.
        :rtype: bool
        )r+   r0   r2   s     r   containszAuditlogModelRegistry.contains   s     &&r   c                 `    	 | j                   |= | j                  |       y# t        $ r Y yw xY w)z
        Unregister a model with auditlog. This will not affect the database.

        :param model: The model to unregister.
        N)r+   _disconnect_signalsKeyErrorrN   s     r   
unregisterz AuditlogModelRegistry.unregister   s7    	,u% $$U+  		s   ! 	--c                 H    t        | j                  j                               S rD   )listr+   keys)r0   s    r   
get_modelsz AuditlogModelRegistry.get_models   s    DNN'')**r   c                     t        | j                  |   d         t        | j                  |   d         t        | j                  |   d         t        | j                  |   d         | j                  |   d   dS )Nr3   r4   r5   r6   r7   )r3   r4   r5   r6   r7   )rU   r+   r-   rN   s     r   get_model_fieldsz&AuditlogModelRegistry.get_model_fields   sx    "4>>%#89I#JK"4>>%#89I#JK"4>>%#89I#JKu 5m DE!^^E2?C
 	
r   c                     t        | j                  |   d         t        | j                  |   d         t        | j                  |   d         dS )Nr9   r:   r;   )r9   r:   r;   )boolr+   r-   rN   s     r   get_serialize_optionsz+AuditlogModelRegistry.get_serialize_options   sT    "4>>%#89I#JK $T^^E%:;M%N O.2u%&FG/
 	
r   c           	         ddl m} | j                  j                         D ])  \  }}|j	                  ||| j                  ||             + | j                  rv| j                  |   d   D ]`  } ||      }|| j                  |   |<   t        ||      }t        |d      }t        j                  ||| j                  t        |             b yy)z0
        Connect signals for the model.
        r   )make_log_m2m_changessenderdispatch_uidr8   throughN)r*   r^   r,   itemsconnect_dispatch_uidr/   r+   r.   getattrr   _m2m_dispatch_uid)r0   r2   r^   signalreceiver
field_namefield	m2m_models           r   r@   z&AuditlogModelRegistry._connect_signals   s     	< $ 3 3 5 	FHNN!//A  	 99"nnU3LA 

/
;7?!!%(4z2#E95	##$!%!7!7Y!O
 r   c                 x   | j                   j                         D ](  \  }}|j                  || j                  ||             * | j                  |   j                         D ]H  \  }}t        ||      }t        |d      }t        j                  || j                  t        |             J | j                  |= y)z3
        Disconnect signals for the model.
        r_   rb   N)r,   rc   
disconnectre   r.   rf   r   rg   )r0   r2   rh   ri   rj   rk   rl   s          r   rQ   z)AuditlogModelRegistry._disconnect_signals   s     !% 3 3 5 	FH4+=+=fh+O  	 %)$5$5e$<$B$B$D 	 JE:.Ey1I"" !33KK	 e$r   c                 B    t        |       t        |      t        |      fS )zXGenerate a dispatch_uid which is unique for a combination of self, signal, and receiver.id)r0   rh   ri   s      r   re   z#AuditlogModelRegistry._dispatch_uid   s    $xFR\11r   c                 B    t        |       t        |      t        |      fS )zVGenerate a dispatch_uid which is unique for a combination of self, signal, and sender.rp   )r0   rh   r`   s      r   rg   z'AuditlogModelRegistry._m2m_dispatch_uid   s    $xFRZ//r   	app_modelc                     	 	 |j                  d      \  }}t        j                  ||      gS # t        $ r& t        j                  |      j                         cY S w xY w# t        $ r g cY S w xY w)N.)splitr
   	get_model
ValueErrorget_app_configrW   LookupError)r0   rs   	app_label
model_names       r   _get_model_classesz(AuditlogModelRegistry._get_model_classes   sr    	C(1(<%	:y*=>> C**95@@BBC 	I	s'   *. ,AA  AA   A.-A.exclude_tracking_modelsc                     t        |      | j                  z   D cg c]  }| j                  |      D ]  }|  }}}|S c c}}w rD   )tupleDEFAULT_EXCLUDE_MODELSr}   )r0   r~   rs   r2   exclude_modelss        r   _get_exclude_modelsz)AuditlogModelRegistry._get_exclude_models   sb    
 ##:;))*
00;	
  

 
 
s   A modelsc                    t        j                  |      }|D ]  }t        |t              r9| j	                  |      D ]$  }| j                  |       | j                  |       & Lt        |t              s]| j	                  |d         }|st        d|d    d      |d   |d<   | j                  |d           | j                  di |  y )Nr2   z2An error was encountered while registering model 'z.' - make sure the app is registered correctly.r   r   )	copydeepcopy
isinstancestrr}   rS   rK   r-   r   )r0   r   r2   model_classappmodels        r   _register_modelsz&AuditlogModelRegistry._register_models  s    v& 	'E%%#'#:#:5#A /KOOK0MM+./ E4(225>B3LUSZ^L\ ]E E  "*!gg/&&	'r   c                    t        t        j                  t              st	        d      t        t        j
                  t              st	        d      t        t        j                  t        t        f      st	        d      t        j                  st        j                  rt        d      t        j                  rt        j                  st        d      t        j                  rt        j                  st        d      t        t        j                  t        t        f      st	        d      t        t        j                  t        t        f      st	        d      t        t        j                  t        t        f      st	        d	      t        j                  D ]U  }t        |t        t        f      st	        d
      t        |t              s5d|vrt        d      d|d   vsLt        d       t        j                  r| j                  t        j                        }t!        j"                  d      D ]  }||v r|j$                  }|j&                  s!|j)                         D cg c]  }t        |t*              s|j,                  ! }}|j.                  D cg c]:  }|j0                  r,|j2                  j$                  j&                  s|j0                  < }}| j5                  |||        t        t        j6                  t              st	        d      | j9                  t        j                         yc c}w c c}w )z9
        Register models from settings variables
        z7Setting 'AUDITLOG_INCLUDE_ALL_MODELS' must be a booleanz8Setting 'AUDITLOG_DISABLE_ON_RAW_SAVE' must be a booleanzBSetting 'AUDITLOG_EXCLUDE_TRACKING_MODELS' must be a list or tupleztIn order to use setting 'AUDITLOG_EXCLUDE_TRACKING_MODELS', setting 'AUDITLOG_INCLUDE_ALL_MODELS' must set to 'True'zoIn order to use 'AUDITLOG_EXCLUDE_TRACKING_FIELDS', setting 'AUDITLOG_INCLUDE_ALL_MODELS' must be set to 'True'zlIn order to use 'AUDITLOG_MASK_TRACKING_FIELDS', setting 'AUDITLOG_INCLUDE_ALL_MODELS' must be set to 'True'zBSetting 'AUDITLOG_INCLUDE_TRACKING_MODELS' must be a list or tuplezBSetting 'AUDITLOG_EXCLUDE_TRACKING_FIELDS' must be a list or tuplez?Setting 'AUDITLOG_MASK_TRACKING_FIELDS' must be a list or tuplezDSetting 'AUDITLOG_INCLUDE_TRACKING_MODELS' items must be str or dictr2   zNSetting 'AUDITLOG_INCLUDE_TRACKING_MODELS' dict items must contain 'model' keyru   z^Setting 'AUDITLOG_INCLUDE_TRACKING_MODELS' model must be in the format <app_name>.<model_name>T)include_auto_created)r2   r8   r4   z7Setting 'AUDITLOG_STORE_JSON_CHANGES' must be a booleanN)r   r   AUDITLOG_INCLUDE_ALL_MODELSr[   r?   AUDITLOG_DISABLE_ON_RAW_SAVE AUDITLOG_EXCLUDE_TRACKING_MODELSrU   r   rx   rG   rI    AUDITLOG_INCLUDE_TRACKING_MODELSr   r-   r   r
   rW   _metamanaged
get_fieldsr   namerelated_objectsrelated_namerelated_modelrK   AUDITLOG_STORE_JSON_CHANGESr   )	r0   itemr   r2   metamr8   ir4   s	            r   register_from_settingsz,AuditlogModelRegistry.register_from_settings  s    (>>EUVV(??FVWW(CCdE]ST 
 4499K  5588N  2288N 
 (CCdE]ST  (CCdE]ST  (@@4-PQ  == 	DdS$K0Z  $%$&$h  d7m+$9 	" //!5599N dC N*{{|| %)OO$5 A9WAFF
  "11"~~aoo.C.C.K.K NN" " J~  %, (>>EUVVhGGH#"s   0MM$?M	)TTTTTN)
NNNNNNNFNF)!r   r   r   __doc__r   r[   r   r-   r   r   r1   r   rU   r   r   r   rK   rO   rS   rW   rY   r\   r@   rQ   DispatchUIDre   rg   r}   r   r   r	   r   r   r   r   r   r   r      s    E 8<)) ) 	)
 ) ) k8345)<  .2.237+/'+04$59/4SS !c+S !c+	S
 !c3h0S d3i(S  }S Z_-S S #4S>2S )-Sj'i 'D ',	 ,d ,+DO +
i 

9 
2%"2 20; 0C DO 	'/}		i	'xc4S>6I0J'K 'PT '$fIr   r   )#r   collectionsr   collections.abcr   r   typingr   r   r   r	   django.appsr
   django.db.modelsr   r   django.db.models.baser   django.db.models.signalsr   r   r   r   r   auditlog.confr   auditlog.signalsr   r   intr   	Exceptionr   r   auditlogr   r   r   <module>r      sd     # 0 1 1  3 +  # %CcM"		 	cI cIL !"r   