a
    µbÙ5  ã                   @   s€  d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ d dlmZm Z  ddl!m"Z" e #e$¡Z%e&e 'd¡ƒZ(dd„ Z)dd„ Z*ej+e)dd� ej,�r$ej+e*dd� G dd„ deƒZ-G dd„ de-ƒZ.G dd„ de-ƒZ/G dd„ de-ƒZ0dd „ Z1G d!d"„ d"e/ƒZ2dS )#é    N)ÚOrderedDict©Úupdate_wrapper)Úmodels)Úsignals)ÚField)Úclass_preparedÚpost_migrate)Ú	force_str)Úgettext_lazy)Úforms)Úget_revision_of_object)Úconf)ÚConcurrencyOptions)ÚfqnÚrefetché   )Ú	_TRIGGERS)	iÐ  r   r   r   r   r   r   r   r   c                 K   sÒ   t | dƒrÎ| | jjkr:t| jjdƒ}t |¡}t| d|ƒ t | dƒr¬t| jddƒ| j_t| jdd ƒ}t| jdd ƒ}|r‚|r‚t	dƒ‚|| j_
|| j_t| jddƒ| j_d	| j_| jjsÂ| jj | ¡ t| d
tƒ d S )NÚ_concurrencymetaÚConcurrencyMetaÚenabledTÚcheck_fieldsÚignore_fieldsz2Cannot set both 'check_fields' and 'ignore_fields'Ú	incrementFZget_concurrency_version)Úhasattrr   ÚbaseÚgetattrÚcopyÚdeepcopyÚsetattrr   r   Ú
ValueErrorr   r   r   ÚskipZmanuallyÚfieldÚ
wrap_modelr   )ÚsenderÚkwargsÚoriginÚlocalr   r   © r(   úO/home/httpd/docs/test/DocsMgr/lib/python3.9/site-packages/concurrency/fields.pyÚ"class_prepared_concurrency_handler   s$    


r*   c                 K   s2   ddl m} ddlm} dd„ |D ƒ}||ƒ d S )Nr   )Úconnections)Úcreate_triggersc                 S   s   g | ]}|‘qS r(   r(   )Ú.0Úaliasr(   r(   r)   Ú
<listcomp>;   ó    z3post_syncdb_concurrency_handler.<locals>.<listcomp>)Ú	django.dbr+   Úconcurrency.triggersr,   )r$   r%   r+   r,   Z	databasesr(   r(   r)   Úpost_syncdb_concurrency_handler6   s    r3   )Údispatch_uidc                       s‚   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Zdd	„ Z‡ fd
d„Z‡ fdd„Z	dd„ Z
dd„ Zeddd„ƒZedd„ ƒZdd„ Z‡  ZS )ÚVersionFieldz Base class c                    s\   |  dd ¡}|  dd ¡}|  dd ¡}|  dd ¡}|  dtdƒ¡}tƒ j|||d||d� d S )	NÚverbose_nameÚnameÚdb_tablespaceÚ	db_columnÚ	help_textzrecord revision numberr   )r:   Údefaultr8   r9   )ÚgetÚ_ÚsuperÚ__init__)ÚselfÚargsr%   r6   r7   r8   r9   r:   ©Ú	__class__r(   r)   r?   K   s    
üzVersionField.__init__c                 C   s   dS )NZBigIntegerFieldr(   )r@   r(   r(   r)   Úget_internal_typeX   s    zVersionField.get_internal_typec                 C   s   t |ƒS ©N)Úint)r@   Úvaluer(   r(   r)   Ú	to_python[   s    zVersionField.to_pythonc                 C   s   d S rE   r(   )r@   rG   Úmodel_instancer(   r(   r)   Úvalidate^   s    zVersionField.validatec                    s(   | j |d< tjj|d< tƒ jf i |¤ŽS )NÚ
form_classÚwidget)rK   r   r5   rL   r>   Ú	formfield)r@   r%   rB   r(   r)   rM   a   s    
zVersionField.formfieldc                    sZ   t ƒ j|g|¢R i |¤Ž t|dƒs,|jjr0d S t|dtƒ ƒ | |j_||j_	g |j_
d S )Nr   )r>   Úcontribute_to_classr   Ú_metaÚabstractr   r   r   r"   r   Útriggers©r@   ÚclsrA   r%   rB   r(   r)   rN   f   s    z VersionField.contribute_to_classc                 C   s   t || jt|ƒƒ d S rE   )r   ÚattnamerF   )r@   rI   rG   r(   r(   r)   Ú_set_version_valueo   s    zVersionField._set_version_valuec                 C   s&   |r|   |¡}|  ||¡ t|| jƒS rE   )Ú_get_next_versionrU   r   rT   )r@   rI   ÚaddrG   r(   r(   r)   Úpre_saver   s    
zVersionField.pre_saveFc                 C   s&   |s|j jrd S |  |¡ d|j _d S )NT)r   Zversioned_saveÚ_wrap_model_methods)rS   ÚmodelÚforcer(   r(   r)   r#   x   s    
zVersionField.wrap_modelc                 C   s$   t | dƒ}t| d| jj |¡ƒ d S )NÚ
_do_update)r   r   r   r"   Ú_wrap_do_update)rZ   Zold_do_updater(   r(   r)   rY      s    
z VersionField._wrap_model_methodsc                    s   ‡ fdd„}t |ˆ ƒS )Nc                    sJ  | j j}t| ƒ}|jjjs:|j|jur:ˆ | ||||||ƒS t|ƒD ]R\}	\}
}}|
|krB| j jr�t| ddƒs�|
 	| ¡}|
