
    Wwg3                         d dl Z d dlmZ d dlmZmZmZmZmZ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)	AnyCallable
CollectionDictIterableListOptionalTuple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__     H/var/www/horilla/myenv/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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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
m2m_fieldsserialize_dataserialize_kwargsserialize_auditlog_fields_onlyc
           	          	 g g i g 
t               i s	rst        d      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 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.)r6   r7   r8   r9   r:   r;   r<   r=   )
issubclassr   	TypeErrorr.   _connect_signals)
clsr7   r6   r:   r8   r9   r3   r=   r;   r<   s
    r   	registrarz1AuditlogModelRegistry.register.<locals>.registrarw   sZ    c5) FGG #1"0"0*("0$42P	#DNN3 !!#&
 Jr   c                      |       S Nr   )rC   rD   s    r   <lambda>z0AuditlogModelRegistry.register.<locals>.<lambda>   s    y~ r   )setr   r    AUDITLOG_EXCLUDE_TRACKING_FIELDSappend)r3   r5   r6   r7   r8   r9   r:   r;   r<   r=   fldrD   s   ` ```````` @r   registerzAuditlogModelRegistry.registerG   s    4 !N!N!NKJ#! >+F 
 << 	'C!!#&	'	 	, = .- 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.   r3   r5   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KeyErrorrO   s     r   
unregisterz AuditlogModelRegistry.unregister   s7    	,u% $$U+  		s   ! 	--c                 H    t        | j                  j                               S rF   )listr.   keys)r3   s    r   
get_modelsz AuditlogModelRegistry.get_models   s    DNN'')**r   c                     t        | j                  |   d         t        | j                  |   d         t        | j                  |   d         t        | j                  |   d         dS )Nr6   r7   r8   r9   )r6   r7   r8   r9   )rV   r.   r0   rO   s     r   get_model_fieldsz&AuditlogModelRegistry.get_model_fields   sg    "4>>%#89I#JK"4>>%#89I#JK"4>>%#89I#JKu 5m DE	
 	
r   c                     t        | j                  |   d         t        | j                  |   d         t        | j                  |   d         dS )Nr;   r<   r=   )r;   r<   r=   )boolr.   r0   rO   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_uidr:   throughN)r-   r_   r/   itemsconnect_dispatch_uidr2   r.   r1   getattrr   )r3   r5   r_   signalreceiver
field_namefield	m2m_models           r   rB   z&AuditlogModelRegistry._connect_signals   s     	< $ 3 3 5 	FHNN!//A  	 99"nnU3LA 

/
;7?!!%(4z2#E95	##$!%!3!3K!J
 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`   rc   N)r/   rd   
disconnectrf   r1   rg   r   )r3   r5   rh   ri   rj   rk   rl   s          r   rR   z)AuditlogModelRegistry._disconnect_signals   s     !% 3 3 5 	FH4+=+=fh+O  	 %)$5$5e$<$B$B$D 	 JE:.Ey1I"" !//XF	 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)r3   rh   ri   s      r   rf   z#AuditlogModelRegistry._dispatch_uid   s    $xFR\11r   	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_configrX   LookupError)r3   rq   	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 rF   )tupleDEFAULT_EXCLUDE_MODELSr{   )r3   r|   rq   r5   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 )Nr5   z2An error was encountered while registering model 'z.' - make sure the app is registered correctly.r   r   )	copydeepcopy
isinstancestrr{   rT   rL   r0   r   )r3   r   r5   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        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]:  }|j.                  r,|j0                  j"                  j$                  s|j.                  < }}| j3                  |||        | j5                  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'zBSetting 'AUDITLOG_INCLUDE_TRACKING_MODELS' must be a list or tuplezBSetting 'AUDITLOG_EXCLUDE_TRACKING_FIELDS' must be a list or tuplezDSetting 'AUDITLOG_INCLUDE_TRACKING_MODELS' items must be str or dictr5   zNSetting 'AUDITLOG_INCLUDE_TRACKING_MODELS' dict items must contain 'model' keyrs   z^Setting 'AUDITLOG_INCLUDE_TRACKING_MODELS' model must be in the format <app_name>.<model_name>T)include_auto_created)r5   r:   r7   N)r   r   AUDITLOG_INCLUDE_ALL_MODELSr\   rA   AUDITLOG_DISABLE_ON_RAW_SAVE AUDITLOG_EXCLUDE_TRACKING_MODELSrV   r~   rv   rI    AUDITLOG_INCLUDE_TRACKING_MODELSr   r0   r   r   rX   _metamanaged
get_fieldsr   namerelated_objectsrelated_namerelated_modelrL   r   )	r3   itemr   r5   metamr:   ir7   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 
 (CCdE]ST  (CCdE]ST  == 	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~  %, 	hGGH"s   K,K
?K)TTTTTN)	NNNNNNFNF) r   r   r   __doc__r   r\   r
   r   r   r   r4   r   r	   r   r   r   rL   rP   rT   rX   rZ   r]   rB   rR   DispatchUIDrf   r{   r   r   r   r   r   r   r   r   r!   r!   $   s    E 8<)) ) 	)
 ) ) k8345)<  .2.237+/04$59/4LL !c+L !c+	L
 !c3h0L d3i(L Z_-L L #4S>2L )-L\'i 'D ',	 ,d ,+DO +
i 

9 
2%"2 2C DO 	'/}		i	'xc4S>6I0J'K 'PT '$UIr   r!   )$r   collectionsr   typingr   r   r   r   r   r	   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   intr   	Exceptionr   r!   auditlogr   r   r   <module>r      sl     #
 
 
  3 +  # %CcM"		 	FI FIR
 !"r   