a
    §Üee2  ã                   @   sˆ  d dl Z d dlZd dlmZ d dlZd dlmZ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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  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+m,Z, d dl-m.Z. d dl/m0Z0m1Z1 d dl2m3Z3 e4ƒ Z5G dd„ dƒZ6G dd„ deƒZ7G dd„ deƒZ8G dd„ dƒZ9G dd„ de6e9ej:ƒZ;dS ) é    N)Úreduce)ÚadminÚmessages)Úhelpers)ÚError)ÚImproperlyConfiguredÚValidationError)Útransaction)ÚQ)ÚINITIAL_FORM_COUNTÚManagementFormÚMAX_NUM_FORM_COUNTÚTOTAL_FORM_COUNT)ÚBaseModelFormSet)ÚHttpResponseÚHttpResponseRedirect)Ú	force_str)Ú	mark_safe)Úngettext)ÚcoreÚforms)Úget_revision_of_object)Úconcurrency_param_name)Ú*CONCURRENCY_LIST_EDITABLE_POLICY_ABORT_ALLÚconf)ÚRecordModifiedError)ÚConcurrentFormÚVersionWidget)Úflattenc                       s@   e Zd ZdZ‡ fdd„Zedƒe_de_dd„ Zdd„ Z	‡  Z
S )	ÚConcurrencyActionMixinTc                    s8   | j r(tj tjtd|jt|ƒf ƒ¡S tƒ  	|¡S dS )zE
        A list_display column containing a checkbox widget.
        z%s,%sN)
Úcheck_concurrent_actionr   ZcheckboxÚrenderÚACTION_CHECKBOX_NAMEr   Úpkr   ÚsuperÚaction_checkbox)ÚselfÚobj©Ú	__class__© úN/home/httpd/docs/test/DocsMgr/lib/python3.9/site-packages/concurrency/admin.pyr%   !   s
    
ÿz&ConcurrencyActionMixin.action_checkboxz,<input type="checkbox" id="action-toggle" />c                 C   s   dS )Nz-concurrency/delete_selected_confirmation.htmlr*   ©r&   r*   r*   r+   Úget_confirmation_template.   s    z0ConcurrencyActionMixin.get_confirmation_templatec              
   C   sæ  zt |j dd¡ƒ}W n ty,   d}Y n0 |j ¡ }| tjd¡ | dd¡ z| d| 	d¡| i¡ W n t
y€   Y n0 | j|dd�}|  |¡|jd _| ¡ �râ|jd }|  |¡| \}}}	|jd rÚt}
n|j 	tj¡}
|
sðdS | jjj}| j�r¾|  ¡ | _|
tu�r²g }|
D ]X}z| d¡\}}W n  t�yT   td| ƒ‚Y n0 | tf i d	||j|i¤Ž¡ �q| tt j!|ƒ¡}t"|
ƒ| #¡ k�r¾t$ %|d
¡ t&dƒS nt$ '|d¡ || ||ƒ}t(|t)ƒ�rÚ|S t&dƒS dS )z¼
        Handle an admin action. This is called if a request is POSTed to the
        changelist; it returns an HttpResponse if the action was handled, and
        None otherwise.
        Úindexr   NÚaction)Úauto_idZselect_acrossú,z_`ConcurrencyActionMixin` error.A tuple with `primary_key, version_number` expected:  `%s` foundr#   zTOne or more record were updated. (Probably by other user) The execution was aborted.Ú.z;Selecting all records, you will avoid the concurrency check)*ÚintÚPOSTÚgetÚ
ValueErrorÚcopyÚpopr   r"   ÚupdateZgetlistÚ
IndexErrorÚaction_formZget_action_choicesÚfieldsÚchoicesÚis_validZcleaned_dataZget_actionsÚALLÚmodelÚ_concurrencymetaÚfieldr    r-   Z%delete_selected_confirmation_templateÚsplitr   Úappendr
   ZattnameÚfilterr   ÚoperatorÚor_ÚlenÚcountr   Úerrorr   ÚwarningÚ
isinstancer   )r&   ÚrequestZquerysetZaction_indexÚdatar;   r/   ÚfuncÚnameÚdescriptionÚselectedZrevision_fieldÚfiltersÚxr#   ÚversionÚresponser*   r*   r+   Úresponse_action1   sZ    	







