a
    µbI  ã                   @   sŠ   d dl Z d dlmZ d dlmZ d dlmZ d dlmZ g d¢Z	e  
e¡Zdd„ Zd	d
„ Zdd„ Zdd„ ZG dd„ dƒZG dd„ dƒZdS )é    N)ÚModel)Úconf)Úget_version_fieldname)ÚRecordModifiedError)Úapply_concurrency_checkÚget_revision_of_objectr   Údisable_concurrencyÚget_versionÚ
is_changedr   c                 C   s   t | t| ƒƒS )zT
        returns teh version of the passed object

    @param obj:
    @return:
    )Úgetattrr   )Úobj© r   úL/home/httpd/docs/test/DocsMgr/lib/python3.9/site-packages/concurrency/api.pyr      s    r   c                 C   s:   t | ƒ}t| ƒ}| jjjf i | jjj| j||i¤Ž ¡  S )zf
        returns True if `obj` is changed or deleted on the database
    :param obj:
    :return:
    )	r   r   Ú	__class__ÚobjectsÚfilterZ_metaÚpkÚnameÚexists)r   Zrevision_fieldÚversionr   r   r   r
      s
    ÿr
   c                 C   s*   t | ƒ}d| j||i}| jjjf i |¤ŽS )z«
        try go load from the database one object with specific version

    :param model_instance: instance in memory
    :param version: version number
    :return:
    r   )r   r   r   r   Úget)Zmodel_instancer   Zversion_fieldÚkwargsr   r   r   r	   &   s    r	   c                 C   sN   t | dƒrd S t d|  ¡ |ƒ }| | |¡ || j_ddlm} || ƒ d S )NÚ_concurrencymetaz Applying concurrency check to %sr   )Ú"class_prepared_concurrency_handler)ÚhasattrÚloggerÚdebugZcontribute_to_classr   ÚfieldZconcurrency.fieldsr   )ÚmodelÚ	fieldnameZversionclassÚverr   r   r   r   r   3   s    
r   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
Úconcurrency_disable_incrementc                 C   s   || _ |jj| _d S ©N)r   r   Ú	incrementÚ	old_value©Úselfr   r   r   r   Ú__init__G   s    z&concurrency_disable_increment.__init__c                 C   sL   t | jtƒr0t| jddƒd | _| j_d| j_n| jjjd | _| jj_d S )NÚ_concurrency_disable_incrementFT)	Ú
isinstancer   r   r   r$   r(   Ú_concurrency_disabledr   r#   ©r&   r   r   r   Ú	__enter__K   s    
z'concurrency_disable_increment.__enter__c                 O   s(   t | jtƒr| j| j_n| j| jj_d S r"   )r)   r   r   r$   r(   r   r#   ©r&   ÚargsÚkwdsr   r   r   Ú__exit__R   s    z&concurrency_disable_increment.__exit__c                    s   ‡ ‡fdd„}|S )Nc                     s6   ˆ� ˆ | i |¤ŽW  d   ƒ S 1 s(0    Y  d S r"   r   ©r.   r/   ©Úfuncr&   r   r   ÚwrapperY   s    z7concurrency_disable_increment.__call__.<locals>.wrapperr   ©r&   r3   r4   r   r2   r   Ú__call__X   s    z&concurrency_disable_increment.__call__N)Ú__name__Ú
__module__Ú__qualname__r'   r,   r0   r6   r   r   r   r   r!   F   s   r!   c                   @   sB   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dS )r   zÚ
        temporary disable concurrency

    can be used either as contextmanager or decorator.
    It can applied to model instances, model class of globally.

    :param model: model instance, model class or None
    Nc                 C   s&   || _ tj| _|d u pt|dƒ| _d S )Nr   )r   r   ÚENABLEDr$   r   Úconcurrency_managedr%   r   r   r   r'   j   s    zdisable_concurrency.__init__c                 C   sr   | j s
d S | jd u r&tjd | _t_nHt| jtƒrVt| jddƒd | _| j_d| j_n| jj	j
d | _| jj	_
d S )NFr*   T)r;   r   r   r:   r$   r)   r   r   r*   r   Úenabledr+   r   r   r   Ústarto   s    

zdisable_concurrency.startc                 C   sF   | j s
d S | jd u r| jt_n$t| jtƒr6| j| j_n| j| jj_	d S r"   )
r;   r   r$   r   r:   r)   r   r*   r   r<   r+   r   r   r   Úfinishz   s    

zdisable_concurrency.finishc                 C   s   |   ¡  d S r"   )r=   r+   r   r   r   r,   „   s    zdisable_concurrency.__enter__c                 O   s   |   ¡  d S r"   )r>   r-   r   r   r   r0   ‡   s    zdisable_concurrency.__exit__c                    s   ‡ ‡fdd„}|S )Nc                     s6   ˆ� ˆ | i |¤ŽW  d   ƒ S 1 s(0    Y  d S r"   r   r1   r2   r   r   r4   ‹   s    z-disable_concurrency.__call__.<locals>.wrapperr   r5   r   r2   r   r6   Š   s    zdisable_concurrency.__call__)N)
r7   r8   r9   Ú__doc__r'   r=   r>   r,   r0   r6   r   r   r   r   r   `   s   	

r   )ÚloggingZdjango.db.modelsr   Zconcurrency.configr   Zconcurrency.corer   Zconcurrency.exceptionsr   Ú__all__Ú	getLoggerr7   r   r   r
   r	   r   r!   r   r   r   r   r   Ú<module>   s   

