o
    Ti5                     @   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__ R/var/www/html/evchargy.com/venv/lib/python3.10/site-packages/model_utils/models.pyr      s   zTimeStampedModel.savec                   @      e Zd ZdZdS )zTimeStampedModel.MetaTN__name__
__module____qualname__abstractr!   r!   r!   r"   Meta(       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)nullblankendc                   @   r#   )zTimeFramedModel.MetaTNr$   r!   r!   r!   r"   r)   5   r*   r)   N)
r%   r&   r'   r+   r   ZDateTimeFieldr,   r/   r2   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   Nr4   status_changedr   r   r   r!   r"   r   E   s   zStatusModel.savec                   @   r#   )zStatusModel.MetaTNr$   r!   r!   r!   r"   r)   Q   r*   r)   )r%   r&   r'   r+   r   r,   r4   r   r5   r   r)   r-   r!   r!   r   r"   r3   9   s    r3   c                 K   sh   t | tsdS | jj}t| ddD ]\}}t| |r#t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.)r4   )
issubclassr3   _metadefault_managergetattr_field_existsr   r%   add_to_classr   nameZdefault_manager_name)senderr   r8   value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)
r6   r.   r:   r   r%   r;   r   r   Qnow)r=   r   r!   r!   r"   add_timeframed_query_managerk   s   


rC   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>   s    z!_field_exists.<locals>.<listcomp>)r7   Zlocal_fields)Zmodel_class
field_namer!   r!   r"   r:      s   r:   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                   @   r#   )zSoftDeletableModel.MetaTNr$   r!   r!   r!   r"   r)      r*   r)   T)Z_emit_deprecation_warningsNc                    s0   |rd| _ | j|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)usingrJ   N)
is_removedr   r   delete)r   rJ   Zsoftr   r   r   r!   r"   rL      s   zSoftDeletableModel.delete)NT)r%   r&   r'   r+   r   ZBooleanFieldrK   r)   r   objectsZavailable_objectsManagerZall_objectsrL   r-   r!   r!   r   r"   rH      s    
rH   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                   @   r#   )zUUIDModel.MetaTNr$   r!   r!   r!   r"   r)      r*   r)   N)r%   r&   r'   r+   r   idr)   r!   r!   r!   r"   rO      s    rO   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                   @   r#   )zSaveSignalHandlingModel.MetaTNr$   r!   r!   r!   r"   r)      r*   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   rU   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r+|jj}|j}|js@d| jvr@t	j
|| |||d tj|dd |sQ| ||| | ||||||}	W d   n1 sew   Y  || j_d| j_|jsd| jvrt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   )r=   rV   rawrJ   r   F)rJ   Z	savepointr   )r=   rV   r   r   rW   rJ   )r   Zdb_for_writer    lenr7   proxyZconcrete_modelZauto_createdrU   r   sendr   ZatomicZ_save_parentsZ_save_table_statedbZaddingr   )
r   rW   Zforce_insertZforce_updaterJ   r   clsoriginmetaupdatedr!   r!   r"   	save_base   s2   

z!SaveSignalHandlingModel.save_base)N)FFFNN)r%   r&   r'   r+   r)   r   ra   r-   r!   r!   r   r"   rT      s    
rT   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   rB   ZModelr   r.   r3   r@   rC   ZsignalsZclass_preparedconnectr:   rH   rO   rT   r!   r!   r!   r"   <module>   s&    