a
    xd5                     @   s  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	 d	ejZG d
d dejZG dd dejZdd Zdd Zejj e ejj e dd Z!G dd dejZ"G dd dejZ#G d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                       sF   e Zd ZdZeedZeedZ fddZ	G dd dZ
  ZS )TimeStampedModelzl
    An abstract base class model that provides self-updating
    ``created`` and ``modified`` fields.

    createdmodifiedc                    s:   | 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__ J/var/www/html/Ranjet/env/lib/python3.9/site-packages/model_utils/models.pyr      s    zTimeStampedModel.savec                   @   s   e Zd ZdZdS )zTimeStampedModel.MetaTN__name__
__module____qualname__Zabstractr!   r!   r!   r"   Meta(   s   r'   )r$   r%   r&   __doc__r
   _r   r   r   r   r'   __classcell__r!   r!   r   r"   r      s
   r   c                   @   sF   e Zd ZdZejeddddZejeddddZG dd dZ	dS )	TimeFramedModelzm
    An abstract base class model that provides ``start``
    and ``end`` fields to record a timeframe.

    startT)nullZblankendc                   @   s   e Zd ZdZdS )zTimeFramedModel.MetaTNr#   r!   r!   r!   r"   r'   5   s   r'   N)
r$   r%   r&   r(   r   ZDateTimeFieldr)   r,   r.   r'   r!   r!   r!   r"   r+   ,   s   r+   c                       sJ   e Zd ZdZeedZeedddZ fddZ	G dd dZ
  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)Zmonitorc                    sB   | 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   Nr0   status_changedr   r   r   r!   r"   r   E   s    zStatusModel.savec                   @   s   e Zd ZdZdS )zStatusModel.MetaTNr#   r!   r!   r!   r"   r'   Q   s   r'   )r$   r%   r&   r(   r   r)   r0   r   r1   r   r'   r*   r!   r!   r   r"   r/   9   s
   r/   c                 K   sh   t | tsdS | jj}t| ddD ]6\}}t| |rFtd| j|f | |t	|d q"|j
| j_dS )z?
    Add a Querymanager for each status item dynamically.

    NZSTATUSr!   z^StatusModel: Model '%s' has a field named '%s' which conflicts with a status of the same name.)r0   )
issubclassr/   _metadefault_managergetattr_field_existsr   r$   add_to_classr   nameZdefault_manager_name)senderr   r4   valueZdisplayr!   r!   r"   add_status_query_managersU   s    

r;   c              	   K   sf   t | tsdS t| dr&td| j | dttjt	dtjddB tjt	dtjddB @  dS )	z7
    Add a QueryManager for a specific timeframe.

    NZ
timeframedz[Model '%s' has a field named 'timeframed' which conflicts with the TimeFramedModel manager.)Z
start__lteT)Zstart__isnull)Zend__gte)Zend__isnull)
r2   r+   r6   r   r$   r7   r   r   Qnow)r9   r   r!   r!   r"   add_timeframed_query_managerk   s    

r>   c                 C   s   |dd | j jD v S )Nc                 S   s   g | ]
}|j qS r!   )Zattname).0fr!   r!   r"   
<listcomp>       z!_field_exists.<locals>.<listcomp>)r3   Zlocal_fields)Zmodel_class
field_namer!   r!   r"   r6      s    r6   c                       sT   e Zd ZdZejddZG dd dZeddZ	e Z
e Zd fd	d
	Z  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                   @   s   e Zd ZdZdS )zSoftDeletableModel.MetaTNr#   r!   r!   r!   r"   r'      s   r'   T)Z_emit_deprecation_warningsNc                    s2   |rd| _ | j|d nt j|d|i|S dS )z
        Soft delete object (set its ``is_removed`` field to True).
        Actually delete object if setting ``soft`` to False.
        T)usingrF   N)
is_removedr   r   delete)r   rF   Zsoftr   r   r   r!   r"   rH      s    zSoftDeletableModel.delete)NT)r$   r%   r&   r(   r   ZBooleanFieldrG   r'   r   ZobjectsZavailable_objectsManagerZall_objectsrH   r*   r!   r!   r   r"   rD      s   
rD   c                   @   s,   e Zd ZdZeddddZG d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)Zprimary_keyversioneditablec                   @   s   e Zd ZdZdS )zUUIDModel.MetaTNr#   r!   r!   r!   r"   r'      s   r'   N)r$   r%   r&   r(   r   idr'   r!   r!   r!   r"   rJ      s   rJ   c                       s:   e Zd ZdZG dd dZd
 fdd	Zddd	Z  ZS )SaveSignalHandlingModelz
    An abstract base class model to pass a parameter ``signals_to_disable``
    to ``save`` method in order to disable signals
    c                   @   s   e Zd ZdZdS )zSaveSignalHandlingModel.MetaTNr#   r!   r!   r!   r"   r'      s   r'   Nc                    s    |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   rP   r   r   r   r!   r"   r      s    
zSaveSignalHandlingModel.saveFc           
   	   C   s  |pt j| j| d}|r$|s |r$J |du s<t|dks<J | j }}|jjrV|jj}|j}|jsd| jvrt	j
|| |||d tj|dd6 |s| ||| | ||||||}	W d   n1 s0    Y  || j_d| j_|jsd| jvrtj
|| |	 |||d	 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   )r9   rQ   rawrF   r   F)rF   Z	savepointr   )r9   rQ   r   r   rR   rF   )r   Zdb_for_writer    lenr3   proxyZconcrete_modelZauto_createdrP   r   sendr   ZatomicZ_save_parentsZ_save_table_statedbZaddingr   )
r   rR   Zforce_insertZforce_updaterF   r   clsoriginmetaupdatedr!   r!   r"   	save_base   s0    
2z!SaveSignalHandlingModel.save_base)N)FFFNN)r$   r%   r&   r(   r'   r   r\   r*   r!   r!   r   r"   rO      s   
  rO   N)%Zdjango.core.exceptionsr   Z	django.dbr   r   r   Zdjango.db.models.functionsr   Zdjango.db.models.signalsr   r   Zdjango.utils.translationr	   r)   Zmodel_utils.fieldsr
   r   r   r   r   Zmodel_utils.managersr   r   r=   ZModelr   r+   r/   r;   r>   ZsignalsZclass_preparedconnectr6   rD   rJ   rO   r!   r!   r!   r"   <module>   s$   