
    f5                         d dl mZ d dl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mZ  e            Z G d d	ej                  Z G d
 dej                  Z G d dej                  Zd Zd Zej        j                             e           ej        j                             e           d Z! G d dej                  Z" G d dej                  Z# G d dej                  Z$dS )    )ImproperlyConfigured)modelsroutertransaction)Now)	post_savepre_save)gettext_lazy)AutoCreatedFieldAutoLastModifiedFieldMonitorFieldStatusField	UUIDField)QueryManagerSoftDeletableManagerc                        e Zd ZdZ e ed                    Z e ed                    Z fdZ	 G d d          Z
 xZS )TimeStampedModelzl
    An abstract base class model that provides self-updating
    ``created`` and ``modified`` fields.

    createdmodifiedc                     |                     dd          }|r&t          |                              dh          |d<    t                      j        |i | dS )z
        Overriding the save method in order to make sure that
        modified field is updated even if it is not given as
        a parameter to the update field argument.
        update_fieldsNr   getsetunionsupersaveselfargskwargsr   	__class__s       H/var/www/equiseq/venv/lib/python3.11/site-packages/model_utils/models.pyr   zTimeStampedModel.save   sd     

?D99 	M&)-&8&8&>&>
|&L&LF?#d%f%%%%%    c                       e Zd ZdZdS )TimeStampedModel.MetaTN__name__
__module____qualname__abstract r$   r#   Metar&   (           r$   r-   )r(   r)   r*   __doc__r   _r   r   r   r   r-   __classcell__r"   s   @r#   r   r      s         
 qq||,,G$$QQz]]33H
& 
& 
& 
& 
&           r$   r   c                       e Zd ZdZ ej         ed          dd          Z ej         ed          dd          Z G d d          Z	dS )	TimeFramedModelzm
    An abstract base class model that provides ``start``
    and ``end`` fields to record a timeframe.

    startT)nullblankendc                       e Zd ZdZdS )TimeFramedModel.MetaTNr'   r,   r$   r#   r-   r:   5   r.   r$   r-   N)
r(   r)   r*   r/   r   DateTimeFieldr0   r5   r8   r-   r,   r$   r#   r4   r4   ,   s         
 !F 7$dCCCE
&
qqxxd$
?
?
?C         r$   r4   c                        e Zd ZdZ e ed                    Z e ed          d          Z fdZ	 G d d          Z
 xZS )StatusModelaD  
    An abstract base class model with a ``status`` field that
    automatically uses a ``STATUS`` class attribute of choices, a
    ``status_changed`` date-time field that records when ``status``
    was last modified, and an automatically-added manager for each
    status that returns objects with that status only.

    statuszstatus changed)monitorc                     |                     dd          }|r*d|v r&t          |                              dh          |d<    t                      j        |i | dS )z
        Overriding the save method in order to make sure that
        status_changed field is updated even if it is not given as
        a parameter to the update field argument.
        r   Nr>   status_changedr   r   s       r#   r   zStatusModel.saveE   sp     

?D99 	SX66&)-&8&8&>&>@P?Q&R&RF?#d%f%%%%%r$   c                       e Zd ZdZdS )StatusModel.MetaTNr'   r,   r$   r#   r-   rC   Q   r.   r$   r-   )r(   r)   r*   r/   r   r0   r>   r   rA   r   r-   r1   r2   s   @r#   r=   r=   9   s          [8%%F!\!!$4"5"5xHHHN
& 
& 
& 
& 
&           r$   r=   c                 :   t          | t                    sdS | j        j        }t	          | dd          D ]T\  }}t          | |          rt          d| j        d|d          |                     |t          |                     U|j
        | j        _        dS )z?
    Add a Querymanager for each status item dynamically.

    NSTATUSr,   zStatusModel: Model 'z' has a field named 'z1' which conflicts with a status of the same name.)r>   )
issubclassr=   _metadefault_managergetattr_field_existsr   r(   add_to_classr   namedefault_manager_name)senderr!   rH   valuedisplays        r#   add_status_query_managersrQ   U   s    
 fk** l2O!&(B77 ? ?w'' 	&& ???EEE+  
 	E<u#=#=#=>>>>(7(<FL%%%r$   c           
         t          | t                    sdS t          | d          rt          d| j        z            |                     dt          t          j        t                    t          j        d          z  t          j        t                    t          j        d          z  z                       dS )	z7
    Add a QueryManager for a specific timeframe.

    N
timeframedz[Model '%s' has a field named 'timeframed' which conflicts with the TimeFramedModel manager.)
start__lteT)start__isnull)end__gte)end__isnull)
rF   r4   rJ   r   r(   rK   r   r   Qnow)rN   r!   s     r#   add_timeframed_query_managerrZ   k   s    
 fo.. V\** 
"@o
 
 	

 l	S	!	!	!FH4$@$@$@	@8S!!!FH$>$>$>>	@' '     r$   c                 2    |d | j         j        D             v S )Nc                     g | ]	}|j         