||f||	< |
 
| |¡  q–qB|j|d� ¡ }|�rF|�rF| j j�r$tj�r$t| ddƒ�s$|sÞtj�r$d||j|i}|jf i |¤Ž |¡dk}|�sF| 
| |¡ t | ¡}n"d|i}|jf i |¤Ž |¡dk}|S )NZ_concurrency_disable_incrementF)ÚpkZ_concurrency_disabledr^   r   )r   r"   r   rZ   rO   rP   Ú	enumerater   r   rV   rU   ÚfilterÚexistsr   r   ZENABLEDZVERSION_FIELD_REQUIREDrT   Z_updateZ	_callback)rI   Zbase_qsÚusingZpk_valÚvaluesZupdate_fieldsZforced_updateZversion_fieldZold_versionÚir"   Z_1rG   Znew_versionÚupdatedZfilter_kwargs©Úfuncr(   r)   r\   †   sB    

ÿ

ÿ
þýýz0VersionField._wrap_do_update.<locals>._do_updater   )r@   rg   r\   r(   rf   r)   r]   „   s    -zVersionField._wrap_do_update)F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r?   rD   rH   rJ   rM   rN   rU   rX   Úclassmethodr#   ÚstaticmethodrY   r]   Ú__classcell__r(   r(   rB   r)   r5   H   s   	
r5   c                   @   s   e Zd ZdZejZdd„ ZdS )ÚIntegerVersionFieldzæ
        Version Field that returns a "unique" version number for the record.

        The version number is produced using time.time() * 1000000, to get the benefits
        of microsecond if the system clock provides them.

    c                 C   s0   t || jdƒ}tt|ƒd tt ¡ d ƒt ƒS )Nr   r   i@B )r   rT   ÚmaxrF   ÚtimeÚOFFSET)r@   rI   Ú	old_valuer(   r(   r)   rV   À   s    z%IntegerVersionField._get_next_versionN©rh   ri   rj   rk   r   r5   rK   rV   r(   r(   r(   r)   ro   ¶   s   ro   c                   @   s   e Zd ZdZejZdd„ ZdS )ÚAutoIncVersionFieldúF
        Version Field increment the revision number each commit

    c                 C   s   t t|| jdƒƒd S )Nr   r   ©rF   r   rT   ©r@   rI   r(   r(   r)   rV   Ì   s    z%AutoIncVersionField._get_next_versionNrt   r(   r(   r(   r)   ru   Å   s   ru   c                       s~   e Zd ZdZejZ‡ fdd„Z‡ fdd„Zdd„ Z	e
dd	„ ƒZd
d„ Zdd„ Zedd„ ƒZe‡ fdd„ƒZedd„ ƒZ‡  ZS )ÚTriggerVersionFieldrv   c                    s*   |  dd ¡| _d| _tƒ j|i |¤Ž d S )NÚtrigger_nameF)ÚpopZ_trigger_nameZ_trigger_existsr>   r?   )r@   rA   r%   rB   r(   r)   r?   ×   s    zTriggerVersionField.__init__c                    s@   t ƒ j|g|¢R i |¤Ž |jjr*|jjr<| tvr<t | ¡ d S rE   )r>   rN   rO   rP   Úproxyr   ÚappendrR   rB   r(   r)   rN   Ü   s    z'TriggerVersionField.contribute_to_classc                 K   sv   g }| j }ddlm} ddlm}m} ddlm} | |¡}|| }	||	ƒ}
|
 	| ¡sr| 
|d | ¡d d dd�¡ |S )Nr   )ÚWarning)r+   Úrouter)ÚfactoryzMissed trigger for field {}zconcurrency.W001)ÚhintÚobjÚid)rZ   Zdjango.core.checksr~   r1   r+   r   r2   r€   Zdb_for_writeZget_triggerr}   Úformat)r@   r%   ÚerrorsrZ   r~   r+   r   r€   r.   Z
connectionÚfr(   r(   r)   Úcheckâ   s$    

üÿzTriggerVersionField.checkc                 C   s   ddl m} || ƒS )Nr   )Úget_trigger_name)r2   rˆ   )r@   rˆ   r(   r(   r)   rz   ø   s    z TriggerVersionField.trigger_namec                 C   s   t t|| jdƒƒS ©Nr   rw   rx   r(   r(   r)   rV   þ   s    z%TriggerVersionField._get_next_versionc                 C   s   dS r‰   r(   )r@   rI   rW   r(   r(   r)   rX     s    zTriggerVersionField.pre_savec                 C   s&   t | ƒ}t| | jjjt|ƒd ƒ d S r‰   )r   r   r   r"   rT   rF   )r‚   rs   r(   r(   r)   Ú_increment_version_number  s    z-TriggerVersionField._increment_version_numberc                    s4   t ttƒ | ¡ t| dƒ}t| d| jj |¡ƒ d S )NZsave)r>   ry   rY   r   r   r   r"   Ú
_wrap_save)rZ   Zold_saverB   r(   r)   rY     s    
z'TriggerVersionField._wrap_model_methodsc                    s   d‡ fdd„	}t |ˆ ƒS )NFc                    sR   |  dd¡}ˆ | |||fi |¤Ž}t | ¡ |rNt| ƒ}t| | jjjt|ƒƒ |S )Nr   F)	r{   ry   rŠ   r   r   r   r"   rT   r   )r@   Zforce_insertZforce_updaterb   r%   ÚreloadÚretrf   r(   r)   Úinner  s    
þz-TriggerVersionField._wrap_save.<locals>.inner)FFNr   )rg   rŽ   r(   rf   r)   r‹     s    zTriggerVersionField._wrap_save)rh   ri   rj   rk   r   r5   rK   r?   rN   r‡   Úpropertyrz   rV   rX   rm   rŠ   rY   r‹   rn   r(   r(   rB   r)   ry   Ð   s   

ry   c                 C   s6   |j s
dS |jr|jd u rdS |jr2| jd u r2dS dS )NFT)ZconcreteZis_relationZrelated_modelZmany_to_manyr^   )Úinstancer"   r(   r(   r)   Úfilter_fields!  s    r‘   c                       s<   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Zd	d
„ Z‡  ZS )ÚConditionalVersionFieldc                    sN   t ƒ j|g|¢R i |¤Ž tjj| j|t|ƒd� tjj| j|t|ƒd� d S )N)r$   r4   )	r>   rN   r   Z	post_initÚconnectÚ_load_modelr   Z	post_saveÚ_save_modelrR   rB   r(   r)   rN   /  s    
þ
þz+ConditionalVersionField.contribute_to_classc                 O   s   |d }|   |¡|j_d S ©Nr�   ©Ú	_get_hashr   Úinitial©r@   rA   r%   r�   r(   r(   r)   r”   9  s    z#ConditionalVersionField._load_modelc                 O   s   |d }|   |¡|j_d S r–   r—   rš   r(   r(   r)   r•   =  s    z#ConditionalVersionField._save_modelc           	         sì   t ƒ }|j}|jj}|jj‰ t t|¡}|d u rXˆ d u rXtdd„ t	||j 
¡ ƒD ƒƒ}n4|d u r„t‡ fdd„t	||j 
¡ ƒD ƒƒ}n|jj}|D ]B}| |¡}t|tjƒrÄt||ƒjddd�||< q�| |¡||< q�t t|ƒ d¡¡ ¡ S )Nc                 S   s   g | ]
}|j ‘qS r(   ©r7   ©r-   r†   r(   r(   r)   r/   I  r0   z5ConditionalVersionField._get_hash.<locals>.<listcomp>c                    s   g | ]}|j ˆ vr|j ‘qS r(   r›   rœ   ©r   r(   r)   r/   K  s   
ÿr^   T)Zflatzutf-8)r   rO   r   r   r   Ú	functoolsÚpartialr‘   Úsortedr`   Z
get_fieldsÚ	get_fieldÚ
isinstancer   ZManyToManyFieldr   Zvalues_listZvalue_from_objectÚhashlibZsha1r
   ÚencodeÚ	hexdigest)	r@   r�   rc   Úoptsr   Zfilter_ÚfieldsÚ
field_namer"   r(   r�   r)   r˜   A  s      $
z!ConditionalVersionField._get_hashc                 C   s\   |j stt|| jƒd ƒS |jj}|  |¡}||krJtt|| jdƒd ƒS tt|| jdƒƒS )Nr   r   )r^   rF   r   rT   r   r™   r˜   )r@   rI   ÚoldÚnewr(   r(   r)   rV   Y  s    
z)ConditionalVersionField._get_next_version)	rh   ri   rj   rN   r”   r•   r˜   rV   rn   r(   r(   rB   r)   r’   .  s
   
r’   )3r   rž   r£   Úloggingrq   Úcollectionsr   r   r1   r   Zdjango.db.modelsr   Zdjango.db.models.fieldsr   Zdjango.db.models.signalsr   r	   Zdjango.utils.encodingr
   Zdjango.utils.translationr   r=   Úconcurrencyr   Zconcurrency.apir   Zconcurrency.configr   Zconcurrency.corer   Zconcurrency.utilsr   r   rQ   r   Ú	getLoggerrh   ÚloggerrF   Úmktimerr   r*   r3   r“   ZAUTO_CREATE_TRIGGERSr5   ro   ru   ry   r‘   r’   r(   r(   r(   r)   Ú<module>   sF   
	ÿÿnQ