a
    ,ÖKe¾  ã                   @   sè   d dl mZ d dlmZ d dlmZmZmZ d dlm	Z	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mZ G dd„ deƒZG dd„ deƒZG dd„ de
ƒZdd„ ZG dd„ dƒZG dd„ dejƒZ dS )é    )Úimport_module)Úforms)ÚImproperlyConfiguredÚNON_FIELD_ERRORSÚValidationError)ÚBadSignatureÚSigner)ÚHiddenInputÚ	ModelForm)Ú	mark_safe)Úgettext)Úconf)Ú_select_lock)ÚRecordModifiedErrorÚVersionErrorc                       s    e Zd ZdZ‡ fdd„Z‡  ZS )ÚConcurrentForma1   Simple wrapper to ModelForm that try to mitigate some concurrency error.
        Note that is always possible have a RecordModifiedError in model.save().
        Statistically form.clean() should catch most of the concurrent editing, but
        is good to catch RecordModifiedError in the view too.
    c                    sb   z&| j jr$t| j | j| j jjj ƒ W n0 tyV   |  t	t
|  tdƒg¡iƒ¡ Y n0 tƒ  ¡ S )NzRecord Modified)ÚinstanceÚpkr   Zcleaned_dataZ_concurrencymetaÚfieldÚnamer   Z_update_errorsr   r   Zerror_classÚ_ÚsuperÚclean©Úself©Ú	__class__© úN/home/httpd/docs/test/DocsMgr/lib/python3.9/site-packages/concurrency/forms.pyr      s    $zConcurrentForm.clean)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú__classcell__r   r   r   r   r      s   r   c                       s.   e Zd ZdZdd„ ZeZd‡ fdd„	Z‡  ZS )ÚVersionWidgeta6  
    Widget that show the revision number using <div>

    Usually VersionField use `HiddenInput` as Widget to minimize the impact on the
    forms, in the Admin this produce a side effect to have the label *Version* without
    any value, you should use this widget to display the current revision number
    c                 C   s   |rt |ƒ}|S ©N)Ústr©r   Úvaluer   r   r   Úformat_value*   s    zVersionWidget.format_valueNc                    sR   t ƒ  |||¡}d}t|tƒr2t|ƒ d¡d }n|d urBt|ƒ}td||f ƒS )NÚ ú:r   z%s<div>%s</div>)r   ÚrenderÚ
isinstanceÚSignedValuer&   Úsplitr   )r   r   r(   ÚattrsÚretÚlabelr   r   r   r,   1   s    
zVersionWidget.render)N)r   r    r!   r"   r)   Z_format_valuer,   r#   r   r   r   r   r$   !   s   r$   c                       s   e Zd Z‡ fdd„Z‡  ZS )ÚVersionFieldSignerc                    s   |sd S t ƒ  |¡S r%   )r   Úsignr'   r   r   r   r4   =   s    zVersionFieldSigner.sign)r   r    r!   r4   r#   r   r   r   r   r3   <   s   r3   c               
   C   s¨   t j} |  d¡}| d |… | |d d …  }}zt|ƒ}W n4 tyn } ztd||f ƒ‚W Y d }~n
d }~0 0 zt||ƒ}W n" ty    td||f ƒ‚Y n0 |ƒ S )NÚ.é   z)Error loading concurrency signer %s: "%s"z5Module "%s" does not define a valid signer named "%s")r   ZFIELD_SIGNERÚrfindr   ÚImportErrorr   ÚgetattrÚAttributeError)ÚpathÚiÚmoduleÚattrÚmodÚeZsigner_classr   r   r   Ú
get_signerC   s    
&rA   c                   @   s   e Zd Zdd„ Zdd„ ZdS )r.   c                 C   s
   || _ d S r%   )r(   r'   r   r   r   Ú__init__S   s    zSignedValue.__init__c                 C   s   | j rt| j ƒS dS d S ©Nr*   )r(   r&   r   r   r   r   Ú__repr__V   s    
zSignedValue.__repr__N)r   r    r!   rB   rD   r   r   r   r   r.   R   s   r.   c                       sD   e Zd ZeZeZ‡ fdd„Zdd„ Zdd„ Zdd„ Z	d	d
„ Z
‡  ZS )ÚVersionFieldc                    sZ   |  dtƒ ¡| _|  dd ¡ |  dd ¡ d|d< d |d< | dt¡ tƒ j|i |¤Ž d S )NZsignerZ	min_valueZ	max_valueTÚrequiredÚinitialÚwidget)ÚpoprA   Ú_signerÚ
setdefaultr	   r   rB   )r   ÚargsÚkwargsr   r   r   rB   a   s    zVersionField.__init__c                 C   s   t |ƒS r%   )r.   )r   ÚdatarG   r   r   r   Ú
bound_dataj   s    zVersionField.bound_datac                 C   s*   t |tƒr|S |d u rdS t| j |¡ƒS rC   )r-   r.   rJ   r4   r'   r   r   r   Úprepare_valuem   s
    
zVersionField.prepare_valuec              	   C   sH   z$|dvr t | j t|ƒ¡ƒW S W dS  ttfyB   t|ƒ‚Y n0 d S )N)Nr*   ÚNoner   )ÚintrJ   Zunsignr&   r   Ú
ValueErrorr   r'   r   r   r   Ú	to_pythont   s    zVersionField.to_pythonc                 C   s   i S r%   r   )r   rH   r   r   r   Úwidget_attrs|   s    zVersionField.widget_attrs)r   r    r!   r	   rH   Zhidden_widgetrB   rO   rP   rT   rU   r#   r   r   r   r   rE   ]   s   	rE   N)!Ú	importlibr   Zdjangor   Zdjango.core.exceptionsr   r   r   Zdjango.core.signingr   r   Zdjango.formsr	   r
   Zdjango.utils.safestringr   Zdjango.utils.translationr   r   Zconcurrency.configr   Zconcurrency.corer   Zconcurrency.exceptionsr   r   r   r$   r3   rA   r.   ZIntegerFieldrE   r   r   r   r   Ú<module>   s   