þÿ
z&ConcurrencyActionMixin.response_action)Ú__name__Ú
__module__Ú__qualname__r    r%   r   Zshort_descriptionZ
allow_tagsr-   rW   Ú__classcell__r*   r*   r(   r+   r      s   

r   c                       sN   e Zd Z‡ fdd„Zdd„ Zd‡ fdd„	Z‡ fdd	„ZeZ‡ fd
d„Z‡  Z	S )ÚConcurrentManagementFormc                    s$   |  dg ¡| _tƒ j|i |¤Ž d S )NÚversions)r8   Ú	_versionsr$   Ú__init__)r&   ÚargsÚkwargsr(   r*   r+   r_   †   s    z!ConcurrentManagementForm.__init__c              
   C   s@   g }| j D ]&\}}| dt› d|› d|› d�¡ q
td |¡ƒS )Nz<input type="hidden" name="Ú_z	" value="z">Ú )r^   rD   r   r   Újoin)r&   Úvr#   rU   r*   r*   r+   Ú_get_concurrency_fieldsŠ   s     z0ConcurrentManagementForm._get_concurrency_fieldsNc                    s   t ƒ  |||¡}||  ¡  S ©N)r$   r!   rf   )r&   Ztemplate_nameÚcontextZrendererÚoutr(   r*   r+   r!   �   s    zConcurrentManagementForm.renderc                    s(   t jd d… dkr|  ¡ S tƒ  ¡ S d S )Né   )é   r   )ÚdjangoÚVERSIONr!   r$   Ú__str__r,   r(   r*   r+   rn   ”   s    z ConcurrentManagementForm.__str__c                    s(   t ƒ  |||||¡}td ||  ¡ ¡ƒS )Nz{0}{1})r$   Ú_html_outputr   Úformatrf   )r&   Z
normal_rowZ	error_rowZ	row_enderZhelp_text_htmlZerrors_on_separate_rowÚretr(   r*   r+   ro   œ   s    z%ConcurrentManagementForm._html_output)NNN)
rX   rY   rZ   r_   rf   r!   rn   Z__html__ro   r[   r*   r*   r(   r+   r\   …   s   r\   c                   @   s   e Zd Zdd„ ZeeƒZdS )ÚConcurrentBaseModelFormSetc              	   C   sf   | j r,t| j| j| jd�}| ¡ sbtdƒ‚n6t| j| jt|  ¡ t	|  
¡ t| jidd„ | jD ƒd�}|S )z5Returns the ManagementForm instance for this FormSet.)r0   Úprefixz8ManagementForm data is missing or has been tampered withc                 S   s   g | ]}|j jt|j ƒf‘qS r*   )Úinstancer#   r   )Ú.0Úformr*   r*   r+   Ú
<listcomp>¯   ó    z?ConcurrentBaseModelFormSet._management_form.<locals>.<listcomp>)r0   rs   Úinitialr]   )Zis_boundr\   rN   r0   rs   r>   r   r   Ztotal_form_countr   Zinitial_form_countr   Zmax_numZinitial_forms)r&   rv   r*   r*   r+   Ú_management_form¢   s"    
ÿ
þÿûz+ConcurrentBaseModelFormSet._management_formN)rX   rY   rZ   rz   ÚpropertyZmanagement_formr*   r*   r*   r+   rr   ¡   s   rr   c                       sj   e Zd ZejZ‡ fdd„Zdd„ Zdd„ Ze	 
¡ ‡ fdd„ƒZ‡ fd	d
„Z‡ fdd„Z‡ fdd„Z‡  ZS )ÚConcurrencyListEditableMixinc                    s   t |d< tƒ j|fi |¤ŽS )NZformset)rr   r$   Úget_changelist_formset)r&   rM   ra   r(   r*   r+   r}   ¹   s    z3ConcurrencyListEditableMixin.get_changelist_formsetc                 C   s(   t |dƒr|j |j¡ n
|jg|_d S ©NÚ!_concurrency_list_editable_errors)Úhasattrr   rD   r#   )r&   rM   r'   r*   r*   r+   Ú_add_conflict½   s    
z*ConcurrencyListEditableMixin._add_conflictc                 C   s   t |dƒr|jS g S d S r~   )r€   r   )r&   rM   r*   r*   r+   Ú_get_conflictsÃ   s    
z+ConcurrencyListEditableMixin._get_conflictsc                    st   zD|r0|j  t› d|j› �d ¡}|r0t ||¡ tƒ  ||||¡ W n* tyn   |  	||¡ | j
tkrj‚ Y n0 d S )Nrb   )r4   r5   r   r#   r   Z_set_versionr$   Ú
save_modelr   r�   Úlist_editable_policyr   )r&   rM   r'   rv   ZchangerU   r(   r*   r+   rƒ   É   s    
z'ConcurrencyListEditableMixin.save_modelc                    s$   |j |  |¡v rd S tƒ  |||¡S rg   )r#   r‚   r$   Ú
log_change)r&   rM   ÚobjectÚmessager(   r*   r+   r…   Û   s    z'ConcurrencyListEditableMixin.log_changec                    s$   |j |  |¡v rd S tƒ  |||¡S rg   )r#   r‚   r$   Úlog_deletion)r&   rM   r†   Zobject_reprr(   r*   r+   rˆ   à   s    z)ConcurrencyListEditableMixin.log_deletionc                    sì   | j j}|  |¡}|rÐt|jƒt|jƒf}dj|Ž }t |¡}	|	 	|¡}
t
|ƒ}|
rÐt|
 d¡ƒ| }d tt|ƒ¡}t |tdd|ƒ |¡¡ |dkr¤t|jƒ}n
t|jƒ}d }|dkrÐtdd	|ƒ||d
œ }tƒ j||g|¢R i |¤ŽS )Nz(?P<num>\d+) ({0}|{1})Únumr1   z:Record with pk `{0}` has been modified and was not updatedz5Records `{0}` have been modified and were not updatedé   r   z,%(count)s %(name)s was changed successfully.z-%(count)s %(name)s were changed successfully.)rI   rP   )r@   Z_metar‚   r   Zverbose_nameZverbose_name_pluralrp   ÚreÚcompileÚmatchrH   r3   Úgrouprd   ÚmapÚstrr   rJ   r   r$   Úmessage_user)r&   rM   r‡   r`   ra   ÚoptsÚ	conflictsÚnamesÚpatternZrexÚmZconcurrency_errrosZupdated_recordZidsrP   r(   r*   r+   r‘   å   sB    



þþÿ
þÿþz)ConcurrencyListEditableMixin.message_user)rX   rY   rZ   r   ZPOLICYr„   r}   r�   r‚   r	   Zatomicrƒ   r…   rˆ   r‘   r[   r*   r*   r(   r+   r|   ¶   s   r|   c                       s.   e Zd ZeZejdeiiZ‡ fdd„Z	‡  Z
S )ÚConcurrentModelAdminZwidgetc                    s¨   t ƒ jf i |¤Ž}| jrR| jjj}|j| jvrR| td 	| ¡d 	|j¡d dd�¡ | j
r¤| jjj}tdd„ | j
D ƒƒ}|j|vr¤| td 	| ¡d 	|j¡d d	d�¡ |S )
Nz,Missed version field in {} fields definitionz)Please add '{}' to the 'fields' attributezconcurrency.A001)Úhintr'   Úidc                 S   s   g | ]\}}|d  ‘qS )r<   r*   )ru   Úkre   r*   r*   r+   rw     rx   z.ConcurrentModelAdmin.check.<locals>.<listcomp>z/Missed version field in {} fieldsets definitionz,Please add '{}' to the 'fieldsets' attributezconcurrency.A002)r$   Úcheckr<   r@   rA   rB   rP   rD   r   rp   Z	fieldsetsr   )r&   ra   ÚerrorsZversion_fieldr<   r(   r*   r+   r›     s2    

üÿ


üÿzConcurrentModelAdmin.check)rX   rY   rZ   r   rv   r   ZVersionFieldr   Zformfield_overridesr›   r[   r*   r*   r(   r+   r—     s   r—   )<rF   r‹   Ú	functoolsr   rl   Zdjango.contribr   r   Zdjango.contrib.adminr   Zdjango.core.checksr   Zdjango.core.exceptionsr   r   Z	django.dbr	   Zdjango.db.modelsr
   Zdjango.forms.formsetsr   r   r   r   Zdjango.forms.modelsr   Zdjango.httpr   r   Zdjango.utils.encodingr   Zdjango.utils.safestringr   Zdjango.utils.translationr   Úconcurrencyr   r   Zconcurrency.apir   Zconcurrency.compatr   Zconcurrency.configr   r   Zconcurrency.exceptionsr   Zconcurrency.formsr   r   Zconcurrency.utilsr   r†   r?   r   r\   rr   r|   Z
ModelAdminr—   r*   r*   r*   r+   Ú<module>   s>   gQþ