S r,   )attname).0fs     r#   
<listcomp>z!_field_exists.<locals>.<listcomp>   s    LLL!)LLLr$   )rG   local_fields)model_class
field_names     r#   rJ   rJ      s"    LL[->-KLLLLLr$   c                        e Zd ZdZ ej        d          Z G d d          Z ed          Z	 e            Z
 ej                    Zd
 fd		Z xZS )SoftDeletableModelz
    An abstract base class model with a ``is_removed`` field that
    marks entries that are not going to be used anymore, but are
    kept in db for any reason.
    Default manager returns only not-removed entries.
    F)defaultc                       e Zd ZdZdS )SoftDeletableModel.MetaTNr'   r,   r$   r#   r-   rh      r.   r$   r-   T)_emit_deprecation_warningsNc                 |    |rd| _         |                     |           dS  t                      j        |d|i|S )z
        Soft delete object (set its ``is_removed`` field to True).
        Actually delete object if setting ``soft`` to False.
        T)usingrk   N)
is_removedr   r   delete)r   rk   softr    r!   r"   s        r#   rm   zSoftDeletableModel.delete   sO    
  	@"DOIIEI"""""!577>?????r$   )NT)r(   r)   r*   r/   r   BooleanFieldrl   r-   r   objectsavailable_objectsManagerall_objectsrm   r1   r2   s   @r#   re   re      s          %$U333J        #"dCCCG,,.. &.""K	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@r$   re   c                   H    e Zd ZdZ eddd          Z G d d          ZdS )		UUIDModelzz
    This abstract base class provides id field on any model that inherits from it
    which will be the primary key.
    T   F)primary_keyversioneditablec                       e Zd ZdZdS )UUIDModel.MetaTNr'   r,   r$   r#   r-   r{      r.   r$   r-   N)r(   r)   r*   r/   r   idr-   r,   r$   r#   ru   ru      sg          

 
 
B         r$   ru   c                   J     e Zd ZdZ G d d          Zd fd	Z	 	 d	dZ xZS )
SaveSignalHandlingModelz
    An abstract base class model to pass a parameter ``signals_to_disable``
    to ``save`` method in order to disable signals
    c                       e Zd ZdZdS )SaveSignalHandlingModel.MetaTNr'   r,   r$   r#   r-   r      r.   r$   r-   Nc                 L    |pg | _          t                      j        |i | dS )zp
        Add an extra parameters to hold which signals to disable
        If empty, nothing will change
        N)signals_to_disabler   r   )r   r   r    r!   r"   s       r#   r   zSaveSignalHandlingModel.save   s3     #5":d%f%%%%%r$   Fc           	      v   |pt          j        | j        |           }|r|s|rJ |t          |          dk    sJ | j        x}}|j        j        r|j        j        }|j        }|j        s"d| j        vrt          j
        || |||           t          j        |d          5  |s|                     |||           |                     ||||||          }	ddd           n# 1 swxY w Y   || j        _        d| j        _        |j        s$d| j        vrt%          j
        || |	 |||	           g | _        dS )
z
        Copied from base class for a minor change.
        This is an ugly overwriting but since Django's ``save_base`` method
        does not differ between versions 1.8 and 1.10,
        that way of implementing wouldn't harm the flow
        )instanceNr   r	   )rN   r   rawrk   r   F)rk   	savepointr   )rN   r   r   r   r   rk   )r   db_for_writer"   lenrG   proxyconcrete_modelauto_createdr   r	   sendr   atomic_save_parents_save_table_statedbaddingr   )
r   r   force_insertforce_updaterk   r   clsoriginmetaupdateds
             r#   	save_basez!SaveSignalHandlingModel.save_base   s    K,T^dKKK ElEmEEE$M(:(:Q(>(>(>>~%f9? 	+)*Cy  	Zt7N%N%NM#U+    eu=== 	c 	c >""3}===&&sC|UTabbG	c 	c 	c 	c 	c 	c 	c 	c 	c 	c 	c 	c 	c 	c 	c
 "  	[8O%O%ON7{+E    #%s   $4C$$C(+C()N)FFFNN)r(   r)   r*   r/   r-   r   r   r1   r2   s   @r#   r~   r~      s                & & & & & & 16@D$% $% $% $% $% $% $% $%r$   r~   N)%django.core.exceptionsr   	django.dbr   r   r   django.db.models.functionsr   django.db.models.signalsr   r	   django.utils.translationr
   r0   model_utils.fieldsr   r   r   r   r   model_utils.managersr   r   rY   Modelr   r4   r=   rQ   rZ   signalsclass_preparedconnectrJ   re   ru   r~   r,   r$   r#   <module>r      s]   7 7 7 7 7 7 1 1 1 1 1 1 1 1 1 1 * * * * * * 8 8 8 8 8 8 8 8 6 6 6 6 6 6              D C C C C C C C	cee    v|   2
 
 
 
 
fl 
 
 
    &,   8= = =,  &   % %&? @ @ @   % %&B C C CM M M@ @ @ @ @ @ @ @8       6% 6% 6% 6% 6%fl 6% 6% 6% 6% 6%r